ITSMConfigurationManagement
5.0.37
OTRS AG
https://otrs.com/
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
Build for OTRS::ITSM 5 patch level 37.
Build for OTRS::ITSM 5 patch level 36.
Build for OTRS::ITSM 5 patch level 35.
Build for OTRS::ITSM 5 patch level 34.
Build for OTRS::ITSM 5 patch level 33.
Build for OTRS::ITSM 5 patch level 32.
Build for OTRS::ITSM 5 patch level 31.
Build for OTRS::ITSM 5 patch level 30.
Build for OTRS::ITSM 5 patch level 29.
Build for OTRS::ITSM 5 patch level 28.
Build for OTRS::ITSM 5 patch level 27.
Build for OTRS::ITSM 5 patch level 26.
Build for OTRS::ITSM 5 patch level 25.
Build for OTRS::ITSM 5 patch level 24.
Build for OTRS::ITSM 5 patch level 23.
Build for OTRS::ITSM 5 patch level 22.
Build for OTRS::ITSM 5 patch level 21.
Build for OTRS::ITSM 5 patch level 20.
Build for OTRS::ITSM 5 patch level 19.
Build for OTRS::ITSM 5 patch level 18.
Build for OTRS::ITSM 5 patch level 17.
Build for OTRS::ITSM 5 patch level 16.
Build for OTRS::ITSM 5 patch level 15.
Build for OTRS::ITSM 5 patch level 14.
Build for OTRS::ITSM 5 patch level 13.
Build for OTRS::ITSM 5 patch level 12.
Build for OTRS::ITSM 5 patch level 11.
Build for OTRS::ITSM 5 patch level 10.
Build for OTRS::ITSM 5 patch level 9.
Build for OTRS::ITSM 5 patch level 8.
Build for OTRS::ITSM 5 patch level 7.
Build for OTRS::ITSM 5 patch level 6.
Build for OTRS::ITSM 5 patch level 5.
Build for OTRS::ITSM 5 patch level 4.
Build for OTRS::ITSM 5 patch level 3.
Build for OTRS::ITSM 5 patch level 2.
Build for OTRS::ITSM 5.
Build for OTRS::ITSM 5 rc1.
Build for OTRS::ITSM 5 beta3.
Build for OTRS::ITSM 5 beta2.
Build for OTRS::ITSM 5 beta1.
The OTRS::ITSM Configuration Management package.
Das OTRS::ITSM Configuration Management Paket.
El paquete OTRS::ITSM Configuration Management.
Az OTRS::ITSM konfigurációmenedzsment csomag.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package ITSMConfigurationManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted está punto de instalar el paquete ITSMConfigurationManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMConfigurationManagement OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>NOTICE</strong>
<br/>
<br/>
In order to grant users access to the config item menu, you need to add them as member to the group 'itsm-configitem'.
<br/>
<br/>
The menu items that were added by this package will be visible after you log-in to the system again.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>HINWEIS</strong>
<br/>
<br/>
Um Benutzern Zugriff auf das ConfigItem-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-configitem' sein.
<br/>
<br/>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Para permitirles a los usuarios el acceso al menú de los elementos de configuración, es necesario que se den de
alta como miembros del grupo 'itsm-configitem'.
<br/>
<br/>
Los elementos del menú que se agregaron por este paquete, serpan visibles después reiniciar la sesión al sistema.
<br/>
<br/>
((enjoy))
<br/>
<br/>
<br/>
<strong>FIGYELMEZTETÉS</strong>
<br/>
<br/>
Annak érdekében, hogy hozzáférést adjon a felhasználók számára a konfigurációelem menühöz, hozzá kell adnia őket az „itsm-configitem” csoporthoz tagként.
<br/>
<br/>
Azok a menüpontok, amelyeket ez a csomag adott hozzá, azután lesznek láthatóak, miután ismét bejelentkezik a rendszerbe.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br/>
<br/>
The group 'itsm-configitem' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br/>
<br/>
All links to config item objects will be irrevocably deleted!
<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 Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
Die von diesem Paket angelegte Gruppe 'itsm-configitem' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Alle Verknüpfungen zu ConfigItem-Objekten werden unwiderruflich gelöscht!
<br/>
<br/>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos que fueron creadas durante su instalación se eliminarán.
¡Todos los datos de dichas tablas se perderán irrevocablemente!
<br/>
<br/>
El grupo 'itsm-configitem' que se creó durante la instalación de este paquete se desactivará.
Es posible reactivar este grupo en el área de administración.
<br/>
<br/>
¡Todos los vínculos a objetos de elementos de configuración serán eliminados permanentemente!
<br/>
<br/>
Si usted desinstala este paquete, las estadísticas que están asociadas a él ya no estarán disponibles.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
<br/>
<br/>
A csomagtelepítés során létrehozott „itsm-configitem” csoport ki lesz kapcsolva.
Ezt a csoportot az adminisztrációs területen tudja ismét bekapcsolni.
<br/>
<br/>
A konfigurációelem objektumokra mutató összes hivatkozás visszavonhatatlanul törölve lesz!
<br/>
<br/>
Az ehhez a csomaghoz hozzárendelt statisztikák többé nem lesznek elérhetők, ha a csomag eltávolításra kerül.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMConfigurationManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted está a punto de actualizar el paquete ITSMConfigurationManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 5.0.37</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMConfigurationManagement OTRS csomag frissítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 5.0.37</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 OTRSCIColumns that has been integrated in OTRS::ITSM 3.3 Beta 1
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSCIColumns',
);
# uninstall Feature AddOn OTRSCIAttributeSyntaxCheck that has been integrated in OTRS::ITSM 3.3 Beta 1
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSCIAttributeSyntaxCheck',
);
# uninstall Feature AddOn OTRSGenericInterfaceITSMCIOperations that has been integrated in OTRS::ITSM 4 Beta 1
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSGenericInterfaceITSMCIOperations',
);
# 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)->CodeUpgradeFromLowerThan_4_0_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)->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(
UserID => 1,
);
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
056136513475929171037780bda6188ee27ea4ca
2019-07-01 15:10:07
opms.otrs.com
H4sIAAAAAAACA+1d3W/jNhJ/37/CcF9awMuQlPihdXeL6wJ3V6CLHrrbl74Ysq04usqSIcvJpg/3tx8pOx/6smRJ1NrJZLFB4ow5HJm/4ZCc+fHHn76ug9GtF2/9KHw/JgiPR164iJZ+uHo//uPLP9/K8U8f3vy49N136v8qdtcj9Y5wq397P75Jks27q6u7uzsU3G/dJIpR4O/Q1rv6nxsE7pUSuhp/eDMaPW9g6Saufu3wqpsksT/fJd4odNfe+/HcXfy1iqNduBzvpQ5yiyiI4tGtG7wff3edfo2vDs1cZdo50vbGXXnz2HP/qm4aqy/HadP0xovzza430dZXIsn9piBS0Y7+/kzmILVVQuHqw3f/IN/tu3R44amtso5WKknWbrzyw6Ie9WyC/YOgSFJK1cNgjnSwsAV5eCanq5sPqy4YVl08rDp/O9tEcRK7flJUOY+iwHPDvdZrN9h67RVtF26gxtgxuzBi1JKEYYtJbZ6waHt9136SRD2ZtH/5EYCngnkV+8vjWM5IVLRy5y+Tm9nXmgfY/oHt27831v6tv/XngVdmgR8mewWke/P3/TSf/4RSp/709o4jYt9a5ayxlB7z2OmzxmrnL71tzVDLylS0dHMQu6p76nm5pg9m/1JuDk9VBO69Fx+a//lp9h4dPmA13cQ7bzxyF4l/+/Dbs2cSzf/rLZKDsZ8TN1y68XL0dvTF+5qMn8Um45G/fD/+DWefVt4+1Zryj4XHtYkexxSbEJo3v+hAqtqez/NNx6r3brgKvMfmMVIxBJtSG0kplTbECWmnMdHPoGag52SqvHkaMGTkcrHFb19+/zyyR/9UH693F8V/VUQaR3BY5dijMClTrF8fXbtrP7hX/XPD7Xi0Te71gFFR6P6t//aCWy/xF+7zcX16D248f3VT2ofnczTHmS/STWd2ENYPxDY6sl6pwjeJa/2vmyIVCazCtVf+OXrhbn2YbhpqKfU5pyHjNu1SHhtPXbFqALd/ce97Gjijn72/fS/+1Q+9Zy4JH1wS6eqSMKKUkQm3kMTMMuicMCLEElxO3qqfMBFkykT6g9btEM7b6Z57f89Sc9oYWZS05YTJYwKMIywdPmEUCY75UVExwe2MWkRx6MUzPRS21eMMF5SX/u0UxSrq9mZ5aBdDDlf/66AhDR+L4+UpdKS40iGerCx17NVPseWEvHS3N4EXro7ZQft1BH/6qz/dVc4RPMQmtKsjEFShUTgTypAl2j7wRp4gp2naj+ZYLUhqHUGlqm8uerKtUexnJ8XcuCbNvMOx953SJ3eXRCr4TrKRXu0yug9cVETrVldEcPvwWdmmEfGoyUJCMDJ9pplRfAEB/CsL2LGKI7JftumIvXIwGgve94ZB8G7CN9mdfRNTa8ZhfNODpgff9KQZfBP4pqODEXzT2fmmPz79qtzSx8Ddbku2E1hXvyTxhJrc4hQOctiEEvV9SjBDhExsgjBrp9ILvPVsv9g2Y1OqoGa1q5YCmDnPvzroKniInDIiUUaV03LbJXdWnHG4iyi89lcKA+tS13uKmm3ixV6kR26Vss4qFGLXJQup3tp35+q97iLpvCqqekS7zSb2ttvZ4x+2xlVFGy92E+U5jKl6OKFraFR6sNNJUUOTuis6jDdjT+4udjcDfECpGvda4XO2uHEL7vNpQ7X1Fmj6mGbpFl75RltvOhJ3tepj36LTlifpccuzdgc3Hz+douHaD4J6Ddk8qdNXB2ZtCKN47QazXERfjOYX0S729Qmzd1cM6j/u/9hyv+wwLXzLPmyi4H4dxZsbf1HfjXUURtuNu/B67sRCh6L6x7P4NM6iNw9+qbYLjRebLbFRH04eObnuMhIbKLaycazTAwwbaJV9DPJaPbTXUWxK3fNhasykyvgvv120WwePwvXbRoVc11zY7y972zbKrV4KquZqrRQmvalTT3vnDbIfVlw5mdOVRs9+4Cf3/ezWNF+sNcwGbfH4NEhn20VUPjxaq6vYiBoENk9L/5n6SOZePBiKbt1Yr0O+V2H0D4AlwNILwFJq04ATEcxCgJwXgRxlUjI7nG3MIJIDDAGGTp99dvFs6W2C2TZxEw+mIYAQQKgFhPxw4QOEAEIAoXYQij0NncRfe4OBZ6k0AnoAPS8GPfN7mHgAOgCdk6Bz44YrmHgAPYCe9uiBiQeg84Kgc1Iy+1MC5lVNrtt6o6DnmUo+fGh/m2WI6VrAxLsWChCCzZKhpAowwmJKbIpSLhTbOf9qpV++fP70MT1F3+0H0Cc3dFeedhPAimK4jik/JoEX5WJ5UUR3XhSSUoYwRG1OjfKiYOIIm1sTbiPBOZkyBxEsufJemizAMcqLUm5kCZeJM6kREBOJa1pQBgEfCvChGK6tlp1DEwVJZsuJIAqPlklOpAdN3EHSsqwp5YhajtJMEWVtNQ8ZrfzLU7h0g49u4gbRCgIU0wFK1ciESOViIxWns7uyHWRzMpECcd62DqIZv6RElLADgxtn0plq3YzTiYORsC2DkUqlkSUUS1rqaCRCJ4QcleAYmNsgUhmIuY10ppW1xUTYBnFvc026YFkqKJlKPQUpda05F5oRteVMKiNSqxdQPT5K9ihxTqR3EraGRGt9OYE+SdgevUcYqtGgdzILfuXhL6MbNdJ1FKaGdBKlNCKjp79q0oki53Ou1V4BRS4EUATxCwOUijvrAJURAUCZARQfFlCdyUVtPKHYIKCslBaI6O8HQFkcMbOAyppUxopVL6B7WQeojAgAygigivxOZgFlXSCgHCQuAFBO/QzlwAxlHlC9z1D/iYL7KhL8znSaNjEMJ6nv46AaUNySdJpy1imVyOJEtqfMaAAqUoMZy2ltuRcuZ24cR3dHlui0Y9OzupU6bjs7Pqmo3dNgg5xbkM7ki3pBoQeVyaVLqkMNY0oom1pCDWeRDmSBKTv/84rdVj310ff+8odXdlZBBj+rKBmMQAd7gVTVhPfglvTmg2m3pHRYe7dk24gRrfEynNJqf4g6W+xPUcE9DeSe8oMS3NM5u6dj8X/nbC99pm50w5ft43/lofbxvzxs+hqP/2XNrq7NW1sO8X9vvOuke9KSvkhNGM2nTg8tOE+p122qqdeFWs4apV7vYtX5ca9TZJRtfbb0rv3Q11ssQLwOxOtAvA7E60C8DsTrQLwOxOtAvA7E60C8DsTrQLwOdJ1AGwBk0UC4AcgB5Jy4f2YCRkEUruZBNAcsAZYuH0uHcw2YhAA4ABzguQX0AHqA5xagA9ABusEOuTGdGTIknjBiMDVGpMVSDOvMGEcgaU0Ebl3O2ywxpoNJTfJiiEBC9nC80CwvRqLsiYLZLJljixRIkYEUGUiRgRQZSJGBFBlIkYEUGUiRgRQZSJGBFBlIkYGtLtjqejEH/YAgQBAg6GQE6b8PBpxbN9aL9+8pwz8AfAA+lw+fp/QySNQE+AB8TobPJoCr1AE+AJ92uwbhwgf4AHwAPpChCegB9ECGJkAHoHMxd6nDxAPoAfS0RQ9MPAAdKA14caUBFPdBm8m4UWrqA3Gm0mKxKbEEYpjpu76pcebM9oY14s7EyGbsWX4VNVgjIJDMJnMJozUCi2gXJl4MNQJQIwA1AlAjADUCUCMANQJQIwA1AlAjADUCUCNw/jUCwAcI216wY9yuTCBd+s9024MnO0OuM6DoJaEIAAQAgtOXiz19aXqfPSU9UDRRhiyTJE1Cn8IoJfThRnvG1Csmb7QvGFUUEbKJiO5pza32WRG41b7brfa4/FZ7WbC05L3k8F7iZN9MCs+i0KVeMUm7YtLRJGAT5iCT3GlaiaWVYDYlRKTXYmJkGcVlmWFlJ6ikkYzu7nEZkZMBdPaDzgLC2En4lJXgHgKe1tnfWbufMCWyHyZMYbdmNWwGzNrbagWtF1A9ZjWTZVYE4NgNjqR8siR0WEDZnQElDAMqzQOyWXqB7mGqM44o0QOibH58frMaSKiZVNTNklmZc4Tla4Izxd90fmSXMT8ODGd5JnAW5PiKNA16ybkvSV8TnPPh7tDLUd4ZzypuwwbxbKUs3kR/P8S7nCFmFs5Zk4oCnNUL6F7WxLtZEYh3e0JUbvlJBw54xQUiSiJxAYiSx2NVjSh57qHqi0AUHxZR8pIQ9RBzSsO7pb1ASveyNl6UsEk6QNzXzzqupjDL6V6YRRAmE8KQwJwZLc/CyOFaEWdcoYo6iKoFDtWw4oZLtLqb2OgyF4kI61RtVptXSpHZO1tu/K1C0z3UY0E9FtRjQT0W1GNBPRbUY0E9FtRjQT0W1GNBPRbc2QI3TkAW/Iu9s2UGl7YAhABC7SCk24RCYAAOAOf0uSfxehzMzS88YlDDCAh6OazfQF0M6AH0AGc+QAegA8XzhawzqzuJMWYIc9MF9KkWMqEYsTRRRmev7JUaTT8rNa5MTCJsseZyGPFM1k1lfk5B8rVkpjXPTeijtt45pXaXmqmtP57UZpEe2MaRQyaWjQiXZpPaBJI8VUSkwqqtQGtPGFbjWZqmHe9sYSPycYpYhhHcJPm4ztDr43DwtGS3agYyyHiDjDfIeIOMN8h4g4w3yHiDjDfIeIOMN8h4g4y315rxBvvWsG/9Io58VGf9JSTrAHIAOSciR/8dMnUAPgCflrlu+y01gBBACCAEyW6AHkAPJLsBdAA6FwCdGzdcwcQD6AH0tEcPTDwAHciyfslZ1p2vQ9LMgITTCaWIGqYk1JpIqomkqdY2QcyZWAKx1umbDZOtq2wsEdWdsk+QVN23MzmhZZIY2U5REjKue8m4LmRNW6fkXFukMmF7AG5ey+qJUZQKhM3Cl9vIcRyR0vRSIR8rJTRdLzcL3woTy8ogOGLsBEltjBDyOM0vwvbB7owoUPkawu+wV7JYdk/1Dzbr4t+b1SpxZAs1vjlyLJukXNkO14qNz6AVJlYAi7JTRLU50iZ1orJMFEDYDwjz0+DQIGR9gVAibroIiamJYD/An4NQIjEQCPMmlkkqnHB5kqgypw6EShQfoP0qQWg4kM1jsP+bV754X5My9PE+VpFSOhOCMbKIY3gVqTU5DhLUnj5XbHOnfV1BXRppTqayLi3ODiJz20m5JPCOieBtelBI7S2tX5G5+hW7m9LsODxpLLbbIMxWmzSqOGm1bRf4q7BqL/L0zcEedtBu0y5VO+m6qvyefJPo7psEIrbyGELN0Mwol8CDJqaDVXtfoMz4xJGIOoyev3P67cvvn9+9++XL508j+5U5KqqnD9tWIZ1jY6k+RWHeT1WMS/BTl+inZC9+ykkjG87N+ymtSd8GxCzlpxy1lkk1O07bLa4h/ZT2UB9TaoHd/pDnkxu6K2/dJ7HhZbgtggS3pPqiKtxh6jsdxG2VDVNwW5fotpw+3BZz9uG2Y/gA8UmTxciUWARZllS/E30V2Pm7LYqJ/RY7bwmDVeAQbqp0WIKb+qZuav974N578Yc3+1/U/1Xsrj+8+T8uX5OkPXUBAA==
iVBORw0KGgoAAAANSUhEUgAABh4AAAQuCAIAAACs0tAIAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeXwUVbrw8eruLGRPhyxkZwdBVBIIEEFEUCC4sCioMzqM6DiKy9W5LCpiGAFBUUR07uUCDuLCRZAIQthhFAnINoAQCIQlkI10NkL2Xur9o671tt1ZupPudLr79/2DT/epqlOnqkJS56nnnFKIoigAAAAAAAAA1vNwdAMAAGhTOp0uNzdXoVDEx8fbo/6CgoLa2tqwsDB/f3971A8AAAC0K4SWAADuRRRFrVarVCrtVL9Op9PpdHaqHAAAAGhv7HVjDQBA+2TvkeAGg0EQBPuFrgAAAIB2hRtfAIB7kUJLCoXCTvXr9XpBEFQqlZ3qBwAAANoVQksAAPdi79ASWUsAAABwK9z4AgDci11DS6IoSvWTtQQAAAA3QWgJAOCO7BRakkbDCWQtAQAAwG1w4wsAcDtKpdJOWUXSaDhSlgAAAOA+PBzdAAAA2pSPj0+3bt3sVLmUtUTKEgAAANwH974AANgMWUsAAABwN4SWAACwGbKWAAAA4G649wUAwGakrCVCSwAAAHAf3PsCAGAzUtYSA+IAAADgPggtAQBgM2QtAQAAwN1w7wsAgM2QtQQAAAB34+HoBgAA4Dr8/PxUKlWHDh0c3RAAAACgjShEUXR0GwAAAAAAAOCUyFoCALiXysrKW7du+fr6BgUFObotAAAAgNMjtAQAcC91dXWVlZUeHvwFBAAAAGyAG2sAgHvx9fVVKpXe3t6ObggAAADgCphrCQAAAAAAAC2kdHQDAAAAAAAA4KwILQEAAAAAAKCFCC0BAAAAAACghQgtAQBgG6IoMoMhAAAA3A1viAMAwDYqKysLCwv9/PyioqIc3RYAAACgjZC1BACAbej1ekEQFAqFoxsCAAAAtB0FqfsAANiEKIoGg0EQBJVK5ei2AAAAAG2E0BIAwL3odDpRFFUqlVJJ6i4AAADQWtxVAwDcS2Fh4dWrV6urqx3dEAAAAMAVEFoCALgXKV2XGZEAAAAAmyC0BABwL4SWAAAAABsitAQAcC9MMggAAADYEKElAIB7IWsJAAAAsCFCSwAA90JoCQAAALAhQksAAHdEaAkAAACwCUJLAAD3YqesJYPBUFxcXFZWZttqAQAAgHaO0BIAwL3YaRpvnU5XVlZWWlpqj8oBAACAdovQEgDAvdgva0kQBKWSP6wAAABwL9wBAwDci51CS3q9XhAElUpl22oBAACAdo7QEgDAHZG1BAAAANgEd8AAADciT7RE1hIAAABgE4SWAABuxH6hJbKWAAAA4J64AwYAuBF7h5bIWgIAAIC7IbQEAHAjcmjJ5qQBcWQtAQAAwN1wBwwAcCN2ej2cQNYSAAAA3BWhJQCA27FHaImsJQAAALgn7oABAG6ErCUAAADAtggtAQDciP1CS2QtAQAAwD15OLoBAAC0HYVC4e3t7eFh+z9/UtYSoSUAAAC4G0JLAAA34uXlFRcXZ/NqRVFkQBwAAADcEw9XAQBoLSmuJJC1BAAAAPfDHTAAAK0lT7Rkj1mcAAAAgPaM0BIAAK3FREsAAABwW9wEAwDQWky0BAAAALdFaAkAgNaSB8Q5uiEAAABAW+MmGACA1mJAHAAAANyWQhRFR7cBAADnVldXV1NT4+np6efn5+i2AAAAAG2K0BIAAAAAAABayMPRDQAAoO1UVFTcunXLz88vODjY0W0BAAAAXAGzQgAA3Eh9fX11dbVOp3N0QwAAAAAXwYA4AIAbqaur02q1np6e3t7ejm4LAAAA4AoILQEAAAAAAKCFGBAHAAAAAACAFiK0BAAAAAAAgBYitAQAAAAAAIAWIrQEAEBrSbODO7oVAAAAgAMQWgIAoFX0ev21a9euXr3KmzEAAADghjwc3QAAAJybKIqenp6iKCoUCke3BQAAAGhrCh6xAgAAAAAAoGXIWgIAuJH6+nopyUipZEg4AAAAYAPcWAMA3EheXt61a9fq6+sd3RAAAADARRBaAgC4EWkYOJMiAQAAALZCaAkA4Eak0BKj4QAAAABb4d4aAOBGyFoCAAAAbIvQEgDAXYiiSGgJAAAAsC1CSwAAdyHFlQQGxAEAAAC2w701AMBdGAwG6QNZSwAAAICteDi6AQAAtBE7jYbTaDQ6nU6tVnfo0MG2NQMAAADtH1lLAAB3YafXw9XU1FRWVur1ettWCwAAADgFQksAAHchDYizedaSFFRSqVS2rRYAAABwCoSWAADuwk5ZS1LEiqnBAQAA4J64DwYAuAs7ZS0RWgIAAIA74z4YAOAu7DGNt/zWOUJLAAAAcE/cBwMA3IU9BsTJmVCElgAAAOCeuA8GALgLewyIk+bwJq4EAAAAt8WtMADAXdhvQByhJQAAALgtboUBAO7CfgPiCC0BAADAbXErDABwF/YYECfVqVKpbFgnAAAA4EQILQEA3IU9spaYawkAAABujlthAIC7sF/WEqElAAAAuC1uhQEA7sLT09PX19fLy8uGdRJaAgAAgJvzcHQDAABoI2q1Wq1W27ZO5loCAACAm+MpKwAALcdcSwAAAHBz3AoDANByDIgDAACAm+NWGACAliO0BAAAADfHrTAAAC3HXEsAAABwc4SWAABoOeZaAgAAgJvjVhgAgJZjQBwAAADcnEIURUe3AQAAZ1VXV6fX6318fBQKhaPbAgAAADgAoSUAAAAAAAC0kIejGwAAQFsQRTEnJ0cQhLi4OMavAQAAALZCaAkA4BYMBoNWqxUEgZFrAAAAgA0xIA4A4BZEUayrqzMYDL6+vo5uCwAAAOA6CC0BAAAAAACghZhsAgAAAAAAAC1EaAkAAAAAAAAtRGgJAAAAAAAALcQb4gAAaKGamhqdTuft7e3l5eXotgAAAACOQWgJbiQ1NVX+FwBa7+bNm7du3QoNDSW0BACArRw+fPjo0aPl5eV6vV74/T28U9/Ju8AhAI1xmtBSfX39sWPHLly4oNFoamtrO3ToEBoa2qtXrwEDBhjf0Fv+HzU1NdVkZU9Pz+Dg4O7du999993+/v4m6xsMhuPHj585c6aoqKiurs7b2zs0NLRz5859+/bt1KmTtcfy2Wef3bx50/IGN7Eav5sAwFE8PT19fX2JKwEArNWycElqaqrlvRK52kGDBo0dO9a8tvT09CNHjpisLNPpdKdOnbpw4UJBQUF1dbVKpQoJCenZs2dSUpKfn5+FDW6Bo0eP7tixw371u7ZWXnSgxZwjtJSTk7Nhw4bKykq5pKqqqqqqKicn5+DBg5MnT46Pj2/9XrRarUaj0Wg0v/7667Rp09Rqtbyovr7+yy+/vH79ulxSU1Nz/fr169evHzhwwNr/k3v27KmoqGh9gwEAjtWxY0dHNwEA4EZa1is5ffr0/fff7+Hxu66fVqs9ffp0YzvKzc3dsGGD9CxcotPpCgoKCgoKDh06lJKSctddd7X2YBpx4sQJQRBGjx49YMAAT09PO+3FftpJalILLjrspJ38SNibE4SWrl+/vnbtWr1eHxUVdffdd8fHx/v4+NTU1Fy7du3gwYN5eXlr167985//HBMTIzR0wZq9kPKiqqqq69ev79y5s6ysbN++fZMmTZLX+de//nX9+nU/P78RI0b06NHD399fq9UWFxdfuXLlzJkz1h7O0aNHExMTjx07ZtWGTR8FAKBptbW19fX13t7e3t7ejm4LAAD/n+VdmF27dlnbK4mOjs7Ly8vMzLzjjjuMyzMzM2tra6WlJpvk5uauWbNGp9NFRUUNGjQoPj7e399fp9OVlpZeuHDh6NGj33//vf1CS8XFxYIgJCYmmsSVXKAr1GaH0IKLDrRSew8t6fX67777Tq/X33XXXQ8//LBS+X+vtPP39+/Tp0/v3r23bNly8uTJjRs3vvzyyyqVqjX78vPz6927t6+v7+eff3758mXjRWfPnhUEYeLEid26dZNKVCpVTExMTEzMsGHDrDqcLVu2+Pn5jRo1qgWhJQBAi926dau8vFytVhNaAgA4qRb0ShISEvLy8o4fP24SZZCSgxITE02iDHq9fuPGjTqdbsCAASkpKXL/y8PDIyoqKioqKjk5OT093eaHJtNqtYIgMNi8Nay96EDrtffQ0unTp8vLy8PCwh566CH595pMqVQ+9NBDeXl50ig2m8TOpSHKdXV1xoW3bt0SBCE2NraVlR84cECj0Tz66KMdOnRoZVXmpCj4O++8c/z48RMnThQXF2u12nfeeUcQhLy8vJMnT169erWsrEyhUAQFBfXq1Wvo0KE+Pj7mNaSmpp48efLo0aMajUapVMbGxo4cOVI6LadOnZLKRVGMjY29//77zeeZKisry8jIuHTpUkVFhYeHR2Rk5KBBg3r37i2v8PHHH5eXlz///PORkZFSSVpa2qlTpwRBuPPOOydMmCAVFhQUrFixQq1Wv/rqq/K2169fz8jIuH79ek1NjY+PT1xcXHJyspSwZsl5MFdXV7dp06asrCylUjl27NiBAwdaedYBOA2DwSAIgvmfEgAAnEULeiX9+vXbuXNnTk5OcXFxaGioVFhcXJyTk+Pl5XX77bdv2bLFeH2p/9WpUyfjuJIxLy+v8ePHG5dYfouempp66tSpX375RepoxMXFyR0N4fdJPfJnkw8miT8XL148ePBgQUGBKIqhoaGJiYmJiYnmazaWBdbYmi3uUpk3u9lDsNXZM2btRbfw6KxqiYUVChZfRMGCnqbQVl1ay09F0z8SrqS9h5aysrIEQRg8eHBjGUkqlWrQoEFbt27NysqySWipoKBAEITAwEDjwoCAgJs3b2ZnZ/fp06fFNWs0mgMHDnTv3v32229vbSsbt23bNvN8qJUrVxp/LS4uLi4uzszMfO6553x9fU1W3r59+y+//CJ/vXjxYk5OznPPPXf06FF5yjdBEC5dupSbm/v888+HhIQYF65fv76+vl76qtPprly5cuXKlXvuuee+++6TCrt27XrixIkrV67IoaUrV66YfBAEQUoc69Kli1xy9OjR9PR0URSlr5WVlZmZmefOnXvwwQcTExMtOQ8mysrK1q1bV1RU5Ovr+9hjjxnvC4DrkX57EFoCADivFvRKpFDCiRMnTpw48cADD0iFUvZKv379zJOD5P6XhX8xrbpF37lz56FDh+SvUkfj+eefb9nchYcPHzae8Ds/Pz8/P7+wsLAFVZlofZfKQnY6e9ZedGuPzpKWWFih5RfRkp6mzN5dWqtOhZto76Gl/Px84ffxBXPSUmnN1qiurs7Jydm5c6cgCP369TNedMcddxw4cGDTpk2XLl3q1atXdHS0ta9FEEVxy5YtSqVy3LhxrWxn044fP56cnJyQkBASEiL/PejcuXNiYmJcXJy/v399fX1+fv6+ffvy8vIOHDgwevRokxqOHj169913JyQkBAYG3rhxY/PmzRqN5uuvv66oqDAvP3DgwCOPPCJtWFFR8e2339bX1/fr1y85Obljx441NTVnz57dv3//Tz/91K1bN2m29S5dukihpeTkZEEQiouLKyoq/P39RVGsqKiQI+tSmEm+9IWFhdu3bxdFsX///kOHDg0ODi4vLz9w4MDJkyfT09NjY2PDw8ObPQ/Grl69+u2331ZXV4eHhz/xxBPGs7YDcElS1pJCoXB0QwAAaKGW9UoSExNPnDhx6tSpkSNHqlQqvV5/8uRJQRASEhLMV5YetFv4liRrb9F/+eWXYcOG9e/f39/fv7CwcPPmzSUlJQcOHJDSoKx6a15hYeGuXbsEQRg4cGBycnJgYGBFRUVGRsbRo0ctaXnTWtylSk1NtXzOZtuePRNWXXQLj86qllhSoeUX0cKepszeXVrLT4VVPxJOrb2HlqqrqwWzHCIT0lJpzRYwv8b9+vW75557jEvuvffeioqKU6dOHT9+/Pjx49JOO3fufOedd8rjnJt25MiR69evjxw5sjUhjMZyOI0NHDhQjkzLpk6dKn/28fHp1q1baGjo0qVLL1y4YP6b4u677x45cqT0OSYmJiUl5YsvvigvLx82bJh5uXGe0eHDh+vq6owHtXl5eSUnJ6tUqu3btx85ckQOLQmCkJOTo9frVSqVHEISRfHMmTNXrlwJDQ3V6/U5OTmCUWjpl19+MRgMPXv2lP/bd+zYcfz48ZWVldnZ2YcPH3744YebPQ+yY8eOpaenGwyGXr16TZw4kYlXAHfAgDgAgLNrWa8kOjo6IiLixo0b58+f79u37/nz56urqzt16hQdHW2+clVVlSAIAQEBlrTH2lv0YcOGjRgxQvocFxc3bty4tWvXXr161aKD/70jR44YDIY+ffrIT+7VavW4ceOqqqoyMzNbUKGx1nepLGHXs2fVRbf26CxpiSUVWn4RLexpyuzdpbXqVLiJ9h5aantBQUHDhw83GX+nUqkmTJiQnJx85syZnJycwsLCioqK06dPnz59uk+fPpMmTWp6BvGbN2/u3bs3LCxMytOxqwEDBpgXStHfy5cvl5eXy6l9UsPMVzaJZEdFRTVRLo33lmRnZwuCMGjQIJMK+/btu337dvklqf7+/uHh4UVFRXl5eXFxccYD386cOXP58uWBAwfm5uZqtdrw8HB/f39pKynSNHToUJPKhw0blp2dbf6/t8HzINm2bZsUCB86dOjIkSNJYQDcBAPiAADOrsW9ksTExPT09BMnTvTt21eKSZmPt2oBa2/RTSYwkcIcxh0Ky0mVm3evhgwZ0vrQUuu7VJaw99mz6qJbdXSWtMSSCi2/iBb2NGX27tLKbPgj7ezae2jJ19e3oqKioqLCePSjiYqKCmnNlu1CSvzR6XRFRUW7d+++cuXK119//eKLL5q87VIQhIiIiIiICEEQRFG8ceNGZmbm4cOHMzMzQ0NDzUddGtu6datWq33ooYda+Q47S5LozLOiNBrN559/XlNTY76yTqczLwwODjb+Kmf0NFiu1+vlkrKyMkEQVq1aJfzWhZNIn6UHIJIuXboUFRVdvnw5NjZW+oXStWtXabWrV6+Komg+0ZJ0lcPCwkxaK6WJmv/vbSI7TIorjRgxYvjw4Y2tA8D1MCAOAOAaWtArueOOO3bv3n358uXLly9fuXLF09PTZAIQmZ+f382bN2/dumXJYAtrb9Gb7VBYTtq1+Yw28qzVrdH6LpUl7H32LL/oNukwGrfEwgotv4iW9zSbaKElLbfJjlr2I+3s2ntoKSoqqqKi4sqVK02ElqQENjkS2TLS2zSffPLJ//mf/9FoNIcPH27s/Z2CICgUik6dOnXq1CkyMnL9+vWnT59uOrR08eJFQRA+//xz80U2H3hpHhHbs2dPTU1NdHT0yJEjIyIifHx8lEqlTqebP39+gzU01u9qtj8m/X+TOm/mjP+DdenS5Zdffrly5UqvXr1qampCQkKk/5NqtbqsrKygoEC6pl27dm16j00wPw+yzp07X7169ZdffunevXtjGaEAXI/NB8TV1tYWFhZ6e3vLLyUAAKAtWd4r6dChQ58+fU6dOrVx40ZRFPv27dvYG6sjIyNv3ryZk5Njj6lI29UDHuPAgYnWd6nswdqzZ/lFt1WHscUVNsvynmbTLbRhl9bCCt1Hew8t9erV6/z584cPH77rrrsaTPnR6/XS3O+9evVq/e48PT1Hjx791VdfHT58eMiQIR4ezZyf7t27C+0+4U1KC3r00UeN/zyUlJTYfEdBQUElJSUvv/xys/Phd+7cWalU5ubmSm+gkLOTunbtevz48aysrLy8PKVSaTyQNTAwsLS0VKPRxMXFGVdVVFQkWDwaXPKHP/xh3bp1ly9fXrt27RNPPNG5c2fLtwXgvGweWtLpdFqttpXpqAAAtJ4lvZLExMRTp05JE9Q2NpezYNT/uuOOO5r9o2nDW3RrSbsuKSmJiYkxLi8uLjZfWZrHuq6uzniK1fLycst3Z48uVRucPQsvus2PzsIKLb+Ilvc0W6nNduR62vuUE3fccUdwcLBGo/nhhx/MY4cGg+GHH37QaDTBwcGNZfdZq3v37lFRUVVVVdIU+k3Lzc0VBEGeD6gxqQ0xXtTaRjdJiq2ahMkyMjJsvqOePXsKgnDw4MFm1+zQoUNkZKRerz98+LBglJ0kxZgOHz6s1+sjIyONw+pSmMm88p9//lkQBKvCQ56enk8++WT37t3r6uq++uqrCxcuWL4tAOdl89AS84IDANoJS3olcXFx0tirsLAwk1iGMan/VVhYKL30xnyF+vr677//Xvpsw1t0a0mVm3dqjN8EL5POTF5ennHhv//9b8t3Z3mXSlqnrq6u2Trb4OxZeNFt3mG0sELLL6LlPc1WsseOLP+RcGrt/YZYpVJJ09GdPHly1apVZ8+erays1Ov10qTxq1evPnnypLyOrXZ69913C4Jw6NAhOUnys88+27t3b3Z29s2bN6XH1KWlpRkZGRs2bBAEoU+fPrbatT1II7GlFytqtdqioqLNmzefOnXK5jtKTk729fU9ceLEunXrLl26dOvWLYPBUFtbm5+fn5GRsWLFCuOVpShSbW2tQqGQf2926dJFoVBI/+tMRsMNGjRIqVRmZWX98MMPpaWler2+tLR08+bNFy9eVKlU5hOtNc3Dw+Pxxx/v2bOnTqf73//9319//bU1Bw6g/ZNvjgktAQCcVyt7JdOnT09NTZ0+fXoT66hUqkcffdTDw+PYsWOrVq06ffr0zZs3pZSfgoKCH3/8cdmyZfIzeNveolslKSlJqVRmZmamp6eXlZXp9fqysrL09PQG5/CWuh7p6enXr1+XTtq+ffukCI6FLO9SBQUFCYLw73//23ju6ga1zdmz5KLbvMNoYYWWX0SrepqtYY8dWf4j4dTa+4A4QRBiY2Offvrpb7/9Nj8/X/qlaczPz++xxx6LjY214R5vu+02tVpdUlKSlZXVu3dvQRA0Go1Gozlw4ECDzbv33nttuHebu/fee7/55pvs7GxpuntJUlLSkSNHbLujgICAJ598cv369VlZWdJItyZ07dpV+m0eERHh5+cnFfr5+YWHh9+4cUP4/RzegiB06tRp7Nix6enp8ptWJQqFIiUlRfrlZRUPD48pU6Zs2LDh/PnzmzZtqqura+KlcgCcnfyogNASAMB5tU2vJCYmZurUqRs2bMjPz9+0aZPJUi8vr/Hjx0ufbX6LbrlOnTrdf//9O3fuPHLkiHG/ZsCAAceOHTNJOxg6dGhmZmZxcfHq1avlwsGDB0tDKCxheZeqT58+Bw4c2LFjx44dO6SSxgapOPDsmbB5h9HCCi2/iFb1NFvDHjuy/EfCqTlBaEkQhPj4+FdfffXYsWNZWVkajaa2trZDhw5hYWE9e/YcMGCA8YhZm1AqlUOGDElPTz948KAUWpo+ffr58+dzcnKKioqkaeF9fX0jIiL69u175513tvN+RY8ePZ588smffvqpoKBAqVSGhYUlJiYmJCTYPLQkCEJMTMyLL74oXani4uL6+novL6+OHTv26NHD5ClKbGysh4eHTqczCSF17dr1xo0bHh4e5hmbAwcOjIiIOHTo0LVr12pqanx8fOLi4pKTk1scWFSpVJMnT/7uu+/Onj27devW2tpa83d/AnANUmK2bX9dE1oCALSxNuuVxMTEvPzyy6dOncrKyiosLKyurlapVCEhIT179kxKSpIfDAt2uEW33JAhQ0JDQw8ePJifny8IQmhoaGJiYp8+fY4dO2bSQwwNDf3zn/+8b9++a9euGQyG0NDQpKSk/v37Wx5asrxLNXz4cFEUMzMzpWyvpqt14NkzZvMOo+UVWn4RLe9ptpLNd2TVj4TzUjQxMT4AAK6hrq7u2rVrHh4eJuHs1igqKrp582ZISAgTPQIA0E5cunTpyy+/jI2NnTZtmqPbghbiIjojnrUCAFyfPTKMyFoCAKBdEUVRGi1oMm0rnAgX0Uk5x4A4AABag9ASAAAu5vPPP09MTIyOjg4KCjIYDPn5+T/99NPVq1e9vLwSEhIc3TpYhIvoMggtAQBcH6ElAABczLVr165du2ZSqFKpHnnkEemdXGj/uIguQ+WSk5MDAGCstra2qqrKy8srICDAVnWWl5fr9frAwEAvLy9b1QkAACzUtWtXg8FgMBj0er1CoQgKCrrtttvGjx9vw3kVYW9cRJdB1hIAwPWRtQQAgIuJi4szf6k0nAsX0WVwQwwAcH2ElgAAAAA7IWsJAOD6OnToEBwc7OPjY8M6CS0BAAAAAqElAIA78PPz8/Pzs2GFoiiKoigQWgIAAIDb44YYAACrSSlLAqElAAAAuD1uiAEAsJo8Gk6hUDi6LQAAAIAjEVoCAMBqTLQEAAAASLgnBgDAaoSWAAAAAAn3xAAAWI3QEgAAACDhnhgAAKsRWgIAAAAkCundyQAAwHKiKEp/QIkuAQAAwM0RWgIAuD6DwUAMCAAAALAHD0c3AAAA+9LpdFeuXBEEoUePHo5uCwAAAOBqeIQLAHBxzIsEAAAA2A8D4gAArk+v14ui6OFBri4AAABgY4SWAAAAAAAA0EKMDgAAAAAAAEALEVoCAAAAAABACxFaAgAAAAAAQAsxoSkAAFYrLS0VBCEoKEilUjm6LQAAAIAjEVoCAMBqpaWloigGBAQQWgIAAICbI7QEAIDVgoODDQYDcSUAAABAIYqio9sAAAAAAAAAp0TWEgDAxZWXlxsMhoCAAE9PT0e3BQAAAHA1hJYAAC7u5s2b9fX1Pj4+hJYAAAAAm1M6ugEAANiXXq8XBEGp5E8eAAAAYHvcZwMAXJzBYBAILQEAAAD2wX02AMCViaIovbCCt7kBAAAA9kBoCQDgyqTRcAJZSwAAAIB9cJ8NAHBljIYDAAAA7IpbbQCAK5NCS4yGAwAAAOzEw9ENAADAjuzxejiNRlNeXh4SEtKxY0cbVgsAAAA4I7KWAACuzB4D4qQ6FQqFDesEAAAAnBRZSwAAV2a/0BLzNwEAbO6JJ544cuSIo1sBpzRr1qy//OUvjm4F3BShJQCAK5MGxNl2riVCSwAAO8nPz4iyXGwAACAASURBVH/rrbfuvfdeRzcETuadd94pLy93dCvgvggtAQBcmT1CS6IoCoSWAAD20alTp65duzq6FXAygYGBjm4C3Bq3xQAAV8aAOAAAAMCuuC0GALgy+w2IYxpvAAAAQCC0BABwbcy1BABA67XmgYozPoxxxjYDDsRtMQDAlTEgDgCAZqWlpXl5eXl6esbExIwZM8bRzbEXhUJBzAiwB26LAQCuzOZZS6IoMo03AMDFTJkyZf369VqtNjc3d8eOHeYrSH/7WqaxbaOiolpcp21b0po1jbX9EQHtBLfFAABXZo/QkvSB0BIAwGVotdoJEya08U4LCgqaXqGurq5tWmIrzR4R4Kq4LQYAuCxp5Jpg09CSPIc3GfUAgDaTlZU1adIktVrt4+MzbNiwvXv39uzZU1567ty58ePHR0dHR0dHT5w4MSsrS14k/cGqrKwcP368l5eXl5dXWlqacc3x8fHSXzTFb0aMGGG8wsWLFxv7q7dp06YePXr4+/v/8Y9/rK6uNl+tsW27d+9uslOTddavXx8dHd2hQwd/f//Ro0cfP37c+HD+8Y9/BAQEZGRkLFy40M/Pz+SImpWTkzN8+HAPDw/zs9FEm6UxgwqFIigoaOLEifv377/99tstP6ImrpFgdF+xa9euO++8s2fPntu2bWusNulrjx49rDpqwK4ILQEAXJaUsmTbMBCvhwMAtLFz586NGTNmzJgxZ8+eraioWLdu3cWLF0tLS+Wlf/rTn5YuXZqXl5eXl/fRRx9NnTpVjlxIybYzZsz429/+VldXt379+ilTphhXnpOTI60j/mb//v3GK/To0aPB0WGHDx9+++23N2zYUFJS8tJLL6Wmpgpm48ga2zY7O9tkp8ar7d+/f+3atVu3bq2uri4sLHzzzTenT59+7Ngxuf6LFy+uWbPmkUceKS4uXrt2rckRNev555//6KOPtFqt+dloos3SmEFRFMvKylasWJGXl1dUVGThETV9jeTjWrZs2ZEjR7Zv356VlbVmzRqpfMuWLePHjzeurbq6umvXrocOHbLqqAG7UrRm0CwAAO2ZwWCoqqoSRTEwMNBWddbW1l6/ft3Dw6NLly62qhMAAMnw4cNnzZqVkpJiXPjII49MmjTp6aefbnCThx9++IUXXhg7dqxcsn379hUrVnz//ffSV4VC8e233z722GPyV/M+YIOFTa8wZsyY1157bfTo0dLXTZs2TZo0qcFKGqu8sfLhw4d/8cUXnTt3lkt+/fXX119/fffu3dJWN2/eDAwMVCgUFRUVAQEBzTbeZKcnT5688847rW1bYGDgt99+m5yc3MRNRWO1NXuNpG137dp1//33S1/1er2cc3333XcvXbo0KSlJ+vrxxx/n5eV98MEHxruYPn16fHz8zJkzGz90wI4ILQEAYIWamprc3FwvL6/4+HhHtwUA4GoaDC0FBgZeunQpLCyswU0CAgJycnJCQkLkkpKSki5dulRUVEhfTeIdtgothYaGZmdnBwcHyzsNDQ21SWjJx8entrbWpNDX17eqqsp4K/MPlrDkbDRYnpmZ+fLLL//888+dOnW6/fbbfXx8li9fHhkZackRNXuNmj6Kf/3rX/Pnz9+zZ48gCHV1dX379j148GBERITxOoSW4FgMiAMAwArSgDjm8AYAtBm9Xt/0QGzzkIRTJxD4+PhcuXJF/D0pruRAffr02bt3b11dXU5OzrZt2zZu3Pjss89avnlrrtG9996rUqn27t0rCMLq1avHjRtnElcCHI47YwAArMBcSwCANjZkyJAtW7Y0tnTEiBGHDx82Ljl06NDIkSPt3aoBAwYcPXpU/irl1LSG/D64cePGff31162srQ2kp6c3vYJ8RK2/RgsWLHjrrbfq6+s//vjjWbNmWdtUwN4ILQEAYAWylgAAbWzhwoVvv/32nj17RFGsqanJyspatWrVM888Iy1dvHjxnDlzMjIydDqdTqfLyMiYO3fu4sWL7d2q1NTU//zP/7xw4YJWq83IyPjxxx+trcHT01N6QVtBQcHy5cuTk5Ol8vfee2/lypXz58+/evWqVqstLS3duXPnuHHjbHwAVgoLC9u8eXNZWZn0NSMjw9PT02Sdxo6o9ddowIABMTExkydPHjVqVFRUlC0OCLAl7owBALACoSUAQBtLSkpKS0tbvHixWq2Oiop66qmnamtrP/30U2npbbfd9s033yxatEitVqvV6sWLF69bt65Xr17SUinNVk62NfkqCMLp06flQonxTE9yoclnQRAGDx48d+7clJSU4ODg5cuXmwdKmthWIr2gTalUDho0KDs7e+vWrVJ5TEzMwYMHs7OzBw4c6O/vn5ycvH//fumNaQ0ejmBxNnGzZ6OJNnfp0iUqKurFF1+MiopKTEx8/PHH169fb1J/Y0fU9DUybkmDJ0ryzjvvpKenz54925IjBdoY03gDAGCF0tLSkpKSoKCg8PBwR7cFAOBqGpzG2yloNJpu3boZz0sN2/r8888PHTq0cuXKBpcyjTccy8PRDQAAwJmIoqhUKuX3AQMAgPz8/Hnz5s2YMcPRDXFZer1+yZIlchoU0N6Qzw8AgBU6duzYrVu3jh07OrohAAA42Pvvvy+N3rrrrrv69ev39ttvO7pFLkg6wx4eHufOnevWrZujmwM0jKwlAIDLqq2tVSqVnp6evNANAACbmzlzJiOw7I0ZbOAUyFoCALis/Pz8nJyc+vp6RzcEAADYXXx8vKIR8fHxjm4d4MrIWgIAuCwPDw/5XwAA4NpycnIc3QTATXG3DQBwWXFxcY5uAgAAAODiGBAHAAAAAACAFiJrCQAAAADahZycnGnTpjGUG9aqrq4eO3aso1sB98XvLAAAAABoF8LCwiZMmJCUlOTohsDJLFu2LDY21tGtgPsitAQAAAAA7YKvr+9dd901atQoRzcETiYtLU2tVju6FXBfhJYAALCUKIqFhYWCIHTq1EmhUDi6OQAAAIDjEVoCAMBSBoOhsrJSEATiSgAAAICE0BIAAJZSKBTh4eEGg8HRDQEAAADaC0JLAABYSqlUBgUFOboVAAAICoVCFMXGFgmC0NjSputsdsMm9muT9QE4I6WjGwAAgF0UFBTk5+fX19c7uiEAALRcZGRkg+VNxGtaHMqxZENrK7d8/YCAAKtqBtB+EFoCALimmpqaqqoqnpQCAJya9PoIY+np6QqFwmTWv6qqqqlTp/r7+/fv3//MmTMmmyQlJSUlJVm4x2vXrg0ePFitVj/zzDNVVVVN77e6uvq5555Tq9UJCQlZWVnGKzS4vlSyfPnymJgYLy+vtLQ0qTwkJKSyslLxGwubCqCdILQEAHBBoijq9XpBEDw8GPoNAHApKSkp5g9OZs2aFRkZWVpaunv37h9++MFkqSiKlj9rWbNmzcaNGy9duuTv7z9z5sxm9xsSElJYWHjgwIEdO3YIRmlKDa4vleTn52dmZq5fv37KlClSeWlpqdxOHgsBToeBrwAAF6TX6y9fviwIQvfu3Xn4CQBwFsOHD581a1ZKSkp0dHR+fr7xoqioqLy8PPmryRxGISEh2dnZISEhgiCUlJSEhoa2rKOnUChyc3Ojo6MFQSgtLe3du3dRUZHJCsY1h4eHnz9/XtqvRqMJDw832a/5XEvGJY19hrWmT58eHx9vHAoE2hLPcgEALkhKWVKpVMSVAADOSI4itSDgYqt5Bg0Gg1LZzDAX47+zNgwM1dfXe3l52ao2APbGgDgAgAuSQ0uObggAAG3h8ccf//DDD7VabX5+/uLFi02WWjXX0sqVK3Nzc8vKyhYsWDB58uSmV54yZcrSpUsNBkNlZeWqVata0vTfeHp6pqWlabXa7du3jxo1qjVVAWhjhJYAAC6I0BIAwDWEh4eblMgTXRvPeP3BBx/k5uaq1eqxY8c+88wzwu/zifR6vSUpRdImU6dOnThxYteuXSsrKxctWtT0fhctWlRYWBgaGjp06NCHHnqo2XbKJSb/CoIgTb2kVqtXrVq1evVqy04PgHaBAXEA7GLhwoUZGRlbt25tYh05wTslJeWee+6ZPXt2W7UOrk+n0wl2CC3pdDqDweDh4dHsAAEAAGzixo0bJiUNBon8/Py++OKLL774osF1jh8/bsm+5K2OHDnSxFJjvr6+K1euXLlypVar3bp1a58+fZpe37jQZIUJEybYaigfgDbGnTEA26uqqlq6dOnSpUulr81OdvPRRx999NFHNTU19m8a3IWdspZKSkpycnLKy8ttWy0AAM7rrbfeUigU/v7+a9eu3bdvn6ObA8ABCC0BsL1NmzYlJyf36NFD+tpsAnbv3r0HDBiwefNmG7ZBq9XasDY4HTuFlgwGgyAIpCwBACBbsGCBKIp1dXVpaWkRERGObg4AB+DmGIDt/fDDD4899phVm0yePHnLli022XtdXd0//vGPd9991ya1wUlJA+I8PGw87pvQEgAAAGCCm2PAxZkMRpO/7t27NyEhwcfHp3PnzvLrPAwGw/z587t06RISEvLMM89UVVXJWy1dujQ2NlbqUTe4rbFjx44NGTLEfKf19fXTp0/v2LFjp06dPvjgA+NN7r777gZH9Vulrq7u008/jY6OfuWVV6ZOndrK2uDU7JS1JKXgEVoCAAAAZEzjDbipp556avny5Q8++OCNGzf+/ve/P/vss4IgfPzxx//617/27dsXHBz8yiuvzJ0798MPP5TW//HHH3/55ZeoqKjGtjVWWFgYGRlpvtOFCxdeuHDh9OnToig+/fTTxouioqLy8/NbfDi1tbUrVqxITU2tra3VarWTJ0/u2rVri2uDCyBrqQkFBQVMbQYAxoKCgjp27OjoVgCAsyK0BLgpDw+P/Pz8oqKiuLg4OfNo5cqV33//fZcuXQRBWLJkyaBBg+TQ0rJly6S4UmPbGmtscqWvvvpqy5Yt0dHRgiB88skn/fr1s8mxHDt27MEHH9RoNHK3f9u2bSEhIdLSmpqa2tpam+wIcA0hISGWvIIaANxEbW3tX/7yl48//tjRDQEAZ0VoCXBT33///bvvvjtv3ryQkJBly5aNHTtWEIScnJzevXvL6xinZsTFxTW9rbHIyMj8/Pzu3bublOfl5cnJRCZL8/PzG0x0ssSAAQO2bdv21ltv/fTTTzqdTqFQTJs27aWXXpKWajSar776qonN/f39PT09W7ZrtE+iKJaVlQmCIEcYbaWsrEwUxcDAQJvnQ7WZd999t3Pnzha+hRoA3MGCBQs0Go2jWwEATsxZ74wBWKhDhw7V1dW+vr6CIBQWFsrlCQkJaWlpoiimp6c/88wzBQUFgiDExcXt2LGjc+fO5vUYz9nU4LbGBgwYcPDgQfPQUnR09OXLl/v06SMIwqVLl4wXHTx4MCkpqcWHmZiYuGPHjn//+99vvfXWjh07Vq5cOW/evICAAEEQunbtOmjQoBbXDGdUX1+fk5OjVCq7detm25qzs7NFUezcubPzhiOZ4R4AIEtLS5syZYq/v/+dd965f/9+40UKhcImKa62qseG+5Vua1vQKks2tPZ4HXV+ANty7tkiADQrMTFxyZIlVVVVV65cef755+XyJ554IjMzU6vVCkbZSS+88MJzzz137ty5+vr6X3/99fHHH2+wzga3NfbQQw9t3LjRvPzJJ5987bXX8vLy8vLy/uM//sN40caNGx966KGWHuX/6d+/f3p6+okTJ+67775PP/20lbXBedlpoiWBabwBAG2uxWndlpgyZcr69etLS0tN4kpCiyIvDTKvR3r416Dq6mqb7LTB/VqyqMV1trhyy9dv4rwBDsfNMeDi/vu//3v79u2hoaEjRowYM2aMXP7II49MnDgxKCjo7bfflseLvfzyyw8//PDEiRMDAwP/8Ic/PPHEEw3W2eC2xiZNmnT48OELFy6YlL/11ltdu3bt169fQkLCAw88IJdnZWUdOXJkwoQJrT1aQRAE4a677tq8efOUKVNsUhuckZ1eDydN5iWYvXgRAAD7Mc46FwShtrb21VdfjYiIiIyMXLNmTc+ePaVyrVY7e/bsXr169ezZc+bMmfX19VK5QqFQKBTLly+PiYnx8vJKS0uTyuPj4xUKhVarnThxorSOvIv09HSTEkEQqqurn3vuObVanZCQkJWVZb6CuQbrCQkJqaysVPxGLtdoNAMHDvTz84uIiHjppZekGJO0ztKlSwMCAjIyMlavXh0QECAfglX7raqqmjp1qr+/f//+/c+cOWOySVJSkuXp89euXRs8eLBarTZ+n3Jj+23ivDW4fmPXq7HzBrQThJYAF3f77bcfOnSopqbm6tWrL7zwgvxg5PHHHz9//nxNTc2JEydGjBghFSqVypdffvncuXO1tbWnT59+5JFHpHKTxykNbmvM19f39ddff+2110w29/b2/q//+q/S0tIbN27MmDFDLn/99ddff/11Hx8fGx44b4hzZ3bKWpJ/YslaAgA4yptvvllfX3/mzJnLly/7+fmVlpZK5XPmzImOjs7Kyrpw4UJ0dPScOXOkcumPV35+fmZm5vr16+Vnbzk5OdIi8TfyLlJSUsxTaWbNmhUSElJYWHjgwIEdO3YIFqTbNFiP1GDznc6YMWPJkiX19fWXLl0aOXLkjBkz5F3o9fp//vOf48aNO3PmzD//+c9mHx821v7IyMjS0tLdu3f/8MMPJktNGtO0NWvWbNy48dKlS/7+/jNnzmx2v42dtwbXb+x6NXbegHaCgZ0AAFdTXFxcVlYWHBwcFhZmw2q1Wu3Vq1cVCoX5PGJORKFQJCQkMI03AMikabwtf0Pcu+++a5yrYlubNm36+OOPU1JSoqOj8/PzjRdFRUXl5eVFRkaePXvW/D0VnTp1On/+fHBwsCAIZWVlffr0kWfDNJ7Nx2Rmn6YnJDJeFB4efv78eWm/Go0mPDzcwo6k+S4a3GnHjh3lMJkgCGFhYUVFRcYrm3+war8hISHZ2dlS+0tKSkJDQ1vWEVYoFLm5udL7jktLS3v37i21s7H9Nnvemj4/TVw7E9OnT4+PjzcOdQFtiWm8AQCuRhoQZ6esJVKWAMDNffLJJ9OmTVOr1faoXB7NnZeXJ30wCShImbkNsmvSgPEgLBvuqL6+3svLSxCExMTEXbt22araZndqk3oMBkOzdwX2Pm9AO0FoCQDgasLCwtRqtZ3mWmKCAwDAX//61wbfqNt66enpTa/w6KOPLlmyZOHChRqN5ueff/7uu++kiS+ffvrplStXSuPIVqxY8dRTT9m2YVOmTFm6dOm8efOqq6tXrVrVmqo8PT3T0tIefPDBPXv2vPfeez/99JMgCGPHjl21atWYMWOioqLs8RTn8ccf//DDD1NTUzUazfvvv2+yVJpo6ciRI5ZUtXLlymeffdbPz2/BggWTJ09uemV7nzegneDRKwDA1SiVSi8vLzuFlshaAgC0pfDwcOOvS5YsKS8vDw8P79u37+bNmz/44AOpfP78+RqNJjY2NjY2tqSkZP78+VK59ETE/F9pDmnht3mjjR+cyF+NyxctWlRYWBgaGjp06FAL3+rbYD2CIEhTCKnV6lWrVq1evVoqfOWVVzQazbBhw0JCQkaPHr1o0SKTBgsWP91pcL8ffPBBbm6uWq0eO3bsM888Y1KbXq+3cJCdIAhTp06dOHFi165dKysrpXY2sd8mzluD6zd2vRo7b0A7wVxLAABYpKqqKj8/v0OHDrGxsY5uS8sx1xIAmLB2rqWwsLCjR4/aKWtp+PDhs2bNSklJsUflNqHVardu3TpnzpyzZ886ui3OxN7njbmW4Fg8egUAwCIMiAMAuLO33npLoVD4+/uvXbt23759jm6O0+C8wR0QWgIAwCJM4w0AcGcLFiwQRbGuri4tLS0iIsLRzXEanDe4A+6PAQCwCFlLAAAYi4iIUJhpg+iJo/YLoDG8IQ4AAIuQtQQAgLEbN2641X4BNIb7YwAALKJUKr29vT09PR3dEAAAAKAdIWsJAACLBAUFBQUFOboVAAAAQPtCaAkA4FIqKyu1Wq2vr6+3t7ej2wIAAAC4PgbEAQBcSkVFRXFxcW1traMbAgAAALgFspYAAC7F19dXpVKRsgQAgD0oFArpvRYNLhJ+e+uFPeoH0G6RtQQAcCnBwcEREREdOnRwdEMAALCByMhIk5KAgABbVV5dXW3tJk3EfWwSErK8EhueBwCtRNYSAACAc5s+ffq6desc3QqgHfH19c3NzXV0K2yjsLDQ+GtISEhlZaWUHyQYBWKkkm3btqWkpKSnp48bNy4mJub69etS+Z49e5544om4uLjvvvsuPj5eEASNRpOSknLs2LHw8PDHHnvs/fff9/X1bbolUrXC76M/VVVV06dP37hxY48ePb788kuTTZKSkgRBOHLkiCVH2mD9Uvs/+eSTxYsXFxUVrV+/fsKECU2cBwAOQWgJAADAuVVXV7/xxhvPPvusoxsCtAsajSYhIcHRrbCX0tLSBoeMHTp06LXXXktJSREEYezYsQMGDFi9erUgCKIoKhSKkpKS69evb9my5bXXXtu0aZMgCDNmzFiyZElycnJdXd3u3btnzJjx2WefNb3rlJQUqTbjwlmzZkVGRpaWllZUVKxcudJkE6siPg3WL5Xk5+dnZmbu3bt3ypQp9fX1TZwHAA5BaAkAAMDp+fj4qNVqR7cCaBek0IOzi46Ozs/Plz5L0ZaoqKi8vLzG1h88eHBkZOSmTZsmTpz43Xffde/e/Y477pCXPvDAA97e3mPHjp02bZpU8sMPP3zxxRfyCmFhYc2Glhr0zTffZGdne3l5hYaG/uUvf3nzzTeNlx49erQFdZp77733BEGYMGGCVqu1SYWuR6vVfvLJJ99++62jG+LuNm/eHB0d7ehWOAChJQAAAABoX+QoUtO5OfX19V5eXtLnhQsXPvroo+PGjfv73//+3XffNbi+h8f/dQATExN37dpl0yY7MqhnfB7ck0qlGjt27JQpUxzdELf22GOP1dXVOboVjkFoCQAAi+Tl5en1+sjISE9PT0e3BQDgvjw9PdPS0h588ME9e/a89957P/30k1Teu3fvIUOGPPTQQ4MGDerRo4fxJj///PMDDzywffv2+++/XyoZO3bsqlWrxowZExUVpVS2/OVOjz/++IcffpiamqrRaN5//32TpVbNtWStxs6De1IqlT169Bg1apSjG+LW3Dm+SWgJAACL1NTUMKcDABOtme2FmWJgifDwcJOS9evXT5kyxcvLa/To0dKESrI33nijT58+Fy9eNNkkKiqqW7dusbGxGzZskEpeeeWV999/f9iwYWVlZYMGDRoxYsTs2bObbok8C5L0Qfrp/eCDD1588UW1Wt2tW7cvv/xy2bJlxj/Yer3e8rhVg/VLn6U6jT83fR4AtDFCSwAAWCQqKspgMMhDCQC4g7S0tClTpoiiGBERcfvtt+/YscPRLYLbuXHjhknJhAkTGht6tm3bthdeeCE2NtakPCEh4fr168YlKpXqjTfeeOONNyxvSYORUD8/vy+++EKetslknePHj7eyfuNCkxWaOA8A2hj3xwAA12EwGFqT1d+0Zt/KDMD1TJkyRX7ZeYNak3bU2LZRUVHy/M2A5eSsn6VLl5oUkiIHwK4ILQEAXEdOTo5er4+NjfX29nZ0WwC4Aq1W20RcyU4KCgqaXqGuro7fcjDXbNYPANiJvR7tAgDQxkRR1Ol0oiiqVCpHtwVAG8nKypo0aZJarfbx8Rk2bNjevXt79uwpLz137tz48eOjo6Ojo6MnTpyYlZUlL1IoFAqForKycvz48V5eXl5eXmlpacY1x8fHy+kekhEjRhivcPHiRancvFWbNm3q0aOHv7//H//4x+rqavPVGtu2e/fuJjs1WWf9+vXR0dEdOnTw9/cfPXq0PNpIWvMf//hHQEBARkbGwoUL/fz8TI4IaFZERITCTEREhKPbBaC9I7QEAHARer1eEASFQsF0SICbOHfu3JgxY8aMGXP27NmKiop169ZdvHixtLRUXvqnP/1p6dKleXl5eXl5H3300dSpU+XokpTKMWPGjL/97W91dXXSfMDGlefk5EjriL/Zv3+/8Qo9evRoMB/k8OHDb7/99oYNG0pKSl566aXU1FTBLHOksW2zs7NNdmq82v79+9euXbt169bq6urCwsI333xz+vTpx44dk+u/ePHimjVrHnnkkeLi4rVr1/Iacljrxo0bohnzyZ4AwAShJQCAi9DpdIIgkLIEuI/Zs2fPmzfvueeei4qK8vT0jImJ+etf/1pcXCwtnTVr1rx587p06SJ97dy589y5c2fNmmVcw3333Tds2DCFQjFhwgStVmuTVqWmpn700Ud33XWXt7f34MGDBw8ebJNqpZo/++yz/v37+/j4+Pv7Dx8+fOXKlcbTMM+bN2/SpEnFxcXSB1sdEQAATeO5LgDARUihJVKWAPexf//+VatWNbF0zZo1xiVJSUkmiTyPPfaYzVt17NixQYMGyV+HDx9uq5qPHDkiR8pkxm8YCAwMlD4EBATYaqcAADSLrCUAgIsgtAS4G71e3+BURzLzQWdOPaWxj4/PlStXTAYrVVVVObpdAAB3R2gJAOAipKEfnp6ejm4IgDYyZMiQLVu2NLZ0xIgRhw8fNi45dOjQyJEj7d2qAQMGHD16VP66Z8+eVlZYV1cnfRg3btzXX3/dytoAALA5QksAABdh16wlnU5XXV0td/AAtAcLFy58++239+zZI4piTU1NVlbWqlWrnnnmGWnp4sWL58yZk5GRodPpdDpdRkbG3LlzFy9ebO9Wpaam/ud//ueFCxe0Wm1GRsaPP/5obQ2enp7Sy90KCgqWL1+enJwslb/33nsrV66cP3/+1atXtVptaWnpzp07x40bZ+MDAFxRY+9zbI05c+bIn9etW6dSqRQKhfnrJuV37QUHB2dmZjZbblwt4CwILQEAXIRds5YqKyvz8vLkN08BaA+Sy3l31AAAIABJREFUkpLS0tIWL16sVqujoqKeeuqp2traTz/9VFp62223ffPNN4sWLVKr1Wq1evHixevWrevVq5e0VOpkyl1Nk6+CIJw+fVoulKSkpMhL5UKTz4IgDB48eO7cuSkpKcHBwcuXLzcPZjWxrUR6XZ1SqRw0aFB2dvbWrVul8piYmIMHD2ZnZw8cONDf3z85OVmeT6rBwzE5IjipyMhIO9XcxJxc1dXVNqmn/bD5YNiLFy+WlZXJX6dPn75161ZRFM1fNyn89s7H8vLyPn36NFteVlZ2+fJl27YWsDdCSwAAF2HXrCXpllSp5O8m0L4kJSXt3r27vLy8rKzsyJEjL730kvG01rfddtuWLVtu3bp169atzZs3y3El4bcendzbNPkqCMIdd9xhMqtRenq6+ebG5KWTJk3Kzs6uqqpat25dbW2tSce76W0FQZgwYUJ9fb3BYLh27dqyZcuMIwvR0dFr1qzRaDR1dXXnz59ftGhRWFiYSfvNP8CpFRYWGn+tra199dVXIyIiIiMj16xZ07NnT6lcq9XOnj27V69ePXv2nDlzZn19vVQuxS6XL18eExNjnFATEhJSWVlpHtzUaDQDBw708/OLiIh46aWX5BiTtfVIkpKSkpKSmj1Gk81Nvr788su9evXy8/O7//779+/fb7xOeXn5tGnTAgICZsyY0fT5kezbt8+k/dbWL1u5cuUDDzwgfy0tLR07dqwgCOPGjevfv3+zh9yEkSNHrlixojU1AG2PW2QAgCswGAx6vV6wW9aSwWAQeP4PwEr5+flz5swx75QCLfbmm2/W19efOXPm8uXLfn5+cjrtnDlzoqOjs7KyLly4EB0dLQ+qksKL+fn5mZmZxgk10obmwc0ZM2YsWbKkvr7+0qVLI0eOlH96ra1H3sqS+KYoioMHD87IyJC+ZmRkDBkyRN7wvffey8rKKi8vnz179sMPP2zcnokTJw4bNiwvL2/MmDFNnx/J9u3bs7KyTBKLrKpftmvXrttuu838WPbu3btt2zbjEh8fHylQZRLSaqy8d+/eu3btavakAe1Lg49NAABwLnV1dRcuXMjOzrZT/RqN5sKFCxqNxk71txlBEBISEhzdCtjY1KlTly9f7uhW4P+TB8GFhYVxadpeYWGhn5+f5evPnz//1VdftXz90NBQ81f12co999yzbds2URSjoqJMOm5RUVGiKHbq1KmkpMR8w4iIiLKyMulzaWlpp06d5EVCQ3ltJp9lISEhxjsNCwtrWT3W2rlz56hRo6TPo0aN2rVrl/T5woULDz74YEhIiJ+f37Bhw0z2e+vWLZN6Gjs/0vpardakzdbWLwsMDDRfunv37oKCgsY2ycnJ8fT0bLb85s2bQUFBjVXSmBdffHHx4sXWbgXbCg8Pv3TpkqNb4RhkLQEAXIG9Xw9H1hIAy82cOVO61S4qKnrppZcc3Rw4pby8POmnSPgt2JGXlyf8Nvq7QWIrxj/KA+gSExONu4tFRUUtq8daDzzwQE1NzYEDBw4cOFBbW3v//fdL5ZMnTx46dOi5c+fKy8u//fZbk638/f1NSpo4P0JDo+atrV9mfrbXrl0bHx/fqVOnxjaJi4uTbleaLW/NpQQcgtASAMAV2HWiJYG5lgAA7cOjjz66ZMkSQRA0Gk1aWtof//hHqfzpp59euXKlFA9asWLFU0891WxV0rsItVrt9u3bR40aJRWOHTt21apVubm50jMVSzRYj8TCuZYk8+bNmzt37ty5c+fNmycX5uXlDRgwIDAwMDMz85NPPmm2ksbOT2OsrV8WHx+fn58vf92wYUO/fv169Ogh/P5B1LBhw+bOnXvp0iVBENLS0uRnYI2VC4KQm5vbtWtXy1sCtAfcIgMAXAFZSwAAlxQeHm78dcmSJeXl5eHh4X379t28efMHH3wglc+fP1+j0cTGxsbGxpaUlMyfP18qN357oMmbBKUph9Rq9apVq1avXi0VvvLKKxqNZtiwYSEhIaNHj160aFHL6pHo9XrLE3BGjhxpMBhEUbzvvvvkwhUrVkybNi0kJGT27NlPP/20eRtMpg9v7Pw01n5r65c98MAD58+fl79OnTo1ISHBfOW0tLScnJzExESFQjFlypT169c3XS4Iwvnz50ePHm3hSQPaCQW5dgAAF1BYWHjr1q3Q0FC1Wm2P+vPz86uqqiIiIgIDA+1Rf5tRKBQJCQnHjx93dENgS3/+858TExMZeAVIbty40a1bt8rKSgvXX7BggUaj+fjjjy1cPyws7OjRo507d25h+5o0fPjwWbNmpaSk2KNy2NCFCxeWLVv22Wef2bzm6dOn/+1vf7M2cWn69Onx8fEzZ860eXtguYiIiEOHDrln0hlZSwAAV0DWEgAAaDM9e/YMDg62R80hISHuGZuAU7PXnBQAALQle8+1JIWWmGsJ7dPp06e3bNny97//3dENAdoFURQtnycIaLEFCxbYo9p3333XHtUCdkVoCQDg9ERRlEJL9staYhpvtGfdunUbNWrU5MmTHd0QoF0oLS0dP368o1sBAG6E0BIAwOlJcSWFQqFSqey0CwbEoT3z8/OLjY1NTEx0dEOAduHGjRv8ugaAtkRoCQDg9AwGQ4cOHeyaUkTWEgAAANAgQksAAKfn7e0dGxtr112QtQQAAAA0iKevAAA0j6wlAAAAoEHcIgMA0AwpriSQtQTn18TPsEKhaNlPuCUbWlsz/9cAAHAihJYAAGgGoSU4ncjIyAbL5R9mqxY1zZINra3c8vUDAgKsqhlAO+HAP6ktjqQDaAyhJQDA/2Pv/uOiqvP9gX8GZExmwGaAmYbRLNzQarPiV+bVuoZo4I8NVODea4RibT8gyw1Bci3bBAyMHrJ5rwtcte1WuOpcU7HwV0kLrebe6iKKiqUyCIwOowwjM8PMfP843849Oz/O/GDgzMDr+YePM5/zOe/P+5wBGd58zueAE9RCSwSlJfAfnZ2dVi11dXW2v0319fVlZ2cLhcJHH320ubnZ6pCEhISEhAQXR7xy5cr06dNFItGKFSv6+vrYx9XpdM8//7xIJIqJiWltbWV2sNufaqmsrJwwYQKfz1coFFS7WCzWarW8X7iYKoB/cVQpdotOp3O9M0vF1ltxiJsVZ7fGdcrFob11HQBGAyzjDQAA4AT1GRS/uMLQ+etf/3rmzBmPD29ra4uNjWXvk5KSYrFYrL6MCwoKZDKZWq2+detWVVWV1SFu/eK3Y8eO3bt3BwcHv/3222vWrPnwww/ZxxWLxZ2dnQMDA9XV1cyx7PanWjo6OlpaWo4ePZqRkWEwGAgharWax+N5PN8KRjCTyfSnP/3Jxc6nTp3SarWu9+/v7/c0L09YVYr7+/sLCgo+++yzgICAkpKS4uLi8+fPk19+SPX09Pzud7/btWvXiy++WFZWRghRqVQpKSnfffedRCJZunTpe++9FxwcTIXKy8urr69vb2+fMWNGUVHR7NmzCaNiS/Whv79Y4tjlKA4hpK6ubv78+cRmUvD777+/fv36L7/88uzZs6+99tpHH32UmprKPi5V/j558qTTy9jX1/fKK6/s3r37vvvu+/Of/8zcNaTXAWCUwA9jAAAAJwwGw+XLlwMDA6OiorjOZbB4PF5MTMzp06e5TgT+QV5e3tdffz116lTPDv/hhx/y8vJyc3PlcnlHRwdzV2RkpFKppF9aFWLEYvHFixfFYjEh5MaNG+Hh4Z59MuTxeO3t7XK5nBCiVqunTp3a3d1t1YEZWSKRnDt3jhpXpVJJJBKrcW0LRswWR9sAlK6urkmTJi1atMjF/mfPntXr9Y888ojrQ3z44YcREREeZefEk08+WVBQkJKSQrdYfZGvXr369u3b77zzjlAoPHDgwEsvvXT9+nW65+zZs7OystLS0k6dOpWYmEgIyc7OXr58+YwZM/R6/eHDh48cOUJXfrVarVAoNBqNJ06ceOaZZ3p7e+2OSGGJ4wj7t6fVXh6PV1ZWds899zz//PPZ2dn/9E//9K//+q8Gg4F93Pj4eELIqVOn2DMhhOTm5oaEhGzYsIGqpBcVFdGjD/V1GB6vvPLKpEmT1qxZw3Uio5pUKm1qahoBHxc9gB/GAAAAThiNxuvXrwcGBkokEq5zGSyUlnxTXl6eXC4vLCz07PDly5fHxsbm5ubSLY5+o2MpLV27di0yMnLwpaXr16//+te/tppnYTWuVCo9e/YsNW53d7dUKvVKaclgMPD5fA/yhxGmq6tr8uTJWq3Wxf4bN25UqVQffPDBkGblIrq05KhSLJPJzpw5Q337WOHxeL29vUKhkNkYFhamVqvplxEREVTl98KFC6tXr25sbNTr9TExMQ0NDewVW0dxWLhbWqLnCDM3PBjXLkeV9GG4DsMDpSVfMJpLS1hrCQAAwImgoCCZTDYC6koAVjIzMzdv3mw0Gjs6OjZt2mS11621lqqqqtrb23t6ejZu3Jiens7eOSMjo6Kiwmw2a7Va6oY4jwUFBSkUCqPReOjQoTlz5gwmFIBPUSqVFouFKm1QG9QMxIGBAZajrOpKhJDY2FgLA10HSU9Pnzlz5tmzZzUaza5duxwFpG4+ZYnjIjqOuwY5rtNkhvk6AIxUKC0BAIB/u379+uXLl2/dusV1IgA+xLYSSi90zVzxuqysrL29XSQSJScnr1ixgvzjmmImk8mVSUzUIdnZ2WlpaVFRUVqttrS0lH3c0tLSzs7O8PDwmTNnLly40GmedIvVv4SQ2trajIwMkUhUXV1dU1Pj2uUB8GNLliwpLy8nhKhUKoVCsWzZMvb+ycnJ1dXV7e3t9CMpKEqlMi4uLjQ0tKWlZcuWLcxddiu2juKw8Erll31c1yvgjirpw3AdAEYDlJYAAMC/6fV6j/8WCjBSdXV1WbVY/hHVKBAIdu7cqdVqf/jhh2nTpjF3EUJOnz7tygom1FH33HPPyZMne3p6qqqqmIva2h03ODi4qqpKrVafOnXq4sWLDzzwAHt/5kurXampqQaDQavV7tmz57777nP3QgH4PqtKcXl5uUajkUgkDz744L59+6i1ugmj6mr1wMRXX31VpVLNmjVLLBbPmzePrvxu27YtJydHLBYXFhZmZWURZxVbR3FYOKr82laQrUrGruRPcbECThxX0ofhOgCMBlhrCQAA/JvRaDQajXw+f8wYPPbUOay15Ju8vtaS73vzzTeLi4v5fH5KSsp//Md/SKVSrjOCkWNkrLXEdSLgZ7DWki/AWksAAAD+KigoKDg4GHUlAP+yceNGi8Wi1+sVCgXqSgAAAH4NpSUAAAAAAAAAAPAQSksAAAAAAADgNqlUyrOBeYgAoxBuHwAAAAAAAAC32T4xAABGJ8xaAgAAAAAAAAAAD6G0BAAA4MSNGzfa2tpu3LjBdSIAACOByWTiOgUAAPAmlJYAAACcMJvNZrOZ6ywAfIVCoeDz+WKxePbs2Va7eDyeW6Hc7e8LqNVkuM5iSAzFqa1bt47etlgsV69ebWlpeeSRR5h9Tpw4sWzZstTUVB6Px+fzFQoFe7tVWAAA4BzWWgIAAHBCLBaPHz8+IAB/jwG/IZPJrl27NkTBMzIyamtrU1NTbXdZLBa3Qtn2DwkJ6e3ttdtZp9MFBwe7FX8oWCwW9vqLj+TpAaen5q4LFy709PTQL//3f//30qVLv/nNb5qbm5ndXnjhhaamJpFIRAhpbGycO3euVqtlaSeE9PT0XLp0KSoqyovZghdRX0ju/ofg8VjDMxAAsMCnZAAA8Fcmk+n69eu3bt0a6oECAwP5fP6YMfh7DPiNzs5O5sv+/v5Vq1ZJpVKZTLZjx47o6Giq3Wg0FhYWTpkyJTo6es2aNQaDgWqnZq9UVlZOmDCBOVtk0qRJPB7PaDSmpaVZzXCpq6uznfOi0+mef/55kUgUExPT2trK7GC3v1gs1mq19HOm6HaVShUfHy8QCKRSaW5urk6no5OsqKgICQlpbGysqakJCQlhTmyx5ei8mMPR2+zxr1y5Mn36dJFItGLFir6+PpY86VAajSYnJyckJCQ/P5+ZVUJCQkJCAkvazCBWedIv8/LypkyZIhAIkpKSjh8/zj6uo68HyrFjx6yuj7vxaVVVVXPnzqVfTps27ZlnnrGtXun1eqp+RAiZMWMGfT0dtRNCEhMTt23b5vSijQwymWzwQeivRleEhIQMMs5w1npcH4vlvABgkFBaAgAAf6XX63t6etRqNdeJAPi6oqIig8HQ3Nx86dIlgUBAf9esW7dOLpe3traeP39eLpfTNxlRv6p1dHS0tLTU1tZmZGRQ7ZcvX6Z2WX5BD5GSkmL7C15BQYFYLO7s7GxoaPjiiy8I45dAu/2pxGyD5+fnl5eXGwyGtra2xMREqoRBdTCZTNu3b58/f35zc/P27dvpVO1ydF7Mseht9vg7duzYvXt3W1ubUChcs2YNS550qLS0tFmzZimVyqefftoqK1d+N7ZYLNOnT29sbKReNjY2Pv744/SBJSUlra2tGo2msLBw0aJF7OM6+nqgHDp0qLW1lXl93I1Pq6+vv//++52e2tWrV91qJ4RMnTq1vr7eaeSRwcVKsaNKn6OKJ3FQMXSrwsvObgWWCltXV0d+KTFPnDiRPsTFSivFboXaUQXZ0XkBgHdYAAAA/FNPT8/58+eVSiXXifgTQkhMTAzXWYC13NzckpISjw/Pzs6urKy0WCyRkZFWn/QiIyMtFstdd91148YN2wOlUmlPTw+1rVar77rrLnoX+ccSD/Molg+QVrsiIiLocbu7u20PdKXFYrGIxWLmSUVERFh1tt1wJUOn2442CCHt7e1Uy40bN+h8HOVJHdLb28uem1NffvnlnDlzqO05c+bU19dT2+fPn1+wYIFYLBYIBLNmzbI6F9txHX09UP2NRiPzZD2ITwsNDbW7l/0rytG7yXx58+bN8ePHOxq3s7NTIBA42mvr3XffXbVqlev9h9QTTzxx8OBBZovVdXj99ddffPHF7u5unU63a9eusLAwZs/Zs2dv37795s2bR44coRqfe+65r776ymAw9Pb27t279+WXX6b7U++OwWA4cuSIUCh0NKLTOHYRQjZs2HD16tUbN27k5eXR/ZuamqZPn05tm83muLi4H374gT4qLi4uLi6OPbLtQLYthYWFN2/e3Lt3b1BQEPt5jRgvv/zypk2buM5itJNIJG1tbVxnwQ3M7QcAAH9lNBoJIXw+n+tEAHyFUqmkNqwWHxkYGHB0CLOb1zGnBngwkMFgoL7BY2Njh22Kirtr9pvNZnohNvY8hULhoDIjZO7cue+8805DQwMhpL+/PykpiWpPT0/PzMysqakRi8XXr1+3un/KdlyWrwdCiO3Nv+7Gp3n81WUymQIDA9nbvfil+8UXX/z444/79u3j8/l2FxEbTvQqaXK5vKOjg9qmvpUiIyOVSuWnn3565swZqo65dOnSpUuXMg///PPPqXckMTGRatm/f//OnTvpDhERER9++CEh5MKFC6tXr25sbNTr9TExMfQ6Vo44isMiJydHLpcTQt5+++2pU6dS/adPny6Tyfbu3ZuWlrZnz55f/epX06ZNow85deoUe0wXlZSUEEJSU1OpjwoAMNRwQxwAAPgral2YoKAgrhMB8HVLliwpLy8nhKhUKoVCsWzZMqo9KyurqqqK+nvjtm3bnn32We+Om5GRUVFRYTabtVptdXW1K4cEBQUpFAqj0Xjo0KE5c+ZQjcnJydXV1e3t7UP3rEZq3GvXrr322muu9K+qqmpvb+/p6dm4cWN6evpg8nTrDqANGzasX79+/fr1GzZsoBuVSmVcXFxoaGhLS8uWLVucBnH09eCIu/FpkyZNoosjLMaNG0ff6Hfq1KnQ0FDqAjpqJ4S0t7d7cQ3vvr6+hx9++LHHHouLi/NWzMGj5+SSX+baULVj9sqgbaUvNjaWObOAmj9ICElPT585c+bZs2c1Gs2uXbscBaSXYHMUxxXMCiwhpLi4eP369Xq9/p133nnnnXdcj+NF9HkBgHcM6ZwoAACAoXPp0qXz58/rdDquE/EnBDfE+SRv3RBHk0gkzJdarfall16KiIiIiIh47rnnOjo6qHa9Xv/GG2/I5XK5XP7GG2/o9XqqnflBkbl98OBBR58k7bb39fWtXLlSJBI9/PDDP/74o9P+FouFuoFFIBCkpaWdP3+eahwYGCguLr7nnnvGjx8/d+5c6lrZJmlxdsOLo/OixuXz+bGxsT/88INtbrZH/fTTT/Hx8XfeeefKlSv7+vpY8mQ5WUpMTIxbdwA98cQTTz75JLNl7969kyZNGjduXHJy8tmzZ22ztRrX0deDo+vjbnza6tWr9+3bZ/ctsLr41B8JwsPDIyMjv/76a/Z2i8WyZ8+egoICR5fI3RvinnrqKas8OeT0hrgXX3xx7dq1Foulu7t77969//Zv/+aoJ+X999+vqqq6evWqyWRitkdERBw5cuT27ds//PDD2rVrmccGBQXt3bvXYDDU1dXNmjWLPY4jhJC33nrr6tWrarX6tddey8vLY+5duXJlUlLSypUrrY6Kj4+Pj493JT5zIJYWp+c1YuCGOF8wmm+IQ2kJAAD8kslkOn/+/Pnz5wcGBrjOxZ8QlJZ8ktdLS77GYDDs3bv3gQce4DoRGFatra1OV+TxzMsvv8zy+9sIKy25WCl2VOlzVPF0VDG0uFPhdYSlAktpa2sbO3bslStXrA50q9Jq95QdVUgdndeIgdKSLxjNpSWstQQAAH6JWj0hMDDQ7nocAOAj3nzzzeLiYj6fn5KScuzYMa7TgWEVHR195513DkVksVjsxRvifFxXVxfzpUAg2Lp169atW626WRwsPhUYGLh27VpqXhJTamoqc2Ep5uGpqam294s5imMXHe3kyZN2Oxw8ePCll15iPhuOcvr0aVfiW43iqNGqg93zAgCvQGkJAAD80nAutNTb22s2m4VCIcpYAO7auHHjxo0buc4CODNE7/4f/vCHoQgLw4Ne4L+iooLbTADAW7CMNwAA+KXhfDxcd3d3d3e3yWQahrEAYJCkUinPhlQq5TovAPj/6DtouE4EALwGpSUAAPBL1Kyl4SktUR9/mU+3AQCf1dXVZbsGhNUtRQDgFajkAgAFN8QBAIBfGs4b4qjSEj2BHwAAAIjNOlAAMGqhtAQAAH5p2G6Io2fso7QEAABDzWQydXV1/fTTT1wnAn7m1q1bAwMDXGcBoxdKSwAA4H8GBgbMZjOPxxuGWUtms5naQGkJAACGWltb20svvYSnRoC7DAZDSkoK11nA6IXSEgAA+B/qbrgxY8YMQ7kHs5YAAGDYREdHFxQUoEYA7nrllVcmTZrEdRYwemFFUgAA8D9YwxvAi6iVd7kammXX4LNCRRgAAGAY4IMyAAD4n2FbaIlgDW/wTzKZzPXOHD4CnGVor2TlepCQkJDBDwcAADA64YY4AADwP8P5eDhqrSWUlsC/dHZ2Ml/29/cXFBR89tlnAQEBJSUlxcXF58+fZ4+Ql5dXX1/f3t4+Y8aMoqKi2bNnE0IUCkVGRobRaAwJCZk2bVp3dzcVx1E7i7q6uvnz55N/rP709fW98soru3fvvu+++/785z9bHZKQkEAIOXnypCtXwG586ht5y5YtmzZt6u7urq2tTU1NJYSIxWKtVkt/m3NYawMghOTk5AQHB3OdBfiZ69evv/nmm1xnAaMXSksAAOB/9Ho9IWTs2LHDMBZmLcEIUFRUZDAYmpubhULhgQMH1Gq100NKSkoqKyuNRuOJEycWLVrU29tLCMnKylqwYMGuXbsMBkN9ff0LL7xAdXbUziIlJcVisVh9ZxUUFMhkMrVafevWraqqKqtD3Kr42I1PtXR0dLS0tBw9ejQjI4OqU6vVah6Ph4oS+IJPP/20v7+f6yzAL4nFYq5TgNELpSUAAPAzJpPJZDIRrLUE/2j79u3vvvsu11l46Pr162PGjLEtpriot7c3NjaWECKXyzs6OqhGqqoSGRmpVCo//fTTM2fOUL91LF26dOnSpewBL1y4sHr16sbGRr1eHxMTo9VqqfZPPvlk8eLFQUFB4eHhERERBw8eZG931yeffHLx4kU+nx8eHv7CCy8UFRUx9546dcqzsFZKSkoIIampqdSttQA+JTIykusUAADchtISAAD4GfpuuOEp92DWkr+4efPmtGnT1q1bx3UinnjvvfckEkl2drZnh//hD3+gNpRKJbVhNQdnYGDArYDp6emZmZk1NTVisfj69ev0yk0LFy40GAx9fX1qtfrjjz+eO3duT08PS/tgUN/pnDAYDMNTuQYAABgZUFoCAAA/M3bs2AkTJgzbrStYa8mPhIeHU5N3/I5EIpHL5R4nLxKJ2DssWbKkvLy8uLhYpVJ98803e/bs+fjjj1n6K5XKuLi40NDQlpaWzz77jG6nZiQ99NBDEydOnDp1al9fH3u7uzIzMzdv3vz222+rVKr33nvPaq9bay25KygoSKFQLFiw4MiRIyUlJSdOnBiKUQAAAEYkTO8HAAA/ExAQMG7cuGFb4hSzlsAfSSQS5svy8nKNRiORSB588MF9+/aVlZXRu3g8HvXlTW8QQrZt25aTkyMWiwsLC7Oyssgv3wL33nvv999/Hx0dzePxMjIyamtrqf6O2lnYHbesrKy9vV0kEiUnJ69YsYL847eeyWRyvaZsNz7dYvUvIaS2tjYjI0MkElVXV9fU1Lg4CgAAABDMWgIAAGCHtZbAH3V1dTFfCgSCrVu3bt261ban3WJNamoq9eg0qz7UjCHbVbodtbOwO65AINi5c+fOnTvt9jl9+vQg4zMbrTqkpqZyeAseAACAX8MHZQAAADaYtQQAAAAAwAKlJQAAADZYawkAAAAAgAVKSwAAAGwwawnAM1KplGdDKpVynRcAAAB4GdZaAgAAYIPSEoBnrNZ7AgAAgJEKs5YAAADYoLQEAAAAAMACs5YAAADYBAcH83i84OBQ757zAAAgAElEQVRgrhMBAAAAAPBFKC0BAIA/uX79elBQUGho6LBNIxIIBAKBYHjGAgAAAADwOygtAQCA3zAYDD09PQEBAePHj+c6FwAAAAAAIASlJQAA8CM8Hu/OO+/kOgsAf0XN9aOWDxtheDzekJ4XS3yPr6orB7p7XkN9HQAAAOzCMt4AAOA3goKCIiIiIiIiuE4EwNfJZDLbRq8UHUJCQgYfhKLT6bwVaqjrKSzxPR7alQPdDe56fy++jwAAACgtAQAAAIw0nZ2dLvbMy8ubMmWKQCBISko6fvw41ahQKPh8Po/HCw0NnTlzZnR0NNUuFou1Wi3vF+yRrboxX6pUqvj4eIFAIJVKc3Nz6RoT1UGj0eTk5ISEhOTn57PnQwipq6uzTcZoNBYWFk6ZMiU6OnrNmjUGg4EZv7KycsKECXw+X6FQOL0+duP39fVlZ2cLhcJHH320ubnZ6pCEhISEhASnkSlXrlyZPn26SCRasWJFX18f+7g6ne75558XiUQxMTGtra3MDnb7Ozpft95HAAAAp1BaAgAAABi9SkpKWltbNRpNYWHhokWLqMasrKwFCxYYjcbOzs433nhDo9FQ7Wq1mhBi+QV7ZIvFMn369MbGRuplY2Pj448/Th2Vn59fXl5uMBja2toSExPpEhK1Ny0tbdasWUql8umnn2bPhxCSkpJim8m6devkcnlra+v58+flcvm6deuY8Ts6OlpaWmprazMyMpxeH7vxCwoKZDKZWq0+fPjw/v37bU/c9dlDO3bs2L17d1tbm1AoXLNmjdNxxWJxZ2dnQ0PDF198QRjTlOz2d3S+br2PAAAATuF+bAAAgFGEx+PFxMScPn2a60S874MPPjhz5kxVVRXXiXgiLy9PLpcXFhZ6dvjy5ctjY2Nzc3PlcnlHRwdzV2RkpFKppF9arcVz4cKF1atXNzY26vX6mJiYhoYGau/+/fsXL15sNBrDw8MjIiJ27twZHx9vNwK7+vr6srKyw4cPE0KSkpLWrFmTlJRECAkLC6OqG5SIiIju7m46fm9vr1AoZMZhycduVnfddde5c+eopdl6enoeeOCBa9eu2fZ0/VyseorF4osXL4rFYkLIjRs3wsPDPftEzePx2tvb5XI5IUStVk+dOpW+DnbHlUgk586do8ZVqVQSicRqXNszcnS+I3tVpq6ursmTJ2u1Whf7JyYmrlq1ii6tAgB4RiqVNjU1RUVFcZ0IBzBrCQAAAGCEUCqV9DwUaoNZV7KVnp4+c+bMs2fPajSaXbt20e0LFy40GAxarfbvf//7s88+O3fuXLuH0zeaOTJ37tzbt283NDQ0NDT09/dTdSVCSGxsrIXBqp5iVVdyPR+mYaubOL0ILjKbzQEBTj6ZM29e8+IJeusUAABg1EJpCQAAgI3ZbDabzSP4z/swmimVyri4uNDQ0JaWli1bttDtERERJ0+eDAgImDhx4tSpU5lrAAUFBSkUCqPReOjQoTlz5jgdYsOGDevXr1+/fv2GDRvoxuTk5Orq6vb2drPZ7EqeLPnYlZWVVVVVRdWttm3b9uyzz7oyiusyMzM3b95sNBo7Ojo2bdpktdettZaqqqra29t7eno2btyYnp7O3jkjI6OiosJsNmu12urqak9S/4W77yMAAAALlJYAAADYXL16ta2t7fbt21wnAuAGiURi1UIv2MxcuXnbtm05OTlisbiwsDArK4v8Mi/m3nvv/f7776Ojo3k8XkZGRm1tLR2HWrJHJBJVV1fX1NQ4zSQxMZEqzj711FN046uvvqpSqWbNmiUWi+fNm1daWkonSWzW/2bPx+55vfvuuyqVauLEiRMnTrxx48a7775rFd/qXxZ245eVlbW3t4tEouTk5BUrVljFMZlMrhSjqUOys7PT0tKioqK0Wi19HRyNW1pa2tnZGR4ePnPmzIULFzrNk+V83X0fAQAAWIzku6wBAAAG7+effzYajRMmTBg3bhzXuXgB1lryTd5aa8m7WYHPMhqNBw4cWLdu3ZkzZ7jOxRdhrSUA4ATWWgIAAPBpFotFr9dz8ueQu+++e/LkyXfcccfwDw0AYOXNN9/k8XhCofCjjz46duwY1+kAAAAQgtISAAD4Bb1ef+XKlZ9//nn4hw4ICAgICHB61wwAwDDYuHEjVWpXKBRSqZTrdAAAAAhBaQkAAPxCf38/IWTs2LFcJwIA1qRSKc+GH1U9/D1/AAAAzo3hOgEAAADn9Ho9QWkJwCd1dXVxncKg+Hv+AAAAnMOsJQAA8AMoLQEAAAAA+CaUlgAAwNdZLBaDwUBQWgIAAAAA8D0oLQEAgK8zGAwWiyUgICAoKIjrXAAAAAAA4B+gtAQAAL4Od8MBAAAAAPgslJYAAMDXobQE4EeoJ6xxG4FzLPl75ez8/foAAMAIg9ISAAD4uv7+fkLIHXfcMfxDm83m69ev37hxY/iHBhgMmUzG1dAWi8WqRafTDTKCB0JCQrzV3938CespeOXsXA/i7nUAAADwAEpLAADg0ywWCzVriZPSkslk6unp6enpGf6hAQajs7OT+bK/v3/VqlVSqVQmk+3YsSM6OppqZ86gsd3WaDQ5OTkhISH5+fnsw/X19WVnZwuFwkcffbS5uZluV6lU8fHxAoFAKpXm5ubSNRoq/tGjRyUSSVxc3OXLlz07TYVCwefzeTxeaGjozJkz6fMSi8VarZb3C+YheXl5U6ZMEQgESUlJx48fZ+/vKH8WdXV1toM6uj6UhISEhIQEF0/ZbnyqpbKycsKECXw+X6FQOL0OAAAAXjSG6wQAAADY6PV6i8USGBjIyRre1NQA/ErmF1Qq1U8//fSXv/yF60Q8cfHiRbVa7XHyV69ejY2NZelQVFRkMBiam5uFQuGBAwfUajXVbrFY6C9v2+20tLSsrKyKiopTp06xJ1BQUCCTydRq9a1bt6qqquj2/Pz88vLyGTNm6PX6w4cP5+fnf/jhh3T8GzduXL169fPPP3/99df37t3rwYlnZWUtWLBg165dBoOhvr7+hRdeoNrVajWPx7M7taekpKSystJoNJ44cWLRokW9vb0s/R3lzyIlJYV5JSmOrg/FrXlMduNTLR0dHS0tLUePHs3IyKCeqslyHQAAALwIP2wAAMCnaTQalUoVHBwsl8uHf3S9Xn/lypXAwMCoqKjhH30o8Hi8mJiY06dPc52I96Wmph4+fPjxxx/nOhFPtLa2jh079p577vHs8La2ttWrV+fm5srl8o6ODuauyMhIpVIpk8nOnDkjFottj2WWHqy2e3t7hUKhKwmIxeKLFy9S8W/cuBEeHk7FCQsLo8tYhJCIiIju7m46fk9Pz5133qnVaiMjI2/duuUoKxb79+9fvHix0WgMDw+PiIjYuXNnfHw8S4QLFy6sXr26sbFRr9fHxMQ0NDTYPXcaS/7srKI5uj4es82W5X0chZ/2u7q6Jk+erNVqXeyfmJi4atWqRYsWDWlWADDiSaXSpqamEfOh0S2YtQQAAD6Nw4WWaJi15C8mTJhw+PBhrrPwRF5enlwuLyws9Ozw5cuXUxtKpZLasCooDAwMOA1iNputWlysK1mh5stQYmNj6+vrnR4yZoyHn0gXLlxoMBj6+vrUavXHH388d+5cu7evGgwGPp9PCElPT8/MzKypqRGLxdevX3e0IhXd38X83cK8PsOMPi8AAADvwlpLAADg06jS0rhx4zgZHTfEwciwZMmS8vJyQohKpVIoFMuWLaN3BQUFKRSKa9euvfbaax7Hz8zM3Lx5s9Fo7Ojo2LRpE92enJxcXV3d3t5uW7cihHzzzTcGg+HQoUNJSUmejRsREXHy5MmAgICJEydOnTq1r6+P3kWdl9FoPHTo0Jw5c6hGpVIZFxcXGhra0tKyZcsWZii7/dnzd52j60Nxa60ld9k9LwAAAO9CaQkAAHyXyWQyGo2EkLFjx3KSAEpL4KckEgnzZXl5uUajkUgkDz744L59+8rKyuhdtbW1mZmZCxcuXLlyJfnlq53+18Xln8vKytrb20UiUXJy8ooVK+gIr776qkqlmjVrllgsnjdvXmlpKfOoyMjIyZMnV1RUvP/++3QjPaIrQ997773ff/99dHQ0j8fLyMiora1lnldGRoZIJKqurq6pqaEat23blpOTIxaLCwsLs7KyCOO7225/9vztspu/o+tDMZlMrt+zZje+1bvm9LwAAAC8azTefQ0AAP6ir6+vo6MjKCjI4zVoBkmn0ymVyrFjx959992cJOB1I3utpbNnz547d47rRDwx+BviYmNjc3NzvZvVkBqdawDB8MBaSwDAidG81hJmLQEAgO/ifKElzFoCGApWM2sAAADAr2EZbwAA8F0+UloCAO/CdxYAAMBIgllLAADgu3yktIS5FQCEEKlUyrMhlUpH6rj+kg8AAADnMGsJAAB8lMFgMJvNPB6PqzW8CUpLAAxdXV2jalxHfC0fAAAAzqG0BAAAPmrMmDF33XXXwMAAh5UdlJYAAAAAANihtAQAAD4qICAgJCSE2xxQWgIAAAAAYIe1lgAAABxCaQkAAAAAgB1KSwAAAE6gtATgIm99s/j7Nx1L/tSy30MXHwAAYPihtAQAAOAQZi2Bn5LJZJyMS33L+EIcd2+nZemv0+ncHZ0lf69cIteDcH5bMQAAjAYoLQEAADiE0hL4qc7OTubL/v7+VatWSaVSmUy2Y8eO6Ohoqp05g8Z2W6PR5OTkhISE5OfnOx2xrq7Odj4O1VJZWTlhwgQ+n69QKNjzcRTHEYVCwefzeTxeaGjozJkz6ThisVir1fJ+wTwkLy9vypQpAoEgKSnp+PHj7P1VKlV8fLxAIJBKpbm5ua7UmOzm39fXl52dLRQKH3300ebmZqtDEhISEhISXDlfR/EdXWeW6wAAAOBFKC0BAAA4hNISjAxFRUUGg6G5ufnSpUsCgUCtVlPtzMkvtttpaWmzZs1SKpVPP/200yFSUlJsp9JQLR0dHS0tLbW1tRkZGez5OIrjSFZW1oIFC4xGY2dn5xtvvKHRaKh2KqDlF8xDSkpKWltbNRpNYWHhokWL2Pvn5+eXl5cbDIa2trbExERXSmx28y8oKJDJZGq1+vDhw/v377faa5uku/EdXWeW6wAAAOBFPPyYAQAAcESlUmk0GrFYHBYWxnUu3sHj8WJiYk6fPs11It43c+bMM2fOpKenc52IJ/76178KBIJHHnnEs8MbGxt/+9vf5ubmyuXyjo4O5q7IyEilUimTyc6cOSMWi22P5fH+79Og1XZvb69QKHQrE2YElvgs+TiKY9f+/fsXL15sNBrDw8MjIiJ27twZHx/PEuHChQurV69ubGzU6/UxMTENDQ12z50WFhbGLHtFRER0d3c7zco2mlgsvnjxInW+N27cCA8PH+QncBevs92eo0FXV9fkyZO1Wq2L/RMTE1etWkWXGgEAPCOVSpuamqKiorhOhANjuE4AAADAd43CX8n8161bt/r7+/3081xzc3NoaKjHyf/444/UhlKppDasCgoDAwNOg5jNZqsWd+tKrnMlH1csXLjQYDD09fWp1eqPP/547ty5PT09tt0MBgOfzyeEpKenZ2Zm1tTUiMXi69evO1qRiu4fGxtbX1/vlVSZwb0b0K2hqfMCAADwLpSWAADA5/T19RmNxuDgYM5/CwoJCRk7duwdd9zBbRrgorFjxxYUFHCdhSfa29vlcrnHyZ87d469w5IlS8rLy4uLi1Uq1TfffLNnz56PP/6Y2hUUFKRQKKZPn15SUuLZ6B5gycctERERBw8efOihhyZOnDh16tS+vj56F3VeCxYsOHLkSElJyYkTJwghSqUyLi4uNDS0paXls88+Y4ay2z85Obm6uvrpp5+OjIwMCPB8HYnMzMzNmze//fbbKpXqvffes9pLLbR08uRJj+OzsHteAAAA3oW1lgAAwOfcvHlTpVIxf0vkyrhx48aPHz927FiuEwFwj0QiYb4sLy/XaDQSieTBBx/ct29fWVkZvau2tjYzM3PhwoUrV64kv6wsRv/r+vLPdE+r5cDt/suSj904jtx7773ff/99dHQ0j8fLyMiora1lnldGRoZIJKqurq6pqaEat23blpOTIxaLCwsLs7KyCGMlNbv9X331VZVKNWvWLLFYPG/evNLSUs+uQ1lZWXt7u0gkSk5OXrFiBXNcQojJZHJ9gqRb19nReQEAAHjXaLz7GgAAfNzNmzf7+vrCwsJQ0/G6EbzW0rRp065cuUIv5Oxf8vLy5HJ5YWGhZ4cvX748NjY2NzfXu1kB+CmstQQAnMBaSwAAAD5k/Pjx48eP5zoLAAAAAABwDjfEAQAAAAAAAACAh1BaAgAAAADnpFIpz4ZUKh2p4/pLPgAAAJzDDXEAAAAA4FxXV9eoGtcRX8sHAACAcygtAQAAAAAAwBD69ttvv/76a66zABis3/72t3feeSfXWfgilJYAAAAAAABgCH311Vd/+ctfkpKSuE4EwHOVlZVLly5FackulJYAAAAcGhgYsFgsgYGBAQFYnRAAAMBzM2bMKC0t5ToLAM9t376d6xR8Fz4oAwAAONTZ2fnzzz/39fVxnQgAAAAAgI9CaQkAAHzFwMCAVqs1mUxcJ/J/An7BdSIAQAghPB6Pw6E5HB0AAMCX4bMyAAD4ir6+vmvXrl27do3rRP5PZGTk5MmTBQIB14kAuEcmkw0+iE6nc71zSEjIUMchhFgsFtdDuTWuUy4O7a3rAAAA4EdQWgIAAF9B/d4VHBzMdSIAfq+zs5P5sr+/f9WqVVKpVCaT7dixIzo6mmqnZuJoNJqcnJyQkJD8/HyqXaVSxcfHCwQCqVSam5vLrInk5eVNmTJFIBAkJSUdP36cahSLxVqtlvcLujNLHLscxSGE1NXVWTVSLysqKkJCQhobG2tqakJCQhQKhdNxExISEhISXLmMfX192dnZQqHw0UcfbW5uZu4a0usAAMNgMPMQ/XEOoz/mDH4EpSUAAPAVKC0BDJGioiKDwdDc3Hzp0iWBQKBWq6l2aiZOWlrarFmzlErl008/TbXn5+eXl5cbDIa2trbExES65EQIKSkpaW1t1Wg0hYWFixYtohqpgJZf0J1Z4tjlKA4hJCUlxaqFemkymbZv3z5//vzm5ubt27dnZGQ4Hdc2uCMFBQUymUytVh8+fHj//v3MXUN6HQBg8BQKBZ/PDwoKmjBhAv2f28iDe3XBR/DcmlcMAAAwRPr7+69evRoQEDB58mSucxnJeDxeTEzM6dOnuU7E+6ZNm3blyhWNRsN1Ip7Iy8uTy+WFhYWeHb58+fLY2Njc3Fy5XN7R0cHcFRkZqVQqZTLZmTNnxGKx7bE8Hq+3t1coFDIbw8LC6PITISQiIqK7u5sQcuHChdWrVzc2Nur1+piYmIaGBvqTJI9n51Olozgs7MZxtJd+abXhwbh2icXiixcvUtftxo0b4eHh1CjDcB1gMLq6uiZPnqzVal3sn5iYuGrVKrpECEOhtLRUqVRWVlYO24h8Pr+2tjY1NXXYRiSEREZGWv0nPAzY/9scJE7OyCmuspJKpU1NTVFRUR53GMEwawkAAHwCNWVp3LhxXCcC4MeUSiU9X4baUCqVhJCBgQGWo6zqSoSQ2NhYCwNdB0lPT585c+bZs2c1Gs2uXbscBTQYDOxxXETHcdcgx3WazDBfBwDwgNFoHOa6EiHE6XqRer1+eDLxFp9aAZM2pFn53XvkI1BaAgAAn3D79m2Cu+EAhsaSJUvKy8sJISqVSqFQLFu2jL1/cnJydXV1e3u72WxmtiuVyri4uNDQ0JaWli1btjB3BQUFKRQKo9F46NChOXPmsMdhYTeOu9jHdX2tpczMzM2bNxuNxo6Ojk2bNtHtw3AdAEa81tbWxYsXi0SicePGzZo16+jRo/QycISQs2fPPvPMM3K5XC6Xp6Wltba20ruoW8C0Wu0zzzzD5/P5fD61yBpt0qRJ1D1i9MJns2fPZna4cOGCo/vI9u7de9999wmFwmXLlul0Ottujo791a9+ZTWoVZ/a2lq5XH7HHXcIhcJ58+bR04epnlu3bqWWjSsuLhYIBFZn5NTly5effPLJMWPG2F4NlpypewZ5PN748ePT0tKOHz/+61//2vUzYnmPCONOvfr6+ocffjg6OvrgwYOOolEv77vvPqdnypKV08j0V87ixYsFAsH999+/e/duZnBH7xG4xAIAAMA1s9l84cKF8+fP6/V6rnMZ4QghMTExXGcxJB566KHx48dznYWHcnNzS0pKPD48Ozu7srKS2SKRSJgvtVrtSy+9FBERERER8dxzz3V0dFDtjj4WDgwMFBcX33PPPePHj587dy6d2969eydNmjRu3Ljk5OSzZ88yj9q7d29QUJBAIEhLSzt//jx7HBZ249hN1Xbb8st0LfZxY2Ji4uLiXLiuFq1Wm5WVJRAIpk2b9sMPP9CjDMN1gMHo7OwUCASu93/qqaf27ds3dPmAxWIpKSnJzc2lX7a0tNxzzz1/+tOflEqlwWC4evXqv//7v4eFhdF74+PjL126RL386aefpk+ffu7cOfpwQsiLL7544sQJs9lMfdPZjuj0V13bDk1NTQ888MD//M//9Pf3NzU1UcuiuXgse/uxY8dSUlL+/ve/63S63t7er7766rHHHjt16hR91GuvvbZ79+7w8PDXX3999+7dds+I5UTmzZv33XffsVwNu7kFBQXt3bvXYrGYTKbu7u4///nPERERLp6R0/eIOvaDDz74wx/+oFQqzWbzkiVLqPbPP//8mWeeYfbU6XRRUVEqlcqlE3acldPIhJC33nrr0KFDt2/fvnz58hNPPHHkyBFqF/t7RJFIJG1tbSyJOe0wgqG0BAAA3Ovr6zt//jz9AQWGDkpLvsnrpSWA0QylJR9kVVpatGjRzp07HXVeuHBhXV0ds6Wuru43v/kN/ZIQsmvXLuZL2yAelJbmzZv3xRdf0C/37NnjrdLSE0888dNPPzFbfvzxxzlz5tBH3bx5k9q4deuWK8lbDfr99997kFtISMihQ4eooVmC2213+h5Rx9bX19MvBwYG6O0ZM2b87W9/o19WVFS88cYbLGm4mJXTyISQ//7v/6Zfnjx5MjExkdpmf48oKC2xwA1xAADAPTwbDgAAYPQ4fvx4cnIyy97HHnuM2ZKQkHDs2DFmy9KlS72e1Xfffccc98knn/RW5JMnT957773MO7amTZvW2NhIdwgNDaU2QkJCPIj/8MMPe3DUt99+W1ZWFhERMWnSpPnz5y9ZssT1NYxceY8IIUlJSfR2YGAgvb1x48aioiJqW6/X//GPf3zjjTc8OAVbTiPPmjWL3p42bdrJkyepbafvEbBDaQkAALjns6Wl7u7ua9euGY1GrhMBAAAYOUwmk92ljmgW1ttg/c64ceOsZsRYLJa+vj5us3rggQeOHj2q1+svX7588ODB3bt3r1y50vXDB/Me/fM//3NgYODRo0cJITU1NfPnz5dKpa4P7cXIfD6f2vDN98iPoLQEAAAcM5lM1MM4fPDxcFqtVqvV+vXHWQBfI5VKeTa89UsFAPiFxx9//PPPP3e0d/bs2d9++y2zpampKTExcaiziouLO3XqFP3yyJEjgwxIP2ts/vz5//Vf/zXIaMOgrq6OvQN9RoN/jzZu3Pjmm28aDIYPPvigoKDA3VTtZuVKZOZEpB9//DE2Npba9pf3yGehtAQAAByjng3H5/PHjBnDdS7WUFQC8Lquri7bNRq6urq4zgsAhk9xcfHvf/97agXl27dvt7a2VldXr1ixgtq7adOmdevWNTY2DgwMDAwMNDY2rl+/nvmUxiHy9ttvv/HGG+fPnzcajY2NjV9//bW7EahnRBJCrl27VllZOWPGDKq9pKSkqqrq3Xff/fnnn41Go1qt/vLLL+fPn+/lE3BTRETEvn37enp6qJeNjY1BQUFWfRyd0eDfo7i4uAkTJqSnp8+ZMycyMtKtzB1l5UrkS5cu1dfX6/X6q1ev5ufnv/XWW1S7b75HfgSlJQAA4Bg12dgH74ajsU/aBwAAALckJCQoFIpNmzaJRKLIyMhnn322v7//j3/8I7X3/vvv/+STT0pLS0UikUgk2rRp06effjplyhRqL/3sebsvCSE//vij1fPpU1JS6L3M59NbPat++vTp69evT0lJufPOOysrK20LJSzHUmprazMyMgICAh577LGLFy8eOHCAap8wYcJf//rXixcvxsfHC4XCGTNmHD9+fMeOHY5Oh7j82cPp1WDJ+d57742MjHz55ZcjIyNjY2MzMzNra2ut4js6I/b3iJmJ3QtFeeutt+rq6goLC105U1eyciXyyy+/vGfPnvDw8NmzZ7/88st0WYrlPQJX+NzfhwEAYLShSksCgYDrROzArCUAAIChkJCQcPjwYUd777//fkd3zFn9aLb9ST1t2jSWH9/sP9kXL168ePFialulUlktqu30U0FqaqrBYLC7Sy6X261TMGPS265//HB6NVhCUStYf/rppyzxWc6I5T1iH5d26tSp55577u6773ba0/WsnEYeM2bMtm3btm3bZrvL0XsErkBpCQAAuNTf328ymQICAnxwoSUaZi0BAACMKh0dHRs2bMjPz+c6kRHLZDKVl5fbTjjy5cjAAjfEAQAAl+i74XyzfINZSwAAAKPHe++9R9299cgjjzz00EO///3vuc5oBKKu8JgxY86ePTt58uRhi2x7tyB4EWYtAQAAl3Q6HfHVu+Fo+BQCMAyob7ThqefyeDwUjgHA1po1a9asWcN1FiPc0P33yx4Z/+0PKcxaAgAAzphMpv7+fuKrpSV8BAH/JZPJBh+Eqvy6yGpFEg/iDOd3nOtjsZwXAMBQmzRpEs+BSZMmcZ2d94228x1JUFoCAADOUHfD3XHHHYGBgVznwgazlsDvdHZ2Ml/29/evWrVKKpXKZLIdO3ZER0dT7dTndY1Gk5OTExISQq8qolKp4uIrdaQAACAASURBVOPjBQKBVCrNzc1l1oby8vKmTJkiEAiSkpKOHz9ONYrFYq1Wa/sYIJY4jly5cmX69OkikWjFihXUfxF0nnV1dYSQuro6Ho83ceJE+pCEhISEhAQXrwx1uNU3NdVSWVk5YcIEPp9PPdOa5bwAAIbH5cuXLQ5cvnyZ6+y8b7Sd70iCG+IAAIAzRqORx+MFBwdznYh9I3XW0sDAQE9PD9dZeJ/JZLJYLH56anq9/vbt2x4nz/6gHEJIUVGRwWBobm4WCoUHDhxQq9VUu8Vi4fF4aWlpWVlZFRUVp06dotrz8/PLy8tnzJih1+sPHz6cn5//4YcfUrtKSkoqKyuNRuOJEycWLVrU29tLCFGr1XZvMWOJ48iOHTt2794dHBz89ttvr1mzhurf1NT0+uuvU48PT05OjouLq6mpoQ9x61s1JSWFOmtmI9XS0dHR0tJy9OjRjIwM6pI6Oi8AAABgwg9LAADgktlsJoQEBPjiLFqz2dzW1kYI+dWvfjViJiyMmBMBpuDg4E2bNuXm5srl8o6ODuauyMhIpVIpk8nOnDkjFottj+XxeL29vUKhkNkYFhZGl58IIREREd3d3YSQCxcurF69urGxUa/Xx8TENDQ00J8k7ZZgHMVxhMfjtbe3y+VyQoharZ46dSrdPy0tbdmyZWlpabt3796zZw/707Kdss2W2eJoG/xFV1fX5MmTtVqti/0TExNXrVq1aNGiIc1qlPvd73537Nix2bNnc50IgOe2bdv2t7/97de//rWjDlKptKmpKSoqajiz8hGYtQQAAFzyzaISZUT+Psnj8ebMmVNfX891It43bdq0K1euaDQarhPxRF5enlwuLyws9Ozw5cuXUxtKpZLasCqIDAwMsBxuVVcihMTGxtr9IklPT8/MzKypqRGLxdevX3e0opPBYODz+SxxXGE2m5n/PxQXFy9ZsmT+/PnvvPPOnj17PIs5SPR5AYC7Ojo6Ojs7v/32W64TAfCcwWBwvWY92qC0BAAA4ARm+oC/W7JkSXl5eXFxsUql+uabb/bs2fPxxx+z9E9OTq6urn766acjIyOZ9R2lUhkXFxcaGtrS0vLZZ58xDwkKClIoFAsWLDhy5EhJScmJEydY4rCoqqpauXKlQCDYuHFjeno63T516tTHH3984cKFjz322H333cc8hFpo6eTJk67Ed5fd8wIAdz388MPh4eGVlZVcJwLgOalUKpFIuM7CR/nu34oBAAC4NSJnLcEoYfXZt7y8XKPRSCSSBx98cN++fWVlZVQ7VTa1Xab61VdfValUs2bNEovF8+bNKy0tpdq3bduWk5MjFosLCwuzsrIIo/BaW1ubkZEhEomqq6vphZAcxbGLCpWdnZ2WlhYVFaXVaq36r1279sSJE+vXr7c6kFpmy8UrQ58p85TpFqt/HZ0XAAAAMGHWEgAAABtMWQJ/1NXVxXwpEAi2bt26detWq26OKjKBgYFr165du3atVXtqampqaqrdw1NTU21XE3cUxy46mqP5RwcPHnzppZeYz4ajnD592pX4VqM4arTqYPe8AAAAgAmlJQAAAPuo3zBRWgLwBfR3YkVFBbeZAAAAgBXcEAcAAGAfbogD8B2WX3CdCAAMOZY/6ljdvev1+ADgGZSWAAAA2OADKIB3SaVSng2pVMp1XgAw3Bw9ZZKliOyV+rLrQUJCQgY/HMBogNISAAAMN4PBYDabuc7COcyPABgKXV1dFhtWi0MBwGjQ2dlp1VJXV2c7L6mvry87O1soFD766KPNzc1WhyQkJFCPiXSF3fhUS2Vl5YQJE/h8vkKhoNrFYrFWq7V90AEA2MJaSwAAMNxUKtXt27elUqlf/DEQnyYBAACGR0pKisVisfrJW1BQIJPJ1Gr1rVu3qqqqrA5x6+9AduNTLR0dHS0tLUePHs3IyKAW71er1TweD39nAnAFSksAADCsLBYL9aTwO+64g+tcnAgKCpLL5SgtAQAAeJFcLu/o6KC2qR+ykZGRSqXSUf9PPvnk4sWLfD4/PDz8hRdeKCoqYu49deqUV7IqKSkhhKSmphqNRq8EhJGnv78/JiYmIMDhvV8ajWY48/EpKC0BAMCw4vF4d999t9FoDAoK4joXJwICAoKDg7nOAgAAYEShq0gezAmi5hNxwmAw8Pl8rkYHXzB27Ni//OUvEydOZOnDvncEQ2kJAAA44Pt1JQAAAPAFmZmZmzdvfvvtt1Uq1XvvvWe1l1po6eTJk0MxdFBQkEKhWLBgwZEjR0pKSk6cODEUo4C/4PF4EydOjIqK4joRX4RlvAEAAABGKb9bm5bDbP3uWgH4PolEYtVCf6Mxv+PKysra29tFIlFycvKKFSvIP/5XQN1l7+KIduPTLVb/EkJqa2szMjJEIlF1dXVNTY2H5wkwCmDWEgAAAMBII5PJrl275rSb7XK2Q0Gn07l+b2lISEhvb6+jvW7dO+PWuE65eK1Y8vduPgAjgO2jIe1+jwsEgp07d+7cudNun9OnT7s+ot34zEarDqmpqRzeggfgRzBrCQAAAGCksXqkd39//6pVq6RSqUwm27FjR3R0NHPvsWPHrB65TQjJy8ubMmWKQCBISko6fvw41ejoEd06ne75558XiUQxMTGtra30dACVShUfHy8QCKRSaW5urk6nY0+b5VHfto8Mp15WVFSEhIQ0NjbW1NSEhIRQKbGP6/qjylkeeW73+jjK393rAAAA4F9QWgIAAAAY4YqKigwGQ3Nz86VLlwQCgVqtZu49dOhQa2srdd8H3VhSUtLa2qrRaAoLCxctWkQ1Un/Ppx7RzexfUFAgFos7OzsbGhq++OILumd+fn55ebnBYGhra0tMTMzPz2fPk0rM8gvmLuqR4cwW6qXJZNq+ffv8+fObm5u3b99OpcQ+rm1wR+hHnh8+fHj//v3MXXavj6P83b0OAAAA/sXtNfkBAADAfwUEBMyZM6e+vp7rRLxv2rRpV65c8dPn/ubl5cnl8sLCQs8OX758eWxsbG5uLvOR3hTqkd4ymezMmTNisdj2WB6PZzQax4wZQxhPa7pw4cLq1asbGxv1en1MTExDQwP9iZH5RCd6WyKRnDt3joqvUqkkEgnVHhYWxixjRUREdHd3s58L+xOjrPbSL602PBjXLrFYfPHiReq8bty4ER4e7tb1oXkrH3BRV1fX5MmTtVqti/0TExNXrVpFlwhhKJSWliqVysrKSq4TAfCcVCptamrCMt52YdYSAAAAwAihVCrp+TLUBvWQ74GBAZajqLoSU3p6+syZM8+ePavRaHbt2uV0XObNX8zCSmxsrIXB3XqKx0ucDHJcp8m4eH3oQ4YiHwAAAN+B0hIAAAwHs9l8+/ZtrrNwj9ls1ul0fpc2gK0lS5aUl5cTQlQqlUKhWLZsGXt/pVIZFxcXGhra0tKyZcsWp/EzMjIqKirMZrNWq62urqbbk5OTq6ur29vbzWazi6lSj/o2Go2HDh2aM2eOi0dZYR/X9bWWqEeeG43Gjo6OTZs20e0s18du/h5cBwAAAD+C0hIAAAwHrVbb3t5OTaDwFwaDQalU2j6/BsD3WT3Su7y8XKPRSCSSBx98cN++fWVlZVS7o0dub9u2LScnRywWFxYWZmVlsfSk/i0tLe3s7AwPD585c+bChQvpcV999VWVSjVr1iyxWDxv3rzS0lKnmTt61LftI8OtnhHOnDnFPq7rjyp39MhzR9fHUf4eXAcAAAA/grWWAABgOCiVSp1OFxYWZne1F9+k1+u7urrGjBkTGRnJdS5eg7WWfJO31lryblYeMBqNBw4cWLdu3ZkzZ7jOBUYvrLXkg7DWEowAWGuJBWYtAQDAkBsYGKAeth0SEsJ1Lm4YO3bs3XffPZLqSgBD58033+TxeEKh8KOPPjp27BjX6QAAAMDwQWkJAACGXG9vLyHkjjvuCAoK4joXABgSGzdutFgser1eoVBIpVKu0wGA0YK+SdbuLg+OGro4HsQH8BcoLQEAwJCjSkv+NWUJAIaIVCrl2UA1CmAUkslkgw/CssCLZ7uGLs7gg+CjFPgslJYAAGBoGQwGvV7P4/HweQgACCFdXV0WG1gvH2AU6uzspLfpQrPdl3l5eVOmTBEIBElJScePH3caua6uznY+UV9fX3Z2tlAofPTRR5ubm13J0IM4rj+D0lF8qqWysnLChAl8Pl+hUFDtYrFYq9VaXRkAH4HSEgAADC1qylJwcHBgYCDXuQAAAIAvslgs06dPb2xspF42NjY+/vjj9HSekpKS1tZWjUZTWFjoyoLrKSkptlOBCgoKZDKZWq0+fPjw/v37XcnKgzhUudyV4I7iUy0dHR0tLS3UQyepdrVaTcfHw7jA16C0BAAAQ+vWrVsEU7gBAACAEEKIXC6n591QG3K5nBCyYcOG9evXU33Wr1+/YcMGavvChQv/8i//EhYWJhKJNmzY4Pqz/6x88skn+fn5fD4/PDz8hRde8Dh/9jinTp06deqUx8FpJSUloaGhqampRqNx8NEAhhpKSwAAMIRu3749MDAQEBAgFAq5zgUAAAC4p1Qq6Xk31IZSqSSEzJ079/bt2w0NDQ0NDf39/UlJSVT/9PT0mTNnnj17VqPR7Nq1yys5GAwGn4rjX0MD2EJpCQAAhhB1N5xQKMSiAAA+yKcW7BjOZHznrAGAiZq4xJyyRAhRKpVxcXGhoaEtLS1btmzxOHhmZubmzZuNRmNHR8emTZuGKI5bay25KygoSKFQGI3GQ4cOzZkzZ4hGAfAASksAADBULBYLNWsdd8MBDDMXn7s0PKt16HQ6V7oN59IheB4TgC+QSCRWLYmJiWaz2WKxPPXUU3Tjtm3bcnJyxGJxYWFhVlYWYVSHrW6sow+x215WVtbe3i4SiZKTk1esWEFcqDJ7EMdkMrn+P4zd+HSL1b+EEGrpJZFIVF1dXVNT4+IoAMMApSUAABgqOp3OZDIFBgaOGzeO61w8odfrlUpld3c314kAuI353CVCSH9//6pVq6RSqUwm27FjR3R0NHPvsWPHrJ5DRBw8j8nRc4t0Ot3zzz8vEoliYmJaW1vp35FUKlV8fLxAIJBKpbm5ua7UmK5cuTJ9+nSRSLRixYq+vj7muHV1deSXBypNnDiRPgTPYwLwU3YfDfn1119/9dVXzJbU1NSff/5Zp9PV1dVNnTqVuYi11bMm6UPstgsEgp07d2q12h9++GHatGmuLIbtQZzTp0+7vtaS3fjMl1a7UlNTDQaDVqvds2fPfffd5+IoAMMApSUAABgqN2/eJISEhIT46a9kJpNJp9Pdvn2b60QABquoqMhgMDQ3N1+6dEkgEFCPGaIdOnSotbWV+Rwi4uB5TI6eW1RQUCAWizs7OxsaGr744gu6Z35+fnl5ucFgaGtrS0xMzM/Pd5rqjh07du/e3dbWJhQK16xZQzU2NTVNnz49JSWFEJKcnBwXF3fw4EH6EDyPCQAAgFs8/JgEAIChMDAw8NNPPxFCJk2axOfzuU7HEzqdTqlUjh079u677+Y6F68JCAiYNGkSs4IwYvznf/7nrVu3XnvtNa4T8cThw4dDQkKmT5/u8eHLly/Pzc2Vy+UdHR3MXZGRkUqlUiaTnTlzRiwW2x7L4/GMRuOYMWOobeqT4YULF1avXt3Y2KjX62NiYhoaGuhPjHQf5rZEIjl37hwVX6VSSSQSqj0sLIxZxoqIiGCfBsjj8drb26lnRanV6qlTp9L909LSli1blpaWtnv37j179nz66aeeXSvbs2A5L7s9wfd1dXVNnjzZ9eeIJSYmrlq1ypVH2oPHSktLlUplZWUl14kAeE4qlTY1NUVFRXGdiC/CrCUAABgSt27dIoSMGzfOT+tKIxWPx8PaMSOYo+cuDQwMsBxF1ZWY3H0eE3NmIrMQExsby7zXw63bS81mc0DA/31SLS4uXr9+vV6vf+edd9555x3X43gRnscEMPJIpVKeDalUynVeAH7G+pMEAACAV1B3w4WGhnKdCPwDHo8XGxtbWlrKdSLeV1dXZzAY/PTU+vr65HJ5YWGhZ4fbXa+EacmSJeXl5cXFxSqV6ptvvtmzZ8/HH3/M0p/5PKbPPvvMaQIZGRkVFRUbNmzQ6XTV1dV0e3JycnV19dNPPx0ZGcmsE7GoqqpauXKlQCDYuHFjeno63T516tTHH3984cKFjz32mNUKI9RCSydPnnQlvruo5zEtWLDgyJEjJSUlJ06cGIpRAIArTv//BABXYNYSAAB4n06nGxgYCAgIwAQZAE5YPXepvLxco9FIJJIHH3xw3759ZWVlVLuj5xA5eh6To39LS0s7OzvDw8Nnzpy5cOFCetxXX31VpVLNmjVLLBbPmzePvfBHhcrOzk5LS4uKitJqtVb9165de+LEifXr11sdiOcxAQAAcAuzlgAAwPv8fQFvAH9n9Xd4gUCwdevWrVu3WnWzeqASvZ2ampqammq7y1H/4ODgqqqqqqoqo9F44MCBBx54gGoPDAxcu3bt2rVrXcmZDuho/tHBgwdfeukl5rPhKKdPn3Ylvm3adhutOlDPY3I9PgAAwCiE0hIAAHjZwMAA9cjw8ePHc53LoGDtXgDXvfnmm8XFxXw+PyUl5dixY16PT9epKyoqvB4cAAAABgM3xAEAgJfxeDyRSCQQCMaOHct1LgAwTDZu3GixWPR6vUKhGIoVcOm1wL0eGQAAAAYJpSUAAPCywMDAsLCwyMhIrhMBAF+E5zEBAJB/XPHNW9atW0dvf/rpp4GBgTwej8/nKxQK26F5PN6dd97Z0tLitJ0ZFsAu3BAHAADABstFAXgXnscEABSZTHbt2rUhCq7T6YKDg4couFdYLBbvfsa4cOFCT08P/fKVV145cOBAcnKyQqHIyMiwWjbO0SRQu+09PT2XLl2KioryYrYwwqC0BAAAAODf+vv7L168+PXXX3OdCIBPUKvVuHfSL3R2djJfUnWWLVu2bNq0qbu7u7a2ln6eQF5eXn19fXt7+4wZM4qKimbPnk11fv/999evX//ll1+ePXv2tdde++ijj1JTU1UqVUpKynfffSeRSJYuXfree+8xa0wJCQnE8eMCrJIhv5RarF7a5kP36enp+d3vfrdr164XX3yRehxnf39/QUHBZ599FhAQUFJSUlxcfP78eXqgY8eOZf0/9u4/rqnz3gP4OQTCjyRIAiSEgFRb0barraKovbLN4S9g2kqd9HWvOKrt7taKbu1Qai23tlWx0Hkra++LgS+oq3X4o5mrovMXm9xCr7a7e3WIoqKTJuFHJAQIAfLr3D/O9ewsISFA4CTh8/7D1znPec7zfM+D4sk3z3nOhg3DXq+L9hllZWXLly9ndnU6Hb2RkZExZ86cYX4YLqWmppaWlu7bt28sjYB/Q2oJAAAAwLf97W9/++yzz8rKyrgOBMArUBSF9/r5InoWj0ajaWxsvHjxInuizd69e0tKSsxm8+XLl1evXt3b20tXtlqtFRUVGRkZOTk5FRUV9Cl5eXnFxcVPP/304ODg+fPn8/LyPvzwQ3YvbgazaNGiX/3qV/RuXV3da6+9VldX5yweJv7MzMwNGzbs37//6tWrdOUdO3aYTKaGhgahUHjq1Ckm40M7c+ZMU1PTuXPnXF+vi/YZ586de/HFFx2v5eLFi6dPn2aXhIaG0omqoKAgdkrLWfmsWbPeeecdpJbABRIZfQAAgCH19fVpNJqQkBDHl537rsDAwOzs7IqKCq4D8bzZs2e3tLTo9XquAxmN3NxchUKRn58/utNfeOGFpKSkzZs3ezYqAB/V3t7+8MMPGwwGN+unpqZu3bp19erV4xrVJFdYWKhWq0tKSgiCUCgUGo2GfTQ2NlatVhMEQZL/+HzKbN+6devVV1+tq6sbHBycO3dubW0tM5NoyI3IyEh2+iY6Orqjo2MUMZ87d66oqOj8+fMEQSxbtmzbtm3Lli1zEQ8dQG9vr1AoZLcjl8uvXbsmkUgcuyBJ0mw2BwYGunO9ztpnTJkyRa1W2x29cOHCd77znZiYmCFPaWlpeeSRRxxTsXblPT09U6dO9dH/YT1IJpPV19fjwcAhYRlvAAAAAAAAmCBqtZp54SO9QeeVnFm3bt3ixYuvX7+u1+uPHj06bPtJSUkUy+jySgRBLF++vL+/v7a2tra2dmBggM4rDRuPY97HYrG46IXOK7GNtH2G46yRQ4cOJSQkOMsrEQQxdepUs9nsTjmmpIBrSC0BAAAMDXdRAAAAnFOr1fPmzQsPD29sbDxw4MCw9dPS0srLy1Uqlc1mczyanJxML7fkjl27dhUUFBQUFOzatWvU8axdu7a4uJggCK1Wq1Qq169f77r+SNtnJCQksKeDHTt27IknnpgxYwbxz+8kSUlJKSgoaG5uJghCqVQGBQW5LicIQqVSYaoOuIa1lgAAAAB83vbt2wsKCriOAsArDJlQAC8klUrZu3T6g34ujL1dWlq6adOmjo6O73//+7/61a/27t3LJEocn4kjCGLLli3vvfdeSkpKV1fXggULlixZwn7c2Gq1BgS4O8EiNTX17bffJknyBz/4AVM4ZDzsmOlqTDzFxcV5eXn0xaanpzNrb4/oel20z1i+fPmNGzcSExPp3ZycHKPR6HhRSqXytddeS0pK6u7uptdUcl1OEMSNGzdWrFjh5qDB5IS1lgAAwANMJpNKpZoyZUpkZCTXsXiMwWBobW3FWku+YjKvtaTVaulFXgGARpLktGnT3KyMtZYmAHutJRgnN2/e/OCDD9hrlnvKK6+88tprr2HiEtZacgGzlgAAwAN6enqsViveyAPAiejo6OjoaK6jAAAALiUmJkZERIxHyxKJBPkUcA2pJQAA8ICoqKiQkBD2Y/l+gL0wAQAAAICX271793g0+84774xHs+BPkFoCAADPcPHKEgAAAAAA8FdILQEAAAwtNDR06tSpmLsEAAAAAOACUksAAABDCwgICA4O5joKAAAAAACv5u5rFwEAAAAAAAAAAOwgtQQAAAAAAAAAAKOE1BIAAAAAAACAXyFJ0uPrRe7cuZPZPnLkCI/HI0mSz+crlUrHrkmSjIiIaGxsHLac3Sz4KKSWAAAAAAAAYKLJ5fKJ79RoNLpfWSQSjV8k442iKM82eOvWra6uLmb3lVdeOXXqFEVRVVVVWVlZjr1TFKXX6x977LFhy7u6uu7cuePZaGGCIbUEAACj1NPTYzabuY4CAAAAfFJbWxt7d2BgYOvWrTKZTC6XV1ZWJiYm0uVmszk/P3/mzJmJiYnbtm0zmUzEg/kv+/fvF4lEdXV1Bw8eFIlESqXSWTlBEFqtdv78+QKBQCaTbd68mckx0aeUlJTExcWxJ+BIJBKDwcBMtGHiVCqVfD6fJMnw8PDFixczcdKSk5OTk5OHvXa7Zu12c3NzZ86cKRAIli1bVlNTw66j1+s3bdokEony8vJcjxvt0qVLdtc10vYZZWVly5cvZ3Z1Ol1aWhpBEBkZGXPmzBn2kl1ITU0tLS0dSwvAOaSWAABgNCwWS0dHx7179+g7PAAAAICx2LFjh8lkamhouHPnjkAg0Ol0dPnOnTsVCkVTU9PNmzcVCgX98BQ9JcdqtVZUVGRkZDQ0NFRUVGRlZTkrJwgiLy+vuLjYZDI1NzenpqYyqRP6FI1G09jYyJ6AQwdAPcDEuWHDhh/+8Idms7mtre2Xv/ylXq9nX4VdZWcoilq4cGFdXR29W1dXt2jRIubEvXv3NjU16fX6/Pz81atXs+PMzMxMSUlRq9UrV650PW60M2fONDU12U0sGlH7jHPnzj366KOO13Lx4sXTp0+zS0JDQ+lElV1Ky1n5rFmzzp07N+yggTcjPT5NDgAAJoOOjo7u7u7Q0NC4uDiuY4ERCAwMzM7Orqio4DoQz5s9e3ZLS4vdLb6vyM3NVSgU+fn5XAcCMBmlpqZu3bqV+YAN46GwsFCtVpeUlBAEoVAoNBoN+2hsbKxarZbL5deuXZNIJHbnxsTE3LhxIyIigiCIrq6uxx57rLW1lSAIkvz/D7N2G87KIyMj2WmX6Ojojo4Oepup6WKb8fnnnz/33HNmszkqKio6Ovrjjz+eP3/+KMbk3LlzRUVF58+fJwhi2bJl27ZtW7ZsGUEQt27devXVV+vq6gYHB+fOnVtbW8uOp7e3VygUsttxNm50fbPZHBgYyL6WkbbPmDJlilqttjt64cKF73znOzExMUOe0tLS8sgjjzh+DWlX3tPTM3XqVO//H1wmk9XX10+fPp3rQLwRZi0BAMCIWSyWnp4egiCGvI/xGzabzWAw9PX1cR0IAACA/1Cr1czUHnpDrVYTBGGxWJyd4pH5EElJSRQLk1dyE5MHWbVqlclkMhgMf/nLX7Kzs9nPiI3I8uXL+/v7a2tra2trBwYG6LwSQRDr1q1bvHjx9evX9Xr90aNH7c5yzPu4GDeCIOi8EttI22c4/hQOHTqUkJDgLK9EEMTUqVOHXDzBsRxTXnwdUksAADBier2eoqiQkJCwsDCuYxlHZrO5tbV1pLeeAAAAMApr164tLi4mCEKr1SqVyvXr19PlGzZsKCsro/NBpaWl2dnZo2s/LS2tvLxcpVLZbDY3TwkKClIqlWaz+cyZM0uXLqULo6Ojr1y5EhAQEB8fP2vWLLuvoNxca4m2a9eugoKCgoKCXbt2MYVqtXrevHnh4eGNjY0HDhwYthFn4+bMSNtnJCQksKebHTt27IknnpgxYwZBEOy1qFJSUgoKCpqbmwmCUCqVQUFBrssJglCpVJgK5OuQWgIAgJGxWq3d3d0EQYjFYq5jGV8BAQFhYWEhISFcBwIAAOCHpFIpe7e4uFiv10ul0scff/zkyZNFRUV0+bvvvqvVauPj4+Pj4zs7O999913iQS6DvQw2e8OxnCCILVu2aLXalJQUiUSyYsWKwsJCx1PsTqeXKBKLxeXl5QcPHqQLp02b9te//jUxMZEkyaysrKqqKvZV18lCoQAAIABJREFUWK1W9yfgpKam2mw2iqJ+8IMfMIWlpaWbNm2SSCT5+fkbNmxwjM1uWXFn4+bsukbaPmP58uU3btxgdnNycubOnetYWalU3rt3LykpyW58nJUTBHHjxo0VK1a4OWjgnbDWEgAAjExnZ6dOp+Pz+QkJCVzHAiOGtZa8E9ZaAuAQ1lqaAOy1lsBH3bx584MPPvjwww893vIrr7zy2muvef/EJay15AJmLQEAwAjYbDZ6ypJ/r7IEAAAAAGyJiYn0YuoeJ5FIkK/xdUgtAQDACHR3d1ut1qCgIJFIxHUsAAAAADBxdu/ePR7NvvPOO+PRLEwkpJYAAMBdFEXRTxuN03dWAAAAAADgc5BaAgAAd3V3d1sslsDAwClTpnAdCwAAAAAAeAWklgAAwC02m02n0xEEERkZOeR7QwAAAAAAYBJCagkAANyi1+utViufzw8PD+c6FgAAAAAA8BZILQEAwPCsVmtXVxdBEJGRkVzHAgAAAAAAXgSpJQAAGF5XV5fNZgsODhYKhVzHAgAAAAAAXiSQ6wAAAMDbWSwW+sVwk23KktVq/fbbbwmCeOihh7iOBQAAAHwDSZIURXHVNUEQXPUOkxlmLQEAwDC6urooigoNDRUIBFzHMtHMZrPZbMYtGgAAgMfJ5fKxN2I0Gt2vLBKJxrsdYoSZnRH1Oyw3u/bUOAAwkFoCAABXzGZzd3c3MfmmLBEPvvoDAACA8dDW1sbeHRgY2Lp1q0wmk8vllZWViYmJdDlJkiRJ6vX6TZs2iUSivLw8ulyr1c6fP18gEMhkss2bN7NzIrm5uTNnzhQIBMuWLaupqaELJRKJwWAgH2Aqu2hnSM7aIQiiurrarpDe3b9/v0gkqqurO3jwoEgkUiqVw/abnJycnJzszjD29fXl5OQIhcI5c+Y0NDSwD43rOACwIbUEAACu6HQ6iqLCwsJCQ0O5jgUAAAD81o4dO0wmU0NDw507dwQCgU6no8vpmTiZmZkpKSlqtXrlypV0eV5eXnFxsclkam5uTk1NZVJOBEHs3bu3qalJr9fn5+evXr2aLqQbpB5gKrtoZ0jO2iEIIj093a6E3rVarRUVFRkZGQ0NDRUVFVlZWcP269i4M9u3b5fL5Tqd7vz5859//jn70LiOAwAbZ0+BAgCAT+jr6+vs7JRKpSEhIVzHMtFsNltzczNBEA8//HBAgJ98GRMYGJidnV1RUcF1IJ43e/bslpYWel0wn5Obm6tQKPLz87kOBGAySk1N3bp1K/PBG8ZDYWGhWq0uKSkhCEKhUGg0GvbR2NhYtVotl8uvXbsmkUgcTydJsre31+5dIpGRkUz6iSCI6Ojojo4OgiBu3br16quv1tXVDQ4Ozp07t7a2lvnMO+QqSM7accH1akp2R5ldu41R9DskiURy+/Ztetw6OzujoqLoXiZgHCYbmUxWX18/ffp0rgPxRn5yowwAAONEIBBMnTp1EuaVCDwQBwAAMA7UajUzX4beUKvVBEFYLBYXZzm+ozYpKYliYfIg69atW7x48fXr1/V6/dGjR501aDKZXLfjJqadkRpjv8MGM8HjAJMcUksAAAAAAADAsbVr1xYXFxMEodVqlUrl+vXrXddPS0srLy9XqVQ2m41drlar582bFx4e3tjYeODAAfahoKAgpVJpNpvPnDmzdOlS1+24MGQ7I+W6X/fXWnr++efff/99s9ms0Wj27dvHlE/AOAAwkFoCAAAYBh4eBwAA8DipVMreLS4u1uv1Uqn08ccfP3nyZFFREV1OTyJ2XHZ6y5YtWq02JSVFIpGsWLGisLCQLi8tLd20aZNEIsnPz9+wYQPBmoZcVVWVlZUlFovLy8sPHjzouh0XhmyHCdJugx2AO/HTrFarm7cfRUVFKpVKLBanpaVt3LiR6WUCxgGAgbWWAAAAnLp16xZBENOnT+fxeFzH4hlYa8k7Ya0lAA5hraUJwF5rCcBHYa0lFzBrCQAAAAAAAAAARgmpJQAAgGFghi8AAAAAgDNILQEAADiFl8QBAABMQjKZjHQgk8m4jgvASwVyHQAAAHgXnU4nFAr5fD7XgQAAAABwo729nesQAHwJZi0BAMA/GI3Gzs7OlpYWq9XKdSxeBA/EAQAAAAA4g1lLAADwD3w+XygU8ng8v3kh2hiRJElRFFJLAAAAAADOILUEAAD/EBgYKJfLuY7Ci2CtJQAAAAAA1/BAHAAAgFN0agmzlgAAAAAAnEFqCQAAwCmklgAAAIBBvypuwvqamI4Axg6pJQAAAKeQWgIAABgnHnkG32g0ul9ZJBKNsZ2JvCVwvy8X1wUwMZBaAgAAGAZSSwAAAB7X1tbG3h0YGNi6datMJpPL5ZWVlYmJiXQ5PVFIr9dv2rRJJBLl5eXR5Vqtdv78+QKBQCaTbd68mZ0bys3NnTlzpkAgWLZsWU1NDV0okUgMBgP5AFPZRTvOtLS0LFy4UCwWb9y4sa+vjx1ndXU1QRDV1dUkScbHxzOnJCcnJycnuzky9Ol2s5bokpKSkri4OD6fr1QqXV8XwETCMt4AAABOYdYSAMBkYDAYurq6uI7Cn/X39w9bZ8eOHSaTqaGhQSgUnjp1SqfT0eUURZEkmZmZuWHDhv3791+9epUuz8vLKy4ufvrppwcHB8+fP5+Xl/fhhx/Sh/bu3VtSUmI2my9fvrx69ere3l6CIHQ6Hf3iV7t+XbTjTGVl5fHjx8PCwt56661t27bR9evr63/xi1+kp6cTBJGWljZv3ryDBw8yp4zoXiI9PZ2+anYhXaLRaBobGy9evJiVlWUymVxcF8BEwl9BAAAApywWC0VRgYGBfvM1YGBgYHZ2dkVFBdeBeN7s2bNbWlr0ej3XgYxGbm6uQqHIz8/nOhCAyeiZZ56pra3lOgrf0NfXZzabnR0NCgoSCARDHhoYGMjOzi4tLSUIQqFQaDQa9tHY2Fi1Wi2Xy69duyaRSBxPJ0myt7dXKBSyCyMjI5n0E0EQ0dHRHR0dBEHcunXr1VdfraurGxwcnDt3bm1tLfOZd8gUjLN2nCFJUqVSKRQKgiB0Ot2sWbOY+pmZmevXr8/MzDx+/PiJEyeOHDniop1hOUbLLnG2DeNHJpPV19dPnz6d60C8EWYtAQBMaq2trSKRyO5eDRiBgfiPEgDAz508eZLrEHxGW1ubs+fFTp06df78+c8//3zIo4WFhWq1mt5mNuwSIhaLxUXXjvcqSUlJ586dc6y5bt26559//uDBgxKJ5P79+85WdDKZTHw+30U77rDZbAEB/1hkZs+ePWvXrs3IyHj77bdPnDgxujbHiLkugImEtZYAACav7u5ug8HQ3t5utVq5jgUAAAC8XUxMzHQnpFLpGBtfu3ZtcXExQRBarVapVK5fv951/bS0tPLycpVKZbPZ2OVqtXrevHnh4eGNjY0HDhxgHwoKClIqlWaz+cyZM0uXLnXdjgtlZWUqlaqrq2v37t3r1q1jymfNmrVo0aJVq1YtWLBgxowZ7FNGtNbSSA15XQATCaklAIBJymw2379/nyCIyMhIHo/HdTgAAAAwudhlo4qLi/V6vVQqffzxx0+ePFlUVESX08+kOy5TvWXLFq1Wm5KSIpFIVqxYUVhYSJeXlpZu2rRJIpHk5+dv2LCBaYEgiKqqqqysLLFYXF5eziyE5KydIdFN5eTkZGZmTp8+3WAw2NV//fXXL1++XFBQYHei1Wp1/5k15krZl8yU2P3p7LoAJhLm+QMATFJardZms4WEhERERHAdCwAAAEw67e3t7F2BQPDRRx999NFHdtWcZWR4PN7rr7/++uuv25WvWbNmzZo1Q56+Zs0aeulrd9oZEtPalStXhqxw+vTpn/3sZ+x3w9G+/vprd9q368VZoV2FIa8LYCIhtQQAMBn19fXR78od+/R1AC/R2dlpMBgWLVrEdSCjcffuXT6fjwVfAGDsDh06ZPcoFkwYZhrR/v37uY0EYILhgTgAgEnHarXS3xNGREQEBwdzHQ6AZxgMBveXyQAA8EtffvmlSqXiOorJi3qA60AAJhpmLQEATDr0ut3BwcFRUVFcxwLgSSRJ1tfXcx3FaOTm5ioUivz8fK4DAQDfhsUTPUUmk3V0dNgVSqVSu4f4AICG1BIAwOTS09PT19dHkqRMJmOvhQkAAAAANKSQAEYEqSUAgEnEbDZrtVqCICQSCR6Fc4fRaBwcHAwJCQkNDeU6FgAAAAAAb4S1lgAAJpH29nabzRYaGiqRSLiOxTcYjcb79+/TS54DAAAAAIAjpJYAACaLrq6u/v7+gIAAmUzGdSw+Izg4WCgU8vl8rgMBAAAAAPBSeCAOAGBSGBwc7OzsJAgiKioqKCiI63B8hkgkEolEXEcBAAAAAOC9MGsJAMD/URTV3t5OUZRAIJgyZQrX4QAAAAC4iyRJ33rxCIfR+txYgd9AagkAwP/pdLrBwUEejyeVSrmOBQAAAIAgCEIul7tTjaKo8Y6EIAij0eh+ZdczmkcU8Ij6HZabXbuI37PxwOSB1BIAgJ/r7+/v6uoiCCIqKiowEM9BAwAAgFdoa2tj7w4MDGzdulUmk8nl8srKysTERPbRS5cuxcXF8fl8pVLJFObm5s6cOVMgECxbtqympoYupGfulJSU2NU3Go0vvfSSWCyeO3duU1MTM8FHq9XOnz9fIBDIZLLNmzcPm1uRSCQGg4F8gH2ourrarpDe3b9/v0gkqqurO3jwoEgkokNy3W9ycnJycrI7w9jX15eTkyMUCufMmdPQ0MA+NOT4OIt/pOMAwIbUEgCAP7NarW1tbRRFiUSi8PBwrsMBAAAAGNqOHTtMJlNDQ8OdO3cEAoFOp2MfPXPmTFNTU1VVVVZWFlO4d+/epqYmvV6fn5+/evVqupCeuaPRaBobG9n1t2/fLpFI2traamtrz549y9TMy8srLi42mUzNzc2pqal5eXmu46QDox5gH0pPT7croXetVmtFRUVGRkZDQ0NFRQUdkut+HRt3Zvv27XK5XKfTnT9//vPPP2cfGnJ8nMU/0nEAYCMnZnohAABwQqVS9ff3BwcHx8fH49l7IAgiMDAwOzu7oqKC60A8b8qUKQaDwWq1ch3IaOTm5ioUivz8fK4DAQDfxuPxLly4sGTJkonv+ne/+93hw4ftUhuMwsJCtVpdUlJCEIRCodBoNOyjsbGxarVaLpdfu3ZNIpE4nk6SpNlspidfk+T/f4a9devWq6++WldXNzg4OHfu3NraWuazLVOHvS2VSm/cuEG3r9VqpVIpXR4ZGclOY0VHR3d0dLi+WHb7wx5ldu02RtHvkCQSye3bt+nr6uzsjIqKGtH4MDwVjx+TyWT19fXTp0/nOhBvhFlLAAB+y2q12mw2kiRlMhnySgAAAOAN1Go1M1+G3lCr1QRBWCwWF2c5PtS/bt26xYsXX79+Xa/XHz16dNh+2fdC7MRKUlISxTLSfIrJZBpRfU/1O2wwbo4Pc8p4xAOTB1JLAAB+i8fjxcfHKxSK4OBgrmMBAAAAcGXt2rXFxcUEQWi1WqVSuX79etf11Wr1vHnzwsPDGxsbDxw4MGz7WVlZ+/fvt9lsBoOhvLycKU9LSysvL1epVDabzc1Qg4KClEql2Ww+c+bM0qVL3TzLjut+3V9r6fnnn3///ffNZrNGo9m3bx9T7mJ8hox/FOMAwEBqCQDAn5EkGRoaynUUAAAAAPbsXlxbXFys1+ulUunjjz9+8uTJoqIiupyebeT4Z2lp6aZNmyQSSX5+/oYNG1zUpP8sLCxsa2uLiopavHjxqlWrmH63bNmi1WpTUlIkEsmKFSsKCwuHjZxewkksFpeXlx88eJApZxbGZm8QrAlT7JlTrvu1Wq1url1TVFSkUqnEYnFaWtrGjRuHHR9n8Y9iHAAYWGsJAADAKaPR2NraGhwcHBcXx3UsnoG1lrwT1loCAI/wibWWOGc2m0+dOrVz585r165xHQv4Eqy15AJmLQEAALhis9l8NFsBAAAAbG+88QZJkkKh8NChQ5cuXeI6HAD/gdQSAACAU/TUcczwBQAA8AO7d++mKGpwcFCpVMpkMq7DAfAfSC0BAAA4hdQSAADAJES/XdcOslEAzti/wREAAHwU/abYgAB8Z+BJ7OU2AQAAYJJob2/nOgQAX4JPIAAAfqK9vf3bb781m81cB+JXMGsJAAAAAMA1pJYAAPyBxWLp7+83m81ILY0HpJYAAAAAAJzBA3EAAP4gMDBw6tSp/f39YWFhXMfiVzBrCQAAAADANcxaAgDwEzweTygUch2Fv6HXrkJqCQAAgCv0EtpcR/H/JjIY77lqgGEhtQQAAOAUc1dns9m4jQQAAMDPyOVyd6pNzBc8RqPRnWoT+W2T+32JRKJxjQRgWEgtAQAAOMWkljBxCQAAwLPa2trYuwMDA1u3bpXJZHK5vLKyMjExkX300qVLcXFxfD5fqVQyhbm5uTNnzhQIBMuWLaupqaEL6YlFJSUldvWNRuNLL70kFovnzp3b1NTEzD/SarXz588XCAQymWzz5s3u5JhaWloWLlwoFos3btzY19fH7re6upogiOrqapIk4+PjmVOSk5OTk5PdHBn6dLtZS86uSyKRGAwG8gE3uwDwLKSWAAAAnGLu0pBaAgAAGFc7duwwmUwNDQ137twRCAQ6nY599MyZM01NTVVVVVlZWUzh3r17m5qa9Hp9fn7+6tWr6UL6v2yNRtPY2Miuv337dolE0tbWVltbe/bsWaZmXl5ecXGxyWRqbm5OTU3Ny8sbNtTKysrjx483NzcLhcJt27bRhfX19QsXLkxPTycIIi0tbd68eadPn2ZOoSjK/XuJ9PR0x8rOroseKOoBN7sA8CwSf/kAAABcaG5uttlsCQkJfD6f61g8IDAwMDs7u6KigutAPG/KlCkGg8FqtXIdyGjk5uYqFIr8/HyuAwEA38bj8S5cuLBkyZKJ7/p3v/vd9u3bV65cOeTRv/71r0lJSR999BFBEAqFQqPRsI/Gxsaq1Wq5XH7t2jWJROJ4OkmSZrM5MDCQ3qY/w966devVV1+tq6sbHBycO3dubW0t89mWqcPelkqlN27coNvXarVSqZQuj4yMZKexoqOjOzo6XFwpSZIqlUqhUBAEodPpZs2axdTPzMxcv359Zmbm8ePHT5w4ceTIkeEHzmVHdp/Wh7yuIWvCeJDJZPX19dOnT+c6EG+EN8QBAPiewcHB4OBgrqOYLAICAmw2G+7YAAAAXHjyySdffvllZ0dbWlqYbbVaTW/YJUQsFouL9um8Etu6deuef/75gwcPSiSS+/fvD7tyE/thMXa/SUlJ586dc32uMzabjX7jB23Pnj1r167NyMh4++23T5w4Mbo2x8hkMvnHl2HgW5BaAgDwMQMDA2q1OiwsLCYmBk/UTwB6kLGMNwAAgAuPPvroo48+6uwoRVFMRsmZtWvXFhcX79mzR6vV/vd///eJEyc++eQTF/XVavW8efPCw8MbGxt/97vfDRthVlbW/v37d+3aZTQay8vLmfK0tLTy8vKVK1fGxsay80QulJWVvfjiiwKBYPfu3evWrWPKZ82atWjRolWrVi1YsGDGjBnsU+iFlq5cueJO+yMVFBSkVCp/+MMfXrhwYe/evZcvXx6PXgBcwFpLAAC+ZHBwUK1W02kO5JUmBn2XiVlLAAAAniWVStm7xcXFer1eKpU+/vjjJ0+eLCoqosvpGx7HP0tLSzdt2iSRSPLz8zds2OCiJv1nYWFhW1tbVFTU4sWLV61axfS7ZcsWrVabkpIikUhWrFhRWFjoIma6qZycnMzMzOnTpxsMBrv6r7/++uXLlwsKCuxOtFqt7t9LMEs9slfmdnZdBEHQSy+JxeLy8vKDBw+62QuAB2HWEgCAz7BYLBqNxmazhYaGxsTEcB3OZIFZSwAAAOOhvb2dvSsQCD766CN6PSY2dkaGvb1mzZo1a9Y4HnJWPywsrKysrKyszGw2nzp16rHHHqPLeTze66+//vrrr7sTM9Ogs/lHp0+f/tnPfsZ+Nxzt66+/dqd9x7CHLLSrsGbNGpPJ5H77AB6H1BIAgG+wWq1qtdpisfD5fLlcjilLEwazlgAAAPzDG2+8sWfPHj6fn56efunSJY+3z9ye7d+/3+ONA3gzPBAHAOADbDabRqMxmUyBgYEKhYLH43Ed0SSCWUsAAAD+Yffu3RRFDQ4OKpVKmUzm8fapBzzeMoCXQ2oJAMDbURTV1tY2MDAQEBCgUCgc35AC4wqzlgAAACYbmUxGOhiPbBSAf8DnEwAAb9fe3t7X10eSpEKhwNtkJx5mLQEAAEw2dutAAYBrSC0BAHg1nU7X29tLEIRMJgsJCeE6nMlIJpPhW0oAAICxGBgYUKvVf/7zn7kOBGD0TCaTxWLhOgovhdQSAID36urq6uzsJAgiOjpaJBJxHQ4AAADAaHz99ddnz549d+4c14EAjF5fX19bW1tiYiLXgXgjpJYAALyUTqdj8koRERFchwMAAAAwSv/yL//y0EMPlZSUcB0IwOjJZLK4uDiuo/BSWMYbAMAbMXmlqKgo5JUAAAAAAMBrIbUEAOB12HklsVjMdTgAAAAAAABO4YE4AADvwqyvFBkZibwSAAAA+IeysrLDhw9zHQXA6On1eq5D8F5ILQEAeJGurq779+8TBCGRSCQSCdfhAAAAAHjAz3/+83//93/nOgqAsZoyZQrXIXgppJYAALyFwWCg80pisTgyMpLrcAAAAAA8IyQkJCQkhOsoAGC8ILUEAOAtwsLCQkJCwsLCkFcCAAAAAABfgdQSAIC3CAgIUCgUAQF4wYJ3sVgser2eJEmk/AAAAAAAHOEDDACAF0FeyQtZrdaurq7u7m6uAwEAAAAA8EaYtQQAAOBKYGCgWCwmSZLrQAAAAAAAvBFSSwAAAK7weLyoqCiuowAAAAAA8FJ48gIAAAAAAAAAAEYJqSUAgIlms9m0Wq3NZuM6EAAAAAAAgLHCA3EAABOttbXVaDRaLBa5XM51LADgD7RabW9vL9dRgM8ICwuLiYnhOgoAAPAfSC0BAEy0yMhIi8WCN9kDgKds27bt1KlT4eHhXAcCPsBgMCxatOj3v/8914EAAID/QGoJAGCihYSETJ06FW8cAwAP+o//+I/NmzdzHQX4gMOHDx87dozrKAAAwK9grSUAAA4grwQAAAAAAP4BqSUAAAAAAAAAABglpJYAAACGZ7PZKIriOgoAAAAAAK+D1BIAwHix2WxchwCeoVKpmpubDQYD14EA+IyxPPaLR4bZMBoAAOD9kFoCABgXZrP522+/7ezs5DoQ8ICAgAACuUIAFqVSyefzg4KC4uLiVq5cyXU4AAAAwCWklgAAPK+/v//bb781mUw9PT3IR/gBpJYA7GRlZVVVVZnNZpVKdfbsWccKY3mA1Nm5sbGxo27Td+FRXAAA8H5ILQEAeJher1er1VarNSQkJD4+ns5KgE9DagnAjtlsXrNmzQR32tra6rrC4ODgxETiJf0CAAB4CXzgAQDwGIqi2tratFotRVFCoTAuLi4wMJDroMADkFoCn9PU1PTcc8+JxeLQ0NCUlJSLFy8mJiYyR69fv/7ss88qFAqFQpGZmdnU1MQcIkmSJEmDwfDss8/y+Xw+n69UKtktJyQk0Kv/kA8sWbKEXeHWrVt0uWNUn3322YwZM4RC4fr1641Go2M1Z+c+8sgjdp3a1amqqlIoFCEhIUKhcMWKFV9//TX7cj766CORSFRXV7dnzx6BQGB3RS7Y9eXYtbN+2fUJgjh37tyTTz6ZmJh4+vRp+hD9RCFJklOmTMnMzKypqfnOd75j17uLkRzLTxAAAMDjkFoCAPAMk8nU0tLS29tLkqRUKpXL5Vh71W/QqSU8lgK+4vr16ytXrly5cuW1a9d6enqOHDly69YtnU7HHP3xj3+8f/9+tVqtVqt/9atf5eTkMLkJ+u95Xl7ea6+9Njg4WFVVlZWVxW783r17dB3qgZqaGnaFGTNmDPmP5csvv3zzzTePHTvW2dm5efPmt956i3D4Z+Xs3Nu3b9t1yq5WU1Nz6NChU6dOGY3Gtra2HTt2vPLKK1999RXT/q1btyorK5955pn79+8fOnTI7opc6O3tlclkfX199K7BYJDJZL29vcP2yx7MDz744MqVK2fOnGlqaqqsrKQP0U8UUhTV1dVVWlqqVqs7Ojrsenc2GmP8CQIAAHgeBQAAY9bb23v79u2bN2/euXPHaDRyHQ54WFdX182bN1tbW7kOxAN4PF5OTg7XUYyL8PDwgIAArqMYpc2bN+/du3fUp+fk5JSUlDC7q1ev/vjjj51VXrVqVXV1Nbukurr6mWeeYXYJgjh69Ch717GRYe8hHSusWLHi7NmzzO6JEyecNTLS8u9+97t3795ll3zzzTdLly5lzuru7qY3enp63Ame7d/+7d8++eQTevu3v/3t+vXr3eyX6f3cuXPMrsVioTdEItGZM2fowFxzjHaMP8FPPvmEXRn8TEBAwKVLl7iOAgAmHcxaAgAYE4qitFpta2urzWajF1cKDQ3lOijwMDwQB76lpqYmLS3NxdEFCxawS5KTky9dusQu+dGPfuTxqL766it2v9/73vc81fKVK1emTZvGflZu9uzZdXV1TIXw8HB6QyQSjbTx7OzsQ4cO0du//e1vs7Oz3e+XtmzZMmabx+PRG19++WVRUVF0dHRCQkJGRsbatWuHXUmKwdVPEAAAwBksAgIAMHpWq7W1tbW/v58gCLFYHBkZiYfg/BJSS+BbrFar699FlMNjVo4lPiQ0NPT69esPPfTQeDS+dOnSTZs20XmfxsbG1NRUj/T72GOPXbx4kV2SkZHBrMQ0LD/7CQIAgK/DrCUAgFEaGBhoaWnp7+8nSTImJiYqKgp5JX+F1BL4lkWLFv3hD39wdnTJkiVffvklu6S+vp6dMRkn8+bNu3r1KrN74cKFMTbIvJctIyPj8OHpaHPvAAAgAElEQVTDY2zNGR6Pl5WV9emnnx4+fDgrK4uZduTxfqurq92sydVPEAAAwBmklgAARqOnp0etVlsslsDAwLi4uFE8ZAE+hE4aIrUEvmLPnj1vvvnmhQsXKIrq7+9vamoqLy/fuHEjfXTfvn07d+6sq6uzWCwWi6Wurq6goGDfvn3jHdVbb731y1/+8ubNm2azua6u7s9//vNIWwgKCqJfdtba2lpSUvL000/T5Xv37i0rK3v33Xf//ve/m81mnU73xz/+MSMjw1OR08/E2T0NN8Z+o6OjT5482dXVRe/W1dUFBQW5GQ9XP0EAAABnkFoCABgZm83W1tbW3t5us9nCwsKmTp0aEhLCdVAwvjBrCXxLcnKyUqnct2+fWCyOjY3Nzs4eGBj49a9/TR999NFHP/3008LCQrFYLBaL9+3bd+TIkZkzZ9JH6UQqMwfTbpcgiG+++YYppKWnpzNHmUK7bYIgFi5cWFBQkJ6eHhERUVJS4pgKcXEujX7ZWUBAwIIFC27fvn3q1Cm6PC4u7osvvrh9+/b8+fOFQuHTTz9dU1NDv4ttyMuxu6JhPfXUUzabjaKoJ598kl3uol+70XO8nGnTpsXGxr788suxsbFJSUnPP/98VVWVm6Mxxp8gAACAx2GtJQCAEaDfME2vYyKVSpmlYcG/IbUEPic5Ofn8+fPOjj766KPOnpizW7LHcQWf2bNnu1jWx/WKP88999xzzz1Hb2u1Wrv5nsOuFrRmzRqTyTTkIYVCwc7pDNkmsz2KZYn+9re/jajfYTu6cuUKQRBHjhwZxbnE2H6CAAAAHofUEgCAu/r6+ujXz/P5/JiYmODgYK4jgglCp5boV6viy3+AsdNoNLt27crLy+M6EAAAAPAAPBAHAOCusLAwPp8fERExdepU5JUmFTq1RGDiEsDYvPfee/SDXU899dQTTzzx5ptvch0RAAAAeABmLQEAuIskybi4OCbLAJMH/WGYoiibzcZ+PxQAjMi2bdu2bdvGdRQAAADgYfiABAAwAsgrTVpYbgnA/yQkJJBOJCQkcB0dAACAz8CsJQAAgOEFBARYrVaklgD8yb1797gOAQAAwB/g63cAAIDh0c/BIbUEAAAAAGAHqSUAgH/S39/f0tJiNpu5DgS8Cx6IAwAAAAAYEh6IAwD4JzqdbnBw8P79+3K5nOtYwIvweLzAQPynCV6qvr6+srIyNzeX60DAN8THx3MdAgAA+BXcJQMA/BOpVKrX6yMjI7kOBLxLTEwM1yEAODV//vxNmza9+OKLXAcCPuDYsWOff/4511EAAIBfQWoJAOCfBAUFRUdHcx0FAMAIBAYGhoaGisVirgMBHyAQCOjF4wAAADwFay0BAAAAAAAAAMAoIbUEAAAAAAAAAACjhNQSAEw6FEV1dXX19fVxHQgAwEQjSdLFIRdHXbc57IkjbXl0kQAAAAAnkFoCgMmlv7+/paXl/v37Wq2WoiiuwwEAGBfO3nHp4vfeqH8lunPiSBt3v75IJBpRywAAAOBxSC0BwGRhsVg0Go1KpTKZTIGBgdHR0fhWHAD8VVtbm11JdXW14/Sivr6+nJwcoVA4Z86choYGu1OSk5OTk5Pd7LGlpWXhwoVisXjjxo3saaFD9ms0Gl966SWxWDx37tympiZ2hSHr0yUlJSVxcXF8Pl+pVNLlEonEYDCQD7gZKgAAAHgWUksA4P8oiurs7Pz73/9Of9qJiIhISEgQCARcxwUAMHHS09MdpwJt375dLpfrdLrz5887vpCeoij3Zw9VVlYeP368ublZKBRu27Zt2H4lEklbW1ttbe3Zs2cJ1jSlIevTJRqNprGxsaqqKisriy7X6XRMnJiICgAAwBWklgDAzxmNxpaWFp1OR1FUSEjI1KlTo6OjAwLw2w8A/JBCoWDm79AbCoXCRf1PP/00Ly+Pz+dHRUX95Cc/sTt69erVq1evutn1pk2b4uLiJBLJW2+9dezYMdeVq6qqtm/fHhwcLBAI/vVf/9XNLvbu3RseHr5mzRqz2ezmKQAAADABArkOAABgvFgsls7Ozp6eHoIgAgICIiMjIyIiuA4KfBVFUW1tbTabLTY2Fs/dgNdSq9X0BkmSI53FYzKZPBKDzWYbNn3P/kfkwdlGJpOJz+d7qjUAAABwE763BwA/RFGUTqe7d+8enVcSiUQJCQnIK8FYkCRpMBiMRqPVauU6FgCPef75599//32z2azRaPbt22d3dERrLZWVlalUqq6urt27d69bt8515aysrP3799tsNoPBUF5ePprQHwgKClIqlWaz+cyZM0uXLh1LUwAAADA6SC0BgF+hKEqv19+9e7ezs9Nms4WEhMTHx8fExAQGYpImjJVMJouJicHTlOATpFKpXYndg3J0YVFRkUqlEovFaWlpGzduJP55PpHVanVnShF9Sk5OTmZm5vTp0w0GQ2Fhoet+CwsL29raoqKiFi9evGrVqmHjZErs/iQIgl56SSwWl5eXHzx40L3hAQAAAE/CZy0A8B99fX3379+nn+kICgqKiooSCoVcBwX+Izw8nOsQANzV3t5uVzJkkkggEHz88ccff/zxkHW+/vprd/pizrpy5YqLo2xhYWFlZWVlZWVms/nUqVOPPfaY6/rsQrsKa9as8dSjfAAAADA6+OoVAPzB4OCgWq3WaDQmkykgICA6OjohIQF5JQAAr/XGG2+QJCkUCg8dOnTp0iWuwwEAAIDRw6wlAPB5nZ2dXV1d9PfYIpEoKioKj78BAHi53bt37969m+soAAAAwAPw6QsA/AFFUQKBICoqCu8GAgAAAAAAmEhILQGAzxOLxcHBwXj8DQAAAAAAYOJhrSUA8HkBAQHIKwEAAAAAAHACqSUAAAAAAAAAABglpJYAwAcYDAaVSjXkG6kBAAAAAACAQ0gtAYC3oyhKq9X29/d3d3dzHQtMajabbWBgYGBggOtAAAAAAAC8CFJLAODtSJKMioqKjIwMDw/nOhaY1Ewm07ffftva2sp1IAAcUyqVfD5fIpEsWbLE7hBJkiNqaqT1PcVFvyRJji4qd070lfEBAAAYEaSWAMAHiEQiiUQSEIBfWcAl+m+gzWbjOhCA4cnl8vFrPCsrq6qqSqfT1dTU2B0a6ZPLjvVFIpGzykajcUSNj6hfdw6Nus1RN+5+fRfjBgAAMN7wOQ0AAMAtPB6PIAibzYZlv8D7tbW1sXcHBga2bt0qk8nkcnllZWViYiJdbjab8/PzZ86cmZiYuG3bNpPJRJfTE3BKSkri4uL4fL5SqaTLExISSJI0m82ZmZl2k3Sqq6sdp+0YjcaXXnpJLBbPnTu3qamJXWHI+hKJxGAwkA8w5Vqtdv78+QKBQCaTbd68mc4x0XX2798vEonq6uoOHjwoEomYUJ0Zst++vr6cnByhUDhnzpyGhga7U5KTk5OTk103y2hpaVm4cKFYLN64cWNfX59nx8fZz8XZuAEAAEwMpJYAgHs2m02n03V2dnIdCIArdGqJIAir1cptJAAjtWPHDpPJ1NDQcOfOHYFAoNPp6PKdO3cqFIqmpqabN28qFIqdO3fS5XT+VKPRNDY2VlVVZWVl0eX37t2jD1EPMF2kp6c7Zl23b98ukUja2tpqa2vPnj1LsKbhDFmfDsyx8by8vOLiYpPJ1NzcnJqampeXxzRltVorKioyMjIaGhoqKiqYUJ1xFqdcLtfpdOfPn//888/tjtoF41plZeXx48ebm5uFQuG2bduG7XdE4+Ps5+Js3AAAACYGif9+AIBDFotFr9d3d3fbbDaSJKdNm8Z8egfwQs3NzTabLSEhgc/ncx3LKAUGBmZnZ1dUVHAdiOdNmTLFYDD4aOIvNzdXqVTGxMSM7vS2trb8/PzNmzcrFAqNRsM+FBsbq1ar5XL5tWvXJBKJ3YkxMTE3btyIiIggCKKrq+uxxx5jVhMjyX/cJbK3HXfZ7A5JpdIbN27Q/Wq1WqlUaneiY1NDNh4ZGcmkwwiCiI6O7ujoYFd23HDNrppEIrl9+zYdZ2dnZ1RU1OjukEmSVKlUCoWCIAidTjdr1iw6Tmf9jnF8XPyMXDh8+PCxY8d+//vfj/jywBfweLwLFy44roMGADCuArkOAAAmKZPJpNfre3p66Fvh4OBgsViMvBJ4OR6PZ7PZfDR5Ad5s27ZtOTk5oz79nXfeoTfUajW9YZdosFgszs4d128Z2Q9njaIjk8lEp3GTkpLOnTvnychcduqRdmw227BLBI5xfJxhxg0AAGBi4IE4AJhoRqNRo9Hcu3evu7uboqiQkBC5XD516lQsQQrej1luietAwN/Ex8cnjYFYLHbd/tq1a4uLiwmC0Gq1SqVy/fr1dPmGDRvKysrop6hKS0uzs7M9e11ZWVn79++32WwGg6G8vNydU4KCgpRKpdlsPnPmzNKlS+nCtLS08vJylUo1Tv/6nn/++ffff99sNms0mn379tkdHdFaS2VlZSqVqqura/fu3evWrXNdeRTj48yQ4wYAADAxkFoCgAlCUVRPT09LS4taraZXNg0LC1MoFPHx8UKhkOvoANxCp5ZcTAAB8BJSqZS9W1xcrNfrpVLp448/fvLkyaKiIrr83Xff1Wq18fHx8fHxnZ2d7777Ll1Oz6Zx/JNeW5p4sJ40e9INs8suLywsbGtri4qKWrx48apVq9ghDVmfIAh6CSGxWFxeXn7w4EG6cMuWLVqtNiUlRSKRrFixorCw0C4w4p9nALkwZL9FRUUqlUosFqelpW3cuNGuNavV6uZDdgRB5OTkZGZmTp8+3WAw0HF6cHyc/VycjRsAAMDEwFpLADDuzGYz/ewb/W1zQEDAlClTpkyZEhQUxHVoACPT3t7e09MTGRnpuGaNr8BaS37phRdeSEpK2rx5M9eBOGU2m0+dOrVz585r165xHYs3msjxwVpL/g1rLQEAJ7DWEgCMI6PRqNfrmbcv8/n8iIgIkUg07PITAN6JnrU0OZMXAKPzxhtv7Nmzh8/np6enX7p0ietwvA7GB/wGRVE//elPuY4CJruf/OQnSUlJXEcxGSG1BADjwmAw6PX6/v5+ejckJCQiIkIoFLr5wAKAd0JqCWCkdu/evXv3bq6j8F4YH/Anv/nNb95++22sIg9cqaioSE1NRWqJE0gtAYCH9fb23r9/n16MhiRJgUAgFotDQkK4jgvAA5BaAvB+Mpmso6PDrlAqlba3t3MSD8Ck8uqrrwoEAq6jgEnq8uXLXIcweSG1BAAeRpKkxWLh8Xjh4eERERGBgfg9A/4DqSUA74cUEgAAwATDRz4A8DCBQCCXywUCAZ59A/+D1BIAAAAAgB2klgDAw0iSFAqFXEcBMC6QWgIAAAAAsIOXNAHAyFit1q6uLsdlLAAmAzq1RFGUzWbjOhYAAADwmLFMt8dUfQCklgBgZGw22/3797u7u00mE9exAEy0gIAA+vYRE5cAAAB8iFKp5PP5QUFBcXFxK1eu5DocAH+D1BIAjExQUFBERIRMJgsKCuI6FgAO4Jk4AO9HkqTHJxHs3LmT2T5y5AiPxyNJks/nK5VKx65JkoyIiGhsbKQLL1++vH79+jVr1jiewm4WAMZPVlZWVVWV2WxWqVRnz551rEBR1Kgbd3ZubGzsqNv0RZPteoENay0BwIhFR0dzHQIAZ3g8nsViQWoJvJxcLm9tbR2nxo1GY1hY2Dg17hEURXk2tXTr1q2uri5m95VXXjl16lRaWppSqczKyrKbxuv4IfMnP/lJfX29WCwmCKKurm758uUGg4E+1NXVdefOnenTp3swWgBwZDab16xZM8GdDvt7eHBwMDg4eGKCmQCT7XqBDbOWAOCfUBTV29vb1tY2lq9uAPwYZi2BT2hra2Pv0vNoSkpK4uLi7GbN5Obmzpw5UyAQLFu2rKamhqm8f/9+kUhUV1d38OBBkUhEn6LVaufPny8QCGQy2ebNm41GI7uX5OTk5OTkYWNj5vUMuesYD1NHr9dv2rRJJBLl5eXR5QMDA1u3bpXJZHK5vLKyMjExkd3RpUuX3LleF+0zysrKli9fzuzqdLq0tDSCIDIyMubMmTPsJQ8ODtJ5JYIgnn766b6+PuZQampqaWnpsC0A+L2mpqbnnntOLBaHhoampKRcvHiR/S/6+vXrzz77rEKhUCgUmZmZTU1NzCH636/BYHj22Wf5fL7jXMKEhAT6Nwzz22bJkiXsCrdu3XI21fGzzz6bMWOGUChcv3690Wh0rObs3EceecSuU7s6VVVVCoUiJCREKBSuWLHi66+/Zl/ORx99RP8G3rNnj0AgsLsi18Y4kq53nY3zqK/Xrq9z5849+eSTiYmJp0+fdv+SwStQAAAURVFUf39/e3v77du3b968efPmTYPBwHVEAN6os7OztbW1r6+P60BGicfj5eTkcB3FuAgPDw8ICOA6Cm7k5OSUlJSwSxzv8QiCyM/P7+7u/uyzz4KCgpjy3t5eiqJMJtOFCxeEQiFTuaio6NixYxERET//+c+PHTtGn/LjH//4T3/6k8lk6u3t/eyzz15++WV2F/PmzZs3b547AS9cuLCuro7erqurW7Roket46JCWLFlSUVHR3d194cIFuvAXv/jFT3/6046ODqPRePTo0cjISHb9X/7ylwaDwZ3rddY+48knn2xqanK8kOrqaq1Wyy4JDQ2l77GDgoI+++wzupDH47HrsH86165de+qpp5yO1Dj45JNPnnnmmYnsESZSQEDApUuXOOmafsHF6G4gGxsbH3rood/85jdqtdpkMn377bf/9V//xfyLbmxsnD9//p07d+jdu3fvLly48MaNG8zpBEH89Kc/vXz5ss1ms/snz67jOgbHCvX19Y899tj//u//DgwM1NfX00lnN891XX7p0qX09PS//OUvRqOxt7f3T3/604IFC65evcqc9fOf//z48eNRUVG/+MUvjh8/PuQVDWnsI+ki/mHHeXTXy5z7n//5n++8845arbbZbGvXrnXzktnS09OrqqpGcSKMHVJLAJPdwMDA/fv37969e/OB5ubmjo4Ok8nEdWgA4HlILfklJrXkuM5FbGwsXYd9x89s37x584c//KFEIhEIBCkpKUy5sw2JRMJuPDo6enQB//GPf1y6dCm9vXTp0nPnzrmOhw6AzgqxxcTEdHZ2DtkFQRBms9nN63XWPiM8PNzx6Pnz51tbW52dcu/ePeZzl4tPa93d3VOmTHHWyHhAasm/+WhqafXq1R9//LGzo6tWraqurmaXVFdXs/8aEwRx9OhR9q5jI6NILa1YseLs2bPM7okTJzyVWvrud7979+5ddsk333zD/FYkCKK7u5ve6OnpcSd4xthH0kX8w47z6K6XOZf5v4CiKIvF4uwqXEBqiUN4IA5gkjKZTDqd7t69ey0tLTqdzmw2kyQpFApjY2OnTZsWHR2NVboBAHyOWq2m7/CIB/f3arXaRf1169YtXrz4+vXrer3+6NGjw7aflJTEvo/s6OgYXZzLly/v7++vra2tra0dGBhYtmyZO/EIhUK7EovF4qKXwED7RUVH2j6DcnhI/NChQwkJCTExMc5OmTp1qtlsdnaU/VCtY+MAk01NTQ39kKmzowsWLGCXJCcnX7p0iV3yox/9yONRffXVV+x+v/e973mq5StXrkybNo397Njs2bPr6uqYCuHh4fSGSCQaUctjH0nXRjfOw14vjfm/gHiw/gD4EKSWACYXk8nU2dl57969e/fudXZ2mkymgIAAkUgUGxv78MMPy+VygUDg2aVPAQDAa6nV6nnz5oWHhzc2Nh44cGDY+mlpaeXl5SqVip6eYMfNtZZou3btKigoKCgo2LVr16jjWbt2bXFxMUEQWq1WqVSuX7/edf2Rts9ISEjQaDTM7rFjx5544okZM2YQBMH+TzMlJaWgoKC5uZkgCKVSyXxJExoaynyIunr1anh4ODOAKpUKa3gDWK1W1/efjhlYn87JhoaG2s3ioSiKvQrbqHnnSI7f9YL3QGoJYFIwm81MRkmn05lMJpIkBQKBXC6fPn16TEwMMkoAAP5EKpWyd5nVVe3+LC0t3bRpk0Qiyc/P37BhA8FaS5W9zDbTzpYtW7RabUpKikQiWbFiRWFhIbsXq9Xq/keU1NRUm81GUdQPfvADpnDIeNh/2i0NW1xcrNfrpVLp448/fvLkyaKiolFcr4v2GcuXL79x4wazm5OTM3fuXMfKSqXy3r17SUlJJEnSbzqnyw8fPvz973+fJMno6Ohnn332888/Z7JON27cWLFihZuDBuCvFi1a9Ic//MHZ0SVLlnz55Zfskvr6+tTU1PGOat68eVevXmV2L1y4MMYGBwcH6Y2MjIzDhw+PsbUheXAkGxsbxxjMBFwveBFPPl0HAF7GbDbr9XqVSnWTpaWlpauri1mBAgAmFay15Jccl/EGz2pqarJbs9xTXn755ebm5vFo2RmsteTffHStpf/5n/+JjY09f/68zWYzGo03btwoKyt74YUX6KONjY1PPfXUF198YTabzWbzF198MWfOHPcXn3ZR6LpCfX397Nmzm5qaTCbTF1988bOf/cxZI87KmeX8NRrNgQMH5s6dS5d/++23CQkJ77zzzt27d+lHCs6ePZuenm7XmuPGsMY4knTA/f39J06cWLlypeuBdYxqdNc70mt0AWstcQizlgD8WWtrK/3eHIIggoODo6KiHnroofj4+IiICMcVKAAAAGBIiYmJERER49GyRCLBA3EAycnJSqVy3759YrE4NjY2Ozt7YGDg17/+NX300Ucf/fTTTwsLC8VisVgs3rdv35EjR2bOnEkfHXKiJXtG4TfffGM3MzE9PZ05yp6uaDd1ceHChQUFBenp6RERESUlJfv27bML28W5tKqqqqysrICAgAULFty+ffvUqVN0eVxc3BdffHH79u358+cLhcKnn366pqamsrLS2eXYXdE4jSQTsEwmO3369JEjR1wMrOM4j+567VpzMXsUvBxJ+fJDqgDgWldXl8FgEAgEQqGQz+dzHQ4AcC8wMDA7O7uiooLrQDxvypQpBoOBvTry5PHCCy8kJSVt3ryZ60DABxw+fPjYsWO///3vuQ4ExgWPx7tw4cKSJUsmvmuKogICAug7z4nvfQJotdqHH364p6eH60DAqYyMjB//+Mfr1q3jOpDJCNMWAPwZ/Y0E11EAAAAAAPgwjUaza9euvLw8rgMB8FJ4IA7Ah3V2dt69e5d+3g0AAAAAADzovffeo5/Peuqpp5544ok333yT64gAvBRmLQH4MIvFYrFY+vr6wsLCuI4FYBJpb283GAzR0dHh4eFcxwIAAADjZdu2bdu2beM6CgAfgFlLAD4sIiIiNjY2KiqK60AAJh2bzWaxWLiOAgAAACaRhIQE0omEhASuo4NJDbOWALwURVFGo7Gvr08sFgcFBQ1ZJzg4ODg4eIIDA4DIyEiJRILXLAIAAMBEunfvHtchAAwNt8UA3oV+wK2vr89oNNIvcAwKCsJS3ABeBUklAAAAAAAGbo4BuEdR1MDAAJ1OGhwcZMoDAwMFAkFoaCiHsQEAgJ8hSZIgCPrbC9eUSmVWVpZQKHzyySdramrsGnGnhQmrP1Iu2nd/fEbXPoB/e/HFF/EFDHDlr3/968qVK7mOYpLCP3sAzphMJqPRaDQa+/v7bTYbUx4SEiIQCAQCAR52AwCA0ZHL5a2trUMeoiiKzp4wjEbjkK+DyMrKqqqqWrNmzZCNjCgex/oikai3t9f9+p7lon3H8fFs+3ZcjwOAD6H/2vN4vIAArOcL3LDZbH19fVxHMUkhtQQwoaxWq/EB9hrAPB5PIBCEhYWFhYXxeDwOIwQAAD/Q1tbG3u3r63vllVeOHz8+Y8aM3/72t0y5VqtNT0//6quvpFLpj370o/fee4/OMSUkJLS0tBAEkZmZSddkciXV1dUZGRnEP2dP6FzMgQMH9u3b19HRwU5IDVlfIpEYDAYmg8M+NGR9s9n85ptvKpVKiqKeffbZd999l8/nu+7XmSHbdzY+tOTkZIIgrly54rrlUYyPi3EA8Dn03+TS0lKBQMB1LDBJZWRkTJ8+nesoJimklgAmQn9/v+PzbiRJhoaG0ukkTFACAIDxs337drlcrtPpenp6ysrKmPK8vLzi4uKnn356cHDw/PnzeXl5H374IfFgpdghn+pKT093nNdDl2g0msbGxosXL2ZlZZlMJhf1dTqds0fGhqy/c+fOuLi4pqYmgiA++OCDnTt3vvfee677dWbI9p2ND3N1rtsctn1ncboYh3Gl0+kuXLgwwZ2C+xYsWCASibiOAgBgBPAcOMBEuHv3LjNHKTg4OCwsTCAQhISEjH3KPQDAiAQGBmZnZ1dUVPwfe3ceFcWZ7g+8emXphqYb6KZZNIBbkpMZI7gemUniQsAlwRjgzDFGY8Z7b4KaMSEiyTgmE0UjiSfhJud4gIkm0QxRB70xkKjROxoxo/GOmatEFNyg2RqarWl6r98f77V+lV6Kbmhplu/nD071W2+971MlAv30u/g7EN+TyWR6vd5ms/k7ED9YvXp1UlJSTk5OTExMY2Mj+1R0dLRGo1EoFLW1tQqFgqKo9vb2iIgI8hdgeHi4TqdjKkdGRra2tjIvuRckcjjFLuE+22/jzmejoqKuXbsWFhZGUVRHR8dDDz3ETPfj7tfD9t09nwHz/PkMfWpp//79b7zxxsSJE4eyU/BcVVXVuXPnpk6dOrDLBQLByZMnH3/8cd9G5Qmapvl8vl6vx6gl8JdFixY9//zzmZmZ/g5kLMKoJYChIJFIbDYbGaAkEon8HQ4AAIxOGo2GHHAkLNjjepKSko4fPz4UkXEym81kghuHIcu/9Dvu6b523e9z8ImpU6ceOXJkCDqCAUDWDwBGIiyxBjBYdru9s7OT/TGvM6VSqVarZTIZ8koAADD0srOz33vvPYvF0tjYuHPnTqY8LS2tpKSkoaGBvZvE0BCJROXl5T6rVegAACAASURBVBaLpbKycv78+dyVV65cWVxcTNM0TdN79ux57rnnfBuMu+dDzJgxgyy3dD949RwARjcej+evEf0c/fokKsxUgFEPqSUAH2hra+vq6rJYLP4OBACGSF9fn06nMxgM/g4EwDWlUsl+uWvXroaGBrlcnpaW9sILL1D33uesX79eq9WmpKQoFIrU1NQdO3aQ+hUVFaQC7x6mKeYlu5wpcfjqrj5FUWVlZVlZWXK5vKSkpLS0lLv9d955R6vVxsXFxcXFtbe3v/POO/32647L9t09H8Jms3k+Zsrb5+PuOQCMDmq12vPKflyqhXvXyPvavgMsswUjFFJLAIPF5/NDQ0MVCgU+jgAYO3p7e9vb27HBLQxbLS0t7JcSiWTfvn16vf6nn3761a9+RYb/UBQlEAg2b95869atzs7Ob7/9Ni8vj9Qna1GzMU25LGe/dHfKoZ2MjAyz2azX6w8fPsyeAeSyvlgsJtmfhoaGXbt2MbPGOPp1x2X77p4PcenSpYsXL3r03L1/Pu6eA8Do4LBbpdFo3LBhg0qlUqvVe/funTRpUr8trFu3bvLkyRKJZMGCBadPnyaF5eXlYrGYx+OFhobOnTuXacddOQeSSXf4M763t3fVqlVSqfTRRx+9cuWKwyVejWR02T4pKSoqio2NFYvF5eXlpJzZNdKPA7gABgapJQC3aJo2Go0dHR2NjY3McqEuKZXK8PBwoRCLlwGMFeT/O7M8PwAAAPQrPz/fbDZfuXLl5s2bEomEvY2AOwUFBTU1NZ2dnXl5eUuXLiWFK1euXLx4scViaW5ufu211zo7O7nLOZBMukMhs2vkiRMnvvrqK4eznmSxudsnJWTXSDJ0kZSTB+JhohxgWME7YYBfsNlsffeYzWb6lxu44NMDACCQWgIAgOHpiSee8HcIFHu3SvL3M9mt8osvvrh69SrZjfHZZ5999tlnudu5cePGxo0bq6qqTCbTtGnT9Ho9KT9w4MAzzzwjEokiIiIiIyO//vpr7nJvHThwoLa2ViwWR0RErF27Nj8/n33W82GM3AoKCiiKysjIwKoaMAogtQTw/9NJRqPRZDKxPyLg8/mBgYFBQUFBQUF+jBAAhhuklgCGLZVK5by3hlKpdJgkCDAqRUREVFZWxsfHD33XNE2Hh4eTY3e7VXr7ezMzMzM7O7u0tFShULS1tTErNy1ZssRsNvf29up0us8//3zhwoUdHR0c5YMxFnaNBBg8pJZgjDKZTMZ7HH5hCASCoHsCAgL8FSEADGcktWSz2fwdCAA4QgoJxjIejyeTyeRy+dB37ckEruXLlxcWFm7fvl2r1X7//feHDx/+/PPPOeprNJrk5OTQ0NDq6uq//vWvTDkZkfTII4/ExcVNmTKFWfrQXbm3yK6RW7du1Wq17777rsNZstDShQsXBtY4N7Jr5OLFi0+ePFlQUHDmzJn70QuAzyG1BGNIX1+fwWAg6SSHXZZFIhHJJQUGBuLDAQDol0AgoCiKpmmr1Yp11gAAAFxy2K2ysLAwNzeXFKanp+/atYs55bCjIklU7dmzZ82aNa2trY899tj7779fUFBAhkHFx8dfvnz5mWeeaWhoEIlEZWVl5Fp35Rxc9rtr166XXnpJLpcnJiZ+9tlnH3zwAXv4lc1m4/M9XbPYZfvMTpHMghtM+2TpJbFYnJqail0jYQTBX8MwhvT09HR1dZFjHo8XeE9QUBB5lwgA4CEejycQCGw2G1JLAAAA7jjvVvnxxx9//PHHzjVdDnrKyMjIyMhwrkNGDK1du9ahvrtyDi77JbtG7tu3z2WdS5cuDbJ9+pfbbrJPkV0jPW8fYJjAX8MwqlitVoFA4G6xbYlEYrfbSTopICAAa3IDwGAIhUKbzYY5cQAAAAAwxiG1BKPH3bt3TSZTXFxcYGCgywoSiUQikQxxVAAwWgmFQpPJhJW8YcRhT8rwVwt+57C0sMMpatB3x9E+AADA6OPpHFGA4Y9MasPmnQAwNLBJHAxnzD5KzpxTHgaDwavGfZI0CQkJ8VV9b+OnOG/BJ3fneSPePgcA8JZKpeI5UalU/o4LYFRBagmGO5qm+/r6Ojs7m5ubGxsbOWqqVKoJEybgTzQAGBoikYhCOhuGq+bmZvbL3t7eVatWSaXSRx999MqVK0y5VqudPn26RCJRqVQ5OTlMjoa89fruu++USmVycvKdO3cGFkZ5eblYLObxeKGhoXPnzp00aRIpVygUer2eeY/HvmTdunWTJ0+WSCQLFiw4ffo0d3138XOoqKhw7tTd8yFmzJhBNoTyhMv2SUlRUVFsbKxYLC4vL+/3OQCAr7S0tNBOsJUkgG8htQTDjt1uJ7mklpaWu3fv1tXVNTQ0aLXanp6e3t5eh53d2IRCIf4sA4Ahg1FLMIJs2rRJrVbrdLoTJ0589dVXTHlubm5hYaHZbK6rq5s3b15ubi4pJ4Nu2tvb6+vrN23a9Ic//GFg/a5cuXLx4sUWi6W5ufm1117r7Owk5TqdjvRCsC8pKCioqanp7OzMy8tbunQpd3138XNIT093HlLk7vkQzkF62z4paWxsrK6uJts/cd8XAADAyIK1lsD/7Ha70Wg03eO8J4JAIAgICCDLbyN5BADDBBm1hNQSDCsxMTHMCF/yGzM6Olqj0Rw4cKC2tlYsFkdERKxduzY/P5/U+eqrr5gtkCiKioyM/Oijj5iXCxcuDAgISEtLW7NmzcDiOXDgwDPPPCMSiSIiIiIjI7/++mvu+jdu3Ni4cWNVVZXJZJo2bZper+euzx2/V3G6fD7ExYsXB9Cms4KCAoqiMjIyMNoRAABGGaSWwA9sNpvJZGLSSc5/YAkEArKJG0HevwEADCsYtQTDkEajIQccy0izP8JJSko6fvx4v82S7/YBWLJkidls7u3t1el0n3/++cKFCzs6OlyGJBaLKYrKzMzMzs4uLS1VKBRtbW3uVoxi6nsYv1f8uO03c18AAAAjCybEwVBrbm6+efOmRqNpb2/X6/UkryQUCiUSSXh4eHR0dHx8fEJCQnR0dHh4uFQqRV4JAIYnMgmXpmlkl2D4y87Ofu+99ywWS2Nj486dO5nytLS0kpKShoYGl/PNv//+e7PZXFlZuWDBgoH1GxkZeeHCBT6fHxcXN2XKlN7eXuaUSCQqLy+3WCyVlZXz588nhRqNJjk5OTQ0tLq6+sMPP2Q35bI+d/yec/d8CK/WWvKWy/sCAAAYWZBaAt/jXiyApIpEIpFUKg0PD4+JiUlISIiPj4+OjlYoFBKJZMAfjQIADDHy8wpzW2AYUiqV7Je7du1qaGiQy+VpaWkvvPACdW+63Pr167VabUpKikKhSE1N3bFjB/uq6OjoxMTE3bt3v//++0whs+C0JytPx8fHX758edKkSTweLysrq6ysjDlFlhySy+UlJSWlpaWkcM+ePWvWrFEoFHl5eStXrmTidFefO36XXMbv7vkQNpvN84WQXLbPlDh8dXdfAADDwf3YYeDNN9907oLH44WFhVVXV5PCM2fOrFixIiMjg8fjsbc+cL4chg+8hwdfomn6zp07FoslISFBIBC4rBMWFiaXy/l8pDUBYMQTCoUWiwWjlmAYctj8SCKR7Nu3j1mWiEmUCASCzZs3b9682WUj06ZNq6+vdyj0arXpCxcuUBS1du1a51MZGRnOU88yMjIyMjJc9uWyPnf8LrmM393zIS5dujTI9tmFDhVc3hfAqKFWq5uamoayx5CQkJ6eHpenDAZDcHDw/WvfWz6J576iadq3qaUbN244T4t2/rG5du3a8+fPy+VyiqKqqqoWLlzILL3X0dFx8+bNhIQEH0YFPoG39+BLzI8ek8nkro5AIEBeCQBGByy3BKOVw8gaAICBaW5uZr80Go0bNmxQqVRqtXrv3r2TJk0i5RaLJS8vb/LkyZMmTXr99deZfKvD6D+H46KiotjYWPaoFoVCodfrmYEwTL9arXb69OkSiUSlUuXk5BgMBnY7nZ2da9asCQkJ6XeXSXftk5cVFRUURVVUVPB4vLi4OKb8u+++UyqVycnJd+7c4Y6H8HASrkMYDi/XrVs3efJkiUSyYMGC06dPc9+vu38X4tSpUw7P2dv2GcXFxQsXLuz31kwmE8krURQ1Z84c9mTqefPm7dmzp98WYOjhHT70z2Kx6PV6nU7X1NR0584dZusZl9RqdXx8/DBPwAMA+AQ2iYPRir7H34EAwKiSn59vNpuvXLly8+ZNiUSi0+lI+ZtvvhkTE1NTU3P9+vWYmBhm0pO7EX/kuLGxsbq6mswqJeWkQeefYLm5uYWFhWazua6ubt68eUzKg9RZtmxZSkqKRqN58sknueN31/758+dnzZqVnp5OUVRaWlpycjLZEJPUaW9vr6+v37Rp0x/+8AfueJioPPnxS9P0rFmzqqqqyMuqqqrZs2czFxYUFNTU1HR2dubl5S1dupT7ft39uxCVlZU1NTXs5+xt+4zjx48/+OCD7JKgoCCSkGKnrpwHzDKmTJni890bwDdogF8ymUxdXV1arVaj0dy6devGjRvXf6murs7fMQIADAudnZ3Xr1/XaDT+DsQLAoFg1apV/o7ivggNDeXz+f6Owj9WrVpVVFTkr94d1nUilEol4hmePv/886eeesrfUYBbEyZM+Oc//zngy1UqVW1trQ/j8RxZTV+v19M0HR0d7fB/MDo6mqbpqKio9vZ252tVKlVHRwc51ul0UVFRzCnql6kcr44ZCoWCHUxkZCS7fk9Pj+e36e4ddEZGxuHDh2maPnjwYHZ2Nrs+ubWenp6QkJB+4/HKt99+O3/+fHI8f/7848ePk+Pr168vXryYrGObkpLi8Hyc79fdvwupb7FYmOOBtc8IDQ11d/bOnTsikcihI+eXXV1dMpnMXfvp6ellZWXuzsJ9hbWWxjqbzWY2m00mE/PVeY8VkkUWi8UBAQHkq19CBQAYboKCgpRKJX4qwhjnsK6T3w23eADGII1GQw7IVqpMOcc4X7q/cToD2AjSbDaLxWKKopKSkjiGukilUm9bdmifoqjt27cvX7580aJFb7/99uHDh13WZ3Yr4o7HcwsXLnz77bfPnj1LUZTRaGR288zMzMzOzi4tLVUoFG1tbWq1mn2V8/1yj7923mTJ2/YZHP/K48aN49gXxWazMSv59vutAn6BCXFjVEtLS319/c2bN2/evNnQ0KDVaru6uoxGo91uJ4kksn2bWq0eP378hAkTxo0bFxUVJZfLsYMbAABDLBbLZLLAwEB/BwIAADACLF++vLCwkKIorVZbXl6+YsUKUr5y5cri4mIy9mHPnj3PPfccc4lIJCovL29qanrllVc86YLUt1gslZWV8+fPJ4VpaWklJSUNDQ0DyE950j5FUVOmTJk9e/aSJUtmzpw5ceJE9iXff/+92WyurKxkUj/c8Xi41hLx1ltvbdmyZcuWLW+99RZTqNFokpOTQ0NDq6urP/zww34bcffv4o637TPGjx/PXlwlJSVly5YtdXV1FEWVl5eTdQYoigoKCmIm+l28eDE0NJR5UA0NDVjDe3hCammMMhqNRqPRZrNRFCUSiSQSiVwuj4qKGjduXGJi4vjx49VqtUKhkEqlTCYeAAAAAADAcw4TVAsLCzs7O5VK5cMPP3z06NFdu3aR8nfeeUer1cbFxcXFxbW3t7/zzjvMJWVlZdnZ2UuWLHnxxRepX24y4PyV1M/KypLL5SUlJaWlpaRw/fr1Wq02JSVFoVCkpqbu2LGDlDPXOizLzcFl+8TmzZvPnDmzZcsWh0uio6MTExN37979/vvvc8dD2Gw2zwfmzJs3z2630zT9xBNPMIV79uxZs2aNQqHIy8tbuXIl5fSsHO7X3b+Lu+fsbfuMhQsXXrt2jXlZXl5+586dpKQkHo+XlZVVVlZGyvfv3//YY4/xeLzIyMinn376q6++YrJO165dS01N9fDhwFDiYTjZ6NPX19fa2ioQCGJjY93VIXNcyTQ37NcGADB2CIXC55577pNPPvF3IL4nk8n0ej351GSsWb16dVJSUk5Ojr8DgRFg//79Bw8ePHLkiL8DAdcmTpx48ODBqVOnDuzyqKioc+fOJSYm+jYqT9A0zefz9Xq9RCIZ+t6Hg6Kiops3b+7evZtd6DAlcIy7fv36Bx988NFHHw24hZdffvnVV191N3Bp0aJFzz//fGZm5oDbhwHDzKYRyWq18vl8dykhPp9vNpu5E0YhISH3JzQAAAAAAICxhRmkw04tMaN4kF0iJk2aFBYWNpgWFAoFJsQNT0gtDXc0TVssFrPZbDabmQO73R4ZGenuv6VYLI6JicFENgAAAHDgq3c4I/2dEkf85K3gIO9upD8fAPCWy//y+DngbNu2bYO5/M9//rOvIgHfQmppeLHb7eZ7SCKJ7PXoUI3H43EM+OfxeMHBwfc5UgAAABi+1Gp1U1OTc7mv3ucMvp2QkJCenh6f1DcYDN7+5cMRP03THi65MrD2HXj7HADgflOpVK2trQ6FSqUSu08CcMAiO35D07TZbO7t7e3o6GhtbW1oaLh161ZdXV19fX1LS0tHR4derzebzWTSckBAQEhICLNlW2JiYnh4uL/vAAAAAIap5uZmh5KKigrndVVJSVFRUWxsrFgsLi8vJ+VGo3HDhg0qlUqtVu/du3fSpEnc7bhTXl4uFot5PF5oaOjcuXOZdhQKhV6vd7nU67p16yZPniyRSBYsWHD69Gnu+lqtdvr06RKJRKVS5eTkGAyGfkNyGX9vb++qVaukUumjjz565coVh0u82q3Jq+fM8RwAwF9aWlpoJ8grAXDDqCW/MRgM7J0XGUKhUCwWi0Qi8T1CIf6ZAAAAYFDS09Odx+OQksbGxurq6u+++y4rK8tsNlMUlZ+fbzabr1y5IpVKjx07ptPpuNtxZ+XKlYsXL/7yyy/NZvPx48fXrl1LynU6nbspYwUFBUVFRRaL5cyZM0uXLiUjetzVz83NLSwsnDNnjslkOnHiRG5ubr+rw7qMf9OmTWq1WqfTdXd3FxcXO1zi1RAtr54zx3MAAAAYQZCzuF+6u7uNRmNoaGhgYKDLCiKRiM/nkxQS+yv2awMAGEFomjYajRaLJTQ01N+xAFAxMTHMB1ckuxEdHa3RaLivKigooCgqIyPDYrGQki+++OLq1asKhYKiqGefffbZZ58dWDwHDhx45plnRCJRREREZGTk119/zV3/xo0bGzdurKqqMplM06ZN0+v13PW/+uqrffv2MS8jIyMHtvHQgQMHamtrxWJxRETE2rVr8/Pz2WcvXrw4gDadOT9nAACA0QGppYHj/sjOYDD09PSIRCJ3qSWxWOyXbUEBAMC3GhoaKIoKDg7GIFPwOyaLNMixMFar1SfxLFmyhEz/1+l0n3/++cKFCzs6Opyrmc1msv1IZmZmdnZ2aWmpQqFoa2tTq9Uum2XqJyUlHT9+3Cehshv3bYNedY1tWAAAYCTCABmP0DRtMpn0en1HR0dLSwuzLhLHJVKpVKFQBAUFDVmQAAAw9Hg8XlBQUHBwMKa0wGiyfPnywsJCiqK0Wm15efmKFSsG1k5kZOSFCxf4fH5cXNyUKVN6e3uZUyKRqLy83GKxVFZWzp8/nxRqNJrk5OTQ0NDq6uoPP/yQ3ZTL+mlpaSUlJQ0NDXa7fWAREtnZ2e+9957FYmlsbNy5c6fDWa/WWvKWy/sCAGC7H8uxvfnmm85d8Hi8sLCw6upqUnjmzJkVK1ZkZGTweDz2OnHOlwPg81VHZHVtyz3k2N1nd1ar1d1n1FKpVCqV3s9IAQBgWIiNjfV3CACOlEqlQwnztoQckGQoOSZDnNjHhYWFubm5pJH09PRdu3Zxt+NOfHz85cuXn3nmmYaGBpFIVFZWxpwqKyvLysoSi8WpqamlpaWkcM+ePWvWrGltbX3sscfef//9goICZviVy/rr169/9913U1JSOjo6Zs6c+fjjj+fl5XE/GZfx79q166WXXpLL5YmJiZ999tkHH3zAHvZls9k8X6/Aq+fs7r4ARg13u1XeP77dTXKY8MnOlWw3btxwHkPq/PN87dq158+fl8vlFEVVVVUtXLiQmafc0dFx8+bNhIQEH0YFI9pYH7VkMpl6enp0Oh0zFqm2tvbu3btNTU1tbW1dXV19fX0kryQQCAIDA8k2bVFRUXFxcYmJiZj7AAAAAMOQ82ZGDrsdORQ6HEskko8//ri1tbW1tXXv3r3siWku23HnwoULa9eura+vJx/dZWRkMKcyMjLMZrNerz98+PDEiROZwtu3bxsMhoqKiilTprC7cFlfIBBs3rz51q1bnZ2d3377bb95JXfxSySSffv26fX6n3766Ve/+pXDrV26dMnz5Za8es7u7gtg1HDYrdLd7pMWiyUvL2/y5MmTJk16/fXXmXmp7NE6zsee77robjdJUq2zs3PNmjUhISG5ubnsaD0csejQncNLl7teuuuXY3dOiqJOnTrlcL/ets8oLi5euHBhv7dmMplIXomiqDlz5rBHns6bN2/Pnj39tgBjx1hPLbW2tjY3N7e3t3d3dzNZJD6fT7JICoWCZJESEhISEhLi4uKioqIUCkVISEhgYCDW2wYAAAAAAPAQs/vkzZs3JRIJs/vkm2++GRMTU1NTc/369ZiYGGayFTvJ63xMdl0kQ/9IOWnQOfdNdpM0m811dXXz5s1jUi2kzrJly1JSUjQazZNPPsmO1pMEOqk2a9asqqoq8rKqqmr27NnMhQUFBTU1NZ2dnXl5eUuXLuXu193zISorK2tqatj36237jOPHjz/44IPskqCgIJKQYqeu6uvr3d31lClTfL7UHYxoo3m7U7PZrNVqKYqKiYlxV0er1ZpMJtEvCQSCIQwTAABg6AiFwueee+6TTz7xdyC+J5PJ9Hq9zWbzdyB+sHr16qSkpJycHH8HAiPA/v37Dx48eOTIEX8HAq5NnDjx4MGDU6dOHdjlUVFR586d88tmQTRN8/l8vV4vkUjYu1USZLdKtVrN7D7JFhUVde3atbCwMIqiOjo6HnroIWYaHXt2qrfHjPDwcHaaJjIysrW1lanf09MzyJVMjh8/vmvXrhMnTlAUtWDBgtdff33BggWU066XZ8+eZcfp3K+750PqWywWMmmGuUdv22fIZDKNRuPy7N27dydMmEAGjjk8TPbL7u7ucePGdXZ2evWg7rdFixY9//zzmZmZ/g5kLBrB426sVmtfXx/H7q08Hs9gMPT19XE0EhkZGRsbq1KpmLFIyCsBAAAAeE6lUvGcqFQqxAMwZmk0GodJoGT/So7dJ/sd8TCA1fqZiXVJSUnsmapMXokY/Aq5Cxcu7OvrO3v27NmzZ41GI8krURSVmZk5d+7cn3/+ubOz88svv3S4yrlf7t05nRdj8bZ9BsfTHjduHMdbbPbnN6N4kAoMwAhILdntdmZ3ttbWVo1Gc/v27dra2lu3bjU0NLhbpI2iKKFQqFKpOIYsAQAAAMAgtbS00E6cF3sas/EAAMPd7pMrV64sLi4m/1v37Nnz3HPPMZeQXRSbmppeeeUVT7rw4W6SXu0O+dZbb23ZsmXLli1vvfUWU8ix66VL3u7O6W37jPHjx7OHlaWkpGzZsoVsgF5eXi4SiUh5UFAQM9Hv4sWLoaGhzANsaGjAGt7ANoxSSzRNWywWg8HQ1dXV1tbW1NRUX19/8+bNuro69rraBoPBYrHQNE0mgnIslc/j8UJDQ4OCgobyLgAAAAAAAIBy2q2ysLCws7NTqVQ+/PDDR48eZXaffOedd7RabVxcXFxcXHt7+zvvvMNcUlZWlp2dvWTJkhdffJFi7bfo8it1b9dFuVxeUlLC3k1Sq9WmpKQoFIrU1NQdO3aQcuZah2W/CZvN5vnAnHnz5tntdpqmn3jiCaaQ7HqpUCjy8vJWrlzpHLNDv+6ej7v79bZ9xsKFC69du8a8LC8vv3PnTlJSEo/Hy8rKYnbz3L9//2OPPcbj8SIjI59++umvvvqKyTpdu3YtNTXVw4cDY4H/11oyGAxtbW1Wq5VjcQSBQCBygt3ZAAAAvIW1lkYlrLUEnsNaS8Pc6Fhraeh7B69cv379gw8++Oijjwbcwssvv/zqq68Ot4FLWGvJj+57dqavr89sNgcHBzMJTgc8Hs9kMjHHzikkkUjEMTQJAAAAAAAAADw0adIksmj6gCkUiuGWVwL/8kFqicxNc3dWp9MZDAaVSuUutRQQEBAVFYWt2QAAYOTq7u7W6XTBwcEOI/8BAAAAhqFt27YN5vI///nPvooERgcvUkt2u91isVitVovFwj7g8/nx8fHurgoKCuLxeByT1/h8fkhIiHdRAwAADCdkS2BmJxoAuE9cbis+ZF1T2BEJAADAFRcZH8s9ZP0j5tjdr1KyXJm7gUsKhcKX8QIAAAw/ZGQux2a9AENMrVY3NTUNshGDwRAcHOxh5ZCQEHf79vqqHcrLzI5X/faLe5w+w1fPAQAAYAT5v9RSW1sbk1Hi2JGRz+cLhUKyhDb7K9ZCAgCAsYyklqxWq91u5/OH0e6rMGY1NzezXxqNxk2bNv31r3/l8/kFBQXbt2+/fv06dW8kTkdHx6uvvvrll1/++7//O9mQSKvVpqen//jjj0ql8tlnn3333XeZnMi6deuOHz/e0NAwZ86c/Pz8xx9/nKIohUKh1+uZPwiZBBBHOy65a4eiqIqKikWLFrELSbX3339/y5Yt33777c8///zKK698+umnGRkZ3P2S3cQvXLjQ72Ps7e19+eWXDx06NHHixM8++4x96r4+B4CR686dO9ihG/zFYDBYrVZ/RzFG/V9qSa/Xsz9rFQgEQqGQZI7YKSSshQQAAOBMIBAIBAIy1DcgIMDf4QA4ys/PN5vNV65ckUqlx44d0+l0pJyMxFm2bNnKlSt379598eJFUp6bm1tYWDhnzhyTyXTixInc3FxmI6GCgoKioiKLxXLmzJmlS5eStaH1UwAAIABJREFUETo6nc7lVDWOdlxy1w5FUenp6Q7jhshLm832ySefLFq0aNWqVZ988klWVpbZbObu1/OhT5s2bVKr1Tqdrru7u7i4mH3qvj4HgJGIfOc//PDD/g4ExrSpU6f+7ne/83cUY9H//fLr6uqiaZpJJOETVwAAAK/U19cbjUa1Wi2VSv0dCxehUPjcc8998skn/g7E92QymV6vt9ls/g7ED1avXp2UlJSTkxMTE9PY2Mg+FR0drdFo1Gr11atXXS5TwOPxenp6HL5vw8PDmfQTRVGRkZGtra0URd24cWPjxo1VVVUmk2natGlnz55ljyFyTqm4a4cD92pKDmeZlw4HA+jXJYVCUVtbS55be3t7REQE6WUInsP9s3///oMHDx45csRfAQC3iRMnHjx4cOrUqQO7PCoq6ty5c4mJib6NyhM0TfP5fL1eL5FIhr53AIqiFi1a9Pzzz2dmZvo7kLHo/1JIMpksLCxMIpGIxWLklQAAALxF5sRhJW/wL41GQ9M0SW2QA41GQ1EU9wQB53xoUlISzcLkQTIzM+fOnfvzzz93dnZ++eWX7hpk/iO4a8dDA/4PNch++w1miJ8DAADAMIcsEgAAgA+IxWIKK3nDcLV8+fLCwkKKorRabXl5+YoVK7jrp6WllZSUNDQ0OCzBqdFokpOTQ0NDq6urP/zwQ/YpkUhUXl5usVgqKyvnz5/P3Q4Hl+14i7vfGTNmkOWW+pWdnf3ee+9ZLJbGxsadO3cy5UPwHAAAAEYQFzvEAQAAgLewSRwMK0qlkv2ysLAwNzeXFKanp5O1uql7K2E7Lzu9fv36d999NyUlpaOjY+bMmY8//nheXh5FUXv27FmzZk1ra+tjjz32/vvvFxQUMPO/ysrKsrKyxGJxampqaWkpdzscXLbDDpIcMOsuOc+J67dfm83m4SD9Xbt2vfTSS3K5PDEx8bPPPvvggw9IL0PwHABGqEceeQRbPIG/NDc3P//88/6OYozims0OAAAAHjIajfX19QKBICEhwd+xcMFaS6MSs9aSvwOBEQBrLQ1zI3etJYqiLl265Jd+ARgJCQlyudzfUYxFGLUEAADgA2RjOJvNZrPZsKEqAACMQUlJSf4OAQD8A2stAQAA+ACPxxMKhRRW8gYAAACAMQapJQAAAN8gK3kjtQTATaVS8ZyoVCp/xwUAAAADhAlxAAAAviEWiw0GA1JLANxaWlr8HQIAAAD4ElJLHqFpmlnv3G63MxuRkLkPLhmNRrvdHhAQ4G7FDZvN1tfXN+CQBAJBUFCQu7N9fX00TQcGBnq4AQoAAAweRi0BAAAAwBg08lJLdrudoiiapu12O3dyR6/XWyyW4OBgsrSqM4vF0tTURI6Z5BFp2aHQpcDAwLi4OHdntVqt0WhUq9VSqdRlBZPJxPQ+ABKJhCO11NLSYrFY4uLiAgMDXVbo6elpbm5mXrIzUHw+n72/L4/HIyUMPp8fGBgYGhrqrneTyURRlFgsxs6jADCmILUEAAAAAGOQn1NLNE13d3eTDI7NZiMHZFiQ3W5nDpiXDpcLhcL4+Hh3jff09Oj1+sjISHepJZqmSRJkwMFznBWLxTRNc2wSJBAIgoODB9y7u5tieidpIA9bYz9b5+fsEkdqqb6+nqbpBx54QCQSuayg1+u7urr49/B4PIFAQJJW7EL2sYc3AgDgRyS1ZLVa7XY7Bo0CAAAAwBjhRWrJfg+TBiIvZTKZu0va2tq6urrkcrlCoXBZgabp1tZWr6NmXc5xlgzqcZfdoChKKBSq1WpyzCRiSEbDk0Ju/a5GGRAQEBMT0287AxMdHc1dQSqVJiYmUr8cpcU+YMZwMdk9ht1u5xgwRVEUn8+naZrjbZXZbDYYDJ7fDsk98fl88jU0NNTdWDAAAD8SCAQCgcBms1ksFu4PAAAAAAAARg0hRVHd3d12JyR/xDFiiBEaGsqRarHb7Tabzd1ZPp8vlUrZU66Y4SouCynWdK1+PxAOCwsLCwvjqEB6525ktGInyDiGVg1MQkICd4Xg4GCBQMAemMZxQFEUTdNWq5W5nCOxZbVab926JRAIOGIgAwqEQiHGFACAz4nF4r6+PrPZjNQSgLfIXybcHxz6sK+h6QgAAGAsEFIU1dbWxpH9YXM5ZYmmaXepJYVCIZPJuN/AM+OGYOwIDAx0twiUM5JmIolOcsBxLZOK4miwvb29u7ubujcYql/e3BkAjHVMasnfgcBYp1arB7OkI2EwGDyfvB8SEtLT0zOYdjj+pPQ5z/NKHPcFAAAABJ+iqJCQkNDQUJlMJpfLIyIiIiMjVSqVWq2OiYmJi4sbN27cAw88kJiYOGHChAkTJiQkJDzwwAPjxo2LjY2NiYlRq9UcmSM+ny8SifDmHAaDz+cLhcKAgICgoCCJRBIaGkpWM3FJLBYnJCSMHz+eo0FmBBwZDGUymQwGQ09PT2dnZ3t7e2tra1NTU0NDw507d27evFlbW3vr1q36+vrGxsbW1tb29naLxeL7mwSA0SIgIEAkEmGFOPA79mYdFEUZjcYNGzaQP/D27t07adIkUk5GMXd2dq5ZsyYkJCQ3N5eUa7Xa6dOnSyQSlUqVk5PDnsa+bt26yZMnSySSBQsWnD59mhQqFAq9Xs/s+MFU5mjHnbt3786aNUsul7/wwgu9vb3sOCsqKiiKqqio4PF47K1UZsyYMWPGDA+fDLnc4T8pKSkqKoqNjRWLxeXl5dz3BQAAAGxCiqIiIyP9HQaAz/SbylQqlUqlkkz57BdJP7Gn4wUHB7tbwMtisfT29orF4sEs0A4AI5pMJuNYgnCYaGxsPHnypL+j8D2r1UrT9Ki8tX61tLRwV8jPzzebzVeuXJFKpceOHdPpdKScDBRatmzZypUrd+/effHiRVKem5tbWFg4Z84ck8l04sSJ3Nzcjz76iJwqKCgoKiqyWCxnzpxZunQpGdGj0+lcTjHjaMedvXv3Hjp0KDg4eOvWra+//jqpf/78+T/84Q/p6ekURaWlpSUnJ5eWljKXeDW1LT093Xl4FClpbGysrq7+7rvvsrKyyNhDd/cFAAAAbPhlCeAWST9ZrVaSZiIHcrlcKHS9/n13d3dLS0twcDDHAu1msxnz7ADAj8RisVKpjIqK8ncgvnf58mWbzZaUlOTvQPygubk5Ly8vJycnJiamsbGRfSo6Olqj0ajV6qtXr7rcVoXH4/X09DisPhkeHs6knyiKioyMJPuu3LhxY+PGjVVVVSaTadq0aWfPnmX+knSZgnHXjjs8Hq+hoYH8GtXpdFOmTGHqL1u2bMWKFcuWLTt06NDhw4e/+OKL/p4KF+do2SXujkeH/fv3Hzx48MiRI/4OBFybOHHiwYMHp06dOrDLo6Kizp07R7brAQAYMl7sEAcw1vB4PKFQ6C6R5EwoFIaEhHCv3avRaKxWK4/HE4lEQqGQfGUfYLw9ANxXQUFBL730Un5+vr8D8T2ZTKbX63/88Ud/B+IHq1evJgcajYYcOCRE2MNvnTnvapKUlHT8+HHnmpmZmdnZ2aWlpQqFoq2tzd2KmWazmcxed9eOJ+x2O3vVhe3bty9fvnzRokVvv/324cOHB9bmIDH3BQAAAGzYIQvAZ4KDg6OiouRyubsK7D3vzGazwWDo6upqb29vaWlpaGi4fft2bW3t7du3NRpNa2trR0eHXq83mUwc+zMCAAB4Yvny5YWFhRRFabXa8vLyFStWcNdPS0srKSlpaGhw+B2k0WiSk5NDQ0Orq6s//PBD9imRSFReXm6xWCorK+fPn8/dDofi4uKGhoaOjo5t27ZlZmYy5VOmTJk9e/aSJUtmzpw5ceJE9iVerbXkLZf3BQAAAGxILQEMHR6Pl5iYmJCQMG7cOLVaHRkZGRYWJpVKAwMDmbFRFouFpJza2tqampru3r1bV1d38+bN+vp67kkEAAAADKVSyX5ZWFjY2dmpVCoffvjho0eP7tq1i5STobLOy1SvX79eq9WmpKQoFIrU1NQdO3aQ8j179qxZs0ahUOTl5a1cuZJpgaKosrKyrKwsuVxeUlLCLITkrh2XSFOrVq1atmxZQkKCXq93qL958+YzZ85s2bLF4UKyNqKHT4a5U/YtMyUOX93dFwAAALCNttnjACMXTdOWe6xWK3PMfNIrFos5Nr+zWq18Pp9jx0YAAIqiZDLZpk2bRvGEOJvN5u9A/GD16tVJSUk5OTn+DuT+Kioqunnz5u7du/0dyMiGtZaGOay1BAAjEdZaAhgueDyeWCx2XsTBZrORHBP3MkzNzc19fX1qtdp5yQwAAICRjvkliNQSAADAcIPUEsBwR3aUCwwM5K5msVgoihKJRO4qWK1Wsv6o5wuTAwAADBMYaA8AADBs4R0mwCgRHx9vs9kEAoG7Cr29vWS1JjI8KoAF0+gAAGDIqFQq59UDlUplS0uLX+IBAACAQUJqCWD04MgrESKRyGq10jRtMplMJhNTLhQK2ZkmjqFPAOCJ9vb27u5uhUIhk8n8HQvAsIMUEgAAwCiD1BLAWCGTyWQyGU3TVqvVxGK9p7e3l9Tk8/nsYU1isRjDmgC8wvxH83cgAAAAAAD3HVJLAGMLj8cTiUQikYhZ7dtut7MzTWaz2W63G41Go9HIXCUSiVQqVVBQkJ+iBhhhZDKZVCp1XpUfAAAAAGD0QWoJYKzj8/lBQUFM2oimaYvFwk42kS3q+p1tBwAMksD1dxQAAAAAAEMBqSUA+AWyyLdYLA4JCSElNpvNZDJxjL/Q6/UGg0EqlQYHBw9VmAAA4AM8Ho8aUZuv8Xg8f0U74p4VAADAkMH6KQDQD4FAwJ0z0uv1XV1d7Al0AADgX2q12pNqQ5MoMRgMnldmPthwyauAveq3Xx52zRG/b+MBAAAYPpBaAoDBCgkJkcvlHOknmqbNZvNQhgQAMMY1NzezXxqNxg0bNqhUKrVavXfv3kmTJrHPnjp1KjY2ViwWl5eXM4Xr1q2bPHmyRCJZsGDB6dOnSSGPx+PxeEVFRQ71DQbD73//e7lcPm3atJqaGlKNoiitVjt9+nSJRKJSqXJycvrNrSgUCr1ez7uHfaqiosKhkLzcvXt3SEhIVVVVaWlpSEgICYm73xkzZsyYMcOTx9jb27tq1SqpVProo49euXKFfcrl83EXv7fPAQAAYGTBhDgAGCyJRCKRSDgqGAyGxsZGPp8fGBgYGBhIlnZyeM8AAAD3T35+vtlsvnLlilQqPXbsmE6nY5+trKysqak5fvx4VlYW80lAQUFBUVGRxWI5c+bM0qVLe3p6KIqiaZrH4zU2NlZXV3/33XdM/U2bNikUiubmZqvVWlJSQt0b45Obm1tYWDhnzhyTyXTixInc3NyPPvqII06dTuduylt6ejrpnSkhL2022yeffLJo0aJVq1Z98sknJCTufj0f+rRp0ya1Wq3T6bq7u4uLi9mnXD4fd/F7+xwARiKapjdv3uzvKACGl9mzZz/11FP+jmIo+G2+OgCMHV1dXVqtlv3ThqSZSI4pMDAQaSaAISOTyTZt2pSfn+/vQHxPJpPp9XqbzebvQPxg9erVSUlJOTk5MTExjY2N7FPR0dEajUatVl+9elWhUDhfy+PxLBaLUCikWCsZ3bhxY+PGjVVVVSaTadq0aWfPnmV+hrNTJ8yxUqm8du0aaV+r1SqVSlIeHh7OTmNFRka2trZy3wv3akoOZ5mXDgcD6NclhUJRW1tL7qu9vT0iIsKr58PwVTw+sX///oMHDx45csRfAQC3iRMnHjx4cOrUqQO7PCoq6ty5c4mJib6NyhM0TfP5/I0bN2IjCwDihx9+eOSRR4qKivwdyFDAqCUAuO9kMlloaKjRaOzr6yNf7Xa7wWAgMwJ4PB7JMQUHBwcEBCDNBAAwYBqNhhw4JDisVivHVSSvxJaZmZmdnV1aWqpQKNra2vpduclhMBFznJSUdPz4cQ+Dd2Y2mzk2keAwyH7dBcMce/h8mPjvRzwAw9Pbb7/NPZgdYOzYsWMH83t51MNaSwAwFEj+SKFQREdHJyYmjh8/XqlUhoSECIVCmqYNBkN7e3t9ff3NmzcbGxs7OjpMJpO/QwYAGD2WL19eWFhIUZRWqy0vL1+xYgV3fY1Gk5ycHBoaWl1d/eGHH/bbflZW1u7du+12u16vJxPiiLS0tJKSkoaGBrvd7mGoIpGovLzcYrFUVlbOnz/fw6sccPfr+VpL2dnZ7733nsViaWxs3LlzJ1PO8Xxcxj+A5wAAADCCILUEAH4gFotlMllUVFR8fDxJM0mlUoFAYLfbe3t729ra7t69W1dX19TU1NnZiT/EYYTq6+trbW0lK7AADDGlUsl+WVhY2NnZqVQqH3744aNHj+7atYuUk9FGzl/37NmzZs0ahUKRl5e3cuVKjprk644dO5qbmyMiIubOnbtkyRKm3/Xr12u12pSUFIVCkZqaumPHjn4jLysry8rKksvlJSUlpaWlTDmzMDb7gGINmGKPnOLu12azebgixK5duxoaGuRyeVpa2gsvvNDv83EX/wCeAwAAwAiCtZYAYBixWCyGe5iMUkJCgkAg8G9gAAPQ0dHR1tYmlUo93AZ+aGCtpVGJWWvJ34FQFovl2LFjb7755tWrV/0dC7iGtZaGuZG+1pJer8eEOACCTIgbI2stYdQSAAwjIpFIJpOp1eqEhITY2FiFQhEaGoq8EoxQAQEBFEVhdieMEW+88QaPx5NKpZ9++umpU6f8HQ4AgM8MZiXQsbaKqL+e1Vh7zsMQUksAMByRtZnCw8NVKhVHta6urt7eXoy+hOGJpJYsFgsmdcJYsG3bNpqmTSZTeXk5949uAIBhpby8XCwWi0Si2NjYJ5980t/hDBFmcrFXxuazAk8gtQQAIxVN021tbY2NjRgVAsOTQCAgG2/hWxSATaVS8ZwgGwUA/pKVlVVWVmaxWBoaGr755hvnCoP5FNPdtdHR0QNu0ycGdlPD9lnhk2a/c9xrFgBgpLDb7SEhISaTKTAw0N+xALgWEBBgtVqNRmNQUJC/YwEYLlpaWvwdAgDA/2exWDIyMoa406amJu4KJpOJDH8eYtz9Ds9nBcMBRi0BwEglEAiUSmVcXBxHHYvFgg8xwI9I3tNoNPo7EAAAgJGqpqbmmWeekcvlQUFBKSkp33333aRJk5izP//889NPPx0TExMTE7Ns2bKamhrmFBkUqdfrn376abFYLBaLy8vL2S2PHz+evfUkj8d7/PHH2RVu3LjhbuLY3/72t4kTJ0ql0hUrVhgMBudq7q6dMGGCQ6cOdcrKymJiYgIDA6VSaWpq6qVLl9i38/HHH4eEhFRVVW3fvl0ikTjcEbejR48++OCDISEhK1as0Ov1Dmfd9TvIZ9Xvv8JgnhXHtdTgvjfAW0gtAcBo1tjYWFdX19jY2N3djfVuYOghtQQAADAYP//885NPPvnkk09evXq1u7v7iy++uHHjhk6nY84+//zzu3fv1mg0Go3m/fffX7VqFZNBIJ8v5ubmvvrqqyaTqaysLCsri934nTt3SB36ntOnT7MrTJw40eWHlD/88MMf//jHgwcPtre35+TkbN26lXKak+Xu2traWodO2dVOnz796aefHjt2zGAwNDc35+fnv/zyyz/++CPT/o0bN/bu3fvUU0+1tbV9+umnDnfE4e9///sf//jHL7/8srW1dfXq1a+99hr7LEe/g3xW/f4rDPhZcV87yO8N8BoNADBKWa3Wurq66/fU1tY2NTXp9Xq73e7v0GCssNls5NuPDKAbDkJDQ8lyy6NPaGgon8/3dxT+sWrVqqKiIn9HASPD559//tRTT/k7CnBrwoQJ//znPwd8uUqlIu/Ghx75DE+v1/u22aVLl+7bt8/d2SVLllRUVLBLKioq2N/hFEV9+eWX7JfOjfT7pti5Qmpq6jfffMO8PHz4sLtGvC3/zW9+c+vWLXbJv/71r/nz5zNXdXV1kYPu7m5PgmcsXLjw5MmTzMujR4+yr+Xut9+wuSt48q8wgHLuOj753hikgoKCnJwcnzc7PGGtJQAYtQQCQXx8fF9fn16v1+v1Nputp6enp6eHz+dLJBKpVCqRSLBTKdxXfD5fLBabzWaTyUSW9AYAAADPnT59uqSkhOPs3r172SUzZsxwGH7y7LPP+jyqH3/8cebMmczL3/72t75q+cKFC/Hx8Q6FwcHBzHFoaCg5CAkJ8arl8+fPJyUlMS/nzp3rVb+DdD/+Fbj563tjzMKfuQAwmvF4vODg4ODgYKVSyeSYrFYrk2OSSqUhISE+/MUJ4CAwMNBsNhuNRolE4u9YAByR9Do9PNakG8pgeDzeMLlrAOBms9m4Pwh0/r88ov93BwUF/fzzzw888MAY6fe+GmXfG8Mc1loCgLEiKCgoMjIyPj4+Li5OLpeLxWK73d7d3a3RaG7duqXVarEgDtwPZJsVfHfBEFOr1Z5UG5o/sg0GgyfVhvIvfs/78nZcAAD41uzZs//rv/7L3dnHH3/8hx9+YJecP39+3rx59zuq5OTkixcvMi9Pnjw5yAZNJhM5WLRo0f79+wfZmkuzZs1ir530/fffs8/ev359jnlW3Pz1vTFmIbUEAGNOYGBgRETE+PHjx48fr1AoRCKR1Wrt7Oysr68nOSYPf2MBeIKs5I1vKhhizc3N7JdGo3HDhg0qlUqtVu/du5e9uRJFUadOnYqNjXXYH2fdunWTJ0+WSCQLFixg1molW+oUFRU51DcYDL///e/lcvm0adNqamqYzXq0Wu306dMlEolKpcrJyfEkx3T37t1Zs2bJ5fIXXniht7eX3W9FRQVFURUVFTwej7096IwZM2bMmOHhkyGXOwyCcHdfCoVCr9e725YIAIbA9u3b//jHP5JFgvr6+mpqakpKSl544QVydufOnW+++WZVVZXVarVarVVVVVu2bNm5c+f9jmrr1q2vvfYaWUuxqqrq73//u7ctiEQi8qOmqampqKhozpw5pLygoKC4uPidd965ffu2xWLR6XTffvvtokWLBh9zfn7+xo0b//d//7evr++7776rrKxkn71//Q6eu2fFzV/fG2MWUksAMHaJxeLw8PDx48dHR0dLpVIej0dyTHfv3q2vr7darf4OEEaDgIAAHo9ns9ksFou/Y4GxKz8/32w2X7ly5ebNmxKJhNlciaisrKypqXHYH6egoKCmpqazszMvL2/p0qWkkAz2aWxsrK6uZtfftGmTQqFobm4+e/bsN998Q7E23yksLDSbzXV1dfPmzcvNze031L179x46dKiurk4qlb7++uuk8Pz587NmzUpPT6coKi0tLTk5+euvv2YuIQuIevgo0tPT3U2RcL4v8qCYNUo97AIAfGjGjBnl5eU7d+6Uy+XR0dHPPfec0Wj8z//8T3L2wQcfPHDgwI4dO+RyuVwu37lz5xdffDF58mRyltm33uVLiqL+9a9/OextT37OMPWZtLJDinnWrFlbtmxJT08PCwsrKipyTlhwXEuQHzV8Pn/mzJm1tbXHjh0j5bGxsefOnautrZ0+fbpUKp0zZw6zZpDL23G4Iw6PPfbY1q1bly9fHhkZ+Ze//OXdd99lX8vR7yCfVb//CgN+VtzXDvJ7A7yFeeYAAP+Hpune3t7u7m6DwUCWAPd3RDBK1NfXG43GqKio4TCzRiaTkZmh/g7E9/77v//bZrONzbHudXV1GzduzMnJiYmJaWxsZJ+Kjo7WaDRqtfrq1asKhcL5Wh6PZ7FYyDLzvHsrEN24cWPjxo1VVVUmk2natGlnz55l/mLksVYpYo6VSuW1a9dI+1qtVqlUkvLw8HB2GisyMrK1tZXjRng8XkNDQ0xMDEVROp1uypQpTP1ly5atWLFi2bJlhw4dOnz48BdffDGwZ+V8Fxz35bLmSLd///6DBw8eOXLE34GAaxMnTjx48ODUqVMHdnlUVNS5c+cSExN9G5UnaJrm8/l6vX4Mri2o1WoTExO7u7v9HQgMLzt27NBoNEVFRf4OZChgGW8AgP/D4/GkUqlUKrVarWaz2d/hwOgRGBhoNBqNRuNwSC2NGzfuqaee+vWvf+3vQHzv3LlzNptt7dq1/g7ED/bs2UMONBoNOXBIiHAPw3TevjAzMzM7O7u0tFShULS1tfW7chP7k152v0lJScePH/fgDlyw2+18/v8fX799+/bly5cvWrTo7bffJvt8Dz2z2SwWi/3SNQAMW42NjW+99ZYnozIBRjGklgAAHAmFQuwTDz5EVvIeJsstyWSylJSU1NRUfwfiey+++KLJZBqbGwmTRYg4LF++vLCwcPv27Vqt9vvvvz98+PDnn3/OUV+j0SQnJ4eGhlZXV//1r3/tN4CsrKzdu3e/9dZbBoOBvU14WlpaSUnJk08+GR0dzc4TcSguLn7xxRclEsm2bdsyMzOZ8ilTpsyePXvJkiUzZ86cOHEi+xKy0NKFCxc8ad9bZI2PxYsXnzx5sqCg4MyZM/ejFwAYcd59991NmzZRFBUZGblly5acnBx/RwTgT1hrCQDAOxaL5fbt2w4rlQBwICt5G43GUTatBoYzpVLJfllYWNjZ2alUKh9++OGjR4/u2rWLlLNXl2B/3bNnz5o1axQKRV5e3sqVKzlqkq87duxobm6OiIiYO3fukiVLmH7Xr1+v1WpTUlIUCkVqauqOHTs4YiZNrVq1atmyZQkJCXq93qH+5s2bz5w5s2XLFocLbTab5/+5HFbl4H4O1L01PuRyeUlJSWlpqYe9AMCo9/rrr5NV2FpbW5FXAsDH8gAA3unu7rZYLH19ff4OBEYMsVgsEAhsNpvRaAwKCvJ3ODAmtLS0sF9KJJKPP/74448/dqjGzsiwjzMyMjIyMpxPuasfHBxcXFxcXFxssViOHTv20EMPkXKBQLB58+bNmzd7EjPToLvxR19//fV//Md/sPeGIy5duuRJ+85huyx0qJCRkYEp0gAw/I0fP/7u3bsuT40bN+7OnTtDHA+AVlMQAAAgAElEQVSMNUgtAQB4R6FQiMVizJgDrwQFBen1eqSWYBR74403tm/fLhaL09PTT5065fP2mWFEu3fv9nnjAAAjHZJH4F+YEAcA4B0ejxcSEoIEAXglMDCQx+PZ7XZ/BwJwv2zbto2maZPJVF5erlKpfN4+fY/PWwYAAIBBwqfuAAA+ZjKZ7HY7ck/AJpPJwsLC2LtoAYxZKpWqtbXVoVCpVDpM4gOAkejFF1/EyG4A4urVqwkJCf6OYojgvz0AgI+1t7f39vYGBgaGhYVJpVJkE4CiKA/3xgIYC5BCAhiVyKDCzs5OgUDg71gAhoW+vr6uri5/RzFEkFoCAPAxgUDA4/GMRmNzc7NQKJTJZDKZDH9mAcD909nZefLkSYPB4O9AYAS4fPny2HmrA0OJfJZ26NAhiUTi71gAhoUdO3ZoNBp/RzFEkFoCAPAxlUoVERHR1dXV1dVltVrb29s7OjpCQ0PlcjmGiAPA/dDU1NTS0tLc3OzvQGAEaG9vDwwM9HcUAAAwquBNDgCA7wkEAoVCIZfLe3t7Ozo6jEZjZ2dnV1cXSTCJRCJ/BwgAo8qDDz64YsWKnJwcfwcCI8D+/fsPHjzo7ygAAGBUQWoJAOB+4fF4UqlUKpUajUadTtfb20uGMkkkEoVCgQ+NAQAAAABgFEBqCQDgvgsMDIyOjjaZTB0dHT09Pb29vb29vUFBQQqFIjg42N/RAcBo0NfX19HR4e8oYATo7e31dwgAFI/HI8t+uzxF3VsU3Ns2+72Qo1+f1AcYs5BaAgAYIgEBAVFRUXK5XKfT6fX6vr4+jUYTHBysUCiCgoL8HR0AjGDBwcEFBQUFBQX+DgRGhrS0NH+HAGOFWq1uampyLufI19A0PbDddT250Ns8kef1Q0JCenp6vGocYDRBagkAYEgFBASo1Wqz2UxGMBkMBoPBEBQUFBERgSlyY8SA/2gGcOejjz766KOP/B0FAIAj5+0FKioqFi1aRP0ya9Pb2/vyyy8fOnRo4sSJn332mcMlM2bMoCjqwoULnvR49+7dzMzMmpqajIyMoqIiZrs6l/0aDIYNGzYcOnQoPj7+iy++mDJlClPBZX3y6/vDDz/cuXNna2trWVlZRkYGRVEKhUKv1zO/3DHQCcYgvr8DgJFk69atW7du9XcU/RspccJYJhaLVSrVAw88IJPJeDxeX19ffX29Tqfzd1xwf9nt9vr6+rq6Orvd7u9YAAAA/CA9Pd0587Jp0ya1Wq3T6U6cOPHVV185nKVp2vNkzd69ew8dOlRXVyeVSl9//fV++1UoFM3NzWfPnv3mm28oVlbIZX1S0tjYWF1dXVZWlpWVRcrJn3D0PR6GCjCaYNSSbxiNxkuXLtXW1mq12r6+voCAgMjIyEmTJiUlJY2FYQhWq/Wnn366fv16U1OTwWAge2NNmjRpxowZzAcFAOBMKBQqlUqFQqHT6bq7u6VSqb8jgvuLz+fbbDaapo1GI5bZAgAAl377298KBIKBXdvV1ZWUlMTn+3kAQUxMTGNjIzkmY3mio6M1Go27+gcOHKitrRWLxREREWvXrs3Pz2efvXjxouddr1mzJiYmhqKorVu3TpkyhXtEZ1lZ2bVr1wICAgICAn73u9+98sornnRBZh9nZGRYLBbPAwMY3ZBa8oEbN2787W9/6+vrY0oMBsOdO3fu3Llz9uzZ9PT0X/3qV34M735raGg4ePBgV1cXU2K1Wpuampqams6fP5+enj516lSvGiQDjjDsCMYOJsEkFOJn8uinUqmEQqFIJPJ3IAAAMBz9+OOPgxnZOnny5G+++SY+Pt6HIXmIpunw8HByzGSRBrAMttls9kk8dru93xQbe366D0cbmc1msVjsq9YARgS8jRms2traAwcO0DQdHx8/Y8aM2NjY4OBgs9nc1tZWU1Nz6dKlv/3tb6M4tdTQ0LB3716r1RodHT1z5szx48dLpVKr1arT6a5fv37x4sUjR454m1oCGJuQVxojsGQ7AABwkMlkg7mcz+fLZDK5XO6reDw3mNRMdnb2e++9t3XrVq1W++677zqc9WqtpeLi4hdffFEikWzbti0zM5O7clZW1u7du9966y2DwVBSUjKw4AmRSFReXr548eKTJ08WFBScOXNmMK0BjDhYa2lQLBZLeXk5TdO//e1vn3/++QcffDAkJEQgEAQFBcXFxc2fP3/Dhg2jOK9ks9kOHTpktVqTk5NffPHFX//612FhYUKhkOyz/thjj23YsAF5JQAAAACAsUmpVDqU8Hg8MlaIOaAoateuXQ0NDXK5PC0t7YUXXqB+OZ6IzCXvty9yyapVq5YtW5aQkKDX63fs2MHd744dO5qbmyMiIubOnbtkyZJ+42RKHL5SFEWWXpLL5SUlJaWlpZ49HoDRAx+SD8rly5d7e3vHjRv3+OOPu6wQGBi4bNky5/KOjo6qqqq6urru7m6hUKhWq2fOnEm2JGAw88J++umnf/zjH1qtls/njxs3bt68eVFRUQNu8E9/+tOlS5f+53/+p62tzWKx/OlPf6IoSqPRXL58+fbt2x0dHTweTyaTTZ48ee7cudyfrv/rX//q7OyMiopKT093OdxULBY//fTTzEtPemHmwbEnxDHHA4uTqK+vr6qqqq+v7+vrCwoKGjdu3Jw5c2JjYx2q3bhx49y5c01NTTRNR0REJCUlJSUlYY4e+JfBYNBqtZGRkVidBwAAAEaQlpYWhxKXSSKJRLJv3759+/a5rHPp0iVP+mKucjm+yWW/wcHBxcXFxcXFFovl2LFjDz30EHd9dqFDhYyMDF9N5QMYiZBaGpQbN25QFDV9+nSvrqqrqysrK2N+9Fit1lu3bt26des3v/nNE0884VD522+/PX/+PLvHO3fu/Nu//Rszk9nbBr/++usff/zRobC4uJj9sq2tra2trbq6+ve//z3HW9mamhqKombNmuXhSoED68UnLVy8eLGiooL5BaDX66urq3/++efFixcnJSUx1X744QeyNwTR2NjY2NjovGcqwBDT6XRms7m3txepJQAAAAAfeuONN7Zv3y4Wi9PT00+dOuXvcABGKqSWBoUkHeLi4jy/pLu7+8svvzSbzY888sicOXPCw8P7+vquXr16+vTpM2fOJCYmjh8/nl3/H//4R0pKyqOPPiqVSpubm48ePdre3n727FlmNJC3DV66dGnOnDnTpk1TKBRMSuiBBx5ISkoaN26cVCo1m82NjY2nTp3SaDRnz55NTU11dy9NTU0URTm0z8GTXrZu3coxRGhgcTY3N1dWVtI0/eijj86dOzcsLKyzs/Ps2bOXL1+uqKiIi4sjI3Wbm5uPHz9OUdT06dPnzJkTGhra3d1dVVXl1Z4UAPeDWq3u6Ojwy7oJAAAAAKPYtm3btm3b5u8oAEY8pJYGxWAwUBTlvF+4c1qEKfnhhx9MJtOvf/3rjIwMUiIWi+fMmSMQCCorKy9cuOCQqUlJSWFm240bN27RokWffvrp7du3mQreNjh9+vSFCxc6hLdq1SrmOCgoKDExMSIiYvfu3devX+dI2fT29lIUFRIS4q6CT3oZfAv/+Mc/7Hb7pEmTnnrqKVISHh7+9NNP6/X62traH374YenSpRRFXbhwwW63P/TQQ4sWLSLV5HL5okWLent7q6urPbxHgPtBIBBERET4OwoAAAAAAAAXkFoaarW1tRRFzZw506H84YcfrqysrK+vdyh3WAY7JiaGoqienp4BN5icnOwcFRmec/Pmzc7OTvYk4a6uLg/uyVOD72VgLdy5c4eiqLlz5zqUp6Sk1NbWMnk6cjBnzhyHarNnz0ZqCQAAAAAAAMAlpJYGJTg4uLu7u6enx2GiisslqImOjg6Kosjels7rwJFxQGxhYWHslwEBARRF2Wy2ATfoPKdGq9X+5S9/6evrc75Bq9XqXMiQSCRdXV3Ot+/SgHsZfAvd3d0URUVGRjqUk3lwTJ6OVGMvYkVgtAgMf3a73cMlzwAAAAAAAHwLqaVBUavV3d3dd/4fe/ce5lR173987VwnyWQyyUzmPiCogGJtRaDWYrWiUvBoFVG8lYNw2lN9RI48RVHR52cPIh6wtnJOqxWqfXqOPrS2I1rRaqutVKzUewFFARUmc58kM5Nkkp1k5/fHrjFmJpnMdScz79cf8yRr76z13ZlaMp+stfann+a+B4qa+CiK0u/R1MxIlXrfzRHp0Gg0prX88Y9/7O3tra2tnT9/fmVlpcVi0el0sVhsw4YN2Yeurq7u6urK8fKHPMoI9gCMS11dXV6vt6KiwmazaV0LchWLxTo6OmKxWN/7VAIAAACFhWhpWKZPn37w4MHXX3/91FNPzXHKgMPh6OzsXLVqVd/ZMUMz/A7VhWBLlixJTYg6OzsHfOH06dM/+OCDv/3tb7lc/pBHGX4PJSUlXq+3vb190qRJqe1tbW0iZa8o9bTOzs60v/Q6OjpyLxIYe11dXbFYrKmpyW63u91uvV6vdUUYmE6nCwQCiUQiGo32TfwBAACAAsICimE59dRTS0pKmpubd+3alWneUJpp06YJIV599dWRqmH4HaozmwyGL+SMe/bsGfCFp556amlpaUtLS6bLl2X5qaeeGuwo6jmRSGSk6lQ3Mu/7Fv31r38VQhx33HHqU/VB3w5fe+21AYcANFRfX+9yuSRJ6unp+eSTT/x+v9YVYWA6nU5d4KzeDgIAAAAoXERLw2IwGC6//HK9Xv/GG2/8/Oc/f+uttzo7O6PRqKIooVDoyJEjO3fuTHvJmWeeabVa33rrrSeeeOLw4cM9PT2KooTD4aampj179jz88MODrWH4HVZWVgohdu7c2d7eHo1G29radu7c+e677w74Qr1ev2TJEoPB8MYbb2zbtu29997r6uqKx+ORSKS5ufkvf/nLT37yk3feeWewozgcDiHE22+/nbpR93Dq/OpXv6rT6Q4ePPjMM894vd54PO71enfu3PnRRx/p9frkDuhz587V6XQHDhzYtWuXz+eLx+M+n2/Xrl3s4Y08J0lSWVlZfX19UVGRoijt7e2NjY1p//kgD1mtVkG0BADAZyRJGnAzkNEbOsuh4Vel1XUBY4YFccNVX1+/fPnyJ598sqWl5emnn+57gt1uX7RoUerTq6++eseOHQcPHjx48ODwCxh+h+ecc87jjz9+6NAh9WZzqrlz5+7du3fA19bV1S1fvvw3v/lNU1PT7373u7SjJpPpkksuGewoJ5988u7du59//vnnn39ebVG3Qh9ynVVVVQsXLty1a9ebb7755ptvJtslSVq0aJGaWKmnnX/++X/4wx/27t2b2ufs2bPfeOMNFhkhz5nN5rq6Op/P5/V6e3t7jx07VlZWlnYfAOQVm83m9XqJlgAA41h1dXVzc3OOJycSCa0imNS7IfU9NPyqsvSfxm63p94NHCgUzFoaAfX19atWrbr44ounT59eUlJiMBiMRqPD4TjppJMuueSS1atXn3TSSann19XV3XDDDfPnz6+rqysqKtLpdEVFRbW1teecc84NN9wwhAKG2eGJJ5549dVX19fXGwwGk8lUW1t78cUXp8ZhA46+atWqiy66aNq0aerlm83m6urqs88+e/Xq1V/5ylcGO8rZZ589b948l8uVluYMp845c+Zcd911J510ks1m0+l0NpvtpJNOWrFixemnn5562te+9rVrrrnmuOOOM5lMJpOppqbmoosumj9/vvjs3nxAPpMkyeVyTZo0yWKxJKcvRaNRretC/4qKivR6vTrPVOtaAAAYFS0tLalPw+Hw6tWrKysrq6urH3vsMXVnj+xWrVo1ffp0m812/vnnv/zyy2pjQ0ODyWSSJKmkpGTevHnJfjK1Z7Fr166+85KCweDy5cuLi4tPO+20ffv2pb1k7ty5c+fOHbDnLP2rLVu3bq2rqzOZTA0NDWq7y+UKBALSZ3IcAsgHUu4BKjAxHT58+Fe/+lV9ff3KlSu1rgXIVVdXV0dHh6IoOp3O7XaXlJRoXRH60dzcHAgEysrKXC7XmA06b968O++8c8GCBWM24phxOByBQKDvrVEBYOKoqqp6+OGHNbn9aCKRmDNnTiAQSL1lrSR94e/NNWvW9Pb2/vCHPywuLv79739//fXXp90wJ+18IUQgECguLo5Go6+88soll1yizuix2+3nn3/+r3/9a1mWX3jhhe9973vJ+/P02z6gtHFvvPFGu91+9913d3d3P/LII7fffnvq0Tlz5ggh/v73v+f+5vS9LkmS1q1bd9ttt/3pT39aunRpciuDvmeicG3atMnj8WzdulXrQsYCC+KAbBKJxO7du4UQU6dO1boWYBAcDofNZmtpaent7W1tbe3p6amsrEzbBR+as1qtgUAgFAqNZbQEABjHJk+evGbNGq2rELW1tU1NTepjdfZNTU2Nx+N54okn9u/fr/6rd/nll19++eXZ+/noo4/WrFmzZ8+eSCQya9asQCCgtj/++OOXXXaZ0WgsLy93u93PPvts9vbBUnfhMJlM5eXl3/ve926//fbUo4MKlbK49957hRCXXnopc8wxDvBnBvC5X/ziF6effnptba3D4VAUpamp6ZVXXvnkk09MJtOsWbO0rg4YHIPBUFdX5/f7Ozo6QqHQp59+WlFRYbfbta4Ln1N38g6Hw+r8Mq3LAQAUvNdff12roROJRPLfMo/Hoz5Im4MTi8UG1ecVV1xx5ZVXbt++3eVydXR0VFdXq+0XXXSRLMvBYNDr9f7v//7vBRdc4PP5srQPh4a3RpFl2WQyaTU6MCh8kAU+d/To0YaGhv/+7/++55577r333l/+8pcff/yxXq//9re/rd63Dig4paWlkyZNMpvNiqK0tLQ0NzcriqJ1Ufgno9FoNBoTiQSbeQMAJoIlS5Zs2bJFCNHe3t7Q0HDttddmP9/j8cyePbukpOTAgQMPPvhgst3tdu/du1en09XX18+YMSMYDGZvH6wrr7zy/vvvj0ajTU1N9913X9rRQe21NFhGo7GhoSEajT733HPnnXfeKI0CjDiiJeBzK1as+PKXv+x2u81ms8FgcDqdp5122r//+7/PnDlT69KAoTOZTPX19Wo8GggEjh49yr7R+UPdkGLIn30BAMhnFRUVqU+3bNni9/srKipmzpy5c+fOzZs3Jw8lN65O3cH64YcfXrlypcvlWrdu3bJly8Rny+umTJnyzjvvTJs2TZKkpUuX7tixQz0/U3sW/Y67efPmxsZGp9O5cOHCFStWJMdVxePx3LdD6rf/ZEvaTyHEjh07li5d6nQ6t23btn379hxHATTHJmEAMFGEQqHW1tZYLCZJknpDSa0rggiFQh6PR6/Xj9mGbmzjDQAYDeqCuLRtvIGJbEJt482sJQCYKKxW66RJk2w2W1FRkdls1rocCCGExWLR6XTxeJypZAAAAChQbOMNABOIXq+vqalRFCV1Xjc0JEmSep+4YDDIPDIAAAAUImYtAcCEw83I8grbLQEAMHoqKyulPiorK7WuCxhXmLUEAICW1GgpEonEYjGDgX+XAQAYSa2trVqXAIx/fHENAICW9Hq9uhQuFAppXQsAAAAwaERLAIB/kmW5t7dX6yomIqvVKlgTBwAAgMJEtAQAEEKIeDze1NTk8XgIOMaeuiYuFAolEgmtawEAAAAGh2gJACCEEDqdzmKxGI1Gi8WidS0TTlFRkV6vVxSFNXEAAOSooaHBZDK5XK5vfvObaYcGeydcDe+cq24rnsuZGl6vJu9P7u/MyHab47ijVF7hIloCAAghhHq3lLq6Ou4fpwmXy+V2u9VNlwAAGB+qq6tHr/OlS5fu2LHD6/W+/PLLaYcGOwu47/l2uz3TySP7PVDfoTP1r9X1DqH/ETFKgw7YbY7jMtM8DX8/AAA+p9frtS5hgiotLS0tLeX9BwCMJy0tLalPw+Hw6tWrKysrq6urH3vssWnTpqnt0Wh03bp106dPnzZt2i233CLLstquTgzZunVrXV2dyWRqaGhQ2ydPnixJUjQaXbx4cdrkkV27dvWdThIKhb773e86nc5Zs2YdPHgw9YR+z3e5XIFAQPpMsr29vX3OnDk2m62ysvLGG29UMyD1nAceeMBut+/Zs2f79u12uz1Zar+CweDy5cuLi4tPO+20ffv2Ze9/CNeb6X0b7PVmOn+wvy/V3Llz586dm+VtGdBgx83yez969OgZZ5zhdDpXrFgx4F4QmcYdbD/jG9ESAAAAAGDU3X777bIs79u378iRIzabzev1qu3r16+vra09ePDghx9+WFtbu379erVdnRjS1NR04MCBHTt2LF26VG3/9NNP1UOJzySHWLRoUd/pJLfeeqvL5Wppadm9e/fzzz8vUqac9Hu+WljfzteuXbtlyxZZlg8fPjx//vy1a9cmu4rH448++uiFF164b9++Rx99NFlqv2699dbq6mqv1/viiy8+88wz2fsfwvVmet8Ge72Zzh/s7yt5dJgzfQY7bpbf+2OPPfbkk08ePny4uLj4lltuGdq4g+1nfJOYxwVgbEjSWP8fzkiNuHHjxj179vz+97/PZaxFixZ94xvfWLdu3fDHBUbDvHnz7rzzzgULFmhdyMhzOByBQCAej2tdCABMRIlEQqfTBQIBm81WW1vb1NSUerSmpsbj8VRXV+/fv9/lcqW9tqqq6oMPPigtLRVC+Hy+k08+ubm5WT2U+nEu7aNdlk96aYcqKio++OADddz29vaKioq0F/btqt/Oy8rKknGYEMLtdre1taWe3PdBv1wu16FDh9R6Ojs7y8vL1ZMz9T/Y6xVZ37fcrzfT0aH9voZgmONm+r1LktTY2FhbWyuE8Hq9M2bMSH2fcx93wH42bdrk8Xi2bt06nDehUDBrCQCyCQaDDzzwwAMPPKA+HXC7vh/96Ec/+tGPent7R7+0McX3EAAAIEcejyc5RUV94PF4hBCxWCzTS0b1k0bq57chDJRcAHX66acnUqTlCEOTurpqNPofZkmZaPXJcFDj5vJ7VxQll21GBxw3x37GsQl98QAK1FjejuF3v/vdmWeeeeKJJ6pPB/x3ZcaMGbNnz965c+foldTR0dHd3T16/felKEpjY2NnZ+dYDgoAAMaZJUuWbNmyRQjR3t7e0NBw7bXXqu3Lli175JFH1Dzl4Ycf/s53vjOy4y5duvSBBx5QFCUQCGzbti2XlxiNxoaGhmg0+txzz5133nlq48KFC7dt29bY2KgoynDqufLKK++///5oNNrU1HTfffcl20eq/yHo93ozGdrva/h7LQ123Cy/90ceeaSxsdHn891zzz1XXHHFkMcdVD/jG9ESAGTzzDPPXH755YN6yRVXXPH000+PRjFer/e222677LLLst/FY8QFg8FwOOz1erX69gwAABSiioqK1Kdbtmzx+/0VFRUzZ87cuXPn5s2b1fYNGza0t7fX19fX19d3dnZu2LBBbVe/Tez7U91bWny2f3Pql47Jp6ntmzZtamlpKS8vnzdv3kUXXZRaUr/nCyHULXucTue2bdu2b9+uNt50003t7e1nnXWWy+VasGDBpk2b0goTuX0Dunnz5sbGRqfTuXDhwhUrViRf1W//Q7jeTO/bYK830/mD/X2p4vF47nOORmTcfn/v6qHly5cvXrx46tSpgUAg+T4Patzs/UxECQDjXTgc/v73v+9yuSorK9UvRtT2eDz+n//5n8cdd5zT6bzuuusCgYDaLoT42c9+Nnny5KKiojPOOOMf//jHgOf/6Ec/qqurU5clHzx48LLLLnO5XCUlJZdeeml7e3vytCxFRqPRO++8c9KkSaWlpVu2bFEb++2q7/+DDThi8nYklZWVq1evDofD2d+ZVFOmTDl06FDyafKcSCRyww03qK/9r//6r9TXfvjhh8cff3zW38mgdXR0/OAHPzCbzUKIp556amQ7z0V3d/dHH3304YcfejweRVHGvgCMlK9//evPP/+81lWMipKSEp1Op3UVADBBqRNtkp8P85Msy7/73e9OPvlkrQvBmNLq937vvffeeOONYzyoVgxjG2QB0MCGDRs+/fTTf/zjH0KI6667Ltn+4x//+M9//vNLL71UWlp600033XXXXffff7966A9/+MOf//xnt9t9//33f//73//rX/+a/fy//OUvr7/+ek1NjRDi8ssv//GPf/yrX/1KluX169ffdtttjzzyyIBF3nfffbt3737ppZdcLtcPf/hDtbHfrhKJRNrWegOOeM899+zfv/+NN94QQixbtmzjxo133313lncmVUtLS3V1dd/2jRs3fvjhh++9914ikVi2bFnqoZqamrStK4ejo6Nj48aNP/3pT4UQkUhk8uTJtbW1b775pnr0N7/5TVdXV6bXRqNRv98/UpXE43E1lTMYDEVFRSPVLcbYBx98sGHDhlz+qyw442+PMwDASLnjjjs2btxoMpkWLVr00ksvaV0Oxgi/9zHDHeKA8e/4449/9tlnZ8yYIYQ4cODAzJkz1f/wTzrppKeeemr69OlCiNbW1q9+9auffPKJEEKSpObm5qqqKiFEKBQqLy8PhULZz//kk08mT57cd+ju7u6ZM2ceO3ZMDHSTiBNPPLGhoeGUU07JdEKOXfV72vHHH//MM8+cfPLJQoh9+/Zdcsklhw4dyvLOpLJYLJ2dnVarVX2a7POEE054+umnk31+6UtfSr42GAy63W71TRumQCCwZMmSP/zhD+pTk8lktVpT76vy8ccf83/jQJLJZIpEIlpXAQATUSLlDnFa1wLkhQl1hziiJWD8s1gsfr9fXUsVDoctFov6H77Vak39kl+n06k37ZYy3Ng1y/mKoiRXI7/xxhu33nrr22+/7fP5hBB6vV69G0j2aMlisfh8vrS5MDl2NeBpqZ2Hw2Gn06leSKZ3JtXUqVNfeOGFE044Ie3dSOsz9bUfffTRt771rcOHD2f7rQzGSy+9dNtttx04cCAUCtlstubmZg0/tIXD4TVYuZwAACAASURBVKampng8bjKZamtrDQZmv46wnp6elpYWo9F43HHHjUb/8+bNu/POOxcsWDAanQMAJiyipTSVlZV9N6msqKhobW3VpB6MvQkVLbGNNzD+1dTUfPzxx+rjI0eOJNsnTZqkznlRqTlRFlnOT92i78orr/zXf/3XQ4cOxWKxzs7OAbtV1dfXqzOJUmXqKm1/xAFHrKmpSV74oUOHamtrk+39vjOpZs+e/eqrr/Ztr62tTb4kLUV69dVXh3n/izTnnnvu66+//swzz5x++uk9PT0/+9nPRrDzwSoqKqqrqzMYDLIsezyeHH+/yJ3NZnM4HJWVlVoXAgAAhq61tbXvfjTkShiviJaA8e+qq65as2ZNU1NTU1PTmjVrku3XX3/9d7/73ffff1+W5X/84x9XXnll9n5yPD8YDJaUlNhstk8//fR73/tejkUuX7581apVR44c8fl8N998c/auysvL33///dxHvOqqq1avXt3Y2NjY2Lh69eqrrroq2d7vO5PqoosuevLJJ/u2X3311TfffLPH4/F4PP/xH/+ReujJJ59Mu/nIiDjnnHP27t375z//ee/evSOy2m7ITCZTfX290WiUZfnYsWPqHDGMFJ1OV1FRYbFYtC4EAAAAyAnREjD+rV+/vr6+/pRTTjnttNO+/vWvG41GtX3VqlUXX3zx4sWLS0pKrrnmmmTgkkmO52/fvn3dunV2u/2b3/zm2WefnWORa9euPfPMM88+++zjjz9+0qRJ2btat27dmWeemZy7NOCI69evP+mkk2bPnj179uyZM2fecccd2d+ZVJdddtnf/va3Dz/8MK39jjvumDp16pe+9KVZs2ZdcMEFyfaDBw/u3bv30ksvzfHCB+vss8/+9a9/3W+pY8lgMNTV1RmNxmg02tjYSLoEAAAATFjstQRMLO+9994ll1ySafHXRJblnbn33nv/+te/Pvvss7n0c+GFF5511lnr1q0b6QLzUSwWa2xsjEajRqNRXSWndUUYGHstAQBGA3stAWnYawnAeHPzzTe3tLR8+umna9asueSSS7QuJ4/k8s7cdtttOeZKQohnn312guRK4rO5SwaDgblLAAAAwIRFtARMCMcdd9ycOXPmzp07derUDRs2aFiJ1B8N68mfd6ZApaZLHo+HdAkAAGhOq4+X2n6sBTTE4gVgQli9evXq1au1rkIIIfJtEW7+vDOFy2g01tTUeDweWZabm5tra2t1Or63AAAAorq6urm5OceTQ6GQ1WodkXG1+sCZ+7h2u72np2dUiwHGEp/+AQDDZTaba2tr9Xp9OBxubm7OtwARAABooqWlJfk4bbp66tP29vY5c+bYbLbKysobb7wxeSdc9QS/379y5Uq73b527Vq1vaGhwWQySZJUUlIyb968adOmJUfZtWtX30nx0Wh03bp106dPnzZt2i233CLLcmr/W7duraurM5lMDQ0Nqa+aO3fu3Llzc7zSfsfN1L/L5QoEAvkwfx8YKURLAIARYDaba2pqdDpdKBTyer1alwMAAPJLIpE444wz9uzZoz7ds2fP1772NfXrqLVr127ZskWW5cOHD8+fPz8ZIalHFy9efNZZZ3k8nm9961tq+7Jly/7lX/4lGo22tLT84Ac/8Pv9yVEWLVrU9yuu9evX19bWHjx48MMPP6ytrV2/fn1q/01NTQcOHNixY8fSpUvTCs7927J+x83Uv/pJKfGZHIcA8hl3iAMAjJhgMOj3+6urq1kTNyK6u7t9Pl9paanD4RipPrlDHABgNKTeIa62trapqSn1qLp2/oUXXti8efOLL74ohDj//PNvueWW888/XwhRVlaW+r2U2+1ua2tTH0uS1NPTU1xcnNrbM888c9lll0Wj0fLycrfb/ctf/nLOnDmpJ0jSF/7Oraqq+uCDD0pLS4UQPp/v5JNPTi7TSz0z7VVD0LeHTP0PfyzkP+4QBwDAUKifJsmVRko8Hpdlubu7W+tCAAAYBI/Hk5yPoz7weDxCiAsuuKC3t3f37t27d+8Oh8NqriSEOP300xMpkrmSKi1XEkJcdNFFsiwHAoG33nrrO9/5zgUXXDBgSfmc4yQX6AGFi0//AADkqZKSEkmSwuEwHzoBAOPD3Xfffdddd91111133313snHhwoXbtm1rbGxUFCWXTtxu9969e3U6XX19/YwZM4LBYPbzly1b9sgjj6i51cMPP/yd73wnl1EGtdfSYBmNxoaGhmg0+txzz5133nmjNAowZoiWAADIU3q9Xr1XDhOXAACFqKKiIq1l/vz5iqIkEolzzz032XjTTTe1t7efddZZLpdrwYIFmzZtUtvVLa77bnc9ZcqUd955Z9q0aZIkLV26dMeOHclDyTNTX7Jhw4b29vb6+vr6+vrOzs4NGzak9Z/2UxWPx3Of69TvuFn6V7decjqd27Zt2759e46jAHmLFZ4AAOSvQCDQ3NxsMBimTJkyIh2y1xIAYDSk7rWkdS1AXmCvJQAAkBdsNpter4/FYsk7MQMAAAB5hWgJADDquLfukEmSZLfbBWviAAAAkK+IlgAAoysWizU2Nqbd7QW5U6OlQCCQ4+amAAAAwFgiWgIAjC5ZlsPhcDAYjMViWtdSkIqKikwmUyKRYOISAAAA8hDREgBgdFmt1qqqqvr6eoPBoHUthcrhcAghurq6tC4EAAAASEe0BAAYdXa73Wg0al1FASspKdHpdLIs9/b2al0LAAAA8AVESwAA5DudTldcXCyYuAQAAID8Q7QEAEABUNfEBQKBeDyudS0AAADA54iWAAAoAEVFRWazmc28AQDQnCRJGg6t4ehAJkRLAAAUBjbzBgAUlurq6uF3EgqFcj/ZbrePdj9CiEQikXtXgxp3QDkOPVLvA5AjoiUAgGYG9ckMdrtdp9NFo1E+FAIACkJLS0vq03A4vHr16srKyurq6scee2zatGlquzoTx+/3r1y50m63r127Vm1vb2+fM2eOzWarrKy88cYbU//5W7Vq1fTp02022/nnn//yyy+rjS6XKxAISJ9Jnpyln35l6kcIsWvXrrRG9ekDDzxgt9v37Nmzfft2u93e0NAw4Lhz586dO3duLm9jMBhcvnx5cXHxaaedtm/fvtRDo/o+ALkjWgIAaEBRlJaWlrRPnMhOp9OpX0IycQkAUIhuv/12WZb37dt35MgRm83m9XrVdvWrpsWLF5911lkej+db3/qW2r527dotW7bIsnz48OH58+cnIychxL333nvw4EG/379u3bqLL75YbVQ7THwmeXKWfvqVqR8hxKJFi9Ja1KfxePzRRx+98MIL9+3b9+ijjy5dunTAcft2nsmtt95aXV3t9XpffPHFZ555JvXQqL4PQO4kvjEGAIy9cDjc2NiYSCTcbndpaanW5RSMSCRy9OhRSZImT55sNBqH0MO8efPuvPPOBQsWjHhtAICJLJFI6HS6QCBgs9lqa2ubmppSj9bU1Hg8nurq6v3797tcrr4vlySpp6dHvR1qUllZWTJ+EkK43e62tjYhxEcffbRmzZo9e/ZEIpFZs2bt3r07+VetJPXzF26mfrLot59MR5NP0x4MYdx+uVyuQ4cOqe9bZ2dneXm5OsoYvA8Yjk2bNnk8nq1bt2pdyFhg1hIAQANFRUVlZWVCiI6OjnA4rHU5BcNsNlut1kQi4ff7ta4FAID+eTye5HwZ9YHH4xFCxGKxLK9Ky5WEEKeffnoiRTIHueKKK+bNm/f+++/7/f5f//rXmTqUZTl7PzlK9jNYwxx3wGLG+H0AsiBaAgBow+l02my2RCLR0tLCFNrclZaW6vX6oU1ZAgBAQ0uWLNmyZYsQor29vaGh4dprr81+/sKFC7dt29bY2KgoSmq7x+OZPXt2SUnJgQMHHnzwwdRDRqOxoaEhGo0+99xz5513XvZ+sui3n8HKPm7uey1deeWV999/fzQabWpquu+++5LtY/A+ADkiWgIAaKaqqspgMESj0fb2dq1rKRg2m23KlCmsIgQA5L+KiorUp1u2bPH7/RUVFTNnzty5c+fmzZvVdnWr6b7bTt90003t7e1nnXWWy+VasGDBpk2b1PaHH3545cqVLpdr3bp1y5YtS/YghNixY8fSpUudTue2bdu2b9+evZ8s+u0nWWTag9QCcqlfFY/Hc/xqbfPmzY2NjU6nc+HChStWrEiOMgbvA5Aj9loCAGgpFAqpk+RrampsNpvW5Yx/7LUEABgNqXstaV0LkBfYawkAgDFitVrVCThtbW3xeFzrcgAAAAAMDtESAEBj5eXlJpMpFouxLA4AAAAoOERLAACNSZJUVVWl3nU4EAhoXQ4AABj/KisrpT4qKyu1rgsoSAatCwAAQJjNZqfT6fV629raLBaLXq/XuiIAADCetba2al0CMH4wawkAkBdcLpfZbI7H421tbVrXAgAAACBXREsAgLyQnIUeCASCwaDW5QAAAADICdESACBfqMvihBBtbW2KomhdTgFIJBKdnZ0ff/wxN9cDAACAVoiWAAB5pKyszGg0xmKxzs5OrWspAJIkhUKhWCzW3d2tdS0AAACYoIiWAAB5RJIkt9sthPD7/ZFIROtyCkBZWVl1dbU62wsAAAyTequ4MRtrbAYCRhvREgAgv9hstuLiYsGtW3JjtVrVtwsAgHxTXV09/E5CoVDuJ9vt9mH2k0gkch9umHIfK8t1AfmAaAkAkHfcbrdOp4tEIn6/X+taAADAELW0tKQ+DYfDq1evrqysrK6ufuyxx6ZNm6a2qxOF/H7/ypUr7Xb72rVr1fb29vY5c+bYbLbKysobb7wxNRtatWrV9OnTbTbb+eef//LLL6uNLpcrEAhIn0menKWfTI4ePXrGGWc4nc4VK1Yk7y6idrtr1y4hxK5duyRJqq+vT75k7ty5c+fOzfGdUV+eNmtJbdm6dWtdXZ3JZGpoaMh+XUD+MGhdAAAA6QwGg8vl6ujoYHfq0dDS0nLkyBGtqwAAjCu5TMC5/fbbZVnet29fcXHx73//e6/Xm3ytJEmLFy9etmzZAw888Pe//11tX7t27ZYtW84888xIJPLiiy+uXbv2f/7nf9RD995779atW6PR6CuvvHLxxRf39PQIIbxeryRJfSvJ0k8mjz322JNPPmm1Wv/f//t/t9xyi3r+a6+9dvPNNy9atEgIsXDhwtmzZ2/fvn1Q70DSokWL1KtObVRbmpqaDhw48Kc//Wnp0qWyLGe5LiB/8D9QAEA+SiQSsiybzWatCxlvFi5c+Prrr2tdBQBgHPL5fIFAwGaz1dbWNjU1pR6qqanxeDzV1dX79+93uVx9XytJUk9PT9oS77KysmT8JIRwu91tbW1CiI8++mjNmjV79uyJRCKzZs3avXt38q/afiOYTP1kIklSY2NjbW2tEMLr9c6YMSN5/uLFi6+99trFixc/+eSTv/3tb5944omB3pVs+lab2pLpMQrFpk2bPB7P1q1btS5kLDBrCQCQjyRJIlcaDc8995zWJQAAxqFEIqHT/XO7FY/Hoz5IC0RisViWHvpuHXj66ae/8MILfc+84oorrrzyyu3bt6tznDPt6CTLsslkytJPLhRFSV6XEGLjxo1Lliy58MILf/jDH/72t78dWp/DlLwuIH+w1xIAAAAAYNQtWbJky5YtQoj29vaGhoZrr702+/kLFy7ctm1bY2Ojoiip7R6PZ/bs2SUlJQcOHHjwwQdTDxmNxoaGhmg0+txzz5133nnZ+8nikUceaWxs9Pl899xzzxVXXJFsnzFjxte+9rWLLrroq1/96oknnpj6kkHttTRY/V4XkD+IlgAAAAAAI6+ioiL16ZYtW/x+f0VFxcyZM3fu3Ll582a1Xd1yqO821TfddFN7e/tZZ53lcrkWLFiwadMmtf3hhx9euXKly+Vat27dsmXLkj0IIXbs2LF06VKn07lt27bkRkiZ+umX2tXy5csXL148derUQCCQdv5tt932yiuv3HXXXWkvjMfjua9ZS15p6iUnW9J+ZrouIH+wYhMAgPEjFov5fL6ysrLU2fsAAIw2dUGcuteS1rWMrq1btx45cuSBBx7QuhDkO/ZaAgAABcnj8ciyrNfr+90kFQAADEdyGhHREpCKrzQBABg/ysrKhBA+ny8ej2tdCwAA403iM1oXAuQXoiUAQGFIJBKhUEjrKvJdcXGx2WxWFMXv92tdCwAA+auyslLqo7KyUuu6gIJEtAQAKACKohw9elRd7aV1LflOXQrn8/my3+MZAICJrLW1NdFHa2ur1nUBBYm9lgAABUCn05lMpng8Ho1GTSaT1uXkteLiYqvVGgqFOjo6qqqqtC4HADAhJBIJo9E4bdo0rQsB8kUkEjnllFO0rmKMEC0BAAqD2+3W6XTc+CwX5eXlR48e7enpKS0tLSoq0rocAMD4J0lSNBq97777zGaz1rUAeeGpp56aONtyES0BAAqDwcC/Wbkym812u72np6ejo6Ourk7rcgAAE8Wll15qs9m0rgLIC4cPH/Z4PFpXMUb47hcAgHGovLxckqTe3t5gMKh1LQAAABjP+AYYAIBxyGAwlJaW+ny+jo4Oq9UqSZLWFQEAxr+77rrLaDRqXQWQF/72t7996Utf0rqKMcKsJQAAxien06nT6WRZ7unp0boWAMD4d+utt5IrAUlnnHHGeeedp3UVY0SaONtKAQAw0aizlgwGw+TJk9kBHQAAAKOBT5kAAIxbpaWlJpMpFot1dnZqXQsAAADGJ6IlAEChYuLtgCRJcrvdQgi/3x+JRLQuBwAAAOMQ0RIAoCB5vd6PP/6YuGRAVqu1uLhYCNHe3q51LQAAABiHiJYAAAVJluV4PO71erUupAC43W6dTtfb28t+3gAAABhxREsAgILkdDqFEIFAQJZlrWvJdwaDQX272tvbFUXRuhwAAACMK0RLAICCZDabrVarEMLn82ldSwFwOp0GgyEej/N2AQAAYGQRLQEACpXL5RJC9PT0xGIxrWvJd8n9vNmdCgAAACNL4vY6AIDCdezYsXA47HQ6y8vLta6lAIRCIXWqFwAAADBSmLUEAChgpaWlQoiuri62EMoFuRIAAABGHNESAKCA2e12o9GoKAr3PgMAAAA0QbQEAChs6sQlv9+vdSEAAADARES0BAAobCUlJTqdTpblUCikdS0AAADAhEO0BAAobDqdzm63CyYuAQAAAFogWgIAFDx1TVwwGIxGo1rXAgAAAEwsREsAgIJnMpksFosQoqurS+taCkwwGAwEAlpXAQAAgAJGtAQAGA/UiUtdXV2KomhdS8EIBoNNTU2tra2xWEzrWgAAAFCoiJYAAOOBzWYzGAyKojAHJ3c2m81isZSWlur1eq1rAQAAQKGSEomE1jUAADACvF5vZ2enxWKpq6vTupaCkUgkJEnSugoAAAAUMGYtAQDGCYfDIUlSb2+vLMta11IwyJUAAAAwTERLAIBxQq/XW61WIUR3d7fWtQAAAAATBdESAGD8KCkpEUJ0d3ez3BsAAAAYGwatCwAAYMTYbDar1VpcXKx1IQAAAMBEwTbeAAAAAAAAGCIWxAEAgC+QZZlvngAAAJAjoiUAAPC5rq6uo0ePdnZ2al0IAAAACgPREgAA+JzBYEgkEj6fLxgMal0LAAAACgDREgAA+JzNZnM4HEKI1tbWWCymdTkAAADId0RLAADgC9xut9lsjsfjzc3NbLoEAACA7IiWAADAF0iSVFtbazAYwuFwS0uL1uUAAAAgrxEtAQCAdHq9vrq6WpKkQCDg9Xq1LgcAAAD5i2gJADA+RSKRlpYW7nQ2ZEVFRW63WwjR2dnJlt4AAADIhGgJADA+RaPRnp6e7u5urQspYA6HQ93Su6WlRZZlrcsBAABAPiJaAgCMT1ar1eFwVFVVaV1IYXO73UVFRYqitLS0KIqidTkAAADIOxJ3fgEAAFnEYrFjx47FYjGr1VpTUyNJktYVAQAAII8wawkAAGRjMBhqa2t1Ol0oFGptbdW6HAAAAOQXoiUAADAAk8mkzlfq6elhZ3QAAACkIloCAAADs1gsFRUVQgiv19vV1aV1OQAAAMgXREsAACAnJSUlLpdLCNHW1hYMBrUuBwAAAHmBaAkAAOSqrKysuLhYCNHS0hKJRLQuBwAAANojWgIAAINQVVVlsVgURWlubuY+swAAAJD4UAgAAAZFUZSmpiaXy2W1WrWuBQAAABojWgIAjH9erzcQCNTW1ur1eq1rAQAAAMYVFsQBAMa/QCAQiUQCgYDWhQAAAADjDdESAGD8s9lsQohQKKR1IQAAAMB4Q7QEABj/1JuahUIhloEDAAAAI4toCQAw/pnNZr1eryhKOBzWuhYAAABgXCFaAgBMCOq9zFgTN9p6enoURdG6CgAAAIwdoiUAwISgbrcUDAa1LmQ88/v9LS0tHo+HhYcAAAATB9ESAGBCUGctRSKRWCymdS3jltVqNRgMxcXFkiRpXQsAAADGCNESAGBC0Ov1ZrNZsCZuNJlMpkmTJjmdTq0LAQAAwNghWgIATBTqmjiipVGl1+u1LgEAAABjimgJADBRWCwWQbQEAAAAjCiiJQDARGGxWHQ6XTwej0QiWtcCAAAAjBNESwCAiUKSJHXiUm9vr9a1AAAAAOME0RIAYAJhTZxWent7fT6f1lUAAABg5Bm0LgAAgLHDrCVNxOPx5ubmeDwejUbdbrckSVpXBAAAgBHDrCUAwARSVFSk0+kURWG7pbGk1+vLysokSerq6mpsbIzH41pXBAAAgBFDtAQAmFhYE6cJh8NRU1Oj0+nC4fCxY8dkWda6IgAAAIwMoiUAwMTCmjitWK3Wuro6g8EQjUYbGxv5FQAAAIwPREsAgIklGS0lEgmta5lwzGZzfX19UVFRPB5vbGz0er1aVwQAAIDhIloCAEwsbLekLYPBUFdXZ7fbhRCdnZ1NTU2KomhdFAAAAIZO4jtbAMBE097eLoRwOBwmk0nrWiaunp6e1tbWRCJhMBiqq6uLioq0rggAAABDQbQEAAC0EYlEmpubo9GoJEnl5eWlpaVaVwQAAIBBI1oCAACaicfjLS0t6g37HA6H2+2WJEnrogAAADAIREsAAEBjnZ2d6pbeZrO5qqqKhYoAAAAFhGgJAABoLxgMtra2xuNxSZLcbrfD4dC6IgAAAOSEaAkAAOSFeDze2toaDAaFEFartbKy0mAwaF0UAAAABqDTugAAAAAhhNDr9TU1NeXl5ZIk9fb2xuNxrSsCAADAwJi1BAAA8kskEpFl2W63a10IAAAABka0BAAAAAAAgCFiCwMAwASVSCQikYgQoqioSOtaAAAAgELFXksAgAnK7/cfO3bM5/NpXQgAAABQwIiWAAATVFFRkV6v1+n4p7CQKIrS2toajUa1LgQAAAD/xF5LAACgYHR0dPh8PpPJNHnyZK1rAQAAgBDstQQAAApISUlJOBx2Op1aFwIAAIB/YtYSAAAAAAAAhogNJgAAAAAAADBEREsAAAAAAAAYIqIlAAAwTkSj0aNHjwaDQa0LAQAAmEDYawkAAIwTra2t3d3dQgir1VpWVlZUVKR1RQAAAOMf0RIAABgn4vG41+vt6upSP97YbLaysjKz2ax1XQAAAOMZ0RIAACKRSEiSpHUVGBmyLHu93p6eHvUpARMAABgliqIkH+t0GXccCofDiqKYzWa9Xt/vCbFYrO+K/kQi0TexSSQSqYOqzGaz3W7PNHpHR4eiKE6n02g09ntCJBJJfnAagqKiIsOQXwwAwDgQiUSam5slSZo8ebLWtWBkmEymqqoql8ulBkzBYDAYDBYXF7tcLgImAADGn2QEkyXcCQQC0WjUarVm+jAQjUbb2trUx4qiJDOdZI7Tb2NSUVFRfX19ptHb29vD4XBNTY3NZuv3BFmWk6MPQXFxcZZoqaenJxaLlZSUZIqWZFn2+XxDHt3hcBAtAQAmNL1eH41GhRCKomT5OIKCkxYwBQKBQCBgs9mcTqfFYtG6OgAAJhw1AJIkKdNUcUVRvF6v+Cy4SU7PSf5MfEYIEY/HxRcjHqPReNxxx2Uavbu7OxgMVlRUZIqWEolEKBQa6sUNwGQyJRKJLB819Xp9cXFxlh50Ol2WKfbZvzxzOByKohgMGfMfo9HocDiy9JCdxWJhQRwAYKI7cuRIPB6vr69n1+fxKm2JnMVicTqdmb42BAAASWqUE4/H1QdqvqMoSr8PhBBVVVWZumpra+vq6nK5XGVlZf2eoCjK4cOHh1yqXq+fOnVqpqM+ny8cDjscDqvVmmn05EeF1BwnmQfl3jgBMWsJADDRmc3mUCgUiUSIlsYrdQZTWVmZz+fr7u7u7e3t7e01mUxOp9Nut7PNFgBggohGo7Is6/X6LJ95Ghsb1SApGScNaogs0ZKavGTpUJIkde6Meqaa2qQ+Tur3hOyFOZ3O7CfodLrhzNyZ4Ji1BACY6Do6Onw+n8PhqKio0LoWjLpYLOb3+7u6utQvVw0Gg8PhcDgcmbbVBAAgHyh9xOPxfmcPVVVVZfpHzefzdXR02O32LAGQOps7rTEZ4iSTnbSfyQelpaV8ZzMBMWsJADDRmUwmIYQsy1oXgrFgMBjKy8udTmdXV5ff74/FYp2dnb29vbW1tVqXBgAY/5JryrJsfNPR0SHLclqElPsQ8Xg8U7RkNBrNZnOWoYUQ1dXVQgjdZ5LTgoAsiJYAABOduvFhJBLRuhCMHb1e73K5nE5nT09PV1dXaWmp1hUBAApScuqQ+kD9abfbM8U3wWCwubk5+93Eent7w+Fw33Y15VHp9frU9Eev1yePZkmOiouLs+8VLYTgZhcYAqIlAMBEZzKZJElSFCUWi2X/Hg/jjCRJJSUlJSUlWhcCAMgv0Wg0FoulLjrrN0LKNJnIZDJl+kShzgDKPgvJ5XKpN65Nw0Iz5C0+QAMAJjpJkoxGoyzLkUiEaAlpotGo+s2w1oUAAEZGPB7v6uoSQrhcrkzneL3e7u7uaPoLRAAAHtxJREFU3PvsO5Mo05kWi+X444/P/s8K9zBFweEDNAAAwmQyybIsyzIf5pCmra2tt7e3srLSbrdrXQsA4J/UHYtSJxDF4/HUpyUlJZlWfiUSic7OTkmSskRLer3eYDCkBkapsVFay6BuBKHueD3oCwbyG9ESAADs5I3+JW+9nOUmzQCA0SDLcjgcjn8mx5VoSWazOVO0pNfri4uL9Xp9IpHIlPKUl5eXl5cP9xqACYNoCQAAoiX0T5KkSZMmRSIRo9GodS0AMK50dnbG4/GysrJMU35CoVB7e3uWHtRdq1MnEKX+VO/RkemF6k3QAIwUoiUAAIiWkE2Wv0+EEKFQyGAwqP8TAoAJRZ3aGYvF+s4qisfjFovF6XRmem1XV1c8Hnc4HJmiJZPJZLPZ9Cn6rkQbtSsDMDhESwAAcJM4DF1LS0s8HjeZTMXFxTabjaVzAMYNRVEikYiaE6n5UTI2Up8mEonsPWSJlhwOhxAiyy5FVqvVarUOuXgAY4lPzwAAfH6TOFmWiZaQu3g8bjabe3t7ZVn2er1er9dgMKgZk8ViYaNWAPmst7c3Go1aLJZMa34jkUhjY+OA/ajTiPpOL8o+nbOsrGyIdQPIP3x6BgBAiJSbxPEdKXKn1+tra2sVRQkGg4FAIBgMxmIxv9/v9/t1Op36lbvNZiOvBDAGkndJSxJZ5w35fL5gMFhZWZkpWlJX+2ZKjpJG63oAFA4+6AAAIIQQ6gdrtlvCEOh0OrvdbrfbE4lEKBRSM6Z4PB4IBAKBgPhsxxCr1cpUJgBDoG5plCa5MC2ZKPVdnqbX67NES2azOZFIZMmGjEbj5MmTR+wyAIxfREsAAAjBTt4YCZIk2Ww2m80mhIhEIsFgMBQKhcNhdUKcz+fT6XRFRUVqxsSuTACEEIqiZMl3EonEkSNHFEXJsbfkTdNymVLEkjQAI4VoCQAAIT6LlqLRqNaFYJwwm81ms9nlcimKEgqF1JgpFouFQqFQKCSE0Ol0VVVVag4FYPxJTjXKcpfJzs5Or9frcDgqKir6PSE5z7FvZtTv2jRumgZAE0RLAAAI8Vm0pK4s4KM5RpBOpysuLi4uLhZCyLLc29sbCoV6e3vj8Xim/U0A5Lksq9JSD6knT5kyJdOGa+qsouz3WZs8ebJOp+MfJgD5jGgJAAAhhFBXKul0OqIljB6TyWQymdRbbkcikSy3Txrwzk0AxozX641EImnbY+dCkiS9Xp9lOZvD4XA4HNm3YOM+AADyn5Q9IwcAAMDYa21t7e7udrlcbIYCjKpIJNLZ2akuUM10TmNjY29vb1pj2pI0g8HQ753URrl8AMgLROAAAAB5x2w2WywWi8WS6QRFUaLRqMlk4pZzmOD6XYmW1lJZWZlpXzNFUYLBYPbpgaWlpXa7PS02Gp2rAYCCxKwlAACAwhMKhTwejyRJRqNR3TLcZDKZzWa9Xk/YhPGnt7c3HA73myLl8udMZWVlSUlJv4fi8XgwGDQYDFardaSrBoCJgllLAAAAhScej6tbg8myLMtyT09P8pDRaFQ3dUo+YIYF8pmiKJ2dnfF4PMuStGAw6PP5Mh1VtzRKu11a8rFOp8uyr5ler8+UOgEAcsSsJQAAgEIVi8Xkz0QiEVmW+90wWP3T2piCvAkjK5FIJFeiKYqSfKDOLYrFYsXFxaWlpZlee+jQISHE1KlTM/3PMhAIBIPBTMkRWxoBgLaIlgAAAMaJRCIRjUaj0agsy8mfsVis75lutzvT3/lAv2RZDoVCqZlR6s8B/6ZwOBwVFRWZjnZ2dkqSVFpaSkgEAIWIBXEAAADjhCRJ6gq41B2L1Q2/I5GImjrFYrFoNJpl0+JIJNLU1GQ2m2tqasakaoyFRCKRSCSyBDdtbW3RaNTtdmdaOxaJRNrb27MMIUmSOpOo359ZlqQJIbgTIgAUNKIlAACA8Uyn06n7fOd4fiwWi8Vi2ZfLtbe3R6NRfR/JNUojUTjSqfGQutxMXYCmtqgPlKwSiYTVaq2trc3UeW9vryzLsVgsUwZkMpnUu6SpC9D6hkdMOAKACYtoCQAAAJ+zWCz19fXZ1zf19vZGIpEsJyTjBnUmS5qSkpKJEz8lPqMoiiRJBkPGj9/d3d2yLNvt9kw5oCzLR48eHXIl/e7DlVRWVpZIJLLMLTKbzVm22QYATGRESwAAfK6rq8vr9RYXF7vdbq1rAbSh0+mKioqyn1NWVhbvQ1GUWCym5hfqTJlML7fb7ZkO+f3+zs5Ou92eZV+e9vb2RCIhSZIkSWrByQcDXp0QwuFwZDoUCoUikUhRUZHFYun3hEQioS4KU6Mi8VlyJIRQZwYlLz+ZKKW+3GAwTJkyJdPowWAwEAgYjcZM0ZJ6gamBXWpy12+KlybL21JcXJzlKAAAWRAtAQDwBepONFpXAeS11L2c0qSuzEreLCxVPB7PknEkV29lGb27uzv7BJzsskRLwWDQ7/e7XK4s0VJXV9fQxh0w3LHZbAaDIcu8IaPReOKJJw5tdAAARg/REgAAnysuLi4qKsqyYgVAdpIkDWe7pZKSEpvNlv3lLpdLCBGPx8Vni7zUx8NnNpuLi4uzhDuSJJWXlyefpkZFyXlDyZ+q5OMBRy8pKRlm/QAAaEIa8EahAAAAAAAAQL+4jwMAAAAAAACGiGgJAAAAAAAAQ0S0BAAAAAAAgCEiWgIAAAAAAMAQES0BAAAAAABgiIiWAAAAAAAAMERESwAAAAAAABgioiUAAL4gkUh0d3d7vV6tCwEAAAAKgEHrAgAAyDutra1CiJKSEoOBfygBAACAbJi1BADAF0iSpCZKsVhM61oAAACAfEe0BABAOqPRKISIRqNaFwIAAADkO6IlAADSES0BAAAAOSJaAgAgHQviAAAAgBwRLQEAkI5oCQAAAMgR0RIAAOmIlgAAAIAcES0BAJCOaAkAAADIEdESAADp1GgpHo8nEgmtawEAAADyGtESAADp9Hq9JEmCiUsAAADAQIiWAADoB2viAAAAgFwQLQEA0A+iJQAAACAXREsAAPRDr9cLoiUAAABgIERLAAD0g1lLAAAAQC6IlgAA6AfREgAAAJALoiUAAPqhRkvxeFzrQgAAAIC8RrQEAEA/mLUEAAAA5IJoCQCAfhAtAQAAALkgWgIAoB9qtJRIJFgTBwAAAGRBtAQAQD8kSdLr9YKJSwAAAEBWBq0LAAAgT5WXl+t0OqPRqHUhAAAAQP6SEomE1jUAAAAAAACgILEgDgAAAAAAAENEtAQAAAAAAIAhIloCAAAAAADAEBEtAQAAAAAAYIiIlgAAAAAAADBEREsAAAAAAAAYIqIlAAAAAAAADBHREgAAGUUikWAwqCiK1oUAAAAAeYpoCQCAjFpaWpqamsLhsNaFAAAAAHnKoHUBAADkL7PZLEmS1lUAAAAA+UtKJBJa1wAAAAAAAICCxII4AAAAAAAADBHREgAAAAAAAIaIaAkAAAAAAABDRLQEAAAAAACAISJaAgAAAAAAwBARLQEAAAAAAGCIiJYAAAAAAAAwRERLAAAAAAAAGCKD1gUAAJDXWltbw+FwRUWFxWLRuhYAAAAg7zBrCQCAbKLRqCzLsVhM60IAAACAfES0BABANgaDQQgRj8e1LgQAAADIR0RLAABko9frhRDMWgIAAAD6RbQEAEA2arTErCUAAACgX0RLAABkQ7QEAAAAZEG0BABANkRLAAAAQBZESwAAZMM23gAAAEAWREsAAGTDrCUAADDG3n///RtuuGHGjBnFxcU2m2369OnXX3/9+++/n3aalINMJ9tstpkzZ65Zs6alpaVvAb29vVu2bPna175WWlpqMBjKysq+/vWv33HHHe++++7Qrii1mEGVnWMlyRdec801fUe/5ppr+vaci0AgMHny5CG8cKKREomE1jUAAJC/FEU5fPiwEOKEE07gUwUAABht99133x133NH3ay29Xr9x48Zbbrkl2ZLLJ5Pkn/yZTq6srHzttdemTJmSbGlrazv33HP379+fvcNBUUdXX5t72blXovYpSZLZbG5ubi4tLU0e8vv91dXVkUhEPX9Q9a9aternP/+5LMuDfeFEw6wlAACy0el06ocVJi4BAIDR9pOf/GTdunWKoqxcufL111/v6ekJBoN79+79t3/7N0VRbr311gcffDB5cuKLsjT2fUlbW9tTTz01derU1tbW9evXp55zyy237N+/v7a29tFHHz127FgkEvH7/a+99trGjRtPPfXU4V9j7mUPtpJzzz03HA4//vjjqY3/93//Fw6H58+fP9g6X3vttZ/+9KepWR4yYdYSAAAD+Pjjj2OxWH19fVFRkda1AACAcevYsWMnnHCCLMu/+MUvrrvuurSjjz766IoVK0wm0+HDh+vq6vq+PHVmUI5HX3311Xnz5lVUVLS2tiYby8rKvF7va6+9dsYZZwzzinKpLcuh3CtRO3n88cevvvrqWbNmvfnmm8lDs2bNevvtt5944omrrroq00B9ybJ82mmnRaPR9957z2Kx5P7CiYlZSwAADIDtlgAAwBh46KGHZFlesmRJ31xJCHHddddddtllsiw/9NBDIzXil7/8ZSFEV1dXamMwGBRCnHjiiQO+vN9NiEZwZ6LcK1EtXrzY5XK99dZb77zzjtry9ttvv/322y6X69JLLx3U0Bs3bjxw4MDPfvYzvlnMBdESAAADIFoCAABj4MUXXxRCfPe73810gnroj3/840iN+NZbbwkh0uZAnXbaaUKIlStXHjp0aKQGGprBVmI2m9VtvLdv3662qA+uvfZas9mc+7gHDhy49957r7322iEso5uYWBAHAMAAWlpaenp6ysvLnU6n1rUAAIBxy+Vy+Xy+zs5Ol8vV7wkdHR1ut7usrKyjo6Pv0UEtiOvo6Ni9e/eaNWs++eSTu+666+67706euXv37gsuuCAcDgshpk6d+pWvfOWUU075xje+cc4556jft2UfMffGAQ8NoZJ33333K1/5itPpbGpqEkJUV1f7/f5333331FNPzf7+JCmKMm/evIMHD37wwQdutzt7hVARLQEAMID29na/3+90OsvLy7WuBQAAjFtGozEWi0WjUYPB0O8J0WjUZDIZDIZoNNr3aC7RUl9XXXXVL3/5S6PRmNr4wQcfbNy48amnnurp6Uk21tXV/fjHP77ssstyvJwca8tedo6VpHYyZ86cN9544/HHH08kEtdcc82cOXP27t074EBJW7duvemmm7Zt27Zy5cpcKoQgWgIAYEBer7ezs7OkpKSyslLrWgAAwLg1BrOW0tTV1T399NPqurO+4vH4vn379u/fv3fv3l27dn300UeSJDU0NHz729/O9ZJyqC2X4GbASlI7eeihh66//vr58+cnEomXXnrpoYce+vf/3969xkRxtQEcn12WFQTEcgmGoshFqmCrFqvxgokENBZTjUJbSFBrbMVGq01bq5jQRGOk7ZderFa8pNqWxEuRYLWKu4hUS1UwaLW2eMEbS0VBcVcXCuy8H/Z9590s7Oy4KCv4/31olnPOPOc5h36QZ2fOLFyocKLr16/HxcWNGjXq6NGj0o5RWnKK0hIAAE40NTXV19f7+PiEhoa6OxcAANBrjRkz5tSpU8XFxcnJyZ0OKC4unjp16pgxY06cONGxV/kDca2trTU1NWvXrt2xY0dwcPAff/zh9Pszi8WyatWq3Nxcu/evKdTF0pLTTGyDNDU1hYaGms1mQRC8vb3r6ur69euncKKUlBSdTldVVTVs2DCXM3wGcYw3AABOWG9K5xhvAADwRCUlJQmCsHnzZkcDrF3WYV3h6ekZExPz3XffTZ069fbt26tWrXJ6iVqt/vjjjwVBOH/+fBdn7yKnmfj7+6empoqiKIpiWlqata6k0IEDB/7999/Y2FiVDWvXY3zzXe9DaQkAACd4QxwAAOgGWVlZnp6eu3fv/v777zv27tixY8+ePVqtNisr67FMp1KpvvrqK41Gs3379urqaqfjra9p8/X1fSyzd4XTTKRjkqQPeKIoLQEA4ASlJQAA0A0GDRq0bt06QRDmzp37zjvvnDp16uHDh2azuaKiYuHChfPmzRMEITc3d+DAgY9rxpiYmPnz57e1tdneuBQXF7dq1apDhw7duHGjpaWlubm5pqZmw4YN1oONpk2bJo3s9Eaex3h3j/JM7EyaNMl611JCQsIjzSh2xrarK8vpxThrCQAA51pbWz08PNRqvpIBAABP1tq1a3NyciwWi127Wq1es2ZNdna2owuVn7Vky2AwREdHNzc3nzx5cvTo0YLjd8kJgjBs2LCSkpIBAwbIxFTeqLDL5UyUTySPs5acorQEAAAAAMBT5Pz58+vXr9fr9bW1taIohoWFJSYmLlmyJC4uTuYq10pLgiCsWLHi008/TUpKOnz4sCAIf/75Z2FhYVlZ2fnz5+vr60VRDAwMjIuLmzlz5oIFC7y8vORjPsbSUhczUT6RPEpLTlFaAgAAAAAAgIu4sR8AAAAAAAAuorQEAAAAAAAAF1FaAgAAAAAAgIsoLQEAAAAAAMBFlJYAAAAAAADgIkpLAAAAAAAAcJHG3QkAANADtLa2Go1GtVrdv39/d+cCAAAAPEW4awkAAOfa29sbGhru3r3r7kQAAACApwulJQAAnNNoNH5+fv369XN3IgAAoNdSqVTW/zoiCILFYtm2bVtCQkJISIhWqx08ePC8efOOHz8uRUhJSek0eEpKijWC5NChQ9OnTw8ODvb09BwwYMDs2bN1Ol1X8i8sLBw4cKBttu7SxdkfaRshUFoCAEAJjUYzYMCAwMBAdycCAAB6OdFGxx+XLFmyZ8+ezz///OLFiyaTqbi4eMyYMe+//750+ZkzZ6qqquxiVlVVnTlzxrYlJycnOzs7Kyururr6/v37e/fubW9vT05O7krmH3zwwc6dO6VUu82TqPUo3MZnhNMdVnXzrxwAAAAAAHSkUtn/hd6xxdfX99q1a46+7lKpVN98801paemuXbts29PS0hITE999911rtOLi4uXLl5eXl3t7e9sOW716dU5Ojsv5e3h4tLW1df9NPR13qesBlWzjs8PpDnPXEgAAAAAAPUNoaOhvv/0mM2DBggWVlZV///231PLXX3+dPn16wYIFUsvXX3+dk5NjV1cSBEGqK23atCk6Olqr1UZHR2/evFkaoFKp8vPzX375ZS8vr5CQkMzMzIaGBqnLYrGo1WrpsT7pqry8vIiICK1WO2TIkE2bNkldHYtQtl35+fljx4719fX18PCwNtbW1i5evNjPzy8iImL58uXNzc1Ch6cIO0Z2YS0Kt9FRSk6DO7pKZq8EQSgqKho1alSfPn0GDx68detWu4W88sorffv29fX1TU5OPnfu3C+//DJhwgQfH5+goKCMjAzb2eXjdMy50x22JwIAAAAAAHfr+Bd6xxadThcSEjJhwoSVK1fu2LHj6tWrHcdv3bp17ty5UuOcOXO2bdtmGy0oKKi+vt5RGgUFBWFhYXq9/v79+3q9PiwsrKioSIofGxur1+uNRmNtbW1GRkZ6enqn2Uqf9+3bN3jw4NLSUqPRWFpaGh4eLnXJrFcQhJiYGL1e/+DBA6k3PDx827ZtRqOxpqbm9ddfX7FihdM4rq1F4TbKpySzUY6uktmrY8eO9e/fPz8/v6mp6cSJE5GRkQcOHJDmGjp0qE6nMxqNdXV1c+fODQgIiI2NPXz4sNSSkZGhJI78hsigtAQAAAAAgPspKS2JovjgwYP9+/fn5OTMnj07ICBgypQpdXV1tuPb2tpiY2NrampEUaypqYmNjW1ra7ONptFoWltbHaUxfvz4vXv3Sj8WFBRMmDBBin/69Gmp69atW4GBgZ1mK31OSEjYt2+f1F5UVKSwtFRWVuYoQ1EUGxsbIyMjncZxbS0Kt1E+JZmNcnSVzF4lJSXt3r1b6vr9999Hjx4tzVVRUSF11dfXC4JQWVlp2yLNLh9HfkNkcNYSAAAAAADup+SsJTvNzc1Lly69detWYWGh7fj8/Pxjx45t2LBh0aJFkyZNSk9Pt+0NDg6+cOFCUFBQpzEDAgIuX7783HPPWX+8e/duVFRUY2OjNUJ7e7ta/f+jdWwz7PRzQEDAlStX+vfvL0ULCAiwdsmsV6VSmc1mLy8vqauxsfGTTz7Zv3+/wWBoaWkR/ne0k3wc19aicBvlU3IUXOYqmb0KDg6+c+eO7Rrl53I0+6PGcfSbssNZSwAAAAAA9EheXl65ubklJSV27W+++ebJkycrKysrKireeOMNu96xY8eWlZW5NqNt6eHxslgstj/a1pUEQZgzZ05bW9vBgwfv3bsniqLJZGpvb+/ijE7XIr+N8ik5Cu7aQkwmk9FotL1RyFoPcjSXo9kfNY5ClJYAAAAAAOgZ3nvvPbtKhMFg8PPzsxumVquzs7OnTJmSnZ3dsV6wePHiNWvWmM1mu/Y1a9YIgjBs2DDbwtPRo0djY2NdTnj48OHHjh2Tfjx+/Lj0OTAw0Pr0llVVVZVMnLKystzc3JiYGGvJSa/XS10ajcZRdaaLa5HfRpmUXFuIzF7Fx8dXVlYqz9wR1+LI7PB/yT8vBwAAJBaLpb293d1ZAACA3qnjX+idtowaNWrv3r337t1ramrS6/UvvfTSunXrHI13FC07Ozs+Pv7nn3++d++e2WwuLy+fMWOGdUBBQcGgQYOOHDliNBqPHDkyaNAg26OvZWJ2+nnfvn0RERFlZWUmk6msrCwiIkLqSk9Pz8jIqK2tNZlMJSUl1qKPo4kmTpyYnZ3d0NBw9+7dXbt2hYSESGMiIyMPHjxo+480qcu1tSjcRpmUZILLXCWzVzqdbvTo0UePHjUajSaTSafTvfrqq07n6tjiWpyOO2w/0lEHAACwZTKZqqurr1275u5EAABA76SkRnD8+PG33norPDxco9H4+fmNGzfO+toyR+Nloh04cGDatGmBgYEajSYkJGTWrFk6nc7atXHjxqioKI1GExUVlZeXpzBDR5+//fbb8PBwT0/P6OjoL774QqvVWtvv3LmTmZkZHBys1WpHjhz5448/ypRmampqpk+f7u/v36dPnxEjRmzfvl0a89NPP0VERHh4eHR6uQtrUbiNMinJBJe5SmavRFEsLS2dPHmyj4+Pt7f35MmTpV/WI5WWXIvTcYftcIw3AACKtLS0XL9+XaPRWL9BAgAAwKMqLy+fP3/+hQsX3J1ID9CD9oqzlgAAUMT6RU3XD4wEAAB4pmRmZp47d+7hw4cnTpzIysqaP3++uzN6evXQvdK4OwEAAHoG6R5gi8Xy5N6NAgAA0MskJSWlp6dfuXIlPDz87bffXrp0qbszenr10L3igTgAAJS6fPmyxWIJDw/XarXuzgUAAAB4KvClKwAASvFMHAAAAGCH0hIAAEpRWgIAAADsUFoCAEApSksAAACAHUpLAAAopdFoBEpLAAAAgA1KSwAAKMVdSwAAoNtcu3btxo0b1s8mk+nq1avWzy0tLQ0NDdKwpqYms9lse6Ht4IaGhuvXr9tFliK0tLTcvHnz5s2bRqPxiawBzwaNuxMAAKDHoLQEAAC6R1FR0dmzZxsbGyMiIlJTU5ctWzZixIg+ffq89tprn3322e3btwsLCwVBMBqNiYmJK1euTE1NtV5YV1cnDR43blxeXt6QIUP8/f0XL15sHXDx4kUpQnl5+ZdffhkfH5+YmDh+/Hi3rRY9nEoURXfnAABAz2A0Gv/55x9vb++wsDB35wIAAHq/+/fvL1q0aNy4cXFxcZMnT541a1ZBQYEgCDNnzrSWlnJycgICAsLCwqTS0vr166XBQ4cOzcjIGD58eFJSkk6ns41sjVBaWrpz584ZM2ZMmTJFreapJriI/3UAAFCKu5YAAEC3EUVx+fLlH3300e3bt4ODgzsOKC0tfeGFF4KCggRBuHLlSkVFhdlsth2ckJCwcePGLVu2XLp0SRpgGyEmJiYtLc1gMCxbtqwbVoTeigfiAABQitISAADoNh9++GFaWtrIkSNPnjxpMBiGDx+uUqlsB5SUlDQ2NlZXV3t4ePj7+9+6dSsqKur555+XBk+bNi0mJqa5uTk+Pt5gMFy9ejUqKsrb21uKEBoaGhoaKgjCjBkzunt56EUoLQEAoBSlJQAA0D3y8vJKSkpaWlrOnTuXmZmZlZW1f//+lJSUxsbGnJycs2fP5ubmrl69WhCEH374wcvLKzk52XphamqqNPjSpUtbtmwxGAxLly6dOHHixIkTBUGwjfDiiy/++uuvBoOB0hK6grOWAABQShTFS5cuCYIQGRlpLTMBAAB0A1EUm5ubbW84UjjYaDT6+PjInKPU1NTUt29fT0/Px5Yrnj3ctQQAgFIqlUqtVlsslvb2dkpLAACg26hUKoV1JbvBfn5+8oP9/f27lBnAMd4AADwSjUYj8EwcAAAA8D+UlgAAeAQctwQAAADYorQEAMAjsJaW2tra3J0IAAAA8FSgtAQAwCPQaDSenp52r/4FAAAAnlm8IQ4AAAAAAAAu4q4lAAAAAAAAuIjSEgAAAAAAAFxEaQkAAAAAAAAuorQEAAAAAAAAF/0HxVuxyzpeWp8AAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRtaW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXI6Ok1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5Db25maWcgSXRlbXM8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPlRpY2tldDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDk1PC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBjb25maWcgaXRlbSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5Db25maWcgSXRlbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNNREI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMyMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBpdGVtIHpvb20uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5BZ2VudC5EZXRhaWwuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFsbG9jYXRpb25MaXN0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5QcmludC5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeS10YWJsZXNvcnRlci0yLjAuNS9qcXVlcnkudGFibGVzb3J0ZXIuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLlVJLlRhYmxlLlNvcnQuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PklUU00uQWdlbnQuWm9vbS5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5JVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPml0c20tY29uZmlnaXRlbTwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWcgaXRlbSBlZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5FZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlnIGl0ZW0gcHJpbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RGVsZXRlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ29uZmlnSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBpdGVtIGFkZC48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+QWRkPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5OZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk5ldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUFkZDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VhcmNoIGNvbmZpZyBpdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+U2VhcmNoPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZWFyY2ggY29uZmlnIGl0ZW1zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2VhcmNoPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPm9uY2xpY2s9IklUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2guT3BlblNlYXJjaERpYWxvZygnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCcpOyBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9IGVsc2UgeyB3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7IjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNvbmZpZyBJdGVtPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5BZ2VudC5EZXRhaWwuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5JVFNNLlRhYmxlLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+SVRTTS5QcmludC5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeS10YWJsZXNvcnRlci0yLjAuNS9qcXVlcnkudGFibGVzb3J0ZXIuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5VSS5UYWJsZS5Tb3J0LmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PklUU00uQWdlbnQuWm9vbS5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+WyUgRW52KCJMYXN0U2NyZWVuT3ZlcnZpZXciKSAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMyMDAtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3Rvcnk7Q29uZmlnSXRlbUlEPVslIERhdGEuQ29uZmlnSXRlbUlEIHwgaHRtbCAlXTtWZXJzaW9uSUQ9WyUgRGF0YS5WZXJzaW9uSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzAwLUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdDtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNDAwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludDtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdO1ZlcnNpb25JRD1bJSBEYXRhLlZlcnNpb25JRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+dGFyZ2V0PSJwcmludCI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM1MDAtTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNQ29uZmlnSXRlbTtTb3VyY2VLZXk9WyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNjAwLUR1cGxpY2F0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5EdXBsaWNhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0O0R1cGxpY2F0ZUlEPVslIERhdGEuQ29uZmlnSXRlbUlEIHwgaHRtbCAlXTtWZXJzaW9uSUQ9WyUgRGF0YS5WZXJzaW9uSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNzAwLUNvbmZpZ0l0ZW1EZWxldGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5EZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkRlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGU7Q29uZmlnSXRlbUlEPVslIERhdGEuQ29uZmlnSXRlbUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Db25maXJtRGlhbG9nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbGVtZW50U2VsZWN0b3IiPiNNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dDb250ZW50UXVlcnlTdHJpbmciPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRGVsZXRlO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZTtTdWJhY3Rpb249Q29uZmlnSXRlbURlbGV0ZTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dUaXRsZSI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0gWyUgQ29uZmlnKCJJVFNNQ29uZmlnSXRlbTo6SG9vayIpICVdIFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZTo6U2V0dGluZ3NWaXNpYmlsaXR5IyMjSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmZpZ0l0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIExvY2F0aW9uPSJLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL051bWJlci8qLnBtIiBTZWxlY3RlZElEPSJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6QXV0b0luY3JlbWVudCI+PC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkNJTmFtZVJlZ2V4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb21wdXRlcjo6Q0lOYW1lUmVnZXgiPl5BQkMuKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29tcHV0ZXI6OkNJTmFtZVJlZ2V4RXJyb3JNZXNzYWdlIj5BIGNvbXB1dGVyIG5hbWUgbXVzdCBzdGFydCB3aXRoIEFCQyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkhhcmR3YXJlOjpDSU5hbWVSZWdleCI+LipcZFxkJDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSGFyZHdhcmU6OkNJTmFtZVJlZ2V4RXJyb3JNZXNzYWdlIj5BIGhhcmR3YXJlIG5hbWUgbXVzdCBlbmQgd2l0aCB0d28gZGlnaXRzITwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkRlZmF1bHRTdWJPYmplY3QjIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgJ0lUU01Db25maWdJdGVtJy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkNvbXB1dGVyPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6SVRTTUNvbmZpZ0l0ZW06OlNob3dDb2x1bW5zQnlDbGFzcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpOYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkN1ckRlcGxTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjozPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjozOjpDYXBhY2l0eTo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpXYXJyYW50eUV4cGlyYXRpb25EYXRlOjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkNyZWF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Mb2NhdGlvbjo6VHlwZTo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpBZGRyZXNzOjoxPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+T2JqZWN0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkNvbmZpZyBJdGVtPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkV2ZW50TW9kdWxlUG9zdCMjIzEwMC1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDb25maWdJdGVtQ3JlYXRlfFZlcnNpb25DcmVhdGV8RGVwbG95bWVudFN0YXRlVXBkYXRlfEluY2lkZW50U3RhdGVVcGRhdGV8Q29uZmlnSXRlbURlbGV0ZXxMaW5rQWRkfExpbmtEZWxldGV8RGVmaW5pdGlvblVwZGF0ZXxOYW1lVXBkYXRlfFZhbHVlVXBkYXRlfERlZmluaXRpb25DcmVhdGV8VmVyc2lvbkRlbGV0ZXxBdHRhY2htZW50QWRkUG9zdHxBdHRhY2htZW50RGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpIaXN0b3J5T3JkZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIGNvbmZpZyBpdGVtIGhpc3RvcnkgKHJldmVyc2Ugb3JkZXJlZCkgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlZpZXdIaXN0b3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJub3JtYWwiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJyZXZlcnNlIiBUcmFuc2xhdGFibGU9IjEiPnJldmVyc2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vcm1hbCIgVHJhbnNsYXRhYmxlPSIxIj5ub3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWcgaXRlbSBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNEZXBsb3ltZW50U3RhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlBhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXM6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPkRlcGxveW1lbnQgU3RhdGUgVHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyIgVHJhbnNsYXRhYmxlPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBvc3Rwcm9kdWN0aXZlIiBUcmFuc2xhdGFibGU9IjEiPnBvc3Rwcm9kdWN0aXZlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InByZXByb2R1Y3RpdmUiIFRyYW5zbGF0YWJsZT0iMSI+cHJlcHJvZHVjdGl2ZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwcm9kdWN0aXZlIiBUcmFuc2xhdGFibGU9IjEiPnByb2R1Y3RpdmU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5GdW5jdGlvbmFsaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+T3B0aW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0RlcGxveW1lbnRTdGF0ZXNDb2xvcnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xhc3MiPklUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+RGVwbG95bWVudCBTdGF0ZSBDb2xvcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyIgVHJhbnNsYXRhYmxlPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+Q29sb3I8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5Db2xvclBpY2tlcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzcyMjIzAxMC1DbGFzc0dyb3VwQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzc0dyb3VwQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246Okl0ZW0jIyMwMTAtSXRlbUNsYXNzR3JvdXBDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtQ2xhc3NHcm91cENoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtRWRpdCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NvbmZpZ0l0ZW1EZWxldGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtWm9vbSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFkbWluSVRTTUNvbmZpZ0l0ZW0jIyNFZGl0b3JSb3dzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6Vmlld0NvbmZpZ0l0ZW1EZWZpbml0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+UGVybWlzc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyIgVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+UGVybWlzc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xhc3MiPklUU006OkNvbmZpZ0l0ZW06OkNsYXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OlNlYXJjaCMjI0NvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpTZWFyY2hSb3V0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iXig/OkFnZW50fEFkbWluKUlUU01Db25maWdJdGVtIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaDtTdWJhY3Rpb249QUpBWDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpTZWFyY2g6OkphdmFTY3JpcHQjIyNDb25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkphdmFTY3JpcHQgZnVuY3Rpb24gZm9yIHRoZSBzZWFyY2ggZnJvbnRlbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlNlYXJjaFJvdXRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJeKD86QWdlbnR8QWRtaW4pSVRTTUNvbmZpZ0l0ZW0iPklUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2guT3BlblNlYXJjaERpYWxvZygnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCcpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMxMDAtQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBKUyBmaWxlcyB0byBhbHdheXMgYmUgbG9hZGVkIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OldlYjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLlVJLkNvbmZpZ0l0ZW1BY3Rpb25Sb3cuanM8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHJlZmVyZW5jZXNHcm91cHMjIyNDb25maWdJdGVtT3ZlcnZpZXdTbWFsbFBhZ2VTaG93biIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb2x1bW4iPk90aGVyIFNldHRpbmdzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmF0aW9uIEl0ZW0gTGltaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5IiBUcmFuc2xhdGFibGU9IjEiPkxpbWl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MTA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjE1PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIwIj4yMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNSI+MjU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjMwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM1Ij4zNTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFTZWxlY3RlZCI+MjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlVzZXJDb25maWdJdGVtT3ZlcnZpZXdTbWFsbFBhZ2VTaG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+ODAwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpPdmVydmlldyMjI1NtYWxsIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW1PdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6T3ZlcnZpZXdTbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+U21hbGw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWVTaG9ydCI+UzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFnZVNob3duIj4yNTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpIb29rIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Q29uZmlnSXRlbSM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gjIyNTZWFyY2hMaW1pdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NvbmZpZ0l0ZW1TZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjEwMDAwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q29uZmlnSXRlbVNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJJbmNpU2lnbmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJEZXBsU2lnbmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOdW1iZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJEZXBsU3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1ckRlcGxTdGF0ZVR5cGUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1ckluY2lTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VySW5jaVN0YXRlVHlwZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFzdENoYW5nZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gjIyNTaG93Q29sdW1uc0J5Q2xhc3MiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NvbmZpZ0l0ZW1TZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6TmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6Q3VySW5jaVNpZ25hbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpDdXJEZXBsU2lnbmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkN1ckRlcGxTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjozPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjozOjpDYXBhY2l0eTo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpXYXJyYW50eUV4cGlyYXRpb25EYXRlOjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkNyZWF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Mb2NhdGlvbjo6Q3VySW5jaVNpZ25hbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Mb2NhdGlvbjo6VHlwZTo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpOYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TG9jYXRpb246OkFkZHJlc3M6OjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Mb2NhdGlvbjo6TGFzdENoYW5nZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIyMjU2VhcmNoQ1NWRGF0YSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EYXRhIHVzZWQgdG8gZXhwb3J0IHRoZSBzZWFyY2ggcmVzdWx0IGluIENTViBmb3JtYXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDb25maWdJdGVtU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5DbGFzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+SW5jaWRlbnQgU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBUcmFuc2xhdGFibGU9IjEiPk5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ0l0ZW1OdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBUcmFuc2xhdGFibGU9IjEiPkRlcGxveW1lbnQgU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBUcmFuc2xhdGFibGU9IjEiPlZlcnNpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBUaW1lPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1NlYXJjaExpbWl0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTAwMDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyICdBbGwnIGlzIHNlbGVjdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJJbmNpU2lnbmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJEZXBsU2lnbmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOdW1iZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJEZXBsU3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1ckRlcGxTdGF0ZVR5cGUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1ckluY2lTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VySW5jaVN0YXRlVHlwZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFzdENoYW5nZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1uc0J5Q2xhc3MiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpOYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6Ok51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpDdXJJbmNpU2lnbmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkN1ckRlcGxTaWduYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6Q3VyRGVwbFN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6SGFyZERpc2s6OjM6OkNhcGFjaXR5OjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29tcHV0ZXI6OldhcnJhbnR5RXhwaXJhdGlvbkRhdGU6OjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db21wdXRlcjo6Q3JlYXRlVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpDdXJJbmNpU2lnbmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TG9jYXRpb246Ok51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpUeXBlOjoxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TG9jYXRpb246Ok5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Mb2NhdGlvbjo6QWRkcmVzczo6MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxvY2F0aW9uOjpMYXN0Q2hhbmdlZDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJVbmlxdWVDSU5hbWU6OkVuYWJsZVVuaXF1ZW5lc3NDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmZpZ0l0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+RGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlVuaXF1ZUNJTmFtZTo6VW5pcXVlbmVzc0NoZWNrU2NvcGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoJ2NsYXNzJykgb3IgZ2xvYmFsbHkgKCdnbG9iYWwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmZpZ0l0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9Imdsb2JhbCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imdsb2JhbCIgVHJhbnNsYXRhYmxlPSIxIj5nbG9iYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNsYXNzIiBUcmFuc2xhdGFibGU9IjEiPmNsYXNzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkJ1bGtBY3Rpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpCdWxrQWN0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT51c2VyczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY29uZmlnaXRlbTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5CdWxrIEFjdGlvbjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5DTURCPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZSMjIzEwMC1ab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byB6b29tIGludG8gYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZVByZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Wm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Wm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlIyMjMjAwLUhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlUHJlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3Rvcnk7Q29uZmlnSXRlbUlEPVslIERhdGEuQ29uZmlnSXRlbUlEIHwgaHRtbCAlXTtWZXJzaW9uSUQ9WyUgRGF0YS5WZXJzaW9uSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlIyMjMzAwLUR1cGxpY2F0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGVQcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RHVwbGljYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7RHVwbGljYXRlSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdO1ZlcnNpb25JRD1bJSBEYXRhLlZlcnNpb25JRCB8IGh0bWwgJV07UmV0dXJuVG9MYXN0U2NyZWVuPTE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrIyMjRGVwbFN0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDb25maWdJdGVtOjpWaWV3QnVsazwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrIyMjSW5jaVN0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q29uZmlnSXRlbTo6Vmlld0J1bGs8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKPC9vdHJzX2NvbmZpZz4K
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpNb2R1bGUjIyNDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkdlbmVyaWNJbnRlcmZhY2UgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiBsYXllci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkNvbmZpZ0l0ZW1DcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbnRyb2xsZXIiPkNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpZ0RpYWxvZyI+QWRtaW5HZW5lcmljSW50ZXJmYWNlT3BlcmF0aW9uRGVmYXVsdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6TW9kdWxlIyMjQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUdldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5HZW5lcmljSW50ZXJmYWNlIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gbGF5ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5Db25maWdJdGVtR2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb250cm9sbGVyIj5Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdEaWFsb2ciPkFkbWluR2VuZXJpY0ludGVyZmFjZU9wZXJhdGlvbkRlZmF1bHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246Ok1vZHVsZSMjI0NvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1VcGRhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+R2VuZXJpY0ludGVyZmFjZSBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIGxheWVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+Q29uZmlnSXRlbVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29udHJvbGxlciI+Q29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29uZmlnRGlhbG9nIj5BZG1pbkdlbmVyaWNJbnRlcmZhY2VPcGVyYXRpb25EZWZhdWx0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpNb2R1bGUjIyNDb25maWdJdGVtOjpDb25maWdJdGVtU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkdlbmVyaWNJbnRlcmZhY2UgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiBsYXllci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkNvbmZpZ0l0ZW1TZWFyY2g8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbnRyb2xsZXIiPkNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpZ0RpYWxvZyI+QWRtaW5HZW5lcmljSW50ZXJmYWNlT3BlcmF0aW9uRGVmYXVsdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6TW9kdWxlIyMjQ29uZmlnSXRlbTo6Q29uZmlnSXRlbURlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5HZW5lcmljSW50ZXJmYWNlIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gbGF5ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5Db25maWdJdGVtRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb250cm9sbGVyIj5Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdEaWFsb2ciPkFkbWluR2VuZXJpY0ludGVyZmFjZU9wZXJhdGlvbkRlZmF1bHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtR2V0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtR2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbVNlYXJjaCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbVNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW1DcmVhdGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW1DcmVhdGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtVXBkYXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtVXBkYXRlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbURlbGV0ZSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbURlbGV0ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OlNldEluY2lkZW50U3RhdGVPbkxpbmsiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtTdGF0dXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0IyMjMDQyLUlUU01Db25maWdJdGVtVGlja2V0U3RhdHVzTGluayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rU3RhdHVzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlRpY2tldFN0YXR1c0xpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oTGlua0FkZHxMaW5rRGVsZXRlKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjMDQyLUlUU01Db25maWdJdGVtVGlja2V0U3RhdHVzTGluayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rU3RhdHVzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlRpY2tldFN0YXR1c0xpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oVGlja2V0U3RhdGVVcGRhdGV8VGlja2V0VHlwZVVwZGF0ZSk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6TGlua1N0YXR1czo6VGlja2V0VHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rU3RhdHVzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+SW5jaWRlbnQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkxpbmtTdGF0dXM6OkRlcGxveW1lbnRTdGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rU3RhdHVzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+UHJvZHVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6TGlua1N0YXR1czo6SW5jaWRlbnRTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua1N0YXR1czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkluY2lkZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+V2FybmluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk9wZXJhdGlvbmFsPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpMaW5rU3RhdHVzOjpMaW5rVHlwZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua1N0YXR1czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZWxldmFudFRvIj5JbmNpZGVudDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb21tb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTUlNRTo6QmFzZTY0KCk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbW1vbiAtIEJhc2UgY2xhc3MgZm9yIGFsbCBDSSBPcGVyYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBJbml0KCkKCmluaXRpYWxpemUgdGhlIG9wZXJhdGlvbiBieSBjaGVja2luZyB0aGUgd2Vic2VydmljZSBjb25maWd1cmF0aW9uCgogICAgbXkgJFJldHVybiA9ICRDb21tb25PYmplY3QtPkluaXQoCiAgICAgICAgV2Vic2VydmljZUlEID0+IDEsCiAgICApOwoKICAgICRSZXR1cm4gPSB7CiAgICAgICAgU3VjY2VzcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgIyBvciAwIGluIGNhc2Ugb2YgZmFpbHVyZSwKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIE1lc3NhZ2UnLAogICAgfQoKPWN1dAoKc3ViIEluaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte1dlYnNlcnZpY2VJRH0gKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiR290IG5vIFdlYnNlcnZpY2VJRCEiLAogICAgICAgIH07CiAgICB9CgogICAgIyBnZXQgd2Vic2VydmljZSBjb25maWd1cmF0aW9uCiAgICBteSAkV2Vic2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyktPldlYnNlcnZpY2VHZXQoCiAgICAgICAgSUQgPT4gJFBhcmFte1dlYnNlcnZpY2VJRH0sCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRXZWJzZXJ2aWNlKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgV2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbicKICAgICAgICAgICAgICAgIC4gJyBpbiBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uOjpuZXcoKScsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH07Cn0KCj1pdGVtIFZhbGlkYXRlQ2xhc3MoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiBDbGFzcyBpcyB2YWxpZC4KCiAgICBteSAkU3VjZXNzID0gJENvbW1vbk9iamVjdC0+VmFsaWRhdGVDbGFzcygKICAgICAgICBDbGFzcyA9PiAnc29tZSBjbGFzcycsCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlQ2xhc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17Q2xhc3N9OwoKICAgICMgY2hlY2sgZm9yIENsYXNzIHNlbnQKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgTmFtZSAgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CgogICAgIyByZXR1cm4gZmFsc2UgaWYgaXRlbSBkYXRhIGlzIGVtcHR5CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtRGF0YVJlZik7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFZhbGlkYXRlRGVwbFN0YXRlKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gRGVwbFN0YXRlIGlzIHZhbGlkLgoKICAgIG15ICRTdWNlc3MgPSAkQ29tbW9uT2JqZWN0LT5WYWxpZGF0ZURlcGxTdGF0ZSgKICAgICAgICBEZWxwU3RhdGUgPT4gJ3NvbWUgRGVwbFN0YXRlJywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVEZXBsU3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17RGVwbFN0YXRlfTsKCiAgICAjIGNoZWNrIGZvciBDbGFzcyBzZW50CiAgICBteSAkSXRlbURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBOYW1lICA9PiAkUGFyYW17RGVwbFN0YXRlfSwKICAgICk7CgogICAgIyByZXR1cm4gZmFsc2UgaWYgaXRlbSBkYXRhIGlzIGVtcHR5CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtRGF0YVJlZik7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFZhbGlkYXRlSW5jaVN0YXRlKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gSW5jaVN0YXRlIGlzIHZhbGlkLgoKICAgIG15ICRTdWNlc3MgPSAkQ29tbW9uT2JqZWN0LT5WYWxpZGF0ZUluY2lTdGF0ZSgKICAgICAgICBJbmNpU3RhdGUgPT4gJ3NvbWUgSW5jaVN0YXRlJywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVJbmNpU3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17SW5jaVN0YXRlfTsKCiAgICAjIGNoZWNrIGZvciBDbGFzcyBzZW50CiAgICBteSAkSXRlbURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgTmFtZSAgPT4gJFBhcmFte0luY2lTdGF0ZX0sCiAgICApOwoKICAgICMgcmV0dXJuIGZhbHNlIGlmIGl0ZW0gZGF0YSBpcyBlbXB0eQogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSXRlbURhdGFSZWYpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBWYWxpZGF0ZUlucHV0VGV4dCgpCgpjaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHZhbGlkLgoKICAgIG15ICRTdWNlc3MgPSAkQ29tbW9uT2JqZWN0LT5WYWxpZGF0ZUlucHV0VGV4dCgKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgdmFsdWUnLAogICAgICAgIE1heExlbmd0aCA9PiAxMjMsCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlSW5wdXRUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBsZW5ndGgKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtJbnB1dH0tPntNYXhMZW5ndGh9CiAgICAgICAgJiYgJFBhcmFte0lucHV0fS0+e01heExlbmd0aH0KICAgICAgICAmJiBsZW5ndGggJFBhcmFte1ZhbHVlfSA+ICRQYXJhbXtJbnB1dH0tPntNYXhMZW5ndGh9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVmFsaWRhdGVJbnB1dERhdGUoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyB2YWxpZC4KCiAgICBteSAkU3VjZXNzID0gJENvbW1vbk9iamVjdC0+VmFsaWRhdGVJbnB1dERhdGUoCiAgICAgICAgVmFsdWUgPT4gJzEyLzEyLzE5NzcnLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRTdWNlc3MgPSAkQ29tbW9uT2JqZWN0LT5WYWxpZGF0ZUlucHV0RGF0ZSgKICAgICAgICBWYWx1ZSA9PiAnMTk3Ny0xMi0xMicsCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlSW5wdXREYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKCiAgICAjIGNoZWNrIGFuZCBjb252ZXJ0IGZvciBkYXRlIGZvcm1hdCBsaWtlICIwNS8xOC8yMDExIgogICAgaWYgKCAkVmFsdWUgPX4gbXtcQSAoXGR7Mn0pIC8gKFxkezJ9KSAvIChcZHs0fSkgXHp9eG1zICkgewogICAgICAgICRWYWx1ZSA9ICQzIC4gJy0nIC4gJDEgLiAnLScgLiAkMiAuICcgMDA6MDA6MDAnOwogICAgfQoKICAgICMgY2hlY2sgYW5kIGNvbnZlcnQgZm9yIGRhdGUgZm9ybWF0IGxpa2UgIjIwMTEtMDUtMTgiCiAgICBpZiAoICRWYWx1ZSA9fiBte1xBIChcZHs0fSAtIFxkezJ9IC0gXGR7Mn0gXHopIH14bXMgKSB7CiAgICAgICAgJFZhbHVlID0gJDEgLiAnIDAwOjAwOjAwJzsKICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIHJhdyBkYXRhIHRvIGEgc3lzdGVtIHRpbWUgZm9ybWF0CiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkVmFsdWUsCiAgICApOwoKICAgICMgY29udmVydCBpdCBiYWNrIHRvIGEgc3RhbmRhcmQgdGltZSBzdGFtcAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICApOwoKICAgIHJldHVybiBpZiAhJFRpbWVTdGFtcDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVmFsaWRhdGVJbnB1dERhdGVUaW1lKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCgogICAgbXkgJFN1Y2VzcyA9ICRDb21tb25PYmplY3QtPlZhbGlkYXRlSW5wdXREYXRlVGltZSgKICAgICAgICBWYWx1ZSA9PiAnMTIvMTIvMTk3NyAxMjowMDowMCcsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFN1Y2VzcyA9ICRDb21tb25PYmplY3QtPlZhbGlkYXRlSW5wdXREYXRlVGltZSgKICAgICAgICBWYWx1ZSA9PiAnMTk3Ny0xMi0xMiAxMjowMDowMCcsCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlSW5wdXREYXRlVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBjaGVjayBhbmQgY29udmVydCBmb3IgZGF0ZSBmb3JtYXQgbGlrZSAiMDUvMTgvMjAxMSIKICAgIGlmICggJFZhbHVlID1+IG17XEEgKFxkezJ9KSAvIChcZHsyfSkgLyAoXGR7NH0pIFx6fXhtcyApIHsKICAgICAgICAkVmFsdWUgPSAkMyAuICctJyAuICQxIC4gJy0nIC4gJDIgLiAnIDAwOjAwOjAwJzsKICAgIH0KICAgIGVsc2lmICggJFZhbHVlID1+IG17XEEgKFxkezJ9KSAvIChcZHsyfSkgLyAoXGR7NH0pIChcZHsyfSA6IFxkezJ9IDogXGR7Mn0pIFx6fXhtcyApIHsKICAgICAgICAkVmFsdWUgPSAkMyAuICctJyAuICQxIC4gJy0nIC4gJDIgLiAkNDsKICAgIH0KCiAgICAjIGNoZWNrIGFuZCBjb252ZXJ0IGZvciBkYXRlIGZvcm1hdCBsaWtlICIyMDExLTA1LTE4IgogICAgaWYgKCAkVmFsdWUgPX4gbXtcQSAoXGR7NH0gLSBcZHsyfSAtIFxkezJ9IFx6KSB9eG1zICkgewogICAgICAgICRWYWx1ZSA9ICQxIC4gJyAwMDowMDowMCc7CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSByYXcgZGF0YSB0byBhIHN5c3RlbSB0aW1lIGZvcm1hdAogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJFZhbHVlLAogICAgKTsKCiAgICAjIGNvbnZlcnQgaXQgYmFjayB0byBhIHN0YW5kYXJkIHRpbWUgc3RhbXAKICAgIG15ICRUaW1lU3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRUaW1lU3RhbXA7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFZhbGlkYXRlSW5wdXRJbnRlZ2VyKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCgogICAgbXkgJFN1Y2VzcyA9ICRDb21tb25PYmplY3QtPlZhbGlkYXRlSW5wdXRJbnRlZ2VyKAogICAgICAgIFZhbHVlID0+IDEyMywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVJbnB1dEludGVnZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwoKICAgIHJldHVybiBpZiAhSXNJbnRlZ2VyKCRWYWx1ZSk7CgogICAgcmV0dXJuIGlmIGRlZmluZWQgJFBhcmFte1ZhbHVlTWlufSAmJiAkVmFsdWUgPCAkUGFyYW17VmFsdWVNaW59OwogICAgcmV0dXJuIGlmIGRlZmluZWQgJFBhcmFte1ZhbHVlTWF4fSAmJiAkVmFsdWUgPiAkUGFyYW17VmFsdWVNYXh9OwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBWYWxpZGF0ZUlucHV0R2VuZXJhbENhdGFsb2coKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyB2YWxpZC4KCiAgICBteSAkU3VjZXNzID0gJENvbW1vbk9iamVjdC0+VmFsaWRhdGVJbnB1dEdlbmVyYWxDYXRhbG9nKAogICAgICAgIFZhbHVlID0+IDEyMywKICAgICAgICBDbGFzcyA9PiAnU29tZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MnCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlSW5wdXRHZW5lcmFsQ2F0YWxvZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBnZXQgdGhlIHZhbHVlcyBmb3IgdGhlIEdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgbXkgJEl0ZW1MaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJbnB1dH0tPntDbGFzc30sCiAgICApOwoKICAgICMgY3JlYXRlIGEgbG9rdXAgbGlzdAogICAgbXkgJUl0ZW1MaXN0TG9va3VwID0gcmV2ZXJzZSAleyRJdGVtTGlzdH07CgogICAgcmV0dXJuIGlmICEkSXRlbUxpc3RMb29rdXB7JFZhbHVlfTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVmFsaWRhdGVJbnB1dEN1c3RvbWVyKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCgogICAgbXkgJFN1Y2VzcyA9ICRDb21tb25PYmplY3QtPlZhbGlkYXRlSW5wdXRDdXN0b21lcigKICAgICAgICBWYWx1ZSA9PiAnc29tZSBjdXN0b21lciBsb2dpbicsCiAgICApOwoKICAgIHJldHVybnMKICAgICRTdWNjZXNzID0gMSAgICAgICAgICAgICMgb3IgMAoKPWN1dAoKc3ViIFZhbGlkYXRlSW5wdXRDdXN0b21lciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CgogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCBcJUN1c3RvbWVyRGF0YSApOwoKICAgICMgaWYgVmFsaWRJRCBpcyBwcmVzZW50LCBjaGVjayBpZiBpdCBpcyB2YWxpZCEKICAgIGlmICggZGVmaW5lZCAkQ3VzdG9tZXJEYXRhe1ZhbGlkSUR9ICkgewoKICAgICAgICAjIHJldHVybiBmYWxzZSBpZiBjdXN0b21lciBpcyBub3QgdmFsaWQKICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKCBWYWxpZElEID0+ICRDdXN0b21lckRhdGF7VmFsaWRJRH0gKSBuZSAndmFsaWQnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBWYWxpZGF0ZUlucHV0Q3VzdG9tZXJDb21wYW55KCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCgogICAgbXkgJFN1Y2VzcyA9ICRDb21tb25PYmplY3QtPlZhbGlkYXRlSW5wdXRDdXN0b21lckNvbXBhbnkoCiAgICAgICAgVmFsdWUgPT4gJ3NvbWUgY3VzdG9tZXIgY29tcGFueSBuYW1lJywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVJbnB1dEN1c3RvbWVyQ29tcGFueSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CgogICAgbXkgJUNvbXBhbnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIExpbWl0ID0+IDAsICAgICMgRGlzcGxheSBhbGwgQ3VzdG9tZXIgQ29tcGFuaWVzCiAgICApOwoKICAgIHJldHVybiBpZiAhJENvbXBhbnlMaXN0eyAkUGFyYW17VmFsdWV9IH07CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFZhbGlkYXRlTWltZVR5cGUoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiBNaW1lVHlwZSBpcyB2YWxpZC4KCiAgICBteSAkU3VjZXNzID0gJENvbW1vbk9iamVjdC0+VmFsaWRhdGVNaW1lVHlwZSgKICAgICAgICBNaW1lVHlwZUlEID0+ICdzb21lIE1pbWVUeXBlJywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVNaW1lVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtNaW1lVHlwZX07CgogICAgcmV0dXJuIGlmICRQYXJhbXtNaW1lVHlwZX0gIX4gbXtcQVx3K1wvXHcrXHp9OwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBWYWxpZGF0ZUNoYXJzZXQoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiBDaGFyc2V0IGlzIHZhbGlkLgoKICAgIG15ICRTdWNlc3MgPSAkQ29tbW9uT2JqZWN0LT5WYWxpZGF0ZUNoYXJzZXQoCiAgICAgICAgQ2hhcnNldCA9PiAnc29tZSBjaGFyc2V0JywKICAgICk7CgogICAgcmV0dXJucwogICAgJFN1Y2Nlc3MgPSAxICAgICAgICAgICAgIyBvciAwCgo9Y3V0CgpzdWIgVmFsaWRhdGVDaGFyc2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NoYXJzZXR9OwoKICAgIG15ICRDaGFyc2V0TGlzdCA9ICRTZWxmLT5fQ2hhcnNldExpc3QoKTsKCiAgICByZXR1cm4gaWYgISRDaGFyc2V0TGlzdC0+eyAkUGFyYW17Q2hhcnNldH0gfTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gUmVwbGFjZUlucHV0RGF0ZSgpCgpyZXBsYWNlcyB0aGUgdXNlciB2YWx1ZSB3aXRoIGEgc3lzdGVtIHZhbGlkIHZhbHVlLgoKICAgIG15ICROZXdWYWx1ZSA9ICRDb21tb25PYmplY3QtPlJlcGxhY2VJbnB1dERhdGUoCiAgICAgICAgVmFsdWUgPT4gJzEyLzEyLzE5NzcnLAogICAgKTsKCiAgICBvcgoKICAgIG15ICROZXdWYWx1ZSA9ICRDb21tb25PYmplY3QtPlJlcGxhY2VJbnB1dERhdGUoCiAgICAgICAgVmFsdWUgPT4gJzE5NzctMTItMTInLAogICAgKTsKCiAgICByZXR1cm5zCiAgICAkTmV3VmFsdWUgPSAnMTk3Ny0xMi0xMicsCgo9Y3V0CgpzdWIgUmVwbGFjZUlucHV0RGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBjaGVjayBhbmQgY29udmVydCBmb3IgZGF0ZSBmb3JtYXQgbGlrZSAiMDUvMTgvMjAxMSIKICAgIGlmICggJFZhbHVlID1+IG17XEEgKFxkezJ9KSAvIChcZHsyfSkgLyAoXGR7NH0pIFx6fXhtcyApIHsKICAgICAgICAkVmFsdWUgPSAkMyAuICctJyAuICQxIC4gJy0nIC4gJDIgLiAnIDAwOjAwOjAwJzsKICAgIH0KCiAgICAjIGNoZWNrIGFuZCBjb252ZXJ0IGZvciBkYXRlIGZvcm1hdCBsaWtlICIyMDExLTA1LTE4IgogICAgaWYgKCAkVmFsdWUgPX4gbXtcQSAoXGR7NH0gLSBcZHsyfSAtIFxkezJ9IFx6KSB9eG1zICkgewogICAgICAgICRWYWx1ZSA9ICQxIC4gJyAwMDowMDowMCc7CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSByYXcgZGF0YSB0byBhIHN5c3RlbSB0aW1lIGZvcm1hdAogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJFZhbHVlLAogICAgKTsKCiAgICAjIGNvbnZlcnQgaXQgYmFjayB0byBhIHN0YW5kYXJkIHRpbWUgc3RhbXAKICAgIG15ICRUaW1lU3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgKTsKCiAgICAjIHJlbW92ZSB0aGUgdGltZSBwYXJ0CiAgICAkVGltZVN0YW1wID1+IHN7IFsgXSAwMDowMDowMCBceiB9e314bXM7CgogICAgcmV0dXJuICRUaW1lU3RhbXA7Cn0KCj1pdGVtIFJlcGxhY2VJbnB1dERhdGVUaW1lKCkKCnJlcGxhY2VzIHRoZSB1c2VyIHZhbHVlIHdpdGggYSBzeXN0ZW0gdmFsaWQgdmFsdWUuCgogICAgbXkgJE5ld1ZhbHVlID0gJENvbW1vbk9iamVjdC0+UmVwbGFjZUlucHV0RGF0ZVRpbWUoCiAgICAgICAgVmFsdWUgPT4gJzEyLzEyLzE5NzcgMTI6MDA6MDAnLAogICAgKTsKCiAgICBvcgoKICAgIG15ICROZXdWYWx1ZSA9ICRDb21tb25PYmplY3QtPlJlcGxhY2VJbnB1dERhdGVUaW1lKAogICAgICAgIFZhbHVlID0+ICcxOTc3LTEyLTEyIDEyOjAwOjAwJywKICAgICk7CgogICAgcmV0dXJucwogICAgJE5ld1ZhbHVlID0gJzE5NzctMTItMTIgMTI6MDA6MDAnOwoKPWN1dAoKc3ViIFJlcGxhY2VJbnB1dERhdGVUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKCiAgICAjIGNoZWNrIGFuZCBjb252ZXJ0IGZvciBkYXRlIGZvcm1hdCBsaWtlICIwNS8xOC8yMDExIgogICAgaWYgKCAkVmFsdWUgPX4gbXtcQSAoXGR7Mn0pIC8gKFxkezJ9KSAvIChcZHs0fSkgXHp9eG1zICkgewogICAgICAgICRWYWx1ZSA9ICQzIC4gJy0nIC4gJDEgLiAnLScgLiAkMiAuICcgMDA6MDA6MDAnOwogICAgfQogICAgZWxzaWYgKCAkVmFsdWUgPX4gbXtcQSAoXGR7Mn0pIC8gKFxkezJ9KSAvIChcZHs0fSkgKFxkezJ9IDogXGR7Mn0gOiBcZHsyfSkgXHp9eG1zICkgewogICAgICAgICRWYWx1ZSA9ICQzIC4gJy0nIC4gJDEgLiAnLScgLiAkMiAuICQ0OwogICAgfQoKICAgICMgY2hlY2sgYW5kIGNvbnZlcnQgZm9yIGRhdGUgZm9ybWF0IGxpa2UgIjIwMTEtMDUtMTgiCiAgICBpZiAoICRWYWx1ZSA9fiBte1xBIChcZHs0fSAtIFxkezJ9IC0gXGR7Mn0gXHopIH14bXMgKSB7CiAgICAgICAgJFZhbHVlID0gJDEgLiAnIDAwOjAwOjAwJzsKICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIHJhdyBkYXRhIHRvIGEgc3lzdGVtIHRpbWUgZm9ybWF0CiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkVmFsdWUsCiAgICApOwoKICAgICMgY29udmVydCBpdCBiYWNrIHRvIGEgc3RhbmRhcmQgdGltZSBzdGFtcAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICApOwoKICAgIHJldHVybiAkVGltZVN0YW1wOwp9Cgo9aXRlbSBSZXBsYWNlSW5wdXRHZW5lcmFsQ2F0YWxvZygpCgpyZXBsYWNlcyB0aGUgdXNlciB2YWx1ZSB3aXRoIGEgc3lzdGVtIHZhbGlkIHZhbHVlLgoKICAgIG15ICROZXdWYWx1ZSA9ICRDb21tb25PYmplY3QtPlJlcGxhY2VJbnB1dEdlbmVyYWxDYXRhbG9nKAogICAgICAgIFZhbHVlID0+ICdzb21lIHZhbHVlJywKICAgICAgICBDbGFzcyA9PiAnU29tZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MnCiAgICApOwoKICAgIHJldHVybnMKICAgICROZXdWYWx1ZSA9IDEyMwoKPWN1dAoKc3ViIFJlcGxhY2VJbnB1dEdlbmVyYWxDYXRhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKCiAgICAjIGdldCB0aGUgdmFsdWVzIGZvciB0aGUgR2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBteSAkSXRlbUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0lucHV0fS0+e0NsYXNzfSwKICAgICk7CgogICAgIyBjcmVhdGUgYSBsb2t1cCBsaXN0CiAgICBteSAlSXRlbUxpc3RMb29rdXAgPSByZXZlcnNlICV7JEl0ZW1MaXN0fTsKCiAgICByZXR1cm4gJEl0ZW1MaXN0TG9va3VweyRWYWx1ZX07Cn0KCj1pdGVtIEludmVydFJlcGxhY2VJbnB1dERhdGUoKQoKcmVwbGFjZXMgdGhlIHN5c3RlbSB2YWx1ZSB3aXRoIGEgdXNlciB2YWx1ZS4KCiAgICBteSAkTmV3VmFsdWUgPSAkQ29tbW9uT2JqZWN0LT5JbnZlcnRSZXBsYWNlSW5wdXREYXRlKAogICAgICAgIFZhbHVlID0+ICcxMi0xMi0xOTc3IDAwOjAwOjAwJywKICAgICk7CgogICAgcmV0dXJucwogICAgJE5ld1ZhbHVlID0gJzE5NzctMTItMTInLAoKPWN1dAoKc3ViIEludmVydFJlcGxhY2VJbnB1dERhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwoKICAgICRWYWx1ZSA9fiBze1xBIChcZHs0fSAtIFxkezJ9IC0gXGR7Mn0pIFsgXSAwMDowMDowMCBcen17JDF9eG1zOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIEludmVydFJlcGxhY2VJbnB1dEdlbmVyYWxDYXRhbG9nKCkKCnJlcGxhY2VzIHRoZSBzeXN0ZW0gdmFsdWUgd2l0aCBhIHVzZXIgdmFsdWUuCgogICAgbXkgJE5ld1ZhbHVlID0gJENvbW1vbk9iamVjdC0+SW52ZXJ0UmVwbGFjZUlucHV0R2VuZXJhbENhdGFsb2coCiAgICAgICAgVmFsdWUgPT4gMTIzLAogICAgICAgIENsYXNzID0+ICdTb21lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcycKICAgICk7CgogICAgcmV0dXJucwogICAgJE5ld1ZhbHVlID0gJ3NvbWUgdmFsdWUnCgo9Y3V0CgpzdWIgSW52ZXJ0UmVwbGFjZUlucHV0R2VuZXJhbENhdGFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBHZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIG15ICRJdGVtTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SW5wdXR9LT57Q2xhc3N9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBhIGxva3VwIGxpc3QKICAgIHJldHVybiAkSXRlbUxpc3QtPnskVmFsdWV9Owp9Cgo9aXRlbSBDcmVhdGVBdHRhY2htZW50KCkKCmNyZXRlcyBhIG5ldyBhdHRhY2htZW50IGZvciB0aGUgZ2l2ZW4gQ29uZmlnSXRlbS4KCiAgICBteSAkUmVzdWx0ID0gJENvbW1vbk9iamVjdC0+Q3JlYXRlQXR0YWNobWVudCgKICAgICAgICBDb250ZW50ICAgICAgPT4gJERhdGEsICAgICAgICAgICAgICAgICAgICMgZmlsZSBjb250ZW50IChCYXNlNjQgZW5jb2RlZCkKICAgICAgICBDb250ZW50VHlwZSAgPT4gJ3NvbWUgY29udGVudCB0eXBlJywKICAgICAgICBGaWxlbmFtZSAgICAgPT4gJ3NvbWUgZmlsZW5hbWUnLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiA0NTYsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywKICAgICk7CgogICAgcmV0dXJucwogICAgJFJlc3VsdCA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyeXRoaW5nIGlzIG9rCiAgICB9CgogICAgJFJlc3VsdCA9IHsKICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIGRlc2NyaXB0aW9uJwogICAgfQoKPWN1dAoKc3ViIENyZWF0ZUF0dGFjaG1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEF0dGFjaG1lbnQgQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiQ3JlYXRlQXR0YWNobWVudCgpIEdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgd3JpdGUgYXR0YWNobWVudAogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+Q29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXsgJFBhcmFte0F0dGFjaG1lbnR9IH0sCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIENvbnRlbnQgICAgICA9PiBNSU1FOjpCYXNlNjQ6OmRlY29kZV9iYXNlNjQoICRQYXJhbXtBdHRhY2htZW50fS0+e0NvbnRlbnR9ICksCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICB9Owp9Cgo9aXRlbSBDaGVja1hNTERhdGEoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiBYTUxEYXRhIHZhbHVlIGFyZSB2YWxpZC4KCiAgICBteSAkWE1MRGF0YUNoZWNrID0gJENvbW1vbk9iamVjdC0+Q2hlY2tYTUxEYXRhKAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25BcnJheVJlZiwgICAgICAgICAgIyBDb25maWcgSXRlbSBEZWZpbml0aW9uIG90IGp1c3QgcGFydCBvZiBpdAogICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGFIYXNoUmVmLAogICAgICAgIFBhcmVudCAgICAgPT4gJ3NvbWUgcGFyZW50JywKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkWE1MRGF0YUNoZWNrID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LCiAgICB9CgogICAgJFhNTERhdGFDaGVjayA9IHsKICAgICAgICBFcnJvckNvZGUgICAgPT4gJ0Z1bmN0aW9uLkVycm9yJywgICAgICAgICAgICMgaWYgZXJyb3IKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIGRlc2NyaXB0aW9uJywKICAgIH0KCj1jdXQKCnN1YiBDaGVja1hNTERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRQYXJhbXtEZWZpbml0aW9ufTsKICAgIG15ICRYTUxEYXRhICAgID0gJFBhcmFte1hNTERhdGF9OwogICAgbXkgJFBhcmVudCAgICAgPSAkUGFyYW17UGFyZW50fSB8fCAnJzsKCiAgICBteSAkQ2hlY2tWYWx1ZVJlc3VsdDsKICAgIGZvciBteSAkRGVmSXRlbSAoIEB7JERlZmluaXRpb259ICkgewogICAgICAgIG15ICRJdGVtS2V5ID0gJERlZkl0ZW0tPntLZXl9OwoKICAgICAgICAjIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IHNob3VsZCBleGlzdAogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkRGVmSXRlbS0+e0NvdW50TWlufQogICAgICAgICAgICAgICAgJiYgJERlZkl0ZW0tPntDb3VudE1pbn0gPj0gMQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkRGVmSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfQogICAgICAgICAgICAgICAgJiYgJERlZkl0ZW0tPntJbnB1dH0tPntSZXF1aXJlZH0KICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAoICFkZWZpbmVkICRYTUxEYXRhLT57JEl0ZW1LZXl9IHx8ICEkWE1MRGF0YS0+eyRJdGVtS2V5fSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBtaXNzaW5nISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkWE1MRGF0YS0+eyRJdGVtS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEFycmF5SXRlbSAoIEB7ICRYTUxEYXRhLT57JEl0ZW1LZXl9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkQXJyYXlJdGVtIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2tWYWx1ZVJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICA9PiAkQXJyYXlJdGVtLT57JEl0ZW1LZXl9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgID0+ICREZWZJdGVtLT57SW5wdXR9LAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tWYWx1ZVJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJENoZWNrVmFsdWVSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2tWYWx1ZVJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICA9PiAkQXJyYXlJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgID0+ICREZWZJdGVtLT57SW5wdXR9LAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tWYWx1ZVJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJENoZWNrVmFsdWVSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0hBU0gnICkgewogICAgICAgICAgICAkQ2hlY2tWYWx1ZVJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tWYWx1ZSgKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0tPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICBJbnB1dCAgID0+ICREZWZJdGVtLT57SW5wdXR9LAogICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJENoZWNrVmFsdWVSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2hlY2tWYWx1ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb25seSBwZXJmb3JtIGNoZWNrcyBpZiBpdGVtIHJlYWxseSBleGl0cyBpbiB0aGUgWE1MRGF0YQogICAgICAgICAgICAjIENvdW50TmluIGNoZWNrcyB3YXMgdmVyaWZpZWQgYW5kIHBhc3NlZCBiZWZvcmUhLCBzbyBpdCBpcyBzYWZlIHRvIHNraXAgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggJFhNTERhdGEtPnskSXRlbUtleX0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2tWYWx1ZVJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tWYWx1ZSgKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRYTUxEYXRhLT57JEl0ZW1LZXl9LAogICAgICAgICAgICAgICAgICAgIElucHV0ICAgPT4gJERlZkl0ZW0tPntJbnB1dH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrVmFsdWVSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJENoZWNrVmFsdWVSZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZXhpc3RzIG1vcmUgZWxlbWVudHMgdGhhbiB0aGUgb25lcyB0aGV5IHNob3VsZAogICAgICAgIGlmICggZGVmaW5lZCAkRGVmSXRlbS0+e0NvdW50TWF4fSApCiAgICAgICAgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgJiYgc2NhbGFyIEB7ICRYTUxEYXRhLT57JEl0ZW1LZXl9IH0gPiAkRGVmSXRlbS0+e0NvdW50TWF4fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNJWE1MRGF0YS0+JFBhcmVudCRJdGVtS2V5IHBhcmFtZXRlciIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHJlcGV0aXRpb25zIGlzIGhpZ2hlciB0aGFuIHRoZSBtYXhpdW0gdmFsdWUhIiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBzdWIgYW5kIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgIGlmICggZGVmaW5lZCAkRGVmSXRlbS0+e1N1Yn0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiAkWE1MRGF0YS0+eyRJdGVtS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkWE1MRGF0YS0+eyRJdGVtS2V5fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiBmb3IgZWFjaCBhcnJheSBpdGVtCiAgICAgICAgICAgICAgICAgICAgbXkgJFhNTERhdGFDaGVjayA9ICRTZWxmLT5DaGVja1hNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZkl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgID0+ICRBcnJheUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCAgICAgPT4gJFBhcmVudCAuICRJdGVtS2V5IC4gIlskQ291bnRlcl0tPiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkWE1MRGF0YUNoZWNrLT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkWE1MRGF0YUNoZWNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgbXkgJFhNTERhdGFDaGVjayA9ICRTZWxmLT5DaGVja1hNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YS0+eyRJdGVtS2V5fSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICctPicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFhNTERhdGFDaGVjay0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkWE1MRGF0YUNoZWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc3RhcnQgcmVjdXNyc2lvbgogICAgICAgICAgICAgICAgbXkgJFhNTERhdGFDaGVjayA9ICRTZWxmLT5DaGVja1hNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiB7fSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICctPicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFhNTERhdGFDaGVjay0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkWE1MRGF0YUNoZWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfTsKfQoKPWl0ZW0gUmVwbGFjZVhNTERhdGEoKQoKcmVwbGFjZSB0aGUgWE1MRGF0YSB0byBvbmUgdGhhdCB1c2VzIGludGVybmFsIHZhbHVlcy4KCiAgICBteSAkTmV3WE1MRGF0YSA9ICRDb21tb25PYmplY3QtPlJlcGxhY2VYTUxEYXRhKAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25BcnJheVJlZiwgICAgICAgICAgIyBDb25maWcgSXRlbSBEZWZpbml0aW9uIG90IGp1c3QgcGFydCBvZiBpdAogICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGFIYXNoUmVmLAogICAgICAgIFBhcmVudCAgICAgPT4gJ3NvbWUgcGFyZW50JywKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkTmV3WE1MRGF0YSA9ICRYTUxEYXRhSGFzaFJlZiwgICAgICAgICAgICAgICAgICAjIHdpdGggcmVwbGFjZWQgdmFsdWVzCgo9Y3V0CgpzdWIgUmVwbGFjZVhNTERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRQYXJhbXtEZWZpbml0aW9ufTsKICAgIG15ICRYTUxEYXRhICAgID0gJFBhcmFte1hNTERhdGF9OwogICAgbXkgJFBhcmVudCAgICAgPSAkUGFyYW17UGFyZW50fSB8fCAnJzsKCiAgICBteSAkTmV3WE1MRGF0YSA9ICRYTUxEYXRhOwoKICAgIElURU06CiAgICBmb3IgbXkgJERlZkl0ZW0gKCBAeyREZWZpbml0aW9ufSApIHsKICAgICAgICBteSAkSXRlbUtleSA9ICREZWZJdGVtLT57S2V5fTsKCiAgICAgICAgbXkgJE5ld1ZhbHVlOwoKICAgICAgICBpZiAoIHJlZiAkWE1MRGF0YS0+eyRJdGVtS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEFycmF5SXRlbSAoIEB7ICRYTUxEYXRhLT57JEl0ZW1LZXl9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkQXJyYXlJdGVtIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIG5ldyB2YWx1ZQogICAgICAgICAgICAgICAgICAgICROZXdWYWx1ZSA9ICRTZWxmLT5fUmVwbGFjZVZhbHVlKAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRBcnJheUl0ZW0tPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICAgPT4gJERlZkl0ZW0tPntJbnB1dH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1LZXkgPT4gJEl0ZW1LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdGhlIHZhbHVlIGluIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgICRBcnJheUl0ZW0tPnskSXRlbUtleX0gPSAkTmV3VmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkTmV3VmFsdWUgPSAkU2VsZi0+X1JlcGxhY2VWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICA9PiAkQXJyYXlJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgID0+ICREZWZJdGVtLT57SW5wdXR9LAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIHRoZSB2YWx1ZSBpbiB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAkQXJyYXlJdGVtID0gJE5ld1ZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPl9SZXBsYWNlVmFsdWUoCiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRYTUxEYXRhLT57JEl0ZW1LZXl9LT57JEl0ZW1LZXl9LAogICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgIEl0ZW1LZXkgPT4gJEl0ZW1LZXksCiAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgdGhlIHZhbHVlIGluIHRoZSBoYXNoCiAgICAgICAgICAgICRYTUxEYXRhLT57JEl0ZW1LZXl9LT57JEl0ZW1LZXl9ID0gJE5ld1ZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb25seSBwZXJmb3JtIHJlcGxhY2UgaWYgaXRlbSByZWFsbHkgZXhpdHMgaW4gdGhlIFhNTERhdGEKICAgICAgICAgICAgaWYgKCAkWE1MRGF0YS0+eyRJdGVtS2V5fSApIHsKICAgICAgICAgICAgICAgICROZXdWYWx1ZSA9ICRTZWxmLT5fUmVwbGFjZVZhbHVlKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIHRoZSByb290IHZhbHVlCiAgICAgICAgICAgICAgICAkWE1MRGF0YS0+eyRJdGVtS2V5fSA9ICROZXdWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIHZhbHVlIGluIHRoZSByZXN1bHRpbmcgWE1MRGF0YQogICAgICAgIGlmICggJFhNTERhdGEtPnskSXRlbUtleX0gKSB7CiAgICAgICAgICAgICROZXdYTUxEYXRhLT57JEl0ZW1LZXl9ID0gJFhNTERhdGEtPnskSXRlbUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3ViIGFuZCBzdGFydCByZWN1cnNpb24KICAgICAgICBpZiAoIGRlZmluZWQgJERlZkl0ZW0tPntTdWJ9ICkgewoKICAgICAgICAgICAgaWYgKCByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkQXJyYXlJdGVtICggQHsgJFhNTERhdGEtPnskSXRlbUtleX0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24gZm9yIGVhY2ggYXJyYXkgaXRlbQogICAgICAgICAgICAgICAgICAgIG15ICROZXdYTUxEYXRhUGFydCA9ICRTZWxmLT5SZXBsYWNlWE1MRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgPT4gJEFycmF5SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICAgICA9PiAkUGFyZW50IC4gJEl0ZW1LZXkgLiAiWyRDb3VudGVyXS0+IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICROZXdYTUxEYXRhLT57JEl0ZW1LZXl9LT5bJENvdW50ZXJdID0gJE5ld1hNTERhdGFQYXJ0OwogICAgICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgICAgICAgICBteSAkTmV3WE1MRGF0YVBhcnQgPSAkU2VsZi0+UmVwbGFjZVhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YS0+eyRJdGVtS2V5fSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICctPicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE5ld1hNTERhdGEtPnskSXRlbUtleX0gPSAkTmV3WE1MRGF0YVBhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoICRYTUxEYXRhLT57JEl0ZW1LZXl9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3VzcnNpb24KICAgICAgICAgICAgICAgICAgICBteSAkTmV3WE1MRGF0YVBhcnQgPSAkU2VsZi0+UmVwbGFjZVhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZkl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgID0+IHt9LAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICctPicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRJdGVtS2V5fSA9ICROZXdYTUxEYXRhUGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkTmV3WE1MRGF0YTsKfQoKPWl0ZW0gRm9ybWF0WE1MRGF0YSgpCgpDcmVhdGUgYSBYTUxEYXRhIHN1aXRhYmxlIGZvciBWZXJzaW9uQWRkLgoKICAgIG15ICROZXdYTUxEYXRhID0gJENvbW1vbk9iamVjdC0+Rm9ybWF0WE1MRGF0YSgKICAgICAgICBYTUxEYXRhICAgID0+ICRYTUxEYXRhSGFzaFJlZiwKICAgICAgICBDaGlsZCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAjIG9yIDAsIG9wdGlvbmFsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJE5ld1hNTERhdGEgPSAkWE1MRGF0YUhhc2hSZWYsICAgICAgICAgICAgICAgICAgIyBzdWl0YWJsZSBmb3IgdmVyc2lvbiBhZGQKCj1jdXQKCnN1YiBGb3JtYXRYTUxEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFhNTERhdGEgPSAkUGFyYW17WE1MRGF0YX07CiAgICBteSAkQ2hpbGQgICA9ICRQYXJhbXtDaGlsZH07CgogICAgbXkgJE5ld1hNTERhdGE7CgogICAgZm9yIG15ICRSb290S2V5ICggc29ydCBrZXlzICV7JFhNTERhdGF9ICkgewogICAgICAgIGlmICggcmVmICRYTUxEYXRhLT57JFJvb3RLZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgIG15IEBOZXdYTUxQYXJ0czsKICAgICAgICAgICAgJE5ld1hNTFBhcnRzWzBdID0gdW5kZWY7CgogICAgICAgICAgICBmb3IgbXkgJEFycmF5SXRlbSAoIEB7ICRYTUxEYXRhLT57JFJvb3RLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkQXJyYXlJdGVtIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSByb290IGtleSBmcm9tIHRoZSBoYXNoIGFuZCBhc3NpZ24gaXQgdG8gY29udGVudCBrZXkKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudCA9IGRlbGV0ZSAkQXJyYXlJdGVtLT57JFJvb3RLZXl9OwoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgICAgIG15ICROZXdYTUxEYXRhUGFydCA9ICRTZWxmLT5Gb3JtYXRYTUxEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEYXRhID0+ICRBcnJheUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIENoaWxkICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5ld1hNTFBhcnRzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICV7JE5ld1hNTERhdGFQYXJ0fSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOZXdYTUxQYXJ0cywgewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRBcnJheUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NhbWJsZSB0aGUgZmluYWwgdmFsdWUgZnJvbSB0aGUgcGFydHMgYXJyYXkKICAgICAgICAgICAgJE5ld1hNTERhdGEtPnskUm9vdEtleX0gPSBcQE5ld1hNTFBhcnRzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFhNTERhdGEtPnskUm9vdEtleX0gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgbXkgQE5ld1hNTFBhcnRzOwogICAgICAgICAgICAkTmV3WE1MUGFydHNbMF0gPSB1bmRlZjsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgcm9vdCBrZXkgZnJvbSB0aGUgaGFzaCBhbmQgYXNzaWduIGl0IHRvIGNvbnRlbnQga2V5CiAgICAgICAgICAgIG15ICRDb250ZW50ID0gZGVsZXRlICRYTUxEYXRhLT57JFJvb3RLZXl9LT57JFJvb3RLZXl9OwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgbXkgJE5ld1hNTERhdGFQYXJ0ID0gJFNlbGYtPkZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgICAgICBYTUxEYXRhID0+ICRYTUxEYXRhLT57JFJvb3RLZXl9LAogICAgICAgICAgICAgICAgQ2hpbGQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBOZXdYTUxQYXJ0cywgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgICV7JE5ld1hNTERhdGFQYXJ0fSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgYXNzYW1ibGUgdGhlIGZpbmFsIHZhbHVlIGZyb20gdGhlIHBhcnRzIGFycmF5CiAgICAgICAgICAgICROZXdYTUxEYXRhLT57JFJvb3RLZXl9ID0gXEBOZXdYTUxQYXJ0czsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JFJvb3RLZXl9IGVxICcnICkgewogICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRSb290S2V5fSA9IFsKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFhNTERhdGEtPnskUm9vdEtleX0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF07CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIG9ubHkgdGhlIHBhcnQgb24gcmVjdXJzaW9uCiAgICBpZiAoJENoaWxkKSB7CiAgICAgICAgcmV0dXJuICROZXdYTUxEYXRhOwogICAgfQoKICAgICMgcmV0dXJuIHRoZSBjb21wbGV0ZSBYTUxEYXRhIGFzIG5lZWRlZCBmb3IgdmVyc2lvbiBhZGQKICAgIHJldHVybiBbCiAgICAgICAgdW5kZWYsCiAgICAgICAgewogICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJE5ld1hNTERhdGEKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgXTsKfQoKPWl0ZW0gSW52ZXJ0Rm9ybWF0WE1MRGF0YSgpCgpDcmVhdGVzIGEgcmVhZGlibGUgWE1MRGF0YS4KCiAgICBteSAkTmV3WE1MRGF0YSA9ICRDb21tb25PYmplY3QtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YUhhc2hSZWYsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJE5ld1hNTERhdGEgPSAkWE1MRGF0YUhhc2hSZWYsICAgICAgICAgICAgICAgICAgIyBzdWl0YWJsZSBmb3IgdmVyc2lvbiBhZGQKCj1jdXQKCnN1YiBJbnZlcnRGb3JtYXRYTUxEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFhNTERhdGEgPSAkUGFyYW17WE1MRGF0YX07CgogICAgbXkgJE5ld1hNTERhdGE7CiAgICBteSAkQ29udGVudDsKICAgIFJPT1RIQVNIOgogICAgZm9yIG15ICRSb290SGFzaCAoIEB7JFhNTERhdGF9ICkgewogICAgICAgIG5leHQgUk9PVEhBU0ggaWYgIWRlZmluZWQgJFJvb3RIYXNoOwogICAgICAgIGRlbGV0ZSAkUm9vdEhhc2gtPntUYWdLZXl9OwoKICAgICAgICBmb3IgbXkgJFJvb3RIYXNoS2V5ICggc29ydCBrZXlzICV7JFJvb3RIYXNofSApIHsKICAgICAgICAgICAgaWYgKCByZWYgJFJvb3RIYXNoLT57JFJvb3RIYXNoS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgaWYgKCBzY2FsYXIgQHsgJFJvb3RIYXNoLT57JFJvb3RIYXNoS2V5fSB9ID4gMiApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB3ZSBhcmUgb24gYW4gYXJyYXkKICAgICAgICAgICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICAgICAgQVJSQVlJVEVNOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXJyYXlJdGVtICggQHsgJFJvb3RIYXNoLT57JFJvb3RIYXNoS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFSUkFZSVRFTSBpZiAhZGVmaW5lZCAkQXJyYXlJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEFycmF5SXRlbS0+e1RhZ0tleX07CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29udGVudCA9IGRlbGV0ZSAkQXJyYXlJdGVtLT57Q29udGVudH0gfHwgJyc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNjYWxhciBrZXlzICV7JEFycmF5SXRlbX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRSb290SGFzaEtleX0tPlskQ291bnRlcl0tPnskUm9vdEhhc2hLZXl9ID0gJENvbnRlbnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXJyYXlJdGVtS2V5ICggc29ydCBrZXlzICV7JEFycmF5SXRlbX0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICROZXdYTUxEYXRhUGFydCA9ICRTZWxmLT5JbnZlcnRGb3JtYXRYTUxEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxEYXRhID0+ICRBcnJheUl0ZW0tPnskQXJyYXlJdGVtS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdYTUxEYXRhLT57JFJvb3RIYXNoS2V5fS0+WyRDb3VudGVyXS0+eyRBcnJheUl0ZW1LZXl9ID0gJE5ld1hNTERhdGFQYXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld1hNTERhdGEtPnskUm9vdEhhc2hLZXl9LT5bJENvdW50ZXJdID0gJENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgd2UgYXJlIG9uIGEgaGFzaCBvciBzaW5nbGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICBBUlJBWUlURU06CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkUm9vdEhhc2gtPnskUm9vdEhhc2hLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVJSQVlJVEVNIGlmICFkZWZpbmVkICRBcnJheUl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQXJyYXlJdGVtLT57VGFnS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRDb250ZW50ID0gZGVsZXRlICRBcnJheUl0ZW0tPntDb250ZW50fSB8fCAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc2NhbGFyIGtleXMgJXskQXJyYXlJdGVtfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdYTUxEYXRhLT57JFJvb3RIYXNoS2V5fS0+eyRSb290SGFzaEtleX0gPSAkQ29udGVudDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW1LZXkgKCBzb3J0IGtleXMgJXskQXJyYXlJdGVtfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE5ld1hNTERhdGFQYXJ0ID0gJFNlbGYtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTERhdGEgPT4gJEFycmF5SXRlbS0+eyRBcnJheUl0ZW1LZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld1hNTERhdGEtPnskUm9vdEhhc2hLZXl9LT57JEFycmF5SXRlbUtleX0gPSAkTmV3WE1MRGF0YVBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRSb290SGFzaEtleX0gPSAkQ29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB3ZSBhcmUgb24gYSBmaW5hbCBub2RlCiAgICAgICAgICAgIGVsc2lmICggcmVmICRSb290SGFzaC0+eyRSb290SGFzaEtleX0gZXEgJycgJiYgJFJvb3RIYXNoS2V5IGVxICdDb250ZW50JyApIHsKICAgICAgICAgICAgICAgICROZXdYTUxEYXRhID0gJFJvb3RIYXNoLT57JFJvb3RIYXNoS2V5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJE5ld1hNTERhdGE7Cn0KCj1pdGVtIEludmVydFJlcGxhY2VYTUxEYXRhKCkKCnJlcGxhY2UgdGhlIFhNTERhdGEgdG8gb25lIHRoYXQgdXNlcyB1c2VyIHZhbHVlcy4KCiAgICBteSAkTmV3WE1MRGF0YSA9ICRDb21tb25PYmplY3QtPkludmVydFJlcGxhY2VYTUxEYXRhKAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25BcnJheVJlZiwgICAgICAgICAgIyBDb25maWcgSXRlbSBEZWZpbml0aW9uIG90IGp1c3QgcGFydCBvZiBpdAogICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGFIYXNoUmVmLAogICAgICAgIFBhcmVudCAgICAgPT4gJ3NvbWUgcGFyZW50JywKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkTmV3WE1MRGF0YSA9ICRYTUxEYXRhSGFzaFJlZiwgICAgICAgICAgICAgICAgICAjIHdpdGggcmVwbGFjZWQgdmFsdWVzCgo9Y3V0CgpzdWIgSW52ZXJ0UmVwbGFjZVhNTERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRQYXJhbXtEZWZpbml0aW9ufTsKICAgIG15ICRYTUxEYXRhICAgID0gJFBhcmFte1hNTERhdGF9OwogICAgbXkgJFBhcmVudCAgICAgPSAkUGFyYW17UGFyZW50fSB8fCAnJzsKCiAgICBteSAkTmV3WE1MRGF0YSA9ICRYTUxEYXRhOwoKICAgIElURU06CiAgICBmb3IgbXkgJERlZkl0ZW0gKCBAeyREZWZpbml0aW9ufSApIHsKICAgICAgICBteSAkSXRlbUtleSA9ICREZWZJdGVtLT57S2V5fTsKCiAgICAgICAgbXkgJE5ld1ZhbHVlOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCRYTUxEYXRhKQogICAgICAgICAgICAmJiAkWE1MRGF0YS0+eyRJdGVtS2V5fQogICAgICAgICAgICAmJiByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0FSUkFZJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkWE1MRGF0YS0+eyRJdGVtS2V5fSB9ICkgewoKICAgICAgICAgICAgICAgIGlmICggcmVmICRBcnJheUl0ZW0gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgbmV3IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPl9JbnZlcnRSZXBsYWNlVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJEFycmF5SXRlbS0+eyRJdGVtS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICA9PiAkUGFyZW50LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSB0aGUgdmFsdWUgaW4gdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgJEFycmF5SXRlbS0+eyRJdGVtS2V5fSA9ICROZXdWYWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNpZiAoIHJlZiAkQXJyYXlJdGVtIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICROZXdWYWx1ZSA9ICRTZWxmLT5fSW52ZXJ0UmVwbGFjZVZhbHVlKAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRBcnJheUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICAgPT4gJERlZkl0ZW0tPntJbnB1dH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1LZXkgPT4gJEl0ZW1LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdGhlIHZhbHVlIGluIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgICRBcnJheUl0ZW0gPSAkTmV3VmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkWE1MRGF0YSkKICAgICAgICAgICAgJiYgJFhNTERhdGEtPnskSXRlbUtleX0KICAgICAgICAgICAgJiYgcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdIQVNIJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTmV3VmFsdWUgPSAkU2VsZi0+X0ludmVydFJlcGxhY2VWYWx1ZSgKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0tPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICBJbnB1dCAgID0+ICREZWZJdGVtLT57SW5wdXR9LAogICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSB0aGUgdmFsdWUgaW4gdGhlIGhhc2gKICAgICAgICAgICAgJFhNTERhdGEtPnskSXRlbUtleX0tPnskSXRlbUtleX0gPSAkTmV3VmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvbmx5IHBlcmZvcm0gcmVwbGFjZSBpZiBpdGVtIHJlYWxseSBleGl0cyBpbiB0aGUgWE1MRGF0YQogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRYTUxEYXRhKSAmJiAkWE1MRGF0YS0+eyRJdGVtS2V5fSApIHsKICAgICAgICAgICAgICAgICROZXdWYWx1ZSA9ICRTZWxmLT5fSW52ZXJ0UmVwbGFjZVZhbHVlKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIHRoZSByb290IHZhbHVlCiAgICAgICAgICAgICAgICAkWE1MRGF0YS0+eyRJdGVtS2V5fSA9ICROZXdWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIHZhbHVlIGluIHRoZSByZXN1bHRpbmcgWE1MRGF0YQogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFhNTERhdGEpICYmICRYTUxEYXRhLT57JEl0ZW1LZXl9ICkgewogICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRJdGVtS2V5fSA9ICRYTUxEYXRhLT57JEl0ZW1LZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIHN1YiBhbmQgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgaWYgKCBkZWZpbmVkICREZWZJdGVtLT57U3VifSApIHsKCiAgICAgICAgICAgIGlmICggcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEFycmF5SXRlbSAoIEB7ICRYTUxEYXRhLT57JEl0ZW1LZXl9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uIGZvciBlYWNoIGFycmF5IGl0ZW0KICAgICAgICAgICAgICAgICAgICBteSAkTmV3WE1MRGF0YVBhcnQgPSAkU2VsZi0+SW52ZXJ0UmVwbGFjZVhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZkl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgID0+ICRBcnJheUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCAgICAgPT4gJFBhcmVudCAuICRJdGVtS2V5IC4gIlskQ291bnRlcl0tPiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkTmV3WE1MRGF0YS0+eyRJdGVtS2V5fS0+WyRDb3VudGVyXSA9ICROZXdYTUxEYXRhUGFydDsKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgbXkgJE5ld1hNTERhdGFQYXJ0ID0gJFNlbGYtPkludmVydFJlcGxhY2VYTUxEYXRhKAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZkl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICAgICAgUGFyZW50ICAgICA9PiAkUGFyZW50IC4gJEl0ZW1LZXkgLiAnLT4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICROZXdYTUxEYXRhLT57JEl0ZW1LZXl9ID0gJE5ld1hNTERhdGFQYXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCAkWE1MRGF0YS0+eyRJdGVtS2V5fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzdGFydCByZWN1c3JzaW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJE5ld1hNTERhdGFQYXJ0ID0gJFNlbGYtPkludmVydFJlcGxhY2VYTUxEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICAgICA9PiAkUGFyZW50IC4gJEl0ZW1LZXkgLiAnLT4nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE5ld1hNTERhdGEtPnskSXRlbUtleX0gPSAkTmV3WE1MRGF0YVBhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJE5ld1hNTERhdGE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9DaGFyc2V0TGlzdCgpCgpyZXR1cm5zIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNoYXJzZXRzLgoKICAgIG15ICRDaGFyc2V0TGlzdCA9ICRDb21tb25PYmplY3QtPl9DaGFyc2V0TGlzdCgKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCiAgICByZXR1cm5zCiAgICAkU3VjY2VzcyA9IHsKICAgICAgICAjLi4uCiAgICAgICAgaXNvLTg4NTktMSAgPT4gMSwKICAgICAgICBpc28tODg1OS0xNSA9PiAxLAogICAgICAgIE1hY1JvbWFuICAgID0+IDEsCiAgICAgICAgdXRmOCAgICAgICAgPT4gMSwKICAgICAgICAjLi4uCiAgICB9Cgo9Y3V0CgpzdWIgX0NoYXJzZXRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2hhcnNldCBhcnJheQogICAgdXNlIEVuY29kZTsKICAgIG15IEBDaGFyc2V0TGlzdCA9IEVuY29kZS0+ZW5jb2RpbmdzKCI6YWxsIik7CgogICAgbXkgJUNoYXJzZXRIYXNoOwoKICAgICMgY3JlYXRlIGEgY2hhcnNldCBsb29rdXAgdGFibGUKICAgIGZvciBteSAkQ2hhcnNldCAoQENoYXJzZXRMaXN0KSB7CiAgICAgICAgJENoYXJzZXRIYXNoeyRDaGFyc2V0fSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlQ2hhcnNldEhhc2g7Cn0KCj1pdGVtIF9DaGVja1ZhbHVlKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQuCgogICAgbXkgJFZhbHVlQ2hlY2sgPSAkQ29tbW9uT2JqZWN0LT5fQ2hlY2tWYWx1ZSgKICAgICAgICBWYWx1ZSAgID0+ICRWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgJFZhbHVlIGNvdWxkIGJlIGEgc3RyaW5nLCBhIHRpbWUgc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIG5hbWUsIG9yIGEgaW50ZWdlcgogICAgICAgIElucHV0ICAgPT4gJElucHV0RGVmaW5pdGlvbkhhc2hSZWYsICAgICAgIyBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgZWxlbWVudCBpbnB1dCBleHRyYWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBmcm9tIHRoZSBDb25maWd1cmF0aW9uIEl0ZW0gZGVmaW5pdGlvbiBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBmb3IgZWFjaCB2YWx1ZQogICAgICAgIEl0ZW1LZXkgPT4gJ3NvbWUga2V5JywgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgYXMgc2VudCBpbiB0aGUgU09BUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHJlcXVlc3QKICAgICAgICBQYXJlbnQgID0+ICdzb2VtIHBhcmVudCBrZXktPicsICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBmb2xsb3dlZCBieSAtPiBvciBlbXB0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGZvciByb290IGtleSBpdGVtcwogICAgKTsKCiAgICByZXR1cm5zOgoKICAgICRWYWx1ZUNoZWNrID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LCiAgICB9CgogICAgJFZhbHVlQ2hlY2sgPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NoZWNrVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyZW50ICA9ICRQYXJhbXtQYXJlbnR9OwogICAgbXkgJEl0ZW1LZXkgPSAkUGFyYW17SXRlbUtleX07CgogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte0lucHV0fS0+e1JlcXVpcmVkfSAmJiAkUGFyYW17SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkUGFyYW17VmFsdWV9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgLiAiIGlzIHJlcXVpcmVkIGFuZCBpcyBtaXNzaW5nISIsCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnVGV4dCcgfHwgJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdUZXh0QXJlYScgKSB7CgogICAgICAgICMgcnVuIFRleHQgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dFRleHQoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGV4Y2VkZXMgdGhlIG1heGl1bSBsZW5ndGghIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZScgKSB7CgogICAgICAgICMgcnVuIERhdGUgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dERhdGUoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIERhdGUgZm9ybWF0ISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0RhdGVUaW1lJyApIHsKCiAgICAgICAgIyBydW4gRGF0ZVRpbWUgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dERhdGVUaW1lKCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBEYXRlVGltZSBmb3JtYXQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnQ3VzdG9tZXInICkgewoKICAgICAgICAjIHJ1biBDdXN0b21lciB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0Q3VzdG9tZXIoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIGN1c3RvbWVyISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0N1c3RvbWVyQ29tcGFueScgKSB7CgogICAgICAgICMgcnVuIEN1c3RvbWVyQ29tcGFueSB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0Q3VzdG9tZXJDb21wYW55KCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBjdXN0b21lciBjb21wYW55ISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0ludGVnZXInICkgewoKICAgICAgICAjIHJ1biBJbnRlZ2VyIHZhbGlkYXRpb25zCiAgICAgICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlSW5wdXRJbnRlZ2VyKCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBJbnRlZ2VyIG9yIG91dCBvZiByYW5nZSEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CgogICAgICAgICMgcnVuIEdlbmVyYWwgQ2F0YWxvZyB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0R2VuZXJhbENhdGFsb2coJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIGZvciBHZW5lcmFsIENhdGFsb2cgJyRQYXJhbXtJbnB1dH0tPntDbGFzc30nISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgVGhlIHR5cGUgaXMgZHVtbXksIGRvIG5vdGhpbmcKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH07Cn0KCj1pdGVtIF9SZXBsYWNlVmFsdWUoKQoKcmVwbGFjZSB1c2VyIHZhbHVlcyB3aXRoIHN5c3RlbSByZWFkeSB2YWx1ZXMuCgogICAgbXkgJE5ld1ZhbHVlID0gJENvbW1vbk9iamVjdC0+X1JlcGxhY2VWYWx1ZSgKICAgICAgICBWYWx1ZSAgID0+ICRWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgJFZhbHVlIGNvdWxkIGJlIGEgc3RyaW5nLCBhIHRpbWUgc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIG5hbWUsIG9yIGEgaW50ZWdlcgogICAgICAgIElucHV0ICAgPT4gJElucHV0RGVmaW5pdGlvbkhhc2hSZWYsICAgICAgIyBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgZWxlbWVudCBpbnB1dCBleHRyYWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBmcm9tIHRoZSBDb25maWd1cmF0aW9uIEl0ZW0gZGVmaW5pdGlvbiBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBmb3IgZWFjaCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGZvciByb290IGtleSBpdGVtcwogICAgKTsKCiAgICByZXR1cm5zOgoKICAgICROZXdWYWx1ZSA9ICRBTmV3VmFsdWUKCj1jdXQKCnN1YiBfUmVwbGFjZVZhbHVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGxpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZAogICAgbXkgJVJlcGxhY2VJbnB1dFR5cGVzID0gKAogICAgICAgIERhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgRGF0ZVRpbWUgICAgICAgPT4gMSwKICAgICAgICBHZW5lcmFsQ2F0YWxvZyA9PiAxLAogICAgKTsKICAgIGlmICggISRSZXBsYWNlSW5wdXRUeXBlc3sgJFBhcmFte0lucHV0fS0+e1R5cGV9IH0gKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CgogICAgbXkgJE5ld1ZhbHVlOwoKICAgIGlmICggJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdEYXRlJyApIHsKCiAgICAgICAgIyBydW4gRGF0ZSByZXBsYWNlCiAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPlJlcGxhY2VJbnB1dERhdGUoJVBhcmFtKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdEYXRlVGltZScgKSB7CgogICAgICAgICMgcnVuIERhdGVUaW1lIHJlcGxhY2UKICAgICAgICAkTmV3VmFsdWUgPSAkU2VsZi0+UmVwbGFjZUlucHV0RGF0ZVRpbWUoJVBhcmFtKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgcnVuIEdlbmVyYWwgQ2F0YWxvZyByZXBsYWNlCiAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPlJlcGxhY2VJbnB1dEdlbmVyYWxDYXRhbG9nKCVQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuICROZXdWYWx1ZTsKfQoKPWl0ZW0gX0ludmVydFJlcGxhY2VWYWx1ZSgpCgpyZXBsYWNlIGludGVybmFsIHZhbHVlcyB3aXRoIHVzZXIgdmFsdWVzLgoKICAgIG15ICROZXdWYWx1ZSA9ICRPcGVyYXRpb25PYmplY3QtPl9JbnZlcnRSZXBsYWNlVmFsdWUoCiAgICAgICAgVmFsdWUgICA9PiAkVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAjICRWYWx1ZSBjb3VsZCBiZSBhIHN0cmluZywgYSB0aW1lIHN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGdlbmVyYWwgY2F0YWxvZyBjbGFzcyBuYW1lLCBvciBhIGludGVnZXIKICAgICAgICBJbnB1dCAgID0+ICRJbnB1dERlZmluaXRpb25IYXNoUmVmLCAgICAgICMgVGhlIGRlZmluaXRpb24gb2YgdGhlIGVsZW1lbnQgaW5wdXQgZXh0cmFjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiBJdGVtIGRlZmluaXRpb24gZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZm9yIGVhY2ggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBmb3Igcm9vdCBrZXkgaXRlbXMKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkTmV3VmFsdWUgPSAkQU5ld1ZhbHVlCgo9Y3V0CgpzdWIgX0ludmVydFJlcGxhY2VWYWx1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IHRoZSBsaXN0IG9mIGlucHV0IHR5cGVzIHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQKICAgIG15ICVSZXBsYWNlSW5wdXRUeXBlcyA9ICgKICAgICAgICBEYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIEdlbmVyYWxDYXRhbG9nID0+IDEsCiAgICApOwoKICAgIGlmICggISRSZXBsYWNlSW5wdXRUeXBlc3sgJFBhcmFte0lucHV0fS0+e1R5cGV9IH0gKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CgogICAgbXkgJE5ld1ZhbHVlOwoKICAgIGlmICggJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdEYXRlJyApIHsKCiAgICAgICAgIyBydW4gRGF0ZSByZXBsYWNlCiAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPkludmVydFJlcGxhY2VJbnB1dERhdGUoJVBhcmFtKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgcnVuIEdlbmVyYWwgQ2F0YWxvZyByZXBsYWNlCiAgICAgICAgJE5ld1ZhbHVlID0gJFNlbGYtPkludmVydFJlcGxhY2VJbnB1dEdlbmVyYWxDYXRhbG9nKCVQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuICROZXdWYWx1ZTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29tbW9uCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uCik7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1DcmVhdGUgLSBHZW5lcmljSW50ZXJmYWNlIENvbmZpZ0l0ZW0gQ29uZmlnSXRlbUNyZWF0ZSBPcGVyYXRpb24gYmFja2VuZAoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyggRGVidWdnZXJPYmplY3QgV2Vic2VydmljZUlEICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgJFNlbGYtPntPcGVyYXRpb25OYW1lfSA9ICdDb25maWdJdGVtQ3JlYXRlJzsKCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0dlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbUNyZWF0ZScpOwoKICAgICRTZWxmLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnTm90IERlZmluZWQnOwoKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgY29uZmlnIGl0ZW0gY2xhc3NlcwogICAgJFNlbGYtPntDbGFzc0xpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntDbGFzc0xpc3R9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5FcnJvcigKICAgICAgICAgICAgU3VtbWFyeSA9PiAnRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IGNsYXNzIGxpc3Rpbmcgb2YgSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBpbmNpc3RhdGVzCiAgICAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5FcnJvcigKICAgICAgICAgICAgU3VtbWFyeSA9PiAnRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IGluY2lkZW50IHN0YXRlIGxpc3Rpbmcgb2YnCiAgICAgICAgICAgICAgICAuICcgSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGRlcGxzdGF0ZXMKICAgICRTZWxmLT57RGVwbFN0YXRlTGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntEZXBsU3RhdGVMaXN0fSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0RlYnVnZ2VyT2JqZWN0fS0+RXJyb3IoCiAgICAgICAgICAgIFN1bW1hcnkgPT4gJ0Vycm9yIHdoZW4gdHJ5aW5nIHRvIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0aW5nIG9mJwogICAgICAgICAgICAgICAgLiAnIElUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFsc28gcHJvdmlkZSB0aGUgY2xhc3NsaXN0IGluIHJldmVyc2VkIGZvcm0gZm9yIGVhc2llciByZXZlcnNlIGxvb2t1cHMKICAgIG15ICVSZXZlcnNlQ2xhc3NMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0NsYXNzTGlzdH0gfTsKICAgICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0gPSBcJVJldmVyc2VDbGFzc0xpc3Q7CgogICAgIyBhbHNvIHByb3ZpZGUgdGhlIGluY2lzdGF0ZWxpc3QgaW4gcmV2ZXJzZWQgZm9ybSBmb3IgZWFzaWVyIHJldmVyc2UgbG9va3VwcwogICAgbXkgJVJldmVyc2VJbmNpU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9IH07CiAgICAkU2VsZi0+e1JldmVyc2VJbmNpU3RhdGVMaXN0fSA9IFwlUmV2ZXJzZUluY2lTdGF0ZUxpc3Q7CgogICAgIyBhbHNvIHByb3ZpZGUgdGhlIGRlcGxzdGF0ZWxpc3QgaW4gcmV2ZXJzZWQgZm9ybSBmb3IgZWFzaWVyIHJldmVyc2UgbG9va3VwcwogICAgbXkgJVJldmVyc2VEZXBsU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0RlcGxTdGF0ZUxpc3R9IH07CiAgICAkU2VsZi0+e1JldmVyc2VEZXBsU3RhdGVMaXN0fSA9IFwlUmV2ZXJzZURlcGxTdGF0ZUxpc3Q7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKcGVyZm9ybSBDb25maWdJdGVtQ3JlYXRlIE9wZXJhdGlvbi4gVGhpcyB3aWxsIHJldHVybiB0aGUgY3JlYXRlZCBjb25maWcgaXRlbSBudW1iZXIuCgogICAgbXkgJFJlc3VsdCA9ICRPcGVyYXRpb25PYmplY3QtPlJ1bigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgICAgPT4gJ3NvbWUgYWdlbnQgbG9naW4nLCAgICAgICAgIyBVc2VyTG9naW4gb3IgU2Vzc2lvbklEIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICByZXF1aXJlZAogICAgICAgICAgICBTZXNzaW9uSUQgICAgICAgICA9PiAxMjMsCgogICAgICAgICAgICBQYXNzd29yZCAgPT4gJ3NvbWUgcGFzc3dvcmQnLCAgICAgICAgICAgICAgICAgICAjIGlmIFVzZXJMb2dpbiBpcyBzZW50IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIFBhc3N3b3JkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgID0+ICcxMTEnLCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ0NvbmZpZyBJdGVtIENsYXNzJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGhlIE5hbWUnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgID0+ICdkZXBsb3ltZW50IHN0YXRlJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICA9PiAnaW5jaWRlbnQgc3RhdGUnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgID0+ICRBcnJheUhhc2hSZWYsICAgICAgICAgICAgICAjIGl0IGRlcGVuZHMgb24gdGhlIENvbmZpZ3VyYXRpb24gSXRlbSBjbGFzcyBhbmQgZGVmaW5pdGlvbgoKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ2NvbnRlbnQnICAgICAgICAgICAgIyBiYXNlNjQgZW5jb2RlZAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnc29tZSBjb250ZW50IHR5cGUnCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdzb21lIGZpbmUgbmFtZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgI29yCiAgICAgICAgICAgICAgICAjQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICAjICAgIENvbnRlbnQgICAgID0+ICdjb250ZW50JwogICAgICAgICAgICAgICAgIyAgICBDb250ZW50VHlwZSA9PiAnc29tZSBjb250ZW50IHR5cGUnCiAgICAgICAgICAgICAgICAjICAgIEZpbGVuYW1lICAgID0+ICdzb21lIGZpbmUgbmFtZScKICAgICAgICAgICAgICAgICN9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSAgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdCBkYXRhIHBheWxvYWQgYWZ0ZXIgT3BlcmF0aW9uCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAjIENvbmZpZ3VyYXRpb24gSXRlbSAgSUQgbnVtYmVyIGluIE9UUlM6OklUU00gKFNlcnZpY2UgZGVzayBzeXN0ZW0pCiAgICAgICAgICAgIE51bWJlciAgICAgICA9PiAyMzI0NDU0MzIzMzIyICAgICAgICAgICAjIENvbmZpZ3VyYXRpb24gSXRlbSAgTnVtYmVyIGluIE9UUlM6OklUU00gKFNlcnZpY2UgZGVzayBzeXN0ZW0pCiAgICAgICAgICAgIEVycm9yID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3VsZCBub3QgcmV0dXJuIGVycm9ycwogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5FcnJvckNvZGUnCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBEZXNjcmlwdGlvbicKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkluaXQoCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnV2Vic2VydmljZS5JbnZhbGlkQ29uZmlndXJhdGlvbicsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtEYXRhfS0+e1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte0RhdGF9LT57U2Vzc2lvbklEfQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFVzZXJMb2dpbiBvciBTZXNzaW9uSUQgaXMgcmVxdWlyZWQhIiwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0RhdGF9LT57VXNlckxvZ2lufSApIHsKCiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57UGFzc3dvcmR9ICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFBhc3N3b3JkIG9yIFNlc3Npb25JRCBpcyByZXF1aXJlZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGF1dGhlbnRpY2F0ZSB1c2VyCiAgICBteSAoICRVc2VySUQsICRVc2VyVHlwZSApID0gJFNlbGYtPkF1dGgoJVBhcmFtKTsKCiAgICBpZiAoICEkVXNlcklEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5BdXRoRmFpbCIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogVXNlciBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgaGFzaGVzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbSkpIHsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiAkTmVlZGVkIHBhcmFtZXRlciBpcyBtaXNzaW5nIG9yIG5vdCB2YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlzb2xhdGUgY29uZmlnIGl0ZW0gcGFyYW1ldGVyCiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19OwoKICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcwogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXskQ29uZmlnSXRlbX0gKSB7CiAgICAgICAgaWYgKCByZWYgJEF0dHJpYnV0ZSBuZSAnSEFTSCcgJiYgcmVmICRBdHRyaWJ1dGUgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPnskQXR0cmlidXRlfSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgI3JlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPnskQXR0cmlidXRlfSA9fiBze1xzK1x6fXt9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX0gKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhIGlzIG1pc3Npbmcgb3IgaW52YWxpZCEiLAogICAgICAgICk7CiAgICB9CgogICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGZvciBDSVhNTERhdGEKICAgICRTZWxmLT5fQ2xlYW5YTUxEYXRhKCBYTUxEYXRhID0+ICRDb25maWdJdGVtLT57Q0lYTUxEYXRhfSApOwoKICAgICMgY2hlY2sgQ29uZmlnSXRlbSBhdHRyaWJ1dGUgdmFsdWVzCiAgICBteSAkQ29uZmlnSXRlbUNoZWNrID0gJFNlbGYtPl9DaGVja0NvbmZpZ0l0ZW0oIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0gKTsKCiAgICBpZiAoICEkQ29uZmlnSXRlbUNoZWNrLT57U3VjY2Vzc30gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvciggJXskQ29uZmlnSXRlbUNoZWNrfSApOwogICAgfQoKICAgICMgY2hlY2sgY3JlYXRlIHBlcm1pc3Npb25zCiAgICBteSAkUGVybWlzc2lvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5QZXJtaXNzaW9uKAogICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICBDbGFzc0lEID0+ICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSwKICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICk7CgogICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkFjY2Vzc0RlbmllZCIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ2FuIG5vdCBjcmVhdGUgY29uZmlndXJhdGlvbiBpdGVtcyEiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEF0dGFjaG1lbnQ7CiAgICBteSBAQXR0YWNobWVudExpc3Q7CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH0gKSB7CgogICAgICAgICMgaXNvbGF0ZSBBdHRhY2htZW50IHBhcmFtZXRlcgogICAgICAgICRBdHRhY2htZW50ID0gZGVsZXRlICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH07CgogICAgICAgICMgaG9tb2xvZ2F0ZSBpbXB1dCB0byBhcnJheQogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnQpICkgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50TGlzdCwgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCRBdHRhY2htZW50KSApIHsKICAgICAgICAgICAgQEF0dGFjaG1lbnRMaXN0ID0gQHskQXR0YWNobWVudH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkF0dGFjaG1lbnQgcGFyYW1ldGVyIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgQXR0YWNobWVudCBpbnRlcm5hbCBzdHJ1Y3R1cmUKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJdGVtIChAQXR0YWNobWVudExpc3QpIHsKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnRJdGVtKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+QXR0YWNobWVudCBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICV7JEF0dGFjaG1lbnRJdGVtfSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICRBdHRyaWJ1dGUgbmUgJ0hBU0gnICYmIHJlZiAkQXR0cmlidXRlIG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudEl0ZW0tPnskQXR0cmlidXRlfSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50SXRlbS0+eyRBdHRyaWJ1dGV9ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgQXR0YWNobWVudCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50Q2hlY2sgPSAkU2VsZi0+X0NoZWNrQXR0YWNobWVudCggQXR0YWNobWVudCA9PiAkQXR0YWNobWVudEl0ZW0gKTsKCiAgICAgICAgICAgIGlmICggISRBdHRhY2htZW50Q2hlY2stPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoICV7JEF0dGFjaG1lbnRDaGVja30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9Db25maWdJdGVtQ3JlYXRlKAogICAgICAgIENvbmZpZ0l0ZW0gICAgID0+ICRDb25maWdJdGVtLAogICAgICAgIEF0dGFjaG1lbnRMaXN0ID0+IFxAQXR0YWNobWVudExpc3QsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9DbGVhblhNTERhdGEoKQoKcmVtb3ZlZCB0cmFpbGluZyBhbmQgbGVhZGluZyB3aGl0ZSBzcGFjZXMgaW4gdGhlIFhNTERhdGEuCgogICAgbXkgJFhNTERhdGFDbGVhbiA9ICRPcGVyYXRpb25PYmplY3QtPl9DbGVhblhNTERhdGEoCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkFycmF5UmVmLCAgICAgICAgICAjIENvbmZpZyBJdGVtIERlZmluaXRpb24gb3QganVzdCBwYXJ0IG9mIGl0CiAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YUhhc2hSZWYsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJFhNTERhdGFDbGVhbiA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcnl0aGluZyBpcyBPSwogICAgfQoKICAgICRYTUxEYXRhQ2xlYW4gPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NsZWFuWE1MRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRYTUxEYXRhID0gJFBhcmFte1hNTERhdGF9OwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFhNTERhdGF9ICkgewogICAgICAgIGlmICggcmVmICRYTUxEYXRhLT57JEtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFhNTERhdGEtPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEVsZW1lbnQgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5fQ2xlYW5YTUxEYXRhKCBYTUxEYXRhID0+ICRFbGVtZW50ICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEVsZW1lbnQgZXEgJycgKSB7CgogICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAkU2VsZi0+X0NsZWFuWE1MRGF0YSggWE1MRGF0YSA9PiAkWE1MRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIG5leHQgS0VZOwoKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnJyApIHsKCiAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgJFhNTERhdGEtPnskS2V5fSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgI3JlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJFhNTERhdGEtPnskS2V5fSA9fiBze1xzK1x6fXt9OwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gX0NoZWNrQ29uZmlnSXRlbSgpCgpjaGVja3MgaWYgdGhlIGdpdmVuIGNvbmZpZyBpdGVtIHBhcmFtZXRlcnMgYXJlIHZhbGlkLgoKICAgIG15ICRDb25maWdJdGVtQ2hlY2sgPSAkT3BlcmF0aW9uT2JqZWN0LT5fQ2hlY2tDb25maWdJdGVtKAogICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sICAgICAgICAgICAgICAgICAgIyBhbGwgY29uZmlnIGl0ZW0gcGFyYW1ldGVycwogICAgKTsKCiAgICByZXR1cm5zOgoKICAgICRDb25maWdJdGVtQ2hlY2sgPSB7CiAgICAgICAgU3VjY2VzcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGV2ZXJ5dGhpbmcgaXMgT0sKICAgIH0KCiAgICAkQ29uZmlnSXRlbUNoZWNrID0gewogICAgICAgIEVycm9yQ29kZSAgICA9PiAnRnVuY3Rpb24uRXJyb3InLCAgICAgICAgICAgIyBpZiBlcnJvcgogICAgICAgIEVycm9yTWVzc2FnZSA9PiAnRXJyb3IgZGVzY3JpcHRpb24nLAogICAgfQoKPWN1dAoKc3ViIF9DaGVja0NvbmZpZ0l0ZW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtDb25maWdJdGVtfTsKCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtIGludGVybmFsbHkKICAgIGZvciBteSAkTmVlZGVkIChxdyhDbGFzcyBOYW1lIERlcGxTdGF0ZSBJbmNpU3RhdGUgQ0lYTUxEYXRhKSkgewogICAgICAgIGlmICggISRDb25maWdJdGVtLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPiROZWVkZWQgcGFyYW1ldGVyIGlzIG1pc3NpbmchIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBDb25maWdJdGVtLT5DbGFzcwogICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlQ2xhc3MoICV7JENvbmZpZ0l0ZW19ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DbGFzcyBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBDb25maWdJdGVtLT5EZXBsU3RhdGUKICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZURlcGxTdGF0ZSggJXskQ29uZmlnSXRlbX0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkRlcGxTdGF0ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBDb25maWdJdGVtLT5EZXBsU3RhdGUKICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUluY2lTdGF0ZSggJXskQ29uZmlnSXRlbX0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkluY2lTdGF0ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgIH07CiAgICB9CgogICAgIyBnZXQgbGFzdCBjb25maWcgaXRlbSBkZWZpbnRpb24KICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgKTsKCiAgICBteSAkWE1MRGF0YUNoZWNrUmVzdWx0ID0gJFNlbGYtPkNoZWNrWE1MRGF0YSgKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIFhNTERhdGEgICAgPT4gJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9LAogICAgKTsKCiAgICBpZiAoICEkWE1MRGF0YUNoZWNrUmVzdWx0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgcmV0dXJuICRYTUxEYXRhQ2hlY2tSZXN1bHQ7CiAgICB9CgogICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LIHRoZW4gcmV0dXJuIFN1Y2Nlc3MKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfTsKfQoKPWl0ZW0gX0NoZWNrQXR0YWNobWVudCgpCgpjaGVja3MgaWYgdGhlIGdpdmVuIGF0dGFjaG1lbnQgcGFyYW1ldGVyIGlzIHZhbGlkLgoKICAgIG15ICRBdHRhY2htZW50Q2hlY2sgPSAkT3BlcmF0aW9uT2JqZWN0LT5fQ2hlY2tBdHRhY2htZW50KAogICAgICAgIEF0dGFjaG1lbnQgPT4gJEF0dGFjaG1lbnQsICAgICAgICAgICAgICAgICAgIyBhbGwgYXR0YWNobWVudCBwYXJhbWV0ZXJzCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJEF0dGFjaG1lbnRDaGVjayA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcmV0aGluZyBpcyBPSwogICAgfQoKICAgICRBdHRhY2htZW50Q2hlY2sgPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NoZWNrQXR0YWNobWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBdHRhY2htZW50ID0gJFBhcmFte0F0dGFjaG1lbnR9OwoKICAgICMgY2hlY2sgYXR0YWNobWVudCBpdGVtIGludGVybmFsbHkKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb250ZW50IENvbnRlbnRUeXBlIEZpbGVuYW1lKSkgewogICAgICAgIGlmICggISRBdHRhY2htZW50LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQXR0YWNobWVudC0+JE5lZWRlZCAgcGFyYW1ldGVyIGlzIG1pc3NpbmchIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBBcnRpY2xlLT5Db250ZW50VHlwZQogICAgaWYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSApIHsKCiAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPSBsYyAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgIyBjaGVjayBDaGFyc2V0IHBhcnQKICAgICAgICBteSAkQ2hhcnNldCA9ICcnOwogICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2NoYXJzZXQ9L2kgKSB7CiAgICAgICAgICAgICRDaGFyc2V0ID0gJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX07CiAgICAgICAgICAgICRDaGFyc2V0ID1+IHMvLis/Y2hhcnNldD0oInwnfCkoXHcrKS8kMi9naTsKICAgICAgICAgICAgJENoYXJzZXQgPX4gcy8ifCcvL2c7CiAgICAgICAgICAgICRDaGFyc2V0ID1+IHMvKC4rPyk7LiovJDEvZzsKICAgICAgICB9CgogICAgICAgIGlmICggJENoYXJzZXQgJiYgISRTZWxmLT5WYWxpZGF0ZUNoYXJzZXQoIENoYXJzZXQgPT4gJENoYXJzZXQgKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdHRhY2htZW50LT5Db250ZW50VHlwZSBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIE1pbWVUeXBlIHBhcnQKICAgICAgICBteSAkTWltZVR5cGUgPSAnJzsKICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9eKFx3K1wvXHcrKS9pICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAkMTsKICAgICAgICAgICAgJE1pbWVUeXBlID1+IHMvInwnLy9nOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlTWltZVR5cGUoIE1pbWVUeXBlID0+ICRNaW1lVHlwZSApICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdHRhY2htZW50LT5Db250ZW50VHlwZSBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgZXZlcnl0aGluZyBpcyBPSyB0aGVuIHJldHVybiBTdWNjZXNzCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH07Cn0KCj1pdGVtIF9Db25maWdJdGVtQ3JlYXRlKCkKCmNyZWF0ZXMgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhdHRhY2htZW50cyBpZiBzcGVjaWZpZWQuCgogICAgbXkgJFJlc3BvbnNlID0gJE9wZXJhdGlvbk9iamVjdC0+X0NvbmZpZ0l0ZW1DcmVhdGUoCiAgICAgICAgQ29uZmlnSXRlbSAgICAgPT4gJENvbmZpZ0l0ZW0sICAgICAgICAgICAgICMgYWxsIGNvbmZpZ3VyYXRpb24gaXRlbSBwYXJhbWV0ZXJzCiAgICAgICAgQXR0YWNobWVudExpc3QgPT4gJEF0dGFjaG1lbnQsICAgICAgICAgICAgICMgYSBsaXN0IG9mIGFsbCBhdHRhY2htZW50cwogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEyMywKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkUmVzcG9uc2UgPSB7CiAgICAgICAgU3VjY2VzcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGV2ZXJldGhpbmcgaXMgT0sKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAnQ04xMjMnLAogICAgICAgIH0KICAgIH0KCiAgICAkUmVzcG9uc2UgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdW5leHBlY3RlZCBlcnJvcgogICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFBhcmFte0Vycm9yQ29kZX06ICRQYXJhbXtFcnJvck1lc3NhZ2V9IiwKICAgIH0KCj1jdXQKCnN1YiBfQ29uZmlnSXRlbUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdJdGVtICAgICA9ICRQYXJhbXtDb25maWdJdGVtfTsKICAgIG15ICRBdHRhY2htZW50TGlzdCA9ICRQYXJhbXtBdHRhY2htZW50TGlzdH07CgogICAgbXkgJERlcGxTdGF0ZUlEID0gJFNlbGYtPntSZXZlcnNlRGVwbFN0YXRlTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGV9IH07CiAgICBteSAkSW5jaVN0YXRlSUQgPSAkU2VsZi0+e1JldmVyc2VJbmNpU3RhdGVMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0luY2lTdGF0ZX0gfTsKCiAgICBteSAkUmF3WE1MRGF0YSA9ICRDb25maWdJdGVtLT57Q0lYTUxEYXRhfTsKCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgZ2V0IGxhc3QgY29uZmlnIGl0ZW0gZGVmaW50aW9uCiAgICBteSAkRGVmaW5pdGlvbkRhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSwKICAgICk7CgogICAgIyByZXBsYWNlIGRhdGUsIGRhdGUgdGltZSwgY3VzdG9tZXIsIGNvbXBhbnkgYW5kIGdlbmVyYWwgY2F0YWxvZyB2YWx1ZXMKICAgIG15ICRSZXBsYWNlZFhNTERhdGEgPSAkU2VsZi0+UmVwbGFjZVhNTERhdGEoCiAgICAgICAgWE1MRGF0YSAgICA9PiAkUmF3WE1MRGF0YSwKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBhbiBYTUxEYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgVmVyc2lvbkFkZAogICAgbXkgJFhNTERhdGEgPSAkU2VsZi0+Rm9ybWF0WE1MRGF0YSgKICAgICAgICBYTUxEYXRhID0+ICRSZXBsYWNlZFhNTERhdGEsCiAgICApOwoKICAgICMgY3JlYXRlIG5ldyBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9LAogICAgICAgIENsYXNzSUQgPT4gJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW0tPntOYW1lfSwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvbklEfSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUlELAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlSUQsCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRYTUxEYXRhLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCAmJiAhJFZlcnNpb25JRCApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb25maWd1cmF0aW9uIEl0ZW0gY291bGQgbm90IGJlIGNyZWF0ZWQsIHBsZWFzZSBjb250YWN0IHRoZSBzeXN0ZW0nCiAgICAgICAgICAgICAgICAuICdhZG1pbmlzdHJhdG9yJywKICAgICAgICB9OwogICAgfQoKICAgICMgc2V0IGF0dGFjaG1lbnRzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkQXR0YWNobWVudExpc3QpICkgewoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyRBdHRhY2htZW50TGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+Q3JlYXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgICA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgbXkgJEVycm9yTWVzc2FnZSA9CiAgICAgICAgICAgICAgICAgICAgJFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgIkF0dGFjaG1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQsIHBsZWFzZSBjb250YWN0IgogICAgICAgICAgICAgICAgICAgIC4gIiB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IiOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRFcnJvck1lc3NhZ2UsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IENvbmZpZ0l0ZW0gZGF0YQogICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRDb25maWdJdGVtRGF0YSkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAnQ291bGQgbm90IGdldCBuZXcgY29uZmlndXJhdGlvbiBpdGVtIGluZm9ybWF0aW9uLCBwbGVhc2UgY29udGFjdCB0aGUnCiAgICAgICAgICAgICAgICAuICcgc3lzdGVtIGFkbWluaXN0cmF0b3InLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgRGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBOdW1iZXIgICAgICAgPT4gJENvbmZpZ0l0ZW1EYXRhLT57TnVtYmVyfSwKICAgICAgICB9LAogICAgfTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29tbW9uCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uCik7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1EZWxldGUgLSBHZW5lcmljSW50ZXJmYWNlIENvbmZpZ3VyYXRpb24gSXRlbSBEZWxldGUgT3BlcmF0aW9uIGJhY2tlbmQKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgp1c3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbi0+bmV3KCk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGVidWdnZXJPYmplY3QgV2Vic2VydmljZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICJHb3Qgbm8gJE5lZWRlZCEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICAkU2VsZi0+e09wZXJhdGlvbk5hbWV9ID0gJ0NvbmZpZ0l0ZW1EZWxldGUnOwoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtRGVsZXRlJyk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKcGVyZm9ybSBDb25maWdJdGVtRGVsZXRlIE9wZXJhdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBhYmxlIHRvIHJldHVybgpvbmUgb3IgbW9yZSBDb25maWdJdGVtIGVudHJpZXMgaW4gb25lIGNhbGwuCgogICAgbXkgJFJlc3VsdCA9ICRPcGVyYXRpb25PYmplY3QtPlJ1bigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgICAgPT4gJ3NvbWUgYWdlbnQgbG9naW4nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZXJMb2dpbiBvciBDdXN0b21lclVzZXJMb2dpbiBvciBTZXNzaW9uSUQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgcmVxdWlyZWQKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJ3NvbWUgY3VzdG9tZXIgbG9naW4nLAogICAgICAgICAgICBTZXNzaW9uSUQgICAgICAgICA9PiAxMjMsCgogICAgICAgICAgICBQYXNzd29yZCAgICAgICAgICA9PiAnc29tZSBwYXNzd29yZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgVXNlckxvZ2luIG9yIGN1c3RvbWVyVXNlckxvZ2luIGlzIHNlbnQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBQYXNzd29yZCBpcyByZXF1aXJlZAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICA9PiAnMzIsMzMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQsIGNvdWxkIGJlIGNvbWEgc2VwYXJhdGVkIElEcyBvciBhbiBBcnJheQogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSAgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdCBkYXRhIHBheWxvYWQgYWZ0ZXIgT3BlcmF0aW9uCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiBbMTIzLCA0NTZdLCAgICAgICAgICMgQ29uZmlndXJhdGlvbiBJdGVtIElEcyBudW1iZXIgaW4gT1RSUzo6SVRTTSAoU2VydmljZSBkZXNrIHN5c3RlbSkKICAgICAgICAgICAgRXJyb3IgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICdDb25maWdJdGVtRGVsZXRlLkVycm9yQ29kZScKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIERlc2NyaXB0aW9uJwogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9OwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+SW5pdCgKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgKTsKCiAgICBpZiAoICEkUmVzdWx0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gJ1dlYnNlcnZpY2UuSW52YWxpZENvbmZpZ3VyYXRpb24nLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAoICRVc2VySUQsICRVc2VyVHlwZSApID0gJFNlbGYtPkF1dGgoCiAgICAgICAgJVBhcmFtCiAgICApOwoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICckU2VsZi0+e09wZXJhdGlvbk5hbWV9LkF1dGhGYWlsJywKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdXRob3JpemF0aW9uIGZhaWxpbmchIiwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiAkTmVlZGVkIHBhcmFtZXRlciBpcyBtaXNzaW5nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgbXkgJEVycm9yTWVzc2FnZSA9ICcnOwoKICAgICMgYWxsIG5lZWRlZCB2YXJpYWJsZXMKICAgIG15IEBDb25maWdJdGVtSURzOwogICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntDb25maWdJdGVtSUR9ICkgKSB7CiAgICAgICAgQENvbmZpZ0l0ZW1JRHMgPSBzcGxpdCAvXHMqLFxzKi8sICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW1JRH07CiAgICB9CiAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Q29uZmlnSXRlbUlEfSApICkgewogICAgICAgIEBDb25maWdJdGVtSURzID0gQHsgJFBhcmFte0RhdGF9LT57Q29uZmlnSXRlbUlEfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lldyb25nU3RydWN0dXJlIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBTdHJ1Y3R1cmUgZm9yIENvbmZpZ0l0ZW1JRCBpcyBub3QgY29ycmVjdCEiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICBteSBARGVsZXRlZENvbmZpZ0l0ZW1JRHM7CgogICAgIyBzdGFydCBDb25maWdJdGVtIGxvb3AKICAgIENPTkZJR0lURU06CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBjaGVjayBjcmVhdGUgcGVybWlzc2lvbnMKICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkUGVybWlzc2lvbiApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5BY2Nlc3NEZW5pZWQiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDYW4gbm90IGRlbGV0ZSBjb25maWd1cmF0aW9uIGl0ZW0hIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRoZSBjb25maWdpdGVtCiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgIGlmICggISREZWxldGVTdWNjZXNzICkgewoKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICdDb3VsZCBub3QgZGVsZXRlIENvbmZpZ0l0ZW0gSUQgJyAuICRDb25maWdJdGVtSUQKICAgICAgICAgICAgICAgIC4gJyBpbiBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbURlbGV0ZTo6UnVuKCknOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnJFNlbGYtPntPcGVyYXRpb25OYW1lfS5EZWxldGVFcnJvcicsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICRFcnJvck1lc3NhZ2UiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBARGVsZXRlZENvbmZpZ0l0ZW1JRHMsICRDb25maWdJdGVtSUQ7CgogICAgfSAgICAjIGZpbmlzaCBDb25maWdJdGVtIGxvb3AKCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxARGVsZXRlZENvbmZpZ0l0ZW1JRHMgKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgZGVsZXRlIENvbmZpZ0l0ZW1zIScsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBEYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IFxARGVsZXRlZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgfSwKICAgIH07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtR2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29tbW9uCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uCik7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1HZXQgLSBHZW5lcmljSW50ZXJmYWNlIENvbmZpZ3VyYXRpb24gSXRlbSBHZXQgT3BlcmF0aW9uIGJhY2tlbmQKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgp1c3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbi0+bmV3KCk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIERlYnVnZ2VyT2JqZWN0IFdlYnNlcnZpY2VJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICRTZWxmLT57T3BlcmF0aW9uTmFtZX0gPSAnQ29uZmlnSXRlbUdldCc7CgogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW1HZXQnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpwZXJmb3JtIENvbmZpZ0l0ZW1HZXQgT3BlcmF0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGFibGUgdG8gcmV0dXJuCm9uZSBvciBtb3JlIENvbmZpZ0l0ZW0gZW50cmllcyBpbiBvbmUgY2FsbC4KCiAgICBteSAkUmVzdWx0ID0gJE9wZXJhdGlvbk9iamVjdC0+UnVuKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gICAgICAgICA9PiAnc29tZSBhZ2VudCBsb2dpbicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIG9yIFNlc3Npb25JRCBpcwogICAgICAgICAgICBTZXNzaW9uSUQgICAgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICByZXF1aXJlZAogICAgICAgICAgICBQYXNzd29yZCAgICAgICAgICA9PiAnc29tZSBwYXNzd29yZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgVXNlckxvZ2luIGlzIHNlbnQgdGhlbiBQYXNzd29yZCBpcyByZXF1aXJlZAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICA9PiAnMzIsMzMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQsIGNvdWxkIGJlIGNvbWEgc2VwYXJhdGVkIElEcyBvciBhbiBBcnJheQogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwsIDEgYXMgZGVmYXVsdC4gSWYgaXQncyBzZXQgd2l0aCB0aGUgdmFsdWUgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGF0dGFjaG1lbnRzIGZvciBhcnRpY2xlcyB3aWxsIGJlIGluY2x1ZGVkIG9uIENvbmZpZ0l0ZW0gZGF0YQogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIG9mIGFuIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgICA9PiAnMjAxMDEwMjcwMDAwMDEnLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICA9PiAxMjMsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdzb21lIG5hbWUnLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICA9PiAnc29tZSBjbGFzcycsCiAgICAgICAgICAgICAgICAgICAgVmVyc2lvbklEICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgICAgPT4gMTIzLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgICA9PiAxMjMsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgID0+ICdzb21lIGluY2lkZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgICAgPT4gJ3NvbWUgaW5jaWRlbnQgc3RhdGUgdHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgID0+ICdzb21lIGRlcGxveW1lbnQgc3RhdGUnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgICA9PiAnc29tZSBkZXBsb3ltZW50IHN0YXRlIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgICA9PiAnc29tZSBpbmNpZGVudCBzdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSAgID0+ICdzb21lIGluY2lkZW50IHN0YXRlIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgICA9PiAnc29tZSBkZXBsb3ltZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlICAgPT4gJ3NvbWUgZGVwbG95bWVudCBzdGF0ZSB0eXBlJywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgPT4gJzIwMTAtMTAtMjcgMjA6MTU6MDAnCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgICAgICBDSVhNTERhdGEgICAgICAgICAgPT4gJFhNTERhdGFIYXNoUmVmLAoKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgID0+ICJ4eHh4IiwgICAgICMgYWN0dWFsIGF0dGFjaG1lbnQgY29udGVudHMsIGJhc2U2NCBlbmNvbmRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgICAgID0+ICJTdGRBdHRhY2htZW50LVRlc3QxLnBkZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc2l6ZSAgICAgICAgICAgPT4gIjQuNiBLQnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMgICAgICAgID0+ICRQcmVmZXJlbmNlc0hhc2hSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuIC4gLgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICMgLiAuIC4KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH07Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5Jbml0KAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICApOwoKICAgIGlmICggISRSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnV2Vic2VydmljZS5JbnZhbGlkQ29uZmlndXJhdGlvbicsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICggJFVzZXJJRCwgJFVzZXJUeXBlICkgPSAkU2VsZi0+QXV0aCgKICAgICAgICAlUGFyYW0KICAgICk7CgogICAgaWYgKCAhJFVzZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gJyRTZWxmLT57T3BlcmF0aW9uTmFtZX0uQXV0aEZhaWwnLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IEF1dGhvcml6YXRpb24gZmFpbGluZyEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICROZWVkZWQgcGFyYW1ldGVyIGlzIG1pc3NpbmchIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBteSAkRXJyb3JNZXNzYWdlID0gJyc7CgogICAgIyBhbGwgbmVlZGVkIHZhcmlhYmxlcwogICAgbXkgQENvbmZpZ0l0ZW1JRHM7CiAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0gKSApIHsKICAgICAgICBAQ29uZmlnSXRlbUlEcyA9IHNwbGl0KCAvLC8sICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0gKTsKICAgIH0KICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntDb25maWdJdGVtSUR9ICkgKSB7CiAgICAgICAgQENvbmZpZ0l0ZW1JRHMgPSBAeyAkUGFyYW17RGF0YX0tPntDb25maWdJdGVtSUR9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uV3JvbmdTdHJ1Y3R1cmUiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFN0cnVjdHVyZSBmb3IgQ29uZmlnSXRlbUlEIGlzIG5vdCBjb3JyZWN0ISIsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRBdHRhY2htZW50cyA9ICRQYXJhbXtEYXRhfS0+e0F0dGFjaG1lbnRzfSB8fCAwOwogICAgbXkgJFJldHVybkRhdGEgID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH07CgogICAgbXkgQEl0ZW07CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIHN0YXJ0IENvbmZpZ0l0ZW0gbG9vcAogICAgQ09ORklHSVRFTToKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlEcykgewoKICAgICAgICAjIGNoZWNrIGNyZWF0ZSBwZXJtaXNzaW9ucwogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgIGlmICggISRQZXJtaXNzaW9uICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkFjY2Vzc0RlbmllZCIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENhbiBub3QgZ2V0IGNvbmZpZ3VyYXRpb24gaXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIENvbmZpZ0l0ZW0gZW50cnkKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbGF0ZXN0IHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZlcnNpb24pICkgewoKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICdDb3VsZCBub3QgZ2V0IENvbmZpZ0l0ZW0gZGF0YScKICAgICAgICAgICAgICAgIC4gJyBpbiBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbUdldDo6UnVuKCknOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogJEVycm9yTWVzc2FnZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSB1bm5lZWRlZCBpdGVtcwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0NsYXNzSUR9OwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICAgICBkZWxldGUgJFZlcnNpb24tPntDdXJJbmNpU3RhdGVJRH07CiAgICAgICAgZGVsZXRlICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9OwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKICAgICAgICBkZWxldGUgJFZlcnNpb24tPntYTUxEZWZpbml0aW9uSUR9OwoKICAgICAgICBteSAkRGVmaW5pdGlvbiA9IGRlbGV0ZSAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259OwoKICAgICAgICBteSAkRm9ybWF0ZWRYTUxEYXRhID0gJFNlbGYtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgIFhNTERhdGEgPT4gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlcGxhY2VkWE1MRGF0YSA9ICRTZWxmLT5JbnZlcnRSZXBsYWNlWE1MRGF0YSgKICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkRm9ybWF0ZWRYTUxEYXRhLAogICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57WE1MRGF0YX0gPSAkUmVwbGFjZWRYTUxEYXRhOwoKICAgICAgICAjIHJlbmFtZSBYTUxEYXRhIHNpbmNlIFNPQVAgdHJhbnNwb3J0IGNvbXBsYWlucyBhYm91dCBYTUwgcHJlZml4IG9uIG5hbWVzCiAgICAgICAgJFZlcnNpb24tPntDSVhNTERhdGF9ID0gZGVsZXRlICRWZXJzaW9uLT57WE1MRGF0YX07CgogICAgICAgICMgc2V0IENvbmZpZ0l0ZW0gZW50cnkgZGF0YQogICAgICAgIG15ICRDb25maWdJdGVtQnVuZGxlID0gJFZlcnNpb247CgogICAgICAgIGlmICgkQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGV0YWlsczsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkRmlsZW5hbWU7CgogICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBuZXh0IGlmIG5vdCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBdHRhY2htZW50KTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBiYXNlNjQKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCAkQXR0YWNobWVudC0+e0NvbnRlbnR9ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50RGV0YWlscywgJEF0dGFjaG1lbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IENvbmZpZ0l0ZW0gZW50cnkgZGF0YQogICAgICAgICAgICAkQ29uZmlnSXRlbUJ1bmRsZS0+e0F0dGFjaG1lbnR9ID0gJyc7CiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEF0dGFjaG1lbnREZXRhaWxzICkgKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUJ1bmRsZS0+e0F0dGFjaG1lbnR9ID0gXEBBdHRhY2htZW50RGV0YWlsczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQKICAgICAgICBwdXNoIEBJdGVtLCAkQ29uZmlnSXRlbUJ1bmRsZTsKCiAgICB9ICAgICMgZmluaXNoIENvbmZpZ0l0ZW0gbG9vcAoKICAgIGlmICggIXNjYWxhciBASXRlbSApIHsKICAgICAgICAkRXJyb3JNZXNzYWdlID0gJ0NvdWxkIG5vdCBnZXQgQ29uZmlnSXRlbSBkYXRhJwogICAgICAgICAgICAuICcgaW4gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1HZXQ6OlJ1bigpJzsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICckU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk5vQ29uZmlnSXRlbURhdGEnLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICRFcnJvck1lc3NhZ2UiLAogICAgICAgICk7CgogICAgfQoKICAgICMgc2V0IENvbmZpZ0l0ZW0gZGF0YSBpbnRvIHJldHVybiBzdHJ1Y3R1cmUKICAgICRSZXR1cm5EYXRhLT57RGF0YX0tPntDb25maWdJdGVtfSA9ICcnOwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxASXRlbSApICkgewogICAgICAgICRSZXR1cm5EYXRhLT57RGF0YX0tPntDb25maWdJdGVtfSA9IFxASXRlbTsKICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQKICAgIHJldHVybiAkUmV0dXJuRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29tbW9uCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uCik7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1TZWFyY2ggLSBHZW5lcmljSW50ZXJmYWNlIENvbmZpZ0l0ZW0gQ29uZmlnSXRlbVNlYXJjaCBPcGVyYXRpb24gYmFja2VuZAoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyggRGVidWdnZXJPYmplY3QgV2Vic2VydmljZUlEICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgJFNlbGYtPntPcGVyYXRpb25OYW1lfSA9ICdDb25maWdJdGVtU2VhcmNoJzsKCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0dlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbVNlYXJjaCcpOwoKICAgICRTZWxmLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnTm90IERlZmluZWQnOwoKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgY29uZmlnIGl0ZW0gY2xhc3NlcwogICAgJFNlbGYtPntDbGFzc0xpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntDbGFzc0xpc3R9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5FcnJvcigKICAgICAgICAgICAgU3VtbWFyeSA9PiAnRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IGNsYXNzIGxpc3Rpbmcgb2YgSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBpbmNpc3RhdGVzCiAgICAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5FcnJvcigKICAgICAgICAgICAgU3VtbWFyeSA9PiAnRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IGluY2lkZW50IHN0YXRlIGxpc3Rpbmcgb2YnCiAgICAgICAgICAgICAgICAuICcgSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGRlcGxzdGF0ZXMKICAgICRTZWxmLT57RGVwbFN0YXRlTGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntEZXBsU3RhdGVMaXN0fSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0RlYnVnZ2VyT2JqZWN0fS0+RXJyb3IoCiAgICAgICAgICAgIFN1bW1hcnkgPT4gJ0Vycm9yIHdoZW4gdHJ5aW5nIHRvIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0aW5nIG9mJwogICAgICAgICAgICAgICAgLiAnIElUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFsc28gcHJvdmlkZSB0aGUgY2xhc3NsaXN0IGluIHJldmVyc2VkIGZvcm0gZm9yIGVhc2llciByZXZlcnNlIGxvb2t1cHMKICAgIG15ICVSZXZlcnNlQ2xhc3NMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0NsYXNzTGlzdH0gfTsKICAgICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0gPSBcJVJldmVyc2VDbGFzc0xpc3Q7CgogICAgIyBhbHNvIHByb3ZpZGUgdGhlIGluY2lzdGF0ZWxpc3QgaW4gcmV2ZXJzZWQgZm9ybSBmb3IgZWFzaWVyIHJldmVyc2UgbG9va3VwcwogICAgbXkgJVJldmVyc2VJbmNpU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0luY2lTdGF0ZUxpc3R9IH07CiAgICAkU2VsZi0+e1JldmVyc2VJbmNpU3RhdGVMaXN0fSA9IFwlUmV2ZXJzZUluY2lTdGF0ZUxpc3Q7CgogICAgIyBhbHNvIHByb3ZpZGUgdGhlIGRlcGxzdGF0ZWxpc3QgaW4gcmV2ZXJzZWQgZm9ybSBmb3IgZWFzaWVyIHJldmVyc2UgbG9va3VwcwogICAgbXkgJVJldmVyc2VEZXBsU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyAkU2VsZi0+e0RlcGxTdGF0ZUxpc3R9IH07CiAgICAkU2VsZi0+e1JldmVyc2VEZXBsU3RhdGVMaXN0fSA9IFwlUmV2ZXJzZURlcGxTdGF0ZUxpc3Q7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKcGVyZm9ybSBDb25maWdJdGVtQ3JlYXRlIE9wZXJhdGlvbi4gVGhpcyB3aWxsIHJldHVybiB0aGUgY3JlYXRlZCBjb25maWcgaXRlbSBudW1iZXIuCgogICAgbXkgJFJlc3VsdCA9ICRPcGVyYXRpb25PYmplY3QtPlJ1bigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgICAgPT4gJ3NvbWUgYWdlbnQgbG9naW4nLCAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIG9yIFNlc3Npb25JRCBpcwogICAgICAgICAgICBTZXNzaW9uSUQgICAgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHJlcXVpcmVkCgoKICAgICAgICAgICAgUGFzc3dvcmQgID0+ICdzb21lIHBhc3N3b3JkJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgVXNlckxvZ2luIGlzIHNlbnQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIFBhc3N3b3JkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdUaGUgQ29uZmlnSXRlbSBDbGFzcycsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgPT4gJ1RoZSBDb25maWdJdGVtIE51bWJlcicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGhlIENvbmZpZ0l0ZW0gTmFtZScsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICAgICAgICAgRGVwbFN0YXRlcyAgID0+IFsnZGVwbG95bWVudCBzdGF0ZSddLCAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgPT4gWydpbmNpZGVudCBzdGF0ZSddLCAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBhZnRlciAuLi4KICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAgICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAgICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY2hhbmdlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgID0+ICRBcnJheUhhc2hSZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpLCBpdCBkZXBlbmRzIG9uIHRoZSBDb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgSXRlbSBjbGFzcyBhbmQgZGVmaW5pdGlvbgoKICAgICAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQoKICAgICAgICAgICAgICAgIE9yZGVyQnkgPT4gWyAnQ29uZmlnSXRlbUlEJywgJ051bWJlcicgXSwgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICAgICAgICAgIyBkZWZhdWx0OiBbICdDb25maWdJdGVtSUQnIF0KICAgICAgICAgICAgICAgICMgKENvbmZpZ0l0ZW1JRCwgTnVtYmVyLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQsCiAgICAgICAgICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgICAgICAgICAjIGRlZmF1bHQ6IFsgJ0Rvd24nIF0KICAgICAgICAgICAgICAgICMgKERvd24gfCBVcCkKCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICAkUmVzdWx0ID0gewogICAgICAgIFN1Y2Nlc3MgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgIyAwIG9yIDEKICAgICAgICBFcnJvck1lc3NhZ2UgICAgPT4gJycsICAgICAgICAgICAgICAgICAgICAgICMgaW4gY2FzZSBvZiBlcnJvcgogICAgICAgIERhdGEgICAgICAgICAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgIyByZXN1bHQgZGF0YSBwYXlsb2FkIGFmdGVyIE9wZXJhdGlvbgogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgID0+IFsxMjMsIDQ1Nl0sICAgICAgICAgIyBDb25maWd1cmF0aW9uIEl0ZW0gIElEcyBudW1iZXIgaW4gT1RSUzo6SVRTTSAoU2VydmljZSBkZXNrIHN5c3RlbSkKICAgICAgICAgICAgRXJyb3IgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICdDb25maWdJdGVtU2VhcmNoLkVycm9yQ29kZScKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIERlc2NyaXB0aW9uJwogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9OwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+SW5pdCgKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgKTsKCiAgICBpZiAoICEkUmVzdWx0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gJ1dlYnNlcnZpY2UuSW52YWxpZENvbmZpZ3VyYXRpb24nLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKAogICAgICAgICEkUGFyYW17RGF0YX0tPntVc2VyTG9naW59CiAgICAgICAgJiYgISRQYXJhbXtEYXRhfS0+e1Nlc3Npb25JRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBVc2VyTG9naW4gb3IgU2Vzc2lvbklEIGlzIHJlcXVpcmVkISIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1VzZXJMb2dpbn0gKSB7CgogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+e1Bhc3N3b3JkfSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBQYXNzd29yZCBvciBTZXNzaW9uSUQgaXMgcmVxdWlyZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhdXRoZW50aWNhdGUgdXNlcgogICAgbXkgKCAkVXNlcklELCAkVXNlclR5cGUgKSA9ICRTZWxmLT5BdXRoKCVQYXJhbSk7CgogICAgaWYgKCAhJFVzZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uQXV0aEZhaWwiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFVzZXIgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQhIiwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIGhhc2hlcwogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW0pKSB7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+eyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogJE5lZWRlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZyBvciBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpc29sYXRlIGNvbmZpZyBpdGVtIHBhcmFtZXRlcgogICAgbXkgJENvbmZpZ0l0ZW0gPSAkUGFyYW17RGF0YX0tPntDb25maWdJdGVtfTsKCiAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICV7JENvbmZpZ0l0ZW19ICkgewogICAgICAgIGlmICggcmVmICRBdHRyaWJ1dGUgbmUgJ0hBU0gnICYmIHJlZiAkQXR0cmlidXRlIG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAjcmVtb3ZlIGxlYWRpbmcgc3BhY2VzCiAgICAgICAgICAgICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX0gPX4gc3tcQVxzK317fTsKCiAgICAgICAgICAgICNyZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX0gPX4gc3tccytcen17fTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRDb25maWdJdGVtLT57Q0lYTUxEYXRhfSApIHsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNJWE1MRGF0YSBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZm9yIENJWE1MRGF0YQogICAgICAgICRTZWxmLT5fQ2xlYW5YTUxEYXRhKCBYTUxEYXRhID0+ICRDb25maWdJdGVtLT57Q0lYTUxEYXRhfSApOwogICAgfQoKICAgIGlmICggISggJENvbmZpZ0l0ZW0tPntDbGFzc30gKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNsYXNzIHBhcmFtZXRlciBpcyBtaXNzaW5nISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgc2VhcmNoIHBhcmFtcyB0byBhcnJheXMKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnSXRlbS0+e0luY2lTdGF0ZXN9ICkgewogICAgICAgIG15IEBJbmNpU3RhdGVzOwogICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGVzfSApICkgewogICAgICAgICAgICBASW5jaVN0YXRlcyA9IHNwbGl0KCAvLC8sICRDb25maWdJdGVtLT57SW5jaVN0YXRlc30gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWdJdGVtLT57SW5jaVN0YXRlc30gKSApIHsKICAgICAgICAgICAgQEluY2lTdGF0ZXMgPSBAeyAkQ29uZmlnSXRlbS0+e0luY2lTdGF0ZXN9IH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lldyb25nU3RydWN0dXJlIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBTdHJ1Y3R1cmUgZm9yIENvbmZpZ0l0ZW0tPkluY2lTdGF0ZXMgaXMgbm90IGNvcnJlY3QhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGVzfSA9IFxASW5jaVN0YXRlczsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGVzfSApIHsKICAgICAgICBteSBARGVwbFN0YXRlczsKICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRDb25maWdJdGVtLT57RGVwbFN0YXRlc30gKSApIHsKICAgICAgICAgICAgQERlcGxTdGF0ZXMgPSBzcGxpdCggLywvLCAkQ29uZmlnSXRlbS0+e0RlcGxTdGF0ZXN9ICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCAkQ29uZmlnSXRlbS0+e0RlcGxTdGF0ZXN9ICkgKSB7CiAgICAgICAgICAgIEBEZXBsU3RhdGVzID0gQHsgJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGVzfSB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5Xcm9uZ1N0cnVjdHVyZSIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFN0cnVjdHVyZSBmb3IgRGVwbFN0YXRlcyBpcyBub3QgY29ycmVjdCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQ29uZmlnSXRlbS0+e0RlcGxTdGF0ZXN9ID0gXEBEZXBsU3RhdGVzOwogICAgfQoKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnSXRlbS0+e09yZGVyQnl9ICkgewogICAgICAgIG15IEBPcmRlckJ5OwogICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntPcmRlckJ5fSApICkgewogICAgICAgICAgICBAT3JkZXJCeSA9IHNwbGl0KCAvLC8sICRDb25maWdJdGVtLT57T3JkZXJCeX0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWdJdGVtLT57T3JkZXJCeX0gKSApIHsKICAgICAgICAgICAgQE9yZGVyQnkgPSBAeyAkQ29uZmlnSXRlbS0+e09yZGVyQnl9IH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lldyb25nU3RydWN0dXJlIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogU3RydWN0dXJlIGZvciBPcmRlckJ5IGlzIG5vdCBjb3JyZWN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRDb25maWdJdGVtLT57T3JkZXJCeX0gPSBcQE9yZGVyQnk7CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRDb25maWdJdGVtLT57T3JkZXJCeURpcmVjdGlvbn0gKSB7CiAgICAgICAgbXkgQE9yZGVyQnlEaXJlY3Rpb247CiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQ29uZmlnSXRlbS0+e09yZGVyQnlEaXJlY3Rpb259ICkgKSB7CiAgICAgICAgICAgIEBPcmRlckJ5RGlyZWN0aW9uID0gc3BsaXQoIC8sLywgJENvbmZpZ0l0ZW0tPntPcmRlckJ5RGlyZWN0aW9ufSApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntPcmRlckJ5RGlyZWN0aW9ufSApICkgewogICAgICAgICAgICBAT3JkZXJCeURpcmVjdGlvbiA9IEB7ICRDb25maWdJdGVtLT57T3JkZXJCeURpcmVjdGlvbn0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uV3JvbmdTdHJ1Y3R1cmUiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFN0cnVjdHVyZSBmb3IgT3JkZXJCeURpcmVjdGlvbiBpcyBub3QgY29ycmVjdCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQ29uZmlnSXRlbS0+e09yZGVyQnlEaXJlY3Rpb259ID0gXEBPcmRlckJ5RGlyZWN0aW9uOwogICAgfQoKICAgICMgY2hlY2sgQ29uZmlnSXRlbSBhdHRyaWJ1dGUgdmFsdWVzCiAgICBteSAkQ29uZmlnSXRlbUNoZWNrID0gJFNlbGYtPl9DaGVja0NvbmZpZ0l0ZW0oIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0gKTsKCiAgICBpZiAoICEkQ29uZmlnSXRlbUNoZWNrLT57U3VjY2Vzc30gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvciggJXskQ29uZmlnSXRlbUNoZWNrfSApOwogICAgfQoKICAgICMgY2hlY2sgc2VhcmNoIHBlcm1pc3Npb25zCiAgICBteSAkUGVybWlzc2lvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5QZXJtaXNzaW9uKAogICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICBDbGFzc0lEID0+ICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSwKICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICk7CgogICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkFjY2Vzc0RlbmllZCIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ2FuIG5vdCBzZWFyY2ggY29uZmlndXJhdGlvbiBpdGVtcyEiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fQ29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICk7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9DbGVhblhNTERhdGEoKQoKcmVtb3ZlZCB0cmFpbGluZyBhbmQgbGVhZGluZyB3aGl0ZSBzcGFjZXMgaW4gdGhlIFhNTERhdGEuCgogICAgbXkgJFhNTERhdGFDbGVhbiA9ICRPcGVyYXRpb25PYmplY3QtPl9DbGVhblhNTERhdGEoCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkFycmF5UmVmLCAgICAgICAgICAjIENvbmZpZyBJdGVtIERlZmluaXRpb24gb3QganVzdCBwYXJ0IG9mIGl0CiAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YUhhc2hSZWYsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJFhNTERhdGFDbGVhbiA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcnl0aGluZyBpcyBPSwogICAgfQoKICAgICRYTUxEYXRhQ2xlYW4gPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NsZWFuWE1MRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRYTUxEYXRhID0gJFBhcmFte1hNTERhdGF9OwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFhNTERhdGF9ICkgewogICAgICAgIGlmICggcmVmICRYTUxEYXRhLT57JEtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFhNTERhdGEtPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEVsZW1lbnQgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5fQ2xlYW5YTUxEYXRhKCBYTUxEYXRhID0+ICRFbGVtZW50ICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEVsZW1lbnQgZXEgJycgKSB7CgogICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAkU2VsZi0+X0NsZWFuWE1MRGF0YSggWE1MRGF0YSA9PiAkWE1MRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIG5leHQgS0VZOwoKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnJyApIHsKCiAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgJFhNTERhdGEtPnskS2V5fSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgI3JlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJFhNTERhdGEtPnskS2V5fSA9fiBze1xzK1x6fXt9OwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gX0NoZWNrQ29uZmlnSXRlbSgpCgpjaGVja3MgaWYgdGhlIGdpdmVuIGNvbmZpZyBpdGVtIHBhcmFtZXRlcnMgYXJlIHZhbGlkLgoKICAgIG15ICRDb25maWdJdGVtQ2hlY2sgPSAkT3BlcmF0aW9uT2JqZWN0LT5fQ2hlY2tDb25maWdJdGVtKAogICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sICAgICAgICAgICAgICAgICAgIyBhbGwgY29uZmlnIGl0ZW0gcGFyYW1ldGVycwogICAgKTsKCiAgICByZXR1cm5zOgoKICAgICRDb25maWdJdGVtQ2hlY2sgPSB7CiAgICAgICAgU3VjY2VzcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGV2ZXJ5dGhpbmcgaXMgT0sKICAgIH0KCiAgICAkQ29uZmlnSXRlbUNoZWNrID0gewogICAgICAgIEVycm9yQ29kZSAgICA9PiAnRnVuY3Rpb24uRXJyb3InLCAgICAgICAgICAgIyBpZiBlcnJvcgogICAgICAgIEVycm9yTWVzc2FnZSA9PiAnRXJyb3IgZGVzY3JpcHRpb24nLAogICAgfQoKPWN1dAoKc3ViIF9DaGVja0NvbmZpZ0l0ZW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtDb25maWdJdGVtfTsKCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtIGludGVybmFsbHkKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2xhc3MpKSB7CiAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+JE5lZWRlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZyEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW0tPkNsYXNzCiAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVDbGFzcyggJXskQ29uZmlnSXRlbX0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNsYXNzIHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIG9wdGlvbmFsIHN0dWZmCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGVzfSApICkgewoKICAgICAgICBmb3IgbXkgJEluY2lTdGF0ZSAoIEB7ICRDb25maWdJdGVtLT57SW5jaVN0YXRlc30gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgQ29uZmlnSXRlbS0+SW5jaVN0YXRlcwogICAgICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbmNpU3RhdGUoIEluY2lTdGF0ZSA9PiAkSW5jaVN0YXRlICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkluY2lTdGF0ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWdJdGVtLT57RGVwbFN0YXRlc30gKSApIHsKCiAgICAgICAgZm9yIG15ICREZXBsU3RhdGUgKCBAeyAkQ29uZmlnSXRlbS0+e0RlcGxTdGF0ZXN9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIENvbmZpZ0l0ZW0tPkluY2lTdGF0ZXMKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlRGVwbFN0YXRlKCBEZXBsU3RhdGUgPT4gJERlcGxTdGF0ZSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5EZXBsU3RhdGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkVGltZVBhcmFtICgKICAgICAgICBxdyhDcmVhdGVUaW1lTmV3ZXJEYXRlIENyZWF0ZVRpbWVPbGRlckRhdGUgQ2hhbmdlVGltZU5ld2VyRGF0ZSBDaGFuZ2VUaW1lT2xkZXJEYXRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoIGRlZmluZWQgJENvbmZpZ0l0ZW0tPnsiQ29uZmlnSXRlbSRUaW1lUGFyYW0ifSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxmLT5WYWxpZGF0ZUlucHV0RGF0ZVRpbWUoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvbmZpZ0l0ZW0tPnsiQ29uZmlnSXRlbSRUaW1lUGFyYW0ifSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5Db25maWdJdGVtJFRpbWVQYXJhbSBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ0l0ZW0tPntMaW1pdH0gKSB7CiAgICAgICAgaWYgKCAhSXNOdW1iZXIoICRDb25maWdJdGVtLT57TGltaXR9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+TGltaXQgcGFyYW1ldGVyIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9ICkgKSB7CgogICAgICAgICMgZ2V0IGxhc3QgY29uZmlnIGl0ZW0gZGVmaW50aW9uCiAgICAgICAgbXkgJERlZmluaXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgICAgICk7CgogICAgICAgIG15ICRYTUxEYXRhQ2hlY2tSZXN1bHQgPSAkU2VsZi0+X0NoZWNrU2VhcmNoWE1MRGF0YSgKICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFhNTERhdGFDaGVja1Jlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICByZXR1cm4gJFhNTERhdGFDaGVja1Jlc3VsdDsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LIHRoZW4gcmV0dXJuIFN1Y2Nlc3MKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfTsKfQoKPWl0ZW0gX0NvbmZpZ0l0ZW1TZWFyY2goKQoKc2VhcmNoIGEgY29uZmlndXJhdGlvbiBpdGVtcy4KCiAgICBteSAkUmVzcG9uc2UgPSAkT3BlcmF0aW9uT2JqZWN0LT5fQ29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBDb25maWdJdGVtICAgICA9PiAkQ29uZmlnSXRlbSwgICAgICAgICAgICAgIyBhbGwgY29uZmlndXJhdGlvbiBpdGVtIHBhcmFtZXRlcnMKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxMjMsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJFJlc3BvbnNlID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyZXRoaW5nIGlzIE9LCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgPT4gWzEyMywgNDU2XSwKICAgICAgICB9CiAgICB9CgogICAgJFJlc3BvbnNlID0gewogICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHVuZXhwZWN0ZWQgZXJyb3IKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRQYXJhbXtFcnJvckNvZGV9OiAkUGFyYW17RXJyb3JNZXNzYWdlfSIsCiAgICB9Cgo9Y3V0CgpzdWIgX0NvbmZpZ0l0ZW1TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtDb25maWdJdGVtfTsKCiAgICBteSAlU2VhcmNoUGFyYW1zOwoKICAgICMgc2V0IHNlYXJjaCBwYXJhbWV0ZXJzIHRoYXQgZG9lcyBub3QgbmVlZCBhbnkgY29udmVyc2lvbgogICAgZm9yIG15ICRQbGFpblBhcmFtICgKICAgICAgICBxdygKICAgICAgICBOYW1lIE51bWJlciBQcmV2aW91c1ZlcnNpb25TZWFyY2ggT3JkZXJCeSBPcmRlckJ5RGlyZWN0aW9uIExpbWl0CiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUKICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCBkZWZpbmVkICRDb25maWdJdGVtLT57JFBsYWluUGFyYW19ICkgewogICAgICAgICAgICAkU2VhcmNoUGFyYW1zeyRQbGFpblBhcmFtfSA9ICRDb25maWdJdGVtLT57JFBsYWluUGFyYW19OwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBzZWFjaCBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1JldmVyc2VDbGFzc0xpc3R9LT57ICRDb25maWdJdGVtLT57Q2xhc3N9IH07CiAgICAkU2VhcmNoUGFyYW1ze0NsYXNzSURzfSA9IFskQ2xhc3NJRF07CgogICAgIyBzZXQgc2VhcmNoIGluY2lkZW50IHN0YXRlcwogICAgaWYgKCBkZWZpbmVkICRDb25maWdJdGVtLT57SW5jaVN0YXRlc30gKSB7CiAgICAgICAgbXkgQEluY2lTdGF0ZUlEczsKICAgICAgICBmb3IgbXkgJEluY2lTdGF0ZSAoIEB7ICRDb25maWdJdGVtLT57SW5jaVN0YXRlc30gfSApIHsKICAgICAgICAgICAgbXkgJEluY2lTdGF0ZUlEID0gJFNlbGYtPntSZXZlcnNlSW5jaVN0YXRlTGlzdH0tPnskSW5jaVN0YXRlfTsKICAgICAgICAgICAgcHVzaCBASW5jaVN0YXRlSURzLCAkSW5jaVN0YXRlSUQ7CiAgICAgICAgfQogICAgICAgICRTZWFyY2hQYXJhbXN7SW5jaVN0YXRlSURzfSA9IFxASW5jaVN0YXRlSURzOwogICAgfQoKICAgICMgc2V0IHNlYXJjaCBkZXBsb3ltZW50IHN0YXRlcwogICAgaWYgKCBkZWZpbmVkICRDb25maWdJdGVtLT57RGVwbFN0YXRlc30gKSB7CiAgICAgICAgbXkgQERlcGxTdGF0ZUlEczsKICAgICAgICBmb3IgbXkgJERlcGxTdGF0ZSAoIEB7ICRDb25maWdJdGVtLT57RGVwbFN0YXRlc30gfSApIHsKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJFNlbGYtPntSZXZlcnNlRGVwbFN0YXRlTGlzdH0tPnskRGVwbFN0YXRlfTsKICAgICAgICAgICAgcHVzaCBARGVwbFN0YXRlSURzLCAkRGVwbFN0YXRlSUQ7CiAgICAgICAgfQogICAgICAgICRTZWFyY2hQYXJhbXN7RGVwbFN0YXRlSURzfSA9IFxARGVwbFN0YXRlSURzOwogICAgfQoKICAgIG15ICRSYXdYTUxEYXRhID0gJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9OwoKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUmF3WE1MRGF0YSkgKSB7CgogICAgICAgICMgZ2V0IGxhc3QgY29uZmlnIGl0ZW0gZGVmaW50aW9uCiAgICAgICAgbXkgJERlZmluaXRpb25EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgICAgICk7CgogICAgICAgICMgcmVwbGFjZSBkYXRlLCBkYXRlIHRpbWUsIGN1c3RvbWVyLCBjb21wYW55IGFuZCBnZW5lcmFsIGNhdGFsb2cgdmFsdWVzCiAgICAgICAgbXkgJFJlcGxhY2VkWE1MRGF0YSA9ICRTZWxmLT5SZXBsYWNlWE1MRGF0YSgKICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkUmF3WE1MRGF0YSwKICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbiBYTUxEYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgQ29uZmlnSXRlbVNlYXJjaAogICAgICAgIG15ICRYTUxEYXRhID0gJFNlbGYtPl9Gb3JtYXRTZWFyY2hYTUxEYXRhKAogICAgICAgICAgICBYTUxEYXRhID0+ICRSZXBsYWNlZFhNTERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFhNTERhdGEpICkgewogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze1doYXR9ID0gJFhNTERhdGE7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5JbmZvKAogICAgICAgIFN1bW1hcnkgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFNlYXJjaCBQYXJhbWV0ZXJzIiwKICAgICAgICBEYXRhICAgID0+IFwlU2VhcmNoUGFyYW1zLAogICAgKTsKCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoJVNlYXJjaFBhcmFtcyk7CgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJENvbmZpZ0l0ZW1JRHMpICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgRGF0YSAgICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSURzID0+ICRDb25maWdJdGVtSURzLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBEYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEcyA9PiAnJywKICAgICAgICB9LAogICAgfTsKfQoKPWl0ZW0gX0NoZWNrU2VhcmNoWE1MRGF0YSgpCgpjaGVja3MgaWYgdGhlIGdpdmVuIFhNTERhdGEgdmFsdWUgYXJlIHZhbGlkLgoKICAgIG15ICRYTUxEYXRhQ2hlY2sgPSAkQ29tbW9uT2JqZWN0LT5fQ2hlY2tTZWFyY2hYTUxEYXRhKAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25BcnJheVJlZiwgICAgICAgICAgIyBDb25maWcgSXRlbSBEZWZpbml0aW9uIG90IGp1c3QgcGFydCBvZiBpdAogICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGFIYXNoUmVmLAogICAgICAgIFBhcmVudCAgICAgPT4gJ3NvbWUgcGFyZW50JywKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkWE1MRGF0YUNoZWNrID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LCiAgICB9CgogICAgJFhNTERhdGFDaGVjayA9IHsKICAgICAgICBFcnJvckNvZGUgICAgPT4gJ0Z1bmN0aW9uLkVycm9yJywgICAgICAgICAgICMgaWYgZXJyb3IKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIGRlc2NyaXB0aW9uJywKICAgIH0KCj1jdXQKCnN1YiBfQ2hlY2tTZWFyY2hYTUxEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERlZmluaXRpb24gPSAkUGFyYW17RGVmaW5pdGlvbn07CiAgICBteSAkWE1MRGF0YSAgICA9ICRQYXJhbXtYTUxEYXRhfTsKICAgIG15ICRQYXJlbnQgICAgID0gJFBhcmFte1BhcmVudH0gfHwgJyc7CgogICAgbXkgJENoZWNrVmFsdWVSZXN1bHQ7CiAgICBmb3IgbXkgJERlZkl0ZW0gKCBAeyREZWZpbml0aW9ufSApIHsKICAgICAgICBteSAkSXRlbUtleSA9ICREZWZJdGVtLT57S2V5fTsKCiAgICAgICAgaWYgKCByZWYgJFhNTERhdGEtPnskSXRlbUtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkWE1MRGF0YS0+eyRJdGVtS2V5fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrVmFsdWVSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJEFycmF5SXRlbS0+eyRJdGVtS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICA9PiAkUGFyZW50LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrVmFsdWVSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRDaGVja1ZhbHVlUmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggcmVmICRBcnJheUl0ZW0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrVmFsdWVSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJEFycmF5SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICA9PiAkUGFyZW50LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrVmFsdWVSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRDaGVja1ZhbHVlUmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JEl0ZW1LZXl9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgaWYgKCAkWE1MRGF0YS0+eyRJdGVtS2V5fS0+eyRJdGVtS2V5fSApIHsKICAgICAgICAgICAgICAgICRDaGVja1ZhbHVlUmVzdWx0ID0gJFNlbGYtPl9DaGVja1ZhbHVlKAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJFhNTERhdGEtPnskSXRlbUtleX0tPnskSXRlbUtleX0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgICA9PiAkRGVmSXRlbS0+e0lucHV0fSwKICAgICAgICAgICAgICAgICAgICBJdGVtS2V5ID0+ICRJdGVtS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tWYWx1ZVJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkQ2hlY2tWYWx1ZVJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb25seSBwZXJmb3JtIGNoZWNrcyBpZiBpdGVtIHJlYWxseSBleGl0cyBpbiB0aGUgWE1MRGF0YQogICAgICAgICAgICAjIENvdW50TmluIGNoZWNrcyB3YXMgdmVyaWZpZWQgYW5kIHBhc3NlZCBiZWZvcmUhLCBzbyBpdCBpcyBzYWZlIHRvIHNraXAgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggJFhNTERhdGEtPnskSXRlbUtleX0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2tWYWx1ZVJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tWYWx1ZSgKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRYTUxEYXRhLT57JEl0ZW1LZXl9LAogICAgICAgICAgICAgICAgICAgIElucHV0ICAgPT4gJERlZkl0ZW0tPntJbnB1dH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgID0+ICRQYXJlbnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrVmFsdWVSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJENoZWNrVmFsdWVSZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBzdWIgYW5kIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgIGlmICggZGVmaW5lZCAkRGVmSXRlbS0+e1N1Yn0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiAkWE1MRGF0YS0+eyRJdGVtS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkWE1MRGF0YS0+eyRJdGVtS2V5fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiBmb3IgZWFjaCBhcnJheSBpdGVtCiAgICAgICAgICAgICAgICAgICAgbXkgJFhNTERhdGFDaGVjayA9ICRTZWxmLT5fQ2hlY2tTZWFyY2hYTUxEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkQXJyYXlJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICJbJENvdW50ZXJdLT4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFhNTERhdGFDaGVjay0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFhNTERhdGFDaGVjazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkWE1MRGF0YS0+eyRJdGVtS2V5fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgICAgIG15ICRYTUxEYXRhQ2hlY2sgPSAkU2VsZi0+X0NoZWNrU2VhcmNoWE1MRGF0YSgKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgID0+ICRYTUxEYXRhLT57JEl0ZW1LZXl9LAogICAgICAgICAgICAgICAgICAgIFBhcmVudCAgICAgPT4gJFBhcmVudCAuICRJdGVtS2V5IC4gJy0+JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkWE1MRGF0YUNoZWNrLT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRYTUxEYXRhQ2hlY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzdGFydCByZWN1c3JzaW9uCiAgICAgICAgICAgICAgICBteSAkWE1MRGF0YUNoZWNrID0gJFNlbGYtPl9DaGVja1NlYXJjaFhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICA9PiB7fSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnQgICAgID0+ICRQYXJlbnQgLiAkSXRlbUtleSAuICctPicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFhNTERhdGFDaGVjay0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkWE1MRGF0YUNoZWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfTsKfQoKPWl0ZW0gX0NoZWNrVmFsdWUoKQoKY2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyB2YWxpZC4KCiAgICBteSAkVmFsdWVDaGVjayA9ICRDb21tb25PYmplY3QtPl9DaGVja1ZhbHVlKAogICAgICAgIFZhbHVlICAgPT4gJFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgIyAkVmFsdWUgY291bGQgYmUgYSBzdHJpbmcsIGEgdGltZSBzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBnZW5lcmFsIGNhdGFsb2cgY2xhc3MgbmFtZSwgb3IgYSBpbnRlZ2VyCiAgICAgICAgSW5wdXQgICA9PiAkSW5wdXREZWZpbml0aW9uSGFzaFJlZiwgICAgICAjIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbGVtZW50IGlucHV0IGV4dHJhY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGZyb20gdGhlIENvbmZpZ3VyYXRpb24gSXRlbSBkZWZpbml0aW9uIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGZvciBlYWNoIHZhbHVlCiAgICAgICAgSXRlbUtleSA9PiAnc29tZSBrZXknLCAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBhcyBzZW50IGluIHRoZSBTT0FQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgcmVxdWVzdAogICAgICAgIFBhcmVudCAgPT4gJ3NvZW0gcGFyZW50IGtleS0+JywgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGZvbGxvd2VkIGJ5IC0+IG9yIGVtcHR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZm9yIHJvb3Qga2V5IGl0ZW1zCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJFZhbHVlQ2hlY2sgPSB7CiAgICAgICAgU3VjY2VzcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGV2ZXJ5dGhpbmcgaXMgT0sKICAgIH0KCiAgICAkVmFsdWVDaGVjayA9IHsKICAgICAgICBFcnJvckNvZGUgICAgPT4gJ0Z1bmN0aW9uLkVycm9yJywgICAgICAgICMgaWYgZXJyb3IKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIGRlc2NyaXB0aW9uJywKICAgIH0KCj1jdXQKCnN1YiBfQ2hlY2tWYWx1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJlbnQgID0gJFBhcmFte1BhcmVudH07CiAgICBteSAkSXRlbUtleSA9ICRQYXJhbXtJdGVtS2V5fTsKCiAgICBpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnVGV4dCcgfHwgJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdUZXh0QXJlYScgKSB7CgogICAgICAgICMgcnVuIFRleHQgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dFRleHQoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGV4Y2VkZXMgdGhlIG1heGl1bSBsZW5ndGghIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZScgKSB7CgogICAgICAgICMgcnVuIERhdGUgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dERhdGUoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIERhdGUgZm9ybWF0ISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0RhdGVUaW1lJyApIHsKCiAgICAgICAgIyBydW4gRGF0ZVRpbWUgdmFsaWRhdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVJbnB1dERhdGVUaW1lKCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBEYXRlVGltZSBmb3JtYXQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJbnB1dH0tPntUeXBlfSBlcSAnQ3VzdG9tZXInICkgewoKICAgICAgICAjIHJ1biBDdXN0b21lciB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0Q3VzdG9tZXIoJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIGN1c3RvbWVyISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0N1c3RvbWVyQ29tcGFueScgKSB7CgogICAgICAgICMgcnVuIEN1c3RvbWVyQ29tcGFueSB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0Q3VzdG9tZXJDb21wYW55KCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBjdXN0b21lciBjb21wYW55ISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SW5wdXR9LT57VHlwZX0gZXEgJ0ludGVnZXInICkgewoKICAgICAgICAjIHJ1biBJbnRlZ2VyIHZhbGlkYXRpb25zCiAgICAgICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlSW5wdXRJbnRlZ2VyKCVQYXJhbSkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhLT4kUGFyZW50JEl0ZW1LZXkgcGFyYW1ldGVyIHZhbHVlIgogICAgICAgICAgICAgICAgICAgIC4gIiBpcyBub3QgYSB2YWxpZCBJbnRlZ2VyIG9yIG91dCBvZiByYW5nZSEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CgogICAgICAgICMgcnVuIEdlbmVyYWwgQ2F0YWxvZyB2YWxpZGF0aW9ucwogICAgICAgIGlmICggISRTZWxmLT5WYWxpZGF0ZUlucHV0R2VuZXJhbENhdGFsb2coJVBhcmFtKSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5DSVhNTERhdGEtPiRQYXJlbnQkSXRlbUtleSBwYXJhbWV0ZXIgdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBhIHZhbGlkIGZvciBHZW5lcmFsIENhdGFsb2cgJyRQYXJhbXtJbnB1dH0tPntDbGFzc30nISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgVGhlIHR5cGUgaXMgZHVtbXksIGRvIG5vdGhpbmcKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH07Cn0KCj1pdGVtIF9Gb3JtYXRTZWFyY2hYTUxEYXRhKCkKCkNyZWF0ZSBhIFhNTERhdGEgc3VpdGFibGUgZm9yIENvbmZpZ0l0ZW1TZWFjaC4KCiAgICBteSAkTmV3WE1MRGF0YSA9ICRPcGVyYXRpb25PYmplY3QtPl9Gb3JtYXRTZWFyY2hYTUxEYXRhKAogICAgICAgIFhNTERhdGEgICAgPT4gJFhNTERhdGFIYXNoUmVmLAogICAgICAgIENoaWxkICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICMgb3IgMCwgb3B0aW9uYWwKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkTmV3WE1MRGF0YSA9ICRYTUxEYXRhSGFzaFJlZiwgICAgICAgICAgICAgICAgICAjIHN1aXRhYmxlIGZvciB2ZXJzaW9uIGFkZAoKPWN1dAoKc3ViIF9Gb3JtYXRTZWFyY2hYTUxEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFhNTERhdGEgPSAkUGFyYW17WE1MRGF0YX07CiAgICBteSAkUGFyZW50ICA9ICRQYXJhbXtQYXJlbnR9IHx8ICcnOwogICAgbXkgJENoaWxkICAgPSAkUGFyYW17Q2hpbGR9OwoKICAgIG15ICROZXdYTUxEYXRhID0gJFBhcmFte05ld1hNTERhdGF9IHx8IHt9OwoKICAgIGZvciBteSAkUm9vdEtleSAoIHNvcnQga2V5cyAleyRYTUxEYXRhfSApIHsKICAgICAgICBpZiAoIHJlZiAkWE1MRGF0YS0+eyRSb290S2V5fSBlcSAnQVJSQVknICkgewoKICAgICAgICAgICAgZm9yIG15ICRBcnJheUl0ZW0gKCBAeyAkWE1MRGF0YS0+eyRSb290S2V5fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgcm9vdCBrZXkgZnJvbSB0aGUgaGFzaCBhbmQgYXNzaW5nIGl0IHRvIGNvbnRlbnQga2V5CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnQgPSBkZWxldGUgJEFycmF5SXRlbS0+eyRSb290S2V5fTsKCiAgICAgICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgICAgICAgICBteSAkTmV3WE1MRGF0YVBhcnQgPSAkU2VsZi0+X0Zvcm1hdFNlYXJjaFhNTERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFhNTERhdGEgPT4gJEFycmF5SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50ICA9PiAkUGFyZW50IC4gJFJvb3RLZXkgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICAgICBDaGlsZCAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRDb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJE5ld1hNTERhdGEtPnsgJFBhcmVudCAuICRSb290S2V5IH0gfSwgJENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFzc2FtYmxlIHRoZSBmaW5hbCB2YWx1ZSBmcm9tIHRoZSBwYXJ0cwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmV3S2V5ICggJXskTmV3WE1MRGF0YVBhcnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkTmV3WE1MRGF0YVBhcnQtPnskTmV3S2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkTmV3WE1MRGF0YS0+eyROZXdLZXl9IH0sICRJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEFycmF5SXRlbSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICROZXdYTUxEYXRhLT57ICRQYXJlbnQgLiAkUm9vdEtleSB9IH0sICRBcnJheUl0ZW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2lmICggcmVmICRYTUxEYXRhLT57JFJvb3RLZXl9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgcm9vdCBrZXkgZnJvbSB0aGUgaGFzaCBhbmQgYXNzaW5nIGl0IHRvIGNvbnRlbnQga2V5CiAgICAgICAgICAgIG15ICRDb250ZW50ID0gZGVsZXRlICRYTUxEYXRhLT57JFJvb3RLZXl9LT57JFJvb3RLZXl9OwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgbXkgJE5ld1hNTERhdGFQYXJ0ID0gJFNlbGYtPl9Gb3JtYXRTZWFyY2hYTUxEYXRhKAogICAgICAgICAgICAgICAgWE1MRGF0YSA9PiAkWE1MRGF0YS0+eyRSb290S2V5fSwKICAgICAgICAgICAgICAgIFBhcmVudCAgPT4gJFBhcmVudCAuICRSb290S2V5IC4gIjo6IiwKICAgICAgICAgICAgICAgIENoaWxkICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQ29udGVudCkgewogICAgICAgICAgICAgICAgcHVzaCBAeyAkTmV3WE1MRGF0YS0+eyAkUGFyZW50IC4gJFJvb3RLZXkgfSB9LCAkQ29udGVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NhbWJsZSB0aGUgZmluYWwgdmFsdWUgZnJvbSB0aGUgcGFydAogICAgICAgICAgICAleyROZXdYTUxEYXRhfSA9ICggJXskTmV3WE1MRGF0YX0sICV7JE5ld1hNTERhdGFQYXJ0fSApOwogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskUm9vdEtleX0gZXEgJycgKSB7CiAgICAgICAgICAgIHB1c2ggQHsgJE5ld1hNTERhdGEtPnsgJFBhcmVudCAuICRSb290S2V5IH0gfSwgJFhNTERhdGEtPnskUm9vdEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIG9ubHkgdGhlIHBhcnQgb24gcmVjdXJzaW9uCiAgICBpZiAoJENoaWxkKSB7CiAgICAgICAgcmV0dXJuICROZXdYTUxEYXRhOwogICAgfQoKICAgICMgcmV0dXJuIHRoZSBjb21wbGV0ZSBYTUxEYXRhIGFzIG5lZWRlZCBmb3IgQ29uZmlnSXRlbVNlYXJjaAogICAgbXkgQFJldHVyblN0cnVjdHVyZTsKICAgIGZvciBteSAkU2VhcmNoUGFyYW0gKCBzb3J0IGtleXMgJXskTmV3WE1MRGF0YX0gKSB7CiAgICAgICAgbXkgJFNlYXJjaEtleSA9ICRTZWFyY2hQYXJhbTsKICAgICAgICAkU2VhcmNoS2V5ID1+IHN7IDo6IH17XCdcfVslXVx7XCd9eG1zZzsKICAgICAgICAkU2VhcmNoS2V5ID0gIlsxXXsnVmVyc2lvbid9WzFdeyckU2VhcmNoS2V5J31bJV17J0NvbnRlbnQnfSI7CiAgICAgICAgcHVzaCBAUmV0dXJuU3RydWN0dXJlLCB7CiAgICAgICAgICAgICRTZWFyY2hLZXkgPT4gJE5ld1hNTERhdGEtPnskU2VhcmNoUGFyYW19LAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gXEBSZXR1cm5TdHJ1Y3R1cmU7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtVXBkYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29tbW9uCiAgICBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29tbW9uCik7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1VcGRhdGUgLSBHZW5lcmljSW50ZXJmYWNlIENvbmZpZ0l0ZW0gQ29uZmlnSXRlbVVwZGF0ZSBPcGVyYXRpb24gYmFja2VuZAoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyhEZWJ1Z2dlck9iamVjdCBXZWJzZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgZGVmaW5lIG9wZXJhdGlvbiBuYW1lCiAgICAkU2VsZi0+e09wZXJhdGlvbk5hbWV9ID0gJ0NvbmZpZ0l0ZW1VcGRhdGUnOwoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnR2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtVXBkYXRlJyk7CgogICAgJFNlbGYtPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSA9ICdOb3QgRGVmaW5lZCc7CgogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBjb25maWcgaXRlbSBjbGFzc2VzCiAgICAkU2VsZi0+e0NsYXNzTGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0NsYXNzTGlzdH0gKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntEZWJ1Z2dlck9iamVjdH0tPkVycm9yKAogICAgICAgICAgICBTdW1tYXJ5ID0+ICdFcnJvciB3aGVuIHRyeWluZyB0byBnZXQgY2xhc3MgbGlzdGluZyBvZiBJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGluY2lzdGF0ZXMKICAgICRTZWxmLT57SW5jaVN0YXRlTGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRTZWxmLT57SW5jaVN0YXRlTGlzdH0gKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntEZWJ1Z2dlck9iamVjdH0tPkVycm9yKAogICAgICAgICAgICBTdW1tYXJ5ID0+ICdFcnJvciB3aGVuIHRyeWluZyB0byBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdGluZyBvZicKICAgICAgICAgICAgICAgIC4gJyBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgZGVwbHN0YXRlcwogICAgJFNlbGYtPntEZXBsU3RhdGVMaXN0fSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0RlcGxTdGF0ZUxpc3R9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57RGVidWdnZXJPYmplY3R9LT5FcnJvcigKICAgICAgICAgICAgU3VtbWFyeSA9PiAnRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IGluY2lkZW50IHN0YXRlIGxpc3Rpbmcgb2YnCiAgICAgICAgICAgICAgICAuICcgSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICApOwogICAgfQoKICAgICMgYWxzbyBwcm92aWRlIHRoZSBjbGFzc2xpc3QgaW4gcmV2ZXJzZWQgZm9ybSBmb3IgZWFzaWVyIHJldmVyc2UgbG9va3VwcwogICAgbXkgJVJldmVyc2VDbGFzc0xpc3QgPSByZXZlcnNlICV7ICRTZWxmLT57Q2xhc3NMaXN0fSB9OwogICAgJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fSA9IFwlUmV2ZXJzZUNsYXNzTGlzdDsKCiAgICAjIGFsc28gcHJvdmlkZSB0aGUgaW5jaXN0YXRlbGlzdCBpbiByZXZlcnNlZCBmb3JtIGZvciBlYXNpZXIgcmV2ZXJzZSBsb29rdXBzCiAgICBteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7ICRTZWxmLT57SW5jaVN0YXRlTGlzdH0gfTsKICAgICRTZWxmLT57UmV2ZXJzZUluY2lTdGF0ZUxpc3R9ID0gXCVSZXZlcnNlSW5jaVN0YXRlTGlzdDsKCiAgICAjIGFsc28gcHJvdmlkZSB0aGUgZGVwbHN0YXRlbGlzdCBpbiByZXZlcnNlZCBmb3JtIGZvciBlYXNpZXIgcmV2ZXJzZSBsb29rdXBzCiAgICBteSAlUmV2ZXJzZURlcGxTdGF0ZUxpc3QgPSByZXZlcnNlICV7ICRTZWxmLT57RGVwbFN0YXRlTGlzdH0gfTsKICAgICRTZWxmLT57UmV2ZXJzZURlcGxTdGF0ZUxpc3R9ID0gXCVSZXZlcnNlRGVwbFN0YXRlTGlzdDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpwZXJmb3JtIENvbmZpZ0l0ZW1VcGRhdGUgT3BlcmF0aW9uLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSB1cGRhdGVkIGNvbmZpZyBpdGVtIG51bWJlci4KCiAgICBteSAkUmVzdWx0ID0gJE9wZXJhdGlvbk9iamVjdC0+UnVuKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJ3NvbWUgYWdlbnQgbG9naW4nLCAgICAgICAgICAgICAgICAjIFVzZXJMb2dpbiBvciBTZXNzaW9uSUQgaXMKICAgICAgICAgICAgU2Vzc2lvbklEID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHJlcXVpcmVkCgogICAgICAgICAgICBQYXNzd29yZCAgPT4gJ3NvbWUgcGFzc3dvcmQnLCAgICAgICAgICAgICAgICAgICAjIGlmIFVzZXJMb2dpbiBpcyBzZW50IHRoZW4gUGFzc3dvcmQgaXMgcmVxdWlyZWQKCiAgICAgICAgICAgIFJlcGxhY2VFeGlzdGluZ0RhdGEgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIDAgb3IgMSwgZGVmYXVsdCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIFhNTCBkYXRhIGFuZCBhdHRhY2htZW50cwogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAoKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29uZmlnIEl0ZW0gQ2xhc3MnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUaGUgTmFtZScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ2RlcGxveW1lbnQgc3RhdGUnLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdpbmNpZGVudCBzdGF0ZScsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gJEFycmF5SGFzaFJlZiwgICAgICAgICAgICAgICAgICMgaXQgZGVwZW5kcyBvbiB0aGUgQ29uZmlndXJhdGlvbiBJdGVtIGNsYXNzIGFuZCBkZWZpbml0aW9uCgogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnY29udGVudCcgICAgICAgICAgICAjIGJhc2U2NCBlbmNvZGVkCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdzb21lIGNvbnRlbnQgdHlwZScKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NvbWUgZmluZSBuYW1lJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgICAgICAgICAjQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICAjICAgQ29udGVudCAgICAgPT4gJ2NvbnRlbnQnCiAgICAgICAgICAgICAgICAjICAgQ29udGVudFR5cGUgPT4gJ3NvbWUgY29udGVudCB0eXBlJwogICAgICAgICAgICAgICAgIyAgIEZpbGVuYW1lICAgID0+ICdzb21lIGZpbmUgbmFtZScKICAgICAgICAgICAgICAgICN9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSAgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdCBkYXRhIHBheWxvYWQgYWZ0ZXIgT3BlcmF0aW9uCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAjIENvbmZpZ3VyYXRpb24gSXRlbSAgSUQgbnVtYmVyIGluIE9UUlM6OklUU00gKFNlcnZpY2UgZGVzayBzeXN0ZW0pCiAgICAgICAgICAgIE51bWJlciAgICAgICA9PiAyMzI0NDU0MzIzMzIyICAgICAgICAgICAjIENvbmZpZ3VyYXRpb24gSXRlbSAgTnVtYmVyIGluIE9UUlM6OklUU00gKFNlcnZpY2UgZGVzayBzeXN0ZW0pCiAgICAgICAgICAgIEVycm9yID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3VsZCBub3QgcmV0dXJuIGVycm9ycwogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5FcnJvckNvZGUnCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBEZXNjcmlwdGlvbicKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkluaXQoCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICdXZWJzZXJ2aWNlLkludmFsaWRDb25maWd1cmF0aW9uJywKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte0RhdGF9LT57VXNlckxvZ2lufQogICAgICAgICYmICEkUGFyYW17RGF0YX0tPntTZXNzaW9uSUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogVXNlckxvZ2luIG9yIFNlc3Npb25JRCBpcyByZXF1aXJlZCEiLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGF0YX0tPntVc2VyTG9naW59ICkgewoKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPntQYXNzd29yZH0gKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogUGFzc3dvcmQgb3IgU2Vzc2lvbklEIGlzIHJlcXVpcmVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXV0aGVudGljYXRlIHVzZXIKICAgIG15ICggJFVzZXJJRCwgJFVzZXJUeXBlICkgPSAkU2VsZi0+QXV0aCglUGFyYW0pOwoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkF1dGhGYWlsIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBVc2VyIGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBoYXNoZXMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtKSkgewogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPnskTmVlZGVkfSApICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICROZWVkZWQgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igbm90IHZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIGl0ZW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggIUlzUG9zaXRpdmVJbnRlZ2VyKCAkUGFyYW17RGF0YX0tPnskTmVlZGVkfSApICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICROZWVkZWQgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igbm90IHZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIHZhbGlkIENvbmZpZ0l0ZW1JRAogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW1JRH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgZ2V0IENvbmZpZ0l0ZW0gZGF0YQogICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRDb25maWdJdGVtRGF0YSkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW1JRCBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlzb2xhdGUgY29uZmlnIGl0ZW0gcGFyYW1ldGVyCiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19OwoKICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcwogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXskQ29uZmlnSXRlbX0gKSB7CiAgICAgICAgaWYgKCByZWYgJEF0dHJpYnV0ZSBuZSAnSEFTSCcgJiYgcmVmICRBdHRyaWJ1dGUgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgc3BhY2VzCiAgICAgICAgICAgICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX0gPX4gc3tcQVxzK317fTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAkQ29uZmlnSXRlbS0+eyRBdHRyaWJ1dGV9ID1+IHN7XHMrXHp9e307CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlIHBhcmFtZXRlciBSZXBsYWNlRXhpc3RpbmdEYXRhIGlzIHNldCB0byAwIG9yIGlmIGl0IGlzIG1pc3NpbmcKICAgICMgdGhlbiBtaXNzaW5nLCBlbXB0eSBvciBvbmx5IHBhcnRpYWxseSBkZWZpbmVkIENJWE1MRGF0YSBwYXJhbWV0ZXIgYXR0cmlidXRlcyBhcmUgYWxsb3dlZAogICAgIyBpbiB0aGlzIGNhc2UgdGhlIGV4aXN0aW5nIENJWE1MRGF0YSBpcyB1c2VkIGZvciB0aGUgbWlzc2luZyBwYXJ0cy4KICAgICMgQSBtaXNzaW5nICh1bmRlZmluZWQpIENJWE1MRGF0YSBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIGVmZmVjdAogICAgIyB0aGUgUmVwbGFjZUV4aXN0aW5nRGF0YSBwYXJhbWV0ZXIgYWxzbyBpbmZsdWVuY2VzIGlmIGV4aXN0aW5nIGF0dGFjaG1lbnRzIHNob3VsZCBiZSByZXBsYWNlZCBvciBrZXB0CiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntSZXBsYWNlRXhpc3RpbmdEYXRhfSB8fCAhZGVmaW5lZCAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX0gKSB7CgogICAgICAgICMgc2V0IHRvIGVtcHR5IGhhc2ggcmVmZXJlbmNlIGlmIGVtcHR5IG9yIG5vdCBkZWZpbmVkCiAgICAgICAgJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9IHx8PSB7fTsKCiAgICAgICAgIyBDSVhNTERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+Q0lYTUxEYXRhIGlzIG1pc3Npbmcgb3IgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGF0ZXN0IHZlcnNpb24gZGF0YSBmcm9tIGNvbmZpZ2l0ZW0KICAgICAgICBteSAkVmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZlcnNpb24pICkgewoKICAgICAgICAgICAgbXkgJEVycm9yTWVzc2FnZSA9ICdDb3VsZCBub3QgZ2V0IENvbmZpZ0l0ZW0gZGF0YScKICAgICAgICAgICAgICAgIC4gJyBpbiBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbVVwZGF0ZTo6UnVuKCknOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAnJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogJEVycm9yTWVzc2FnZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSB1bm5lZWRlZCBpdGVtcwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0NsYXNzSUR9OwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICAgICBkZWxldGUgJFZlcnNpb24tPntDdXJJbmNpU3RhdGVJRH07CiAgICAgICAgZGVsZXRlICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9OwogICAgICAgIGRlbGV0ZSAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKICAgICAgICBkZWxldGUgJFZlcnNpb24tPntYTUxEZWZpbml0aW9uSUR9OwoKICAgICAgICBteSAkRGVmaW5pdGlvbiA9IGRlbGV0ZSAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259OwoKICAgICAgICBteSAkRm9ybWF0ZWRYTUxEYXRhID0gJFNlbGYtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgIFhNTERhdGEgPT4gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlcGxhY2VkWE1MRGF0YSA9ICRTZWxmLT5JbnZlcnRSZXBsYWNlWE1MRGF0YSgKICAgICAgICAgICAgWE1MRGF0YSAgICA9PiAkRm9ybWF0ZWRYTUxEYXRhLAogICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57WE1MRGF0YX0gPSAkUmVwbGFjZWRYTUxEYXRhOwoKICAgICAgICAjIHJlbmFtZSBYTUxEYXRhIHNpbmNlIFNPQVAgdHJhbnNwb3J0IGNvbXBsYWlucyBhYm91dCBYTUwgcHJlZml4IG9uIG5hbWVzCiAgICAgICAgJFZlcnNpb24tPntDSVhNTERhdGF9ID0gZGVsZXRlICRWZXJzaW9uLT57WE1MRGF0YX07CgogICAgICAgICMgbWVyZ2UgZXhpc3RpbmcgZGF0YSBhbmQgbmV3IGRhdGEgZnJvbSBwYXJhbWV0ZXJzCiAgICAgICAgJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9ID0gewogICAgICAgICAgICAleyAkVmVyc2lvbi0+e0NJWE1MRGF0YX0gfSwKICAgICAgICAgICAgJXsgJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNJWE1MRGF0YSBpcyBlbXB0eSBvciBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZm9yIENJWE1MRGF0YQogICAgJFNlbGYtPl9DbGVhblhNTERhdGEoIFhNTERhdGEgPT4gJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9ICk7CgogICAgIyBjaGVjayBDb25maWdJdGVtIGF0dHJpYnV0ZSB2YWx1ZXMKICAgIG15ICRDb25maWdJdGVtQ2hlY2sgPSAkU2VsZi0+X0NoZWNrQ29uZmlnSXRlbSggQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSApOwoKICAgIGlmICggISRDb25maWdJdGVtQ2hlY2stPntTdWNjZXNzfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKCAleyRDb25maWdJdGVtQ2hlY2t9ICk7CiAgICB9CgogICAgIyBjaGVjayB1cGRhdGUgcGVybWlzc2lvbnMKICAgIG15ICRQZXJtaXNzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgIENsYXNzSUQgPT4gJFNlbGYtPntSZXZlcnNlQ2xhc3NMaXN0fS0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgKTsKCiAgICBpZiAoICEkUGVybWlzc2lvbiApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uQWNjZXNzRGVuaWVkIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDYW4gbm90IHVwZGF0ZSBjb25maWd1cmF0aW9uIGl0ZW1zISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSBhdHRhY2htZW50cwogICAgbXkgJEF0dGFjaG1lbnQ7CiAgICBteSBAQXR0YWNobWVudExpc3Q7CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH0gKSB7CgogICAgICAgICMgaXNvbGF0ZSBBdHRhY2htZW50IHBhcmFtZXRlcgogICAgICAgICRBdHRhY2htZW50ID0gZGVsZXRlICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH07CgogICAgICAgICMgaG9tb2xvZ2F0ZSBpbXB1dCB0byBhcnJheQogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnQpICkgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50TGlzdCwgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCRBdHRhY2htZW50KSApIHsKICAgICAgICAgICAgQEF0dGFjaG1lbnRMaXN0ID0gQHskQXR0YWNobWVudH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkF0dGFjaG1lbnQgcGFyYW1ldGVyIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgQXR0YWNobWVudCBpbnRlcm5hbCBzdHJ1Y3R1cmUKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJdGVtIChAQXR0YWNobWVudExpc3QpIHsKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnRJdGVtKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+QXR0YWNobWVudCBwYXJhbWV0ZXIgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICV7JEF0dGFjaG1lbnRJdGVtfSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICRBdHRyaWJ1dGUgbmUgJ0hBU0gnICYmIHJlZiAkQXR0cmlidXRlIG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudEl0ZW0tPnskQXR0cmlidXRlfSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50SXRlbS0+eyRBdHRyaWJ1dGV9ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgQXR0YWNobWVudCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50Q2hlY2sgPSAkU2VsZi0+X0NoZWNrQXR0YWNobWVudCggQXR0YWNobWVudCA9PiAkQXR0YWNobWVudEl0ZW0gKTsKCiAgICAgICAgICAgIGlmICggISRBdHRhY2htZW50Q2hlY2stPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoICV7JEF0dGFjaG1lbnRDaGVja30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9Db25maWdJdGVtVXBkYXRlKAogICAgICAgIENvbmZpZ0l0ZW0gICAgICAgICAgPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIEF0dGFjaG1lbnRMaXN0ICAgICAgPT4gXEBBdHRhY2htZW50TGlzdCwKICAgICAgICBSZXBsYWNlRXhpc3RpbmdEYXRhID0+ICRQYXJhbXtEYXRhfS0+e1JlcGxhY2VFeGlzdGluZ0RhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9DbGVhblhNTERhdGEoKQoKcmVtb3ZlZCB0cmFpbGluZyBhbmQgbGVhZGluZyB3aGl0ZSBzcGFjZXMgaW4gdGhlIFhNTERhdGEuCgogICAgbXkgJFhNTERhdGFDbGVhbiA9ICRPcGVyYXRpb25PYmplY3QtPl9DbGVhblhNTERhdGEoCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkFycmF5UmVmLCAgICAgICAgICAjIENvbmZpZyBJdGVtIERlZmluaXRpb24gb3QganVzdCBwYXJ0IG9mIGl0CiAgICAgICAgWE1MRGF0YSAgICA9PiAkWE1MRGF0YUhhc2hSZWYsCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJFhNTERhdGFDbGVhbiA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcnl0aGluZyBpcyBPSwogICAgfQoKICAgICRYTUxEYXRhQ2xlYW4gPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NsZWFuWE1MRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRYTUxEYXRhID0gJFBhcmFte1hNTERhdGF9OwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFhNTERhdGF9ICkgewogICAgICAgIGlmICggcmVmICRYTUxEYXRhLT57JEtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFhNTERhdGEtPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEVsZW1lbnQgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5fQ2xlYW5YTUxEYXRhKCBYTUxEYXRhID0+ICRFbGVtZW50ICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJEVsZW1lbnQgZXEgJycgKSB7CgogICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAkU2VsZi0+X0NsZWFuWE1MRGF0YSggWE1MRGF0YSA9PiAkWE1MRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIG5leHQgS0VZOwoKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCByZWYgJFhNTERhdGEtPnskS2V5fSBlcSAnJyApIHsKCiAgICAgICAgICAgICMgVE9ETzogVXNlIFN0cmluZ0NsZWFuIGZ1bmN0aW9uIQoKICAgICAgICAgICAgI3JlbW92ZSBsZWFkaW5nIHNwYWNlcwogICAgICAgICAgICAkWE1MRGF0YS0+eyRLZXl9ID1+IHN7XEFccyt9e307CgogICAgICAgICAgICAjcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAkWE1MRGF0YS0+eyRLZXl9ID1+IHN7XHMrXHp9e307CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBfQ2hlY2tDb25maWdJdGVtKCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29uZmlnIGl0ZW0gcGFyYW1ldGVycyBhcmUgdmFsaWQuCgogICAgbXkgJENvbmZpZ0l0ZW1DaGVjayA9ICRPcGVyYXRpb25PYmplY3QtPl9DaGVja0NvbmZpZ0l0ZW0oCiAgICAgICAgQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSwgICAgICAgICAgICAgICAgICAjIGFsbCBjb25maWcgaXRlbSBwYXJhbWV0ZXJzCiAgICApOwoKICAgIHJldHVybnM6CgogICAgJENvbmZpZ0l0ZW1DaGVjayA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcnl0aGluZyBpcyBPSwogICAgfQoKICAgICRDb25maWdJdGVtQ2hlY2sgPSB7CiAgICAgICAgRXJyb3JDb2RlICAgID0+ICdGdW5jdGlvbi5FcnJvcicsICAgICAgICAgICAjIGlmIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdFcnJvciBkZXNjcmlwdGlvbicsCiAgICB9Cgo9Y3V0CgpzdWIgX0NoZWNrQ29uZmlnSXRlbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdJdGVtID0gJFBhcmFte0NvbmZpZ0l0ZW19OwoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0gaW50ZXJuYWxseQogICAgZm9yIG15ICROZWVkZWQgKHF3KENsYXNzIE5hbWUgRGVwbFN0YXRlIEluY2lTdGF0ZSBDSVhNTERhdGEpKSB7CiAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+JE5lZWRlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZyEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW0tPkNsYXNzCiAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVDbGFzcyggJXskQ29uZmlnSXRlbX0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvckNvZGUgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkNsYXNzIHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW0tPkRlcGxTdGF0ZQogICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlRGVwbFN0YXRlKCAleyRDb25maWdJdGVtfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+RGVwbFN0YXRlIHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW0tPkRlcGxTdGF0ZQogICAgaWYgKCAhJFNlbGYtPlZhbGlkYXRlSW5jaVN0YXRlKCAleyRDb25maWdJdGVtfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5JbnZhbGlkUGFyYW1ldGVyIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ29uZmlnSXRlbS0+SW5jaVN0YXRlIHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGdldCBsYXN0IGNvbmZpZyBpdGVtIGRlZmludGlvbgogICAgbXkgJERlZmluaXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkU2VsZi0+e1JldmVyc2VDbGFzc0xpc3R9LT57ICRDb25maWdJdGVtLT57Q2xhc3N9IH0sCiAgICApOwoKICAgIG15ICRYTUxEYXRhQ2hlY2tSZXN1bHQgPSAkU2VsZi0+Q2hlY2tYTUxEYXRhKAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgWE1MRGF0YSAgICA9PiAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX0sCiAgICApOwoKICAgIGlmICggISRYTUxEYXRhQ2hlY2tSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICByZXR1cm4gJFhNTERhdGFDaGVja1Jlc3VsdDsKICAgIH0KCiAgICAjIGlmIGV2ZXJ5dGhpbmcgaXMgT0sgdGhlbiByZXR1cm4gU3VjY2VzcwogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9Owp9Cgo9aXRlbSBfQ2hlY2tBdHRhY2htZW50KCkKCmNoZWNrcyBpZiB0aGUgZ2l2ZW4gYXR0YWNobWVudCBwYXJhbWV0ZXIgaXMgdmFsaWQuCgogICAgbXkgJEF0dGFjaG1lbnRDaGVjayA9ICRPcGVyYXRpb25PYmplY3QtPl9DaGVja0F0dGFjaG1lbnQoCiAgICAgICAgQXR0YWNobWVudCA9PiAkQXR0YWNobWVudCwgICAgICAgICAgICAgICAgICAjIGFsbCBhdHRhY2htZW50IHBhcmFtZXRlcnMKICAgICk7CgogICAgcmV0dXJuczoKCiAgICAkQXR0YWNobWVudENoZWNrID0gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBldmVyZXRoaW5nIGlzIE9LCiAgICB9CgogICAgJEF0dGFjaG1lbnRDaGVjayA9IHsKICAgICAgICBFcnJvckNvZGUgICAgPT4gJ0Z1bmN0aW9uLkVycm9yJywgICAgICAgICAgICMgaWYgZXJyb3IKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0Vycm9yIGRlc2NyaXB0aW9uJywKICAgIH0KCj1jdXQKCnN1YiBfQ2hlY2tBdHRhY2htZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEF0dGFjaG1lbnQgPSAkUGFyYW17QXR0YWNobWVudH07CgogICAgIyBjaGVjayBhdHRhY2htZW50IGl0ZW0gaW50ZXJuYWxseQogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbnRlbnQgQ29udGVudFR5cGUgRmlsZW5hbWUpKSB7CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnQtPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdHRhY2htZW50LT4kTmVlZGVkICBwYXJhbWV0ZXIgaXMgbWlzc2luZyEiLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIEFydGljbGUtPkNvbnRlbnRUeXBlCiAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ICkgewoKICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9IGxjICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9OwoKICAgICAgICAjIGNoZWNrIENoYXJzZXQgcGFydAogICAgICAgIG15ICRDaGFyc2V0ID0gJyc7CiAgICAgICAgaWYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvY2hhcnNldD0vaSApIHsKICAgICAgICAgICAgJENoYXJzZXQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKICAgICAgICAgICAgJENoYXJzZXQgPX4gcy8uKz9jaGFyc2V0PSgifCd8KShcdyspLyQyL2dpOwogICAgICAgICAgICAkQ2hhcnNldCA9fiBzLyJ8Jy8vZzsKICAgICAgICAgICAgJENoYXJzZXQgPX4gcy8oLis/KTsuKi8kMS9nOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ2hhcnNldCAmJiAhJFNlbGYtPlZhbGlkYXRlQ2hhcnNldCggQ2hhcnNldCA9PiAkQ2hhcnNldCApICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IEF0dGFjaG1lbnQtPkNvbnRlbnRUeXBlIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgTWltZVR5cGUgcGFydAogICAgICAgIG15ICRNaW1lVHlwZSA9ICcnOwogICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL14oXHcrXC9cdyspL2kgKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICQxOwogICAgICAgICAgICAkTWltZVR5cGUgPX4gcy8ifCcvL2c7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU2VsZi0+VmFsaWRhdGVNaW1lVHlwZSggTWltZVR5cGUgPT4gJE1pbWVUeXBlICkgKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IEF0dGFjaG1lbnQtPkNvbnRlbnRUeXBlIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBldmVyeXRoaW5nIGlzIE9LIHRoZW4gcmV0dXJuIFN1Y2Nlc3MKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfTsKfQoKPWl0ZW0gX0NvbmZpZ0l0ZW1VcGRhdGUoKQoKdXBkYXRlcyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGF0dGFjaG1lbnRzIGlmIHNwZWNpZmllZC4KCiAgICBteSAkUmVzcG9uc2UgPSAkT3BlcmF0aW9uT2JqZWN0LT5fQ29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgID0+IDEyMywKICAgICAgICBDb25maWdJdGVtICAgICAgICAgID0+ICRDb25maWdJdGVtLCAgICAgICAgICAgICAjIGFsbCBjb25maWd1cmF0aW9uIGl0ZW0gcGFyYW1ldGVycwogICAgICAgIEF0dGFjaG1lbnRMaXN0ICAgICAgPT4gJEF0dGFjaG1lbnQsICAgICAgICAgICAgICMgYSBsaXN0IG9mIGFsbCBhdHRhY2htZW50cwogICAgICAgIFJlcGxhY2VFeGlzdGluZ0RhdGEgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGV4aXN0aW5nIHhtbCBhdHRyaWJ1dGVzIGFuZCBhdHRhY2htZW50cyBzaG91bGQgYmUgcmVwbGFjZWQgb3Iga2VwdAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMTIzLAogICAgKTsKCiAgICByZXR1cm5zOgoKICAgICRSZXNwb25zZSA9IHsKICAgICAgICBTdWNjZXNzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgZXZlcmV0aGluZyBpcyBPSwogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICdDTjEyMycsCiAgICAgICAgfQogICAgfQoKICAgICRSZXNwb25zZSA9IHsKICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB1bmV4cGVjdGVkIGVycm9yCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkUGFyYW17RXJyb3JDb2RlfTogJFBhcmFte0Vycm9yTWVzc2FnZX0iLAogICAgfQoKPWN1dAoKc3ViIF9Db25maWdJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ0l0ZW1JRCAgID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICBteSAkQ29uZmlnSXRlbSAgICAgPSAkUGFyYW17Q29uZmlnSXRlbX07CiAgICBteSAkQXR0YWNobWVudExpc3QgPSAkUGFyYW17QXR0YWNobWVudExpc3R9OwoKICAgIG15ICREZXBsU3RhdGVJRCA9ICRTZWxmLT57UmV2ZXJzZURlcGxTdGF0ZUxpc3R9LT57ICRDb25maWdJdGVtLT57RGVwbFN0YXRlfSB9OwogICAgbXkgJEluY2lTdGF0ZUlEID0gJFNlbGYtPntSZXZlcnNlSW5jaVN0YXRlTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGV9IH07CgogICAgbXkgJFJhd1hNTERhdGEgPSAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgZ2V0IGxhc3QgY29uZmlnIGl0ZW0gZGVmaW50aW9uCiAgICBteSAkRGVmaW5pdGlvbkRhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRTZWxmLT57UmV2ZXJzZUNsYXNzTGlzdH0tPnsgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSwKICAgICk7CgogICAgIyByZXBsYWNlIGRhdGUsIGRhdGUgdGltZSwgY3VzdG9tZXIsIGNvbXBhbnkgYW5kIGdlbmVyYWwgY2F0YWxvZyB2YWx1ZXMKICAgIG15ICRSZXBsYWNlZFhNTERhdGEgPSAkU2VsZi0+UmVwbGFjZVhNTERhdGEoCiAgICAgICAgWE1MRGF0YSAgICA9PiAkUmF3WE1MRGF0YSwKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBhbiBYTUxEYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgVmVyc2lvbkFkZAogICAgbXkgJFhNTERhdGEgPSAkU2VsZi0+Rm9ybWF0WE1MRGF0YSgKICAgICAgICBYTUxEYXRhID0+ICRSZXBsYWNlZFhNTERhdGEsCiAgICApOwoKICAgICMgZ2V0IHRoZSBjdXJyZW50IGNvbmZpZyBpdGVtIHZlcnNpb24gZGF0YQogICAgbXkgJEN1cnJlbnRWZXJzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVJRCwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUlELAogICAgICAgIFhNTERhdGEgICAgICA9PiAkWE1MRGF0YSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRWZXJzaW9uSUQgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAnQ29uZmlndXJhdGlvbiBJdGVtIGNvdWxkIG5vdCBiZSB1cGRhdGVkLCBwbGVhc2UgY29udGFjdCB0aGUgc3lzdGVtJwogICAgICAgICAgICAgICAgLiAnYWRtaW5pc3RyYXRvcicKICAgICAgICB9OwogICAgfQoKICAgICMgZ2V0IHRoZSB2ZXJzaW9uIElEIG9mIHRoZSBjb25maWcgaXRlbSBiZWZvcmUgdGhlIHVwZGF0ZQogICAgbXkgJEN1cnJlbnRWZXJzaW9uSUQgPSAkQ3VycmVudFZlcnNpb24tPntWZXJzaW9uSUR9IHx8ICcnOwoKICAgICMgY29tcGFyZSBvbGQgdmVyc2lvbiBhbmQgbmV3IHZlcnNpb24gSURzCiAgICBpZiAoICRDdXJyZW50VmVyc2lvbklEIGVxICRWZXJzaW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntEZWJ1Z2dlck9iamVjdH0tPk5vdGljZSgKICAgICAgICAgICAgU3VtbWFyeSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogTm8gY2hhbmdlIGluIGNvbmZpZ3VyYXRpb24gaXRlbSB2ZXJzaW9uIiwKICAgICAgICAgICAgRGF0YSAgICA9PiAnVGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHdhcyBpbmRlbnRpY2FsIHRvIHRoZSBsYXN0JwogICAgICAgICAgICAgICAgLiAnIG9uZSwgbm8gdXBkYXRlIHdhcyBwZXJmb3JtZWQnLAogICAgICAgICk7CiAgICB9CgogICAgIyB0aGUgUmVwbGFjZUV4aXN0aW5nRGF0YSBmbGFnIGlzIHNldAogICAgaWYgKCAkUGFyYW17UmVwbGFjZUV4aXN0aW5nRGF0YX0gKSB7CgogICAgICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgYXR0YWNobWVudHMKICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICAgICAgRklMRU5BTUU6CiAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoZSBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICREZWxldGlvblN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkRGVsZXRpb25TdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5rbm93biBwcm9ibGVtIHdoZW4gZGVsZXRpbmcgYXR0YWNobWVudCAkRmlsZW5hbWUgb2YgQ29uZmlnSXRlbSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRDb25maWdJdGVtSUQuIFBsZWFzZSBjaGVjayB0aGUgVmlydHVhbEZTIGJhY2tlbmQgZm9yIHN0YWxlIGZpbGVzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGF0dGFjaG1lbnRzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkQXR0YWNobWVudExpc3QpICkgewoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyRBdHRhY2htZW50TGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+Q3JlYXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgICA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0KICAgICAgICAgICAgICAgICAgICB8fCAiQXR0YWNobWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIjsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkRXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBDb25maWdJdGVtIGRhdGEKICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQ29uZmlnSXRlbURhdGEpICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0NvdWxkIG5vdCBnZXQgbmV3IGNvbmZpZ3VyYXRpb24gaXRlbSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnRhY3QgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yJywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTnVtYmVyICAgICAgID0+ICRDb25maWdJdGVtRGF0YS0+e051bWJlcn0sCiAgICAgICAgfSwKICAgIH07Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvQtdC90LjQtSDQvdCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3QuNGC0LUg0LXQtNC40L3QuNGG0LggQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ9Ca0LvQsNGBJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAn0J/QvtGB0LvQtdC00L3QsCDQv9GA0L7QvNGP0L3QsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ9CU0LAg0YLRitGA0YHQuCDQuCDQsiDQv9GA0LXQtNC40YjQvdC40YLQtSDQstC10YDRgdC40Lg/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAn0J/QvtGB0LvQtdC00L3QviDQv9GA0L7QvNC10L3QtdC9INC+0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gVmVyc2lvbiBEZXRhaWxzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAn0JzQvtC00LXQuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAn0KHQtdGA0LjQtdC9INCd0L7QvNC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAn0J/RgNC+0YbQtdGB0L7RgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYW0nfSA9ICfQn9Cw0LzQtdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ9Ci0LLRitGA0LQg0LTQuNGB0LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICfQmtCw0L/QsNGG0LjRgtC10YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAn0JzRgNC10LbQvtCyINCw0LTQsNC/0YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQINC+0YIgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVAg0LDQtNGA0LXRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICfQk9GA0LDRhNC40YfQvdCwINC60LDRgNGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAn0JTRgNGD0LPQviDQvtCx0L7RgNGD0LTQstCw0L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICfQlNCw0YLQsCDQvdCwINC40LfRgtC40YfQsNC90LUg0L3QsCDQs9Cw0YDQsNC90YbQuNGP0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICfQlNCw0YLQsCDQvdCwINC40L3RgdGC0LDQu9Cw0YbQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICfQnNGA0LXQttC+0LIg0LDQtNGA0LXRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ9Cc0LDRgdC60LAg0L3QsCDQv9C+0LTQvNGA0LXQttCw0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn0JPQtdC50YIg0L/RgNC10YXQvtC0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ9Ci0LjQvyDQvdCwINC70LjRhtC10L3Qt9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAn0JvQuNGG0LXQvdC30LXQvSDQutC70Y7Rhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ9Ca0L7Qu9C40YfQtdGB0YLQstC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ9CU0LDRgtCwINC90LAg0LjQt9GC0LjRh9Cw0L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ9Cc0LXQtNC40Y8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICfQmNC30YLQtdC60LvQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ9Cf0L7QtNC00YDRitC20LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ9Cf0LjQu9C+0YIt0LLQvtC00LDRhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAn0J/Qu9Cw0L3QuNGA0LDQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICfQoNC10LzQvtC90YIv0JLRitC30YHRgtCw0L3QvtCy0Y/QstCw0L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAn0JjQt9C70Y/Qt9GK0Lsg0L7RgiDRg9C/0L7RgtGA0LXQsdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ9Cf0YDQtdCz0LvQtdC20LTQsNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rlc3QvUUEnfSA9ICfQotC10YHRgi/QmtCw0YfQtdGB0YLQstC10L0g0LrQvtC90YLRgNC+0LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAn0J/RgNC10L3QvtGB0LjQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAn0J3QsNGB0YLQvtC70LXQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAn0KHRitGA0LLRitGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAn0JTRgNGD0LPQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAn0JzQvtC90LjRgtC+0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ9Cf0YDQuNC90YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ9Ca0L7QvdGG0LXQvdGC0YDQsNGC0L7RgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICfQoNGD0YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiDRgtC+0YfQutCwINC30LAg0LTQvtGB0YLRitC/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ9CjLdCy0L4g0LfQsCDRgdC40LPRg9GA0L3QvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ9CQ0YDRhdC40LLQuNGA0LDRidC+INGDLdCy0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICfQnNC40YjQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAn0JrQu9Cw0LLQuNCw0YLRg9GA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAn0JrQsNC80LXRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ9CR0LjQvNC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICfQnNC+0LTQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnUENNQ0lBINC60LDRgNGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ1VTQiDQo9GB0YLRgNC+0LnRgdGC0LLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfQlNC+0LrQuNC90LMg0YHRgtCw0L3RhtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ9Ch0LrQtdC90LXRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAn0J/QvtGC0YDQtdCx0LjRgtC10LvRgdC60Lgg0L/RgNC40LvQvtC20LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ9Ch0YDQtdC00L3QviDQvdC40LLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICfQodGK0YDQstGK0YDQvdC+INC/0YDQuNC70L7QttC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ9Cf0L7RgtGA0LXQsdC40YLQtdC70YHQutCwINCe0L/QtdGALtGBLdC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAn0YHRitGA0LLRitGA0L3QsCDQntC/0LXRgC7RgS3QvNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICfQkNC00LzQuNC90LjRgdGC0YDQsNGC0LjQstC90LXQvSDQuNC90YHRgtGA0YPQvNC10L3Rgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICfQmtC70LjQtdC90YLRgdC60Lgg0LjQvdGB0YLRgNGD0LzQtdC90YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICfQktCz0YDQsNC00LXQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAn0JXQtNC40L3QuNGH0LXQvSDQu9C40YbQtdC90LcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICfQm9C40YbQtdC90LfQuNGA0LDQvdC1INC30LAg0L/QvtGC0YDQtdCx0LjRgtC10LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ9Cb0LjRhtC10L3Qt9C40YDQsNC90LUg0LfQsCDQv9GA0L7RhtC10YHQvtGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICfQm9C40YbQtdC90LfQuNGA0LDQvdC1INC30LAg0YHRitGA0LLRitGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAn0JvQuNGG0LXQvdC30LjRgNCw0L3QtSDQvdCwINGC0L7Rh9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfQodC/0LXRhtC40LDQu9C90Lgg0L7QsdC10LzQvdC4INC/0YDQvtCz0YDQsNC80LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn0JXQvdGC0YrRgNC/0YDQsNC50YEg0LvQuNGG0LXQvdC3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn0JvQuNGG0LXQvdC3INC30LAg0YDQsNC30YDQsNCx0L7RgtGH0LjRhtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfQlNC10LzQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICfQm9C40YbQtdC90LcsINC+0LPRgNCw0L3QuNGH0LXQvSDQv9C+INCy0YDQtdC80LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICfQkdC10LfQv9C70LDRgtC90L4g0YDQsNC30L/RgNC+0YHRgtGA0LDQvdGP0LLQsNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAn0KHQvtGE0YLRg9C10YAg0YEg0L7RgtCy0L7RgNC10L0g0LrQvtC0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ9Cd0LXQvtCz0YDQsNC90LjRh9C10L0g0LvQuNGG0LXQvdC3JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAn0JDQtNC80LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfQn9Cw0YDQsNC80LXRgtGA0Lgg0LfQsCDQv9GA0LjQvNC10YDQvdC40YLQtSDRgNCw0LfRgNC10YjQuNGC0LXQu9C90Lgg0LPRgNGD0L/QuCDQvtGCINCw0YLRgNC40LHRg9GC0LjRgtC1INC90LAg0L7QsdGJ0LjRjyDQutCw0YLQsNC70L7Qsy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdTcHLDoXZhIEtvbmZpZ3VyYcSNbsOtY2ggUG9sb8W+ZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdLb25maWcuIFBvbG/FvmthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdUxZnDrWRhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0ptw6lubyB0w6l0byBLb25maWcuIFBvbG/Fvmt5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ1N0YXYgTmFzYXplbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnU3RhdiBJbmNpZGVudHUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnTmFzdGF2ZW7DrSBrb250ZXh0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdBa3R1w6FsbsOtIFN0YXYgSW5jaWRlbnR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICdQb3NsZWRuw60gem3Em25hJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnSGxlZGF0IHRha8OpIHYgcMWZZWRjaG96w61jaCB2ZXJ6w61jaD8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0FrdHXDoWxuw60gU3RhdiBOYXNhemVuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAnUG9zbGVkbsOtIHptxJtuYSBvZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogSVRTTSBDb25maWdJdGVtJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgZG9uXCd0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtOiAlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIGNvbmZpZ2l0ZW0gSUQgJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENsYXNzSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFJlc3VsdCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gU2VhcmNoIFJlc3VsdHMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnU3RhdiBOYXNhemVuw60gdMOpdG8gS29uZmlnLiBQb2xvxb5reSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ1N0YXYgSW5jaWRlbnR1IHTDqXRvIEtvbmZpZy4gUG9sb8W+a3knOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTWF4IHBvxI1ldCBqZWRuw6kgUG9sb8W+a3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnU8OpcmlvdsOpIMSMw61zbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnUHJvY2Vzb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnUkFNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ1Bldm7DvSBEaXNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnS2FwYWNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAnU8OtxaVvdsO9IEFkYXB0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgb3ZlciBESENQJ30gPSAnSVAgeiBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdJUCBBZHJlc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnR3JhZmlja8OhIEthcnRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ0ppbsOpIFZ5YmF2ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICdLb25lYyBwbGF0bm9zdGkgesOhcnVreSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICdEYXR1bSBJbnN0YWxhY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1RlbGVmb24gMSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnVGVsZWZvbiAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAnQWRyZXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ1PDrcWlb3bDoSBBZHJlc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdNYXNrYSBQb2Rzw610xJsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJ0dhdGV3YXknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnRHJ1aCBsaWNlbmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnTGljZW7EjW7DrSBLbMOtxI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdNbm/FvnN0dsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ0tvbmVjIFBsYXRub3N0aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ03DqWRpdW0nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICdQcm9wYWRudXTDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ8OaZHLFvmJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnxZjDrWTDrWPDrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnTmFwbMOhbm92w6Fubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdPcHJhdmEvT2Jub3ZlbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICdNaW1vIHByb3Zveic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdQxZllaGxlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9Lb250cm9sYSBrdmFsaXR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhcHRvcCd9ID0gJ01vYmlsbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdTdG9sbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdKaW7DqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnTW9uaXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAnVGlza8Ohcm5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N3aXRjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSb3V0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdQxZnDrXN0dXBvdsO9IEJvZCBXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ0JlenBlxI1ub3N0bsOtIFphxZnDrXplbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdaw6Fsb2hvdsOhY8OtIFphxZnDrXplbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAnTXnFoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXlib2FyZCd9ID0gJ0tsw6F2ZXNuaWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0thbWVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICdCZWFtZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICdNb2RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQSBrYXJ0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnVVNCIFphxZnDrXplbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJ0RvayBTdGFuaWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTa2VuZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdCdWRvdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdwb2RsYcW+w60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ03DrXN0bm9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnUmFjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICdQcmFjb3ZpxaF0xJsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnRmlsacOhbGthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnSVQgUMWZw61zbHXFoWVuc3R2w60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICdXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnVGVsY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ1XFvml2YXRlbHNrw6kgQXBsaWthY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ1N0xZllZG7DrSDDunJvdmXFiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICdTZXJ2ZXJvdsOhIEFwbGlrYWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ1XFvml2YXRlbHNrw70gT3BlcmHEjW7DrSBTeXN0w6ltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1NlcnZlcm92w70gT3BlcmHEjW7DrSBTeXN0w6ltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICdBZG1pbmlzdHJhxI1uw60gbsOhc3Ryb2onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnVcW+aXZhdGVsc2vDvSBOw6FzdHJvaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ1Zlc3RhdsSbbsO9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnSmVkbm9kdWNow6EgTGljZW5jZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ25hIFXFvml2YXRlbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ25hIFByb2Nlc29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICduYSBTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICduYSBVemVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnU3ZhemtvdsOhIExpY2VuY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnUG9kbmlrb3bDoSBMaWNlbmNlICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xpY2VuY2UgVsO9dm9qw6HFmWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RlbW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnxIxhc292xJsgb21lemVuw6EgTGljZW5jZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ0ZyZWV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAnU29mdHdhcmUgcyBPdGV2xZllbsO9bSBLw7NkZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnTmVvbWV6ZW7DoSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ0FkbWluaXN0csOhdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBkZWZpbml0aW9ucyBmb3IgQ29uZmlndXJhdGlvbiBJdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1cGRhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uIE5vdGU6IENsYXNzIGNvbHVtbiBpcyBhbHdheXMgYXZhaWxhYmxlIGlmIGZpbHRlciBcJ0FsbFwnIGlzIHNlbGVjdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiBsaW5rIChuYW1lZCBmcm9tIHRoZSB0aWNrZXQgcGVyc3BlY3RpdmUpIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBza3VwaW55IHBybyBwxZnDrWtsYWQgb3Byw6F2bsSbbsOtIG9iZWNuw71jaCBhdHJpYnV0xa8ga2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdDb25maWcgSXRlbSBzdHlyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnQ29uZmlnIEl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ0tsYXNzZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdOYXZuZXQgcMOlIGRlbm5lIENvbmZpZyBJdGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0RlcGxveW1lbnQgdGlsc3RhbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdJbmNpZGVudCB0aWxzdGFuZCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnTnV2w6ZyZW5kZSBJbmNpZGVudCB0aWxzdGFuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnU2lkc3Qgw6ZuZHJldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1PDuGcgb2dzw6UgaSB0aWRsaWdlcmUgdmVyc2lvbmVyPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnTnV2w6ZyZW5kZSBkZXBsb3ltZW50IHN0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdTaWRzdCDDpm5kcmV0IGFmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gVmVyc2lvbiBEZXRhaWxzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdEZXBsb3ltZW50IHRpbHN0YW5kIGZvciBkZW5uZSBDb25maWcgaXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0luY2lkZW50IHRpbHN0YW5kIGZvciBkZW5uZSBDb25maWcgSXRlbSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYXhpbXVtIGFudGFsIGFmIGV0IGVsZW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnU2VyaWVudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdIYXJkZGlzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJ0thcGFjaXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdOZXRrb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIHZpYSBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdJUCBhZHJlc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ0dyYWZpa2tvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAnQW5kZXQgdWRzdHlyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ1VkbMO4YnNkYXRvIGZvciBnYXJhbnRpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ0luc3RhbGxhdGlvbnNkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICdUZWxlZm9uIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVmb24gMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FkcmVzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAnTmV0dsOmcmtzYWRyZXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ1N1Ym5ldCBtYXNrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2F0ZXdheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdMaWNlbnN0eXBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnTGljZW5zbsO4Z2xlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnTcOmbmdkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdVZGzDuGJzZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGllJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnVWRsw7hiZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICdWZWRsaWdlaG9sZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQaWxvdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnUGxhbmxhZ3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnUmVwZXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnUGVyc2lvbmVyZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnQW5tZWxkZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdMYXB0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ0Rlc2t0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ0FuZGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdQcmludGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N3aXRjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSb3V0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdXTEFOIEFjY2VzcyBQb2ludCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWN1cml0eSBEZXZpY2UnfSA9ICdTaWtrZXJoZWRzZW5oZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ0JhY2t1cCBlbmhlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ011cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXlib2FyZCd9ID0gJ1Rhc3RhdHVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0thbWVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICdCZWFtZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICdNb2RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQSBrb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0IgZW5oZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnRG9ja2luZyBTdGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTa2FubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnQnlnbmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ0V0YWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ1JhY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnQXJiZWpkc3BsYWRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ1N0aWtrb250YWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnSVQgZmFjaWxpdGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdLbGllbnQgYXBsaWthdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnTWlkZGxld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICdTZXJ2ZXIgYXBsaWthdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdLbGllbnQgT1MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAnU2VydmVyIE9TJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICdBZG1pbiB2w6Zya3TDuGplcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICdCcnVnZXIgdsOmcmt0w7hqZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdFbWJlZGRlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ0Vua2VsdGxpY2Vucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ1ByIGJydWdlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUHIgcHJvY2Vzc29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICdQciBzZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICdQciBub2RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnVm9sdW1lbiBMaWNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnRW50ZXJwcmlzZSBsaWNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICdVZHZpa2xlciBsaWNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RlbW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnVGlkc2JlZ3LDpm5zZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ09wZW4gU291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ1VuYmVncsOmbnNldCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdDb25maWcgSXRlbSBWZXJ3YWx0dW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnS2xhc3Nlbi1EZWZpbml0aW9uIMOkbmRlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICdDb25maWdJdGVtIEtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pdGlvbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdDb25maWcgSXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICdGaWx0ZXIgZsO8ciBLbGFzc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ1fDpGhsZW4gU2llIGVpbmUgS2xhc3NlIGF1cyBkZXIgTGlzdGUgYXVzIHVtIGVpbiBuZXVlcyBDb25maWcgSXRlbSB6dSBlcnN0ZWxsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnS2xhc3NlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnSVRTTSBDb25maWdJdGVtIFNhbW1lbC1Ba3Rpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJ1ZlcndlbmR1bmdzc3RhdHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnVm9yZmFsbHNzdGF0dXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnWnUgZWluZW0gYW5kZXJlbiB2ZXJsaW5rZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISd9ID0gJ1VuZ8O8bHRpZ2UgQ29uZmlndXJhdGlvbiBJdGVtIE51bW1lciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnRGllIE51bW1lciBkZXMgenUgdmVybGlua2VuZGVuIENvbmZpZ0l0ZW1zLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ1dvbGxlbiBTaWUgZGllc2VzIENvbmZpZ2l0ZW0gd2lya2xpY2ggbMO2c2NoZW4/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0RlciBOYW1lIGRpZXNlcyBDb25maWcgSXRlbXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ05hbWUgd2lyZCBiZXJlaXRzIHZvbiBkZW4gQ29uZmlnSXRlbXMgbWl0IGRlbiBmb2xnZW5kZW4gTnVtbWVybiB2ZXJ3ZW5kZXQ6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdWZXJ3ZW5kdW5nc3N0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBTdGF0ZSd9ID0gJ1ZvcmZhbGxzc3RhdHVzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ0tvbnRleHQtRWludHN0ZWxsdW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnQ29uZmlnIEl0ZW1zIHBybyBTZWl0ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICdWZXJ3ZW5kdW5nc3N0YXR1cy1UeXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ID0gJ0FrdHVlbGxlciBWb3JmYWxsc3N0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdBa3R1ZWxsZXIgVm9yZmFsbHNzdGF0dXMtVHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1p1bGV0enQgZ2XDpG5kZXJ0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnTmV1ZSBWb3JsYWdlIGVyc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnU3VjaGUgYXVzZsO8aHJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICdBdWNoIGluIGZyw7xoZXJlbiBWZXJzaW9uZW4gc3VjaGVuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ0NvbmZpZ3VyYXRpb24gSXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICdDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnQWt0dWVsbGVyIFZlcndlbmR1bmdzc3RhdHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ1p1bGV0enQgZ2XDpG5kZXJ0IHZvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdaZWlnZSBudXIgZWluZSBWZXJzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAnWmVpZ2UgYWxsZSBWZXJzaW9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ1ZlcnNpb25zLVZvcmZhbGxzdGF0dXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnVmVyc2lvbnNudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9ucy1EZXRhaWxzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnRWlnZW5zY2hhZnQnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICdDb25maWdJdGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ0tlaW4gRXJnZWJuaXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnU3VjaGVyZ2VibmlzZSBmaWx0ZXJuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0RlciBWZXJ3ZW5kdW5nc3N0YXR1cyBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRGVyIFZvcmZhbGxzc3RhdHVzIGRpZXNlcyBDb25maWcgSXRlbXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTWF4aW1hbGUgQW56YWhsIGVpbmVzIEVsZW1lbnRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ0xlZXJlIEZlbGRlciBiZWxhc3NlbiBkZW4gYWt0dWVsbGVuIFdlcnQnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdTZXJpZW5udW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ0FyYmVpdHNzcGVpY2hlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdGZXN0cGxhdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnS2FwYXppdMOkdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdOZXR6d2VyayBBZGFwdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIMO8YmVyIERIQ1AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgQWRkcmVzcyd9ID0gJ0lQIEFkZHJlc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ0dyYWZpayBBZGFwdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ1NvbnN0aWdlIEF1c3N0YXR0dW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ0dhcmFudGllIEFibGF1ZmRhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ0luc3RhbGxhdGlvbnNkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnVGVsZWZvbiAxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICdUZWxlZm9uIDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnRS1NYWlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICdBZHJlc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ05ldHp3ZXJrIEFkcmVzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuZXR6IE1hc2tlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICdHYXRld2F5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ0xpemVuenR5cCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ0xpemVuenNjaGzDvHNzZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdNZW5nZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdBYmxhdWZkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGl1bSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnQ29tcHV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICdIYXJkd2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnTmV0endlcmsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICdTb2Z0d2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnQWJnZWxhdWZlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ0luIFdhcnR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQaWxvdGJldHJpZWInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ0dlcGxhbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnSW4gUmVwYXJhdHVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICdBdcOfZXIgRGllbnN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ1VudGVyIFJldmlldyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9RUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdMYXB0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ0Rlc2t0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ1NvbnN0aWdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnTW9uaXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAnRHJ1Y2tlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICdTd2l0Y2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAnUm91dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiBBY2Nlc3MgUG9pbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnU2ljaGVyaGVpdHNnZXLDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ0JhY2t1cCBHZXLDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdNYXVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnVGFzdGF0dXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnS2FtZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ0JlYW1lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ01vZGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnUENNQ0lBIEthcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0IgR2Vyw6R0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJ0RvY2tpbmcgU3RhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAnU2Nhbm5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ0dlYsOkdWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnRXRhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ1JhdW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ1JhY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnQXJiZWl0c3BsYXR6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ0Fuc2NobHVzc2Rvc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdJVCBFaW5yaWNodHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxrbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnQ2xpZW50IEFud2VuZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnTWlkZGxld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICdTZXJ2ZXIgQW53ZW5kdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ0NsaWVudCBCZXRyaWVic3N5c3RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdTZXJ2ZXIgQmV0cmllYnNzeXN0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ0FkbWluIFRvb2wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnVXNlciBUb29sJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnRW1iZWRkZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICdFaW56ZWxsaXplbnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICdQcm8gQmVudXR6ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1BybyBQcm96ZXNzb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJ1BybyBTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICdQcm8gS25vdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnVm9sdW1lbiBMaXplbnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnRW50ZXJwcmlzZSBMaXplbnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICdFbnR3aWNrbGVyIExpemVueic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAnRGVtbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICdaZWl0bGljaCBiZWdyZW56dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ0ZyZWV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAnT3BlbiBTb3VyY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnVW5saW1pdGllcnQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJ1Byw7xmZSBOYW1lbiBhdWYgRWluZGV1dGlna2VpdCBpbm5lcmhhbGIgZGVyIHNlbGJlbiBDb25maWdJdGVtLUtsYXNzZSBvZGVyIGdsb2JhbCwgZC5oLiBlcyB3ZXJkZW4gYWxsZSBDb25maWdJdGVtcyBqZWdsaWNoZXIgQ29uZmlnSXRlbS1LbGFzc2UgYmVpIGRlciBQcsO8ZnVuZyBhdWYgZWluZW4gZWluZGV1dGlnZW4gTmFtZW4gYmVyw7xja3NpY2h0aWd0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdDb25maWcgSXRlbXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJ0NvbmZpZyBJdGVtIGhpbnp1ZsO8Z2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJ0NvbmZpZyBJdGVtIGJlYXJiZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICdDb25maWcgSXRlbSBWZXJsYXVmLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICdDb25maWcgSXRlbSBkcnVja2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJ0NvbmZpZyBJdGVtIFpvb20uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkYXMgU3RhbmRhcmQtU3Vib2JqZWN0IGRlciBLbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnRGVha3RpdmllcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdBa3RpdmllcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyhEZS0pQWt0aXZpZXJ0IGRpZSBGdW5rdGlvbmFsaXTDpHQgdW0gQ29uZmlnSXRlbXMgYXVmIGVpbmRldXRpZ2UgTmFtZW4genUgw7xiZXJwcsO8ZmVuLiBCZXZvciBTaWUgZGllc2UgT3B0aW9uIGFrdGl2aWVyZW4sIHNvbGx0ZW4gU2llIElociBTeXN0ZW0gYXVmIGJlcmVpdHMgdm9yaGFuZGVuZSBDb25maWdJdGVtcyBtaXQgZ2xlaWNoZW0gTmFtZW4gw7xiZXJwcsO8ZmVuLiBTaWUga8O2bm5lbiBkaWVzIG1pdCBIaWxmZSBkZXMgc2NyaXB0cyBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsIHR1bi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ09iamVrdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ8OcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciBmw7xyIGRpZSB6dWdyaWZmc2JlcmVjaHRpZ3RlIEdydXBwZSBkZXIgR2VuZXJhbC1LYXRhbG9nLUF0dHJpYnV0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnU3VjaGUgY29uZmlnIGl0ZW1zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3RzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuICJBdXRvSW5jcmVtZW50IiBpbmNyZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBpbmNpZGVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY29uZmlnIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZWRpdCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIGNvbmZpZyBpdGVtIGhpc3RvcnkgKHJldmVyc2Ugb3JkZXJlZCkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnS2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2dsb2JhbCd9ID0gJ0dsb2JhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwb3N0cHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmVwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Byb2R1Y3RpdmUnfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpDb25maWdJdGVtQ3JlYXRlJ30gICAgICAgICAgICA9ICdOZXcgQ29uZmlnSXRlbSAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6VmVyc2lvbkNyZWF0ZSd9ICAgICAgICAgICAgICAgPSAnTmV3IHZlcnNpb24gKElEPSVzKSc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkRlcGxveW1lbnRTdGF0ZVVwZGF0ZSd9ICAgICAgID0gJ0RlcGxveW1lbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6SW5jaWRlbnRTdGF0ZVVwZGF0ZSd9ICAgICAgICAgPSAnSW5jaWRlbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6Q29uZmlnSXRlbURlbGV0ZSd9ICAgICAgICAgICAgPSAnQ29uZmlnSXRlbSAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpMaW5rQWRkJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaW5rIHRvICVzICh0eXBlPSVzKSBhZGRlZCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkxpbmtEZWxldGUnfSAgICAgICAgICAgICAgICAgID0gJ0xpbmsgdG8gJXMgKHR5cGU9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpEZWZpbml0aW9uVXBkYXRlJ30gICAgICAgICAgICA9ICdDb25maWdJdGVtc1wnIGRlZmluaXRpb24gdXBkYXRlZCAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6TmFtZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnTmFtZSB1cGRhdGVkIChuZXc9JXM7IG9sZD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWYWx1ZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdBdHRyaWJ1dGUgJXMgdXBkYXRlZCBmcm9tICIlcyIgdG8gIiVzIic7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OlZlcnNpb25EZWxldGUnfSAgICAgICAgICAgICAgID0gJ1ZlcnNpb24gJXMgZGVsZXRlZCc7CgogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdEZXZlbG9wZXIgTGljZW5zZSc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJ0VudGVycHJpc2UgTGljZW5zZSc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NpbmdsZSBMaWNlbnNlJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lIExpY2Vuc2UnOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIFR5cGUnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIEtleSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ0xpY2Vuc2UgS2V5OjpRdWFudGl0eSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ0xpY2Vuc2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0NBX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VyaWFsIE51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgb3ZlciBESENQJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdMaWNlbnNlIFR5cGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICdMaWNlbnNlIEtleSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICcnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnS2V5Ym9hcmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ1NpbmdsZSBMaWNlbnNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ1ZvbHVtZSBMaWNlbnNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVycHJpc2UgTGljZW5jZSd9ID0gJ0VudGVycHJpc2UgTGljZW5zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0RldmVsb3BlciBMaWNlbnNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0dCX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ0NvbnRleHQgU2V0dGluZ3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICdMYXN0IGNoYW5nZWQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBOZXcgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVuIFNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdMYXN0IGNoYW5nZWQgYnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnTm8gUmVzdWx0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhcHRvcCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdLZXlib2FyZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBkZWZpbml0aW9ucyBmb3IgQ29uZmlndXJhdGlvbiBJdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1cGRhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uIE5vdGU6IENsYXNzIGNvbHVtbiBpcyBhbHdheXMgYXZhaWxhYmxlIGlmIGZpbHRlciBcJ0FsbFwnIGlzIHNlbGVjdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiBsaW5rIChuYW1lZCBmcm9tIHRoZSB0aWNrZXQgcGVyc3BlY3RpdmUpIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHpvb20gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgaGlzdG9yeSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byB6b29tIGludG8gYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjb25maWcgaXRlbSBoaXN0b3J5IChyZXZlcnNlIG9yZGVyZWQpIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLCBlLmcuIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jLiBUaGUgZGVmYXVsdCBpcyBDb25maWdJdGVtIy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncG9zdHByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJlcHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcm9kdWN0aXZlJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBFbGVtZW50b3MgZGUgQ29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICdDYW1iaWFyIGRlZmluaWNpw7NuIGRlIGxhIENsYXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnQ2xhc2UgZGUgZWxlbWVudG8gZGUgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ0RlZmluaWNpw7NuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQWRkCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSd9ID0gJ0VsZW1lbnRvIGRlIENvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJ0ZpbHRybyBwYXJhIENsYXNlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICdTZWxlY2Npb25lIHVuYSBDbGFzZSBkZSBsYSBsaXN0YSBwYXJhIGNyZWFyIHVuIG51ZXZvIEl0ZW0gZGUgQ29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdDbGFzZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnRXN0YWRvIGRlIGRlc3BsaWVndWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICdFc3RhZG8gZGVsIGluY2lkZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICdFbmxhemFyIGNvbiBvdHJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICfCoU7Dum1lcm8gZGUgw410ZW0gZGUgQ29uZmlndXJhY2nDs24gbm8gdmFsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICdFbCBuw7ptZXJvIGRlIG90cm8gZWxlbWVudG8gZGUgY29uZmlndXJhY2nDs24gY29uIGVsIHF1ZSB2aW5jdWxhci4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBjb25maWcgaXRlbT8nfSA9ICfCv1JlYWxtZW50ZSBkZXNlYSBlbGltaW5hciBlc3RlIGVsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpw7NuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdFbCBub21icmUgZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAnRWwgbm9tYnJlIHlhIGVzdGEgZW4gdXNvIHBvciDDjXRlbXMgZGUgQ29uZmlndXJhY2nDs24gY29uIGxvcyBzaWd1aWVudGVzIG7Dum1lcm8ocyk6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgbGEgSW1wbGVtZW50YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlbCBJbmNpZGVudGUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJ0hpc3RvcmlhbCBkZWwgRWxlbWVudG8gZGUgY29uZmlndXJhY2nDs246ICVzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdBanVzdGVzIGRlIENvbnRleHRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0NJcyBwb3IgcMOhZ2luYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJ1VuYSB0YWJsYSBnZW7DqXJpY2EgZGUgw610ZW1zIGRlIGNvbmZpZ3VyYWNpw7NuIGRlIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnVGlwbyBkZSBlc3RhZG8gZGUgaW1wbGVtZW50YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gQWN0dWFsIGRlbCBJbmNpZGVudGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ8OabHRpbWEgbW9kaWZpY2FjacOzbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ0NyZWFyIG51ZXZhIHBsYW50aWxsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnRWplY3V0YXIgbGEgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ8K/RGVzZWEgYnVzY2FyIGVuIHZlcnNpb25lcyBhbnRlcmlvcmVzPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ0VsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBkZWwgZWxlbWVudG8gZGUgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnRXN0YWRvIEFjdHVhbCBkZSBsYSBJbXBsZW1lbnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAnw5psdGltYSBtb2RpZmljYWNpw7NuIHBvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdNb3N0cmFyIHVuYSB2ZXJzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ01vc3RyYXIgdG9kYXMgbGFzIHZlcnNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlbCBpbmNpZGVudGUgZGUgbGEgdmVyc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIGxhIHZlcnNpw7NuIGRlIGltcGxlbWVudGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJ07Dum1lcm8gZGUgdmVyc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ1Byb3BpZWRhZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogSVRTTSBDb25maWdJdGVtJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgZG9uXCd0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtOiAlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIGNvbmZpZ2l0ZW0gSUQgJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAnaW1wcmVzbyBwb3IgJXMgZW4gJXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ8KhU2luIHJlc3VsdGFkb3MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0VsIGVzdGFkbyBkZSBpbXBsZW1lbnRhY2nDs24gZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0VsIGVzdGFkbyBkZSBlc3RlIGVsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpw7NuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ07Dum1lcm8gbcOheGltbyBkZSB1biBlbGVtZW50byAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnTG9zIGNhbXBvcyB2YWPDrW9zIGluZGljYW4gcXVlIGxvcyB2YWxvcmVzIGFjdHVhbGVzIHNlIG1hbnRpZW5lbic7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAnTW9kZWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdOw7ptZXJvIFNlcmlhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICdDUFUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnUkFNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ0Rpc2NvIER1cm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdDYXBhY2lkYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAnQWRhcHRhZG9yIGRlIFJlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCBzb2JyZSBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdEaXJlY2Npw7NuIElQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ1RhcmpldGEgR3LDoWZpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAnT3RybyBFcXVpcG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnRmVjaGEgZGUgRXhwaXJhY2nDs24gZGUgbGEgR2FyYW50w61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ0ZlY2hhIGRlIEluc3RhbGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnVGVsw6lmb25vIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbMOpZm9ubyAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJ0UtTWFpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAnRGlyZWNjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdEaXJlY2Npw7NuIGRlIFJlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ03DoXNjYXJhIGRlIFN1YnJlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnUHVlcnRhIGRlIGVubGFjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdUaXBvIGRlIExpY2VuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnQ2xhdmUgZGUgTGljZW5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdDYW50aWRhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdGZWNoYSBkZSBFeHBpcmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICdPcmRlbmFkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICdIYXJkd2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnUmVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnU29mdHdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJ0V4cGlyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAnTWFudGVuaW1pZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ1BpbG90byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnUGxhbmlmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnUmVwYXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1JldGlyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ1JldmlzYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rlc3QvUUEnfSA9ICdQcnVlYmEgLyBDb250cm9sIGRlIGNhbGlkYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnT3JkZW5hZG9yIHBvcnTDoXRpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAnRXNjcml0b3Jpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdBZ2VuZGEgUGVyc29uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAnU2Vydmlkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdPdHJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdJbXByZXNvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAnU3dpdGNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ0VucnV0YWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1B1bnRvIGRlIEFjY2VzbyBXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ0Rpc3Bvc2l0aXZvIGRlIFNlZ3VyaWRhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gZGUgUmVzcGFsZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdSYXTDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdUZWNsYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0PDoW1hcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnUHJveWVjdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTcOzZGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnVGFyamV0YSBQQ01DSUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ0Rpc3Bvc2l0aXZvIFVTQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICdFc3RhY2nDs24gZGUgYWNvcGxhbWllbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdFc2PDoW5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ0VkaWZpY2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnUGlzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnSGFiaXRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ1JhY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnTHVnYXIgZGUgdHJhYmFqbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICdPdXRsZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdJbnN0YWxhY2lvbmVzIGRlIFRJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ0NvbmZlcmVuY2lhIHRlbGVmw7NuaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdBcGxpY2FjacOzbiBDbGllbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ0FwbGljYWNpw7NuIFNlcnZpZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ1Npc3RlbWEgT3BlcmF0aXZvIGRlbCBDbGllbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1Npc3RlbWEgb3BlcmF0aXZvIGRlbCBTZXJ2aWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnSGVycmFtaWVudGEgZGUgQWRtaW5pc3RyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ0hlcnJhbWllbnRhIGRlIFVzdWFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdFbWJlYmlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ0xpY2VuY2lhIMOabmljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ1BvciBVc3VhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICdQb3IgUHJvY2VzYWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUG9yIFNlcnZpZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAnUG9yIE5vZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICdMaWNlbmNpYSBwb3IgVm9sdW1lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMaWNlbmNpYSBDb3Jwb3JhdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xpY2VuY2lhIGRlIERlc2Fycm9sbGFkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RlbW9zdHJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnVGllbXBvIFJlc3RyaW5naWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnRnJlZXdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICdDw7NkaWdvIEFiaWVydG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnSWxpbWl0YWRhJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvIGRlIGVsZW1lbnRvcyBkZSBjb25maWd1cmFjacOzbiBxdWUgaGFiaWxpdGEgZWwgYWNjZXNvIGEgbGEgaGlzdG9yaWEgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnTMOtbWl0ZSBkZSBFbGVtZW50b3MgZGUgQ29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUm91dGVyIGJhY2tlbmQgZGUgYsO6c3F1ZWRhIGRlIGVsZW1lbnRvcyBkZSBjb25maWd1cmFjacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnQ3JlYSB5IGdlc3Rpb25hIGxhcyBkZWZpbmljaW9uZXMgZGUgbG9zIGVsZW1lbnRvcyBkZSBjb25maWd1cmFjacOzbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJ0RlZmluaXIgYWNjaW9uZXMgZG9uZGUgZXN0w6EgZGlzcG9uaWJsZSB1biBib3TDs24gZGUgY29uZmlndXJhY2nDs24gZW4gZWwgd2lkZ2V0IGRlIG9iamV0b3MgdmluY3VsYWRvcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBUZW5nYSBlbiBjdWVudGEgcXVlIGVzdGFzIGFjY2lvbmVzIGRlYmVuIGhhYmVyIHJlZ2lzdHJhZG8gbG9zIHNpZ3VpZW50ZXMgYXJjaGl2b3MgSlMgeSBDU1M6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIHkgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnRGVmaW5pciBlbCBncnVwbyBjb24gcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1cGRhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHN1Ym9iamV0byBwb3IgZGVmYXVsdCBkZSBsYSBjbGFzZSBcJ0lUU01Db25maWdJdGVtXCcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uIE5vdGU6IENsYXNzIGNvbHVtbiBpcyBhbHdheXMgYXZhaWxhYmxlIGlmIGZpbHRlciBcJ0FsbFwnIGlzIHNlbGVjdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiBsaW5rIChuYW1lZCBmcm9tIHRoZSB0aWNrZXQgcGVyc3BlY3RpdmUpIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJ0Rlc2hhYmlsaXRhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdIYWJpbGl0YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnTcOzZHVsbyBwYXJhIHZlcmlmaWNhciBlbCBncnVwbyByZXNwb25zYWJsZSBkZSB1bmEgY2xhc2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnTcOzZHVsbyBwYXJhIHZlcmlmaWNhciBlbCBncnVwbyByZXNwb25zYWJsZSBkZSB1biBlbGVtZW50byBkZSBjb25maWd1cmFjacOzbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICdNw7NkdWxvIHBhcmEgZ2VuZXJhciBlc3RhZMOtc3RpY2FzIGRlIGxvcyBlbGVtZW50b3MgZGUgY29uZmlndXJhY2nDs24gSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnUmVnaXN0cm8gZGVsIG3Ds2R1bG8gZGUgb2JqZXRvIGJhY2tlbmQgcGFyYSBlbCBtw7NkdWxvIGRlIGltcG9ydGFjacOzbi9leHBvcnRhY2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ1Zpc3RhIGdlbmVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGFyw6FtZXRyb3MgcGFyYSBsb3MgZXN0YWRvcyBkZSBpbXBsZW1lbnRhY2nDs24gZW4gbGEgdmlzdGEgZGUgcHJlZmVyZW5jaWFzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcsOhbWV0cm9zIHBhcmEgbG9zIHBlcm1pc29zIGRlIGVqZW1wbG8gZGUgbG9zIGF0cmlidXRvcyBkZWwgY2F0w6Fsb2dvIGdlbmVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ1BhcsOhbWV0cm9zIHBhcmEgbGFzIHDDoWdpbmFzIChkb25kZSBzZSBtdWVzdHJhbiBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgbmVjZXNhcmlvcyBwYXJhIHVzYXIgbGEgdmVudGFuYSBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgbmVjZXNhcmlvcyBwYXJhIHVzYXIgbGEgdmVudGFuYSBkZSBiw7pzcXVlZGEgZGUgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgZGV0YWxsZSBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgbmVjZXNhcmlvcyBwYXJhIHVzYXIgbGEgdmVudGFuYSBwYXJhIGFncmVnYXIgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgZWRpY2nDs24gZGUgbG9zIGVsZW1lbnRvcyBkZSBjb25maWd1cmFjacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyBuZWNlc2FyaW9zIHBhcmEgdXNhciBsYSB2ZW50YW5hIGRlIGhpc3RvcmlhbCBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyBuZWNlc2FyaW9zIHBhcmEgdXNhciBsYSB2ZW50YW5hIGRlIGltcHJlc2nDs24gZGUgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICdQcml2aWxlZ2lvcyBuZWNlc2FyaW9zIHBhcmEgZWxpbWluYXIgbG9zIGVsZW1lbnRvcyBkZSBjb25maWd1cmFjacOzbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnU2VsZWNjaW9uYSBlbCBtw7NkdWxvIGdlbmVyYWRvciBkZSBuw7ptZXJvcyBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuLiAiQXV0b0luY3JlbWVudGFyIiBpbmNyZW1lbnRhIGVsIG7Dum1lcm8gZGVsIGVsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpw7NuOyBlbCBTeXN0ZW1JRCwgZWwgQ29uZmlnSXRlbUNsYXNzSUQgeSBlbCBjb250YWRvciBzb24gdXNhZG9zLiBFbCBmb3JtYXRvIGVzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgcG9yIGVqZW1wbG86IDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSB1biBsaW5rIGVuIGVsIG1lbsO6IHBhcmEgdmluY3VsYXIgdW4gZWxlbWVudG8gZGUgY29uZmlndXJhY2nDs24gY29uIG90cm8gb2JqZXRvLCBlbiBsYSB2aXN0YSBkZXRhbGxhZGEgZGUgZGljaG8gZWxlbWVudG8gZGUgY29uZmlndXJhY2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSB1biBsaW5rIGVuIGVsIG1lbsO6IHBhcmEgYWNjZWRlciBhIGxhIGhpc3RvcmlhIGRlIHVuIGVsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpb24gZW4gc3UgdmlzdGEgZGV0YWxsYWRhLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIHVuIGxpbmsgZW4gZWwgbWVuw7ogcGFyYSBkdXBsaWNhciB1biBlbGVtZW50byBkZSBjb25maWd1cmFjaW9uIGVuIHN1IHZpc3RhIGRldGFsbGFkYSwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW4gbGluayBlbiBlbCBtZW7DuiBwYXJhIGVkaXRhciB1biBlbGVtZW50byBkZSBjb25maWd1cmFjaW9uIGVuIHN1IHZpc3RhIGRldGFsbGFkYSwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW4gbGluayBlbiBlbCBtZW7DuiBwYXJhIGltcHJpbWlyIHVuIGVsZW1lbnRvIGRlIGNvbmZpZ3VyYWNpb24gZW4gc3UgdmlzdGEgZGV0YWxsYWRhLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSBsYSBoaXN0b3JpYSBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNpw7NuIChvcmRlbmFkb3MgaW52ZXJzYW1lbnRlKSBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnY2xhc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnZ2xvYmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2KogQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICfYqti624zbjNixINiq2LnYsduM2YEg2qnZhNin2LMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ9iq2LnYsduM2YEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAn2KLbjNiq2YUg2b7bjNqp2LHYqNmG2K/bjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICfZgduM2YTYqtixINio2LHYp9uMINqp2YTYp9iz4oCM2YfYpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICfaqdmE2KfYs9uMINix2Kcg2KjYsdin24wg2LPYp9iu2Kog24zaqSDYotuM2KrZhSDZvtio2qnYsdio2YbYr9uMINis2K/bjNivINin2YbYqtiu2Kcg2qnZhtuM2K8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAn2qnZhNin2LMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBjb25maWcgaXRlbT8nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAn2YbYp9mFINin24zZhiDYotuM2KrZheKAjNmH2KfbjCDZvtuM2qnYsdio2YbYr9uMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ9mI2LbYuduM2Kog2YbYtdioJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAn2YjYtti524zYqiDYsdiu2K/Yp9ivJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ9iq2YbYuNuM2YXYp9iqINmF2YHYp9ivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ9iq2LnYr9in2K8g2KLbjNiq2YXigIzZh9in24wg2b7bjNqp2LHYqNmG2K/bjCDYr9ixINmH2LEg2LXZgdit2YcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAn2YbZiNi5INmI2LbYuduM2Kog2YbYtdioJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICfZiNi22LnbjNiqINis2KfYsduMINix2K7Yr9in2K8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAn2YbZiNi5INmI2LbYuduM2Kog2KzYp9ix24wg2LHYrtiv2KfYryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICfYotiu2LHbjNmGINiq2LrbjNuM2LEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBOZXcgVGVtcGxhdGUnfSA9ICfYs9in2K7YqtmGINmC2KfZhNioINis2K/bjNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAn2K/YsSDZiNuM2LHYp9uM2LTigIzZh9in24wg2YLYqNmE24wg2YfZhSDYrNiz2KrYrNmIINin2YbYrNin2YUg2LTZiNiv2J8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfYotuM2KrZhSDZvtuM2qnYsdio2YbYr9uMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSA9ICfZiNi22LnbjNiqINmB2LnZhNuMINmG2LXYqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICfYotiu2LHbjNmGINiq2LrbjNuM2LEg2KjZhyDZiNiz24zZhNmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAn2KrYp9uM24zYryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAn2YbZhdin24zYtCDbjNqpINmG2LPYrtmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn2YbZhdin24zYtCDYqtmF2KfZhSDZhtiz2K7Zh+KAjNmH2KcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ9mI2LbYuduM2Kog2LHYrtiv2KfYryDZhtiz2K7Zhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICfYtNmF2KfYsdmHINmG2LPYrtmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICfYrNiy2KbbjNin2Kog2YbYs9iu2Ycg2KLbjNiq2YUg2b7bjNqp2LHYqNmG2K/bjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ9mI24zamNqv24wnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfYotuM2KrZhSDZvtuM2qnYsdio2YbYr9uMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfZiNi22LnbjNiqINmG2LXYqCDYp9uM2YYgQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfZiNi22LnbjNiqINix2K7Yr9in2K8g2KfbjNmGIENJJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ9it2K/Yp9qp2KvYsSDYtNmF2KfYsdmHINuM2qkg2LnZhti12LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAn2YHbjNmE2K/Zh9in24wg2K7Yp9mE24wg2YXYtNiu2LUg2YXbjOKAjNqp2YbYryDaqdmHINmF2YLYp9iv24zYsSDaqdmG2YjZhtuMINio2KfZgtuMINiu2YjYp9mH2YbYryDZhdin2YbYryc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAn2YXYr9mEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICfYtNmF2KfYsdmHINiz2LHbjNin2YQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAn2LPbjOKAjNm+24zigIzbjNmIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ9ix2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZCBEaXNrJ30gPSAn2YfYp9ix2K8g2K/bjNiz2qknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICfYuNix2YHbjNiqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ9qp2KfYsdiqINi02KjaqdmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQINin2LIg2LfYsduM2YIgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAn2KLYr9ix2LMgSVAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAn2qnYp9ix2Kog2q/Ysdin2YHbjNqpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ9iq2KzZh9uM2LLYp9iqINmF2KrZgdix2YLZhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINin2YbZgti22KfbjCDYttmF2KfZhtiq4oCM2YbYp9mF2YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAn2KrYp9ix24zYriDZhti12KgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ9iq2YTZgdmGINuxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICfYqtmE2YHZhiDbsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ9mG2LTYp9mG24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAn2KLYr9ix2LMg2LTYqNqp2YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuZXQgTWFzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2F0ZXdheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICfZhtmI2Lkg2KfYrNin2LLZh+KAjNmG2KfZhdmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAn2qnZhNuM2K8g2KfYrNin2LLZh+KAjNmG2KfZhdmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAn2KrYudiv2KfYryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINin2YbZgti22KcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICfYsdiz2KfZhtmHJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAn2YXZhtmC2LbbjCDYtNiv2YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICfZvti02KrbjNio2KfZhtuMINmIINmG2q/Zh9iv2KfYsduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAn2YbZhdmI2YbZhyDYotiy2YXYp9uM2LTbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAn2KjYsdmG2KfZhdmHINix24zYstuMINi02K/Zhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICfYqti52YXbjNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICfYqNin2LLZhti02LPYqtmHINi02K/Zhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICfYqNin2LLYqNuM2YbbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAn2KrYs9iqL9iq2LbZhduM2YYg2qnbjNmB24zYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfaqduM2YHbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAn2LHZiNmF24zYstuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICfYs9ix2YjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ9i624zYsdmHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfYtdmB2K3ZhyDZhtmF2KfbjNi0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICfahtin2b7ar9ixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ9iz2YjbjNqGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ9mF2LPbjNix24zYp9ioJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAn2YbZgtin2Lcg2K/Ys9iq2LHYs9uMIFdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAn2YjYs9in24zZhCDYp9mF2YbbjNiq24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ9mI2LPYp9uM2YQg2b7YtNiq24zYqNin2YbigIzar9uM2LHbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ9mF2KfZiNizJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAn2LXZgdit2Ycg2qnZhNuM2K8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAn2K/ZiNix2KjbjNmGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ9m+2LHYqtmIINin2YHaqdmGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAn2YXZiNiv2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICfaqdin2LHYqiBQQ01DSUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ9iq2KzZh9uM2LLYp9iqIFVTQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfYp9uM2LPYqtqv2KfZhyDYp9iq2LXYp9mEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICfYp9iz2qnZhtixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAn2LPYp9iu2KrZhdin2YYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICfYt9io2YLZhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAn2KfYqtin2YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ9mC2YHYs9mHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ9mF2K3ZhCDaqdin2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAn2b7YsduM2LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICfYqtiz2YfbjNmE2KfYqiBJVCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAn2KjYsdmG2KfZhdmH4oCM2YfYp9uMINqp2YTYp9uM2YbYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAn2YXbjNin2YYg2KfZgdiy2KfYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICfZhtix2YUg2KfZgdiy2KfYsSDYs9ix2YjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICfYs9uM2LPYqtmFINi52KfZhdmEINqp2YTYp9uM2YbYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICfYs9uM2LPYqtmFINi52KfZhdmEINiz2LHZiNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICfYp9io2LLYp9ixINmF2K/bjNix24zYqtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ9in2KjYstin2LEg2qnYp9ix2KjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ9iv2KfYrtmE24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2KraqduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAn2KjZhyDYp9iy2KfbjCDaqdin2LHYqNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICfYqNmHINin2LLYp9uMINm+2LHYr9in2LLYtNqv2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJ9io2Ycg2KfYstin24wg2LPYsdmI2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfYqNmHINin2LLYp9uMINqp2KfZhdm+24zZiNiq2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2K3YrNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn2KfYrNin2LLZh+KAjNmG2KfZhdmHINiz2KfYstmF2KfZhtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn2KfYrNin2LLZh+KAjNmG2KfZhdmHINiq2YjYs9i52Ycg2K/Zh9mG2K/Zhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAn2YbYs9iu2Ycg2YbZhdin24zYtNuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ9iv2KfYsdin24wg2YXYrdiv2YjYr9mHINiy2YXYp9mG24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICfZhtix2YUg2KfZgdiy2KfYsSDZhdis2KfZhtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAn2qnYryDYqNin2LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAn2YbYp9mF2K3Yr9mI2K8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICfZhdiv24zYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfZhdin2pjZiNmEINix2YjbjNiv2KfYryDYotuM2KrZhSDZvtuM2qnYsdio2YbYr9uMINqp2Ycg2KvYqNiqINmI2YLYp9uM2Lkg2K/YsSDYqtin2LHbjNiu2obZhyDYsdinINiv2LEg2YjYp9iz2Lcg2qnYp9ix2KjYsduMINqp2KfYsdi02YbYp9izINmB2LnYp9mEINmF24zigIzYs9in2LLYry4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAn2YXYrdiv2YjYr9uM2Kog2KLbjNiq2YUg2b7bjNqp2LHYqNmG2K/bjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ9iz2KfYrtiqINmIINmF2K/bjNix24zYqiDYqti52KfYsduM2YEg2KLbjNiq2YXigIzZh9in24wg2b7bjNqp2LHYqNmG2K/bjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn2b7Yp9ix2KfZhdiq2LHZh9in24zbjCDYqNix2KfbjCDar9ix2YjZh+KAjNmH2KfbjCDYr9iz2KrYsdiz24wg2YbZhdmI2YbZhyDZhdix2KjZiNi3INio2Ycg2YjbjNqY2q/bjOKAjNmH2KfbjCDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGRlcyBFbMOpbWVudHMgZGUgQ29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJ0NsYXNzZSBkXCfDiWzDqW1lbnQgZGUgQ29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQWRkCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSd9ID0gJ8OJbMOpbWVudCBkZSBDb25maWd1cmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICdDaG9pc2lzc2V6IHVuZSBjbGFzc2UgcG91ciBjcsOpZXIgdW4gbm91dmVsIMOJbMOpbWVudCBkZSBDb25maWd1cmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnQ2xhc3NlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICdOdW3DqXJvIGRcJ8OJbMOpbWVudCBkZSBDb25maWd1cmF0aW9uIG5vbiB2YWxhYmxlICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnVm91bGV6LXZvdXMgdnJhaW1lbnQgc3VwcHJpbWVyIGNldCDDqWzDqW1lbnQgZGUgY29uZmlndXJhdGlvbiA/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0xlIG5vbSBkZSBjZXQgw6lsw6ltZW50IGRlIGNvbmZpZ3VyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnRXRhdCBkZSBkw6lwbG9pZW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdFdGF0IGRlIGxcJ2luY2lkZW50JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ1LDqWdsYWdlcyBkZSBDb250ZXh0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICfDiWzDqW1lbnRzIGRlIENvbmZpZ3VyYXRpb24gcGFyIHBhZ2UnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdFdGF0IGFjdHVlbCBkZSBsXCdpbmNpZGVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnRGVybmnDqHJlIG1vZGlmaWNhdGlvbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0NoZXJjaGVyIMOpZ2FsZW1lbnQgZGFucyBsZXMgdmVyc2lvbnMgcHLDqWPDqWRlbnRlcz8/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnw4lsw6ltZW50IGRlIENvbmZpZ3VyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0V0YXQgYWN0dWVsIGRlIGTDqXBsb2llbWVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdEZXJuacOocmUgbW9kaWZpY2F0aW9uIGVmZmVjdHXDqWUgcGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gVmVyc2lvbiBEZXRhaWxzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ0F1Y3VuIHLDqXN1bHRhdCAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0xcJ8OpdGF0IGRlIGTDqXBsb2llbWVudCBkZSBjZXQgw6lsw6ltZW50IGRlIGNvbmZpZ3VyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdMXCfDqXRhdCBkXCdpbmNpZGVudCBkZSBjZXQgw6lsw6ltZW50IGRlIGNvbmZpZ3VyYXRpb24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnUXVhbnRpdMOpIG1heGltYWxlIHBvdXIgdW4gw6lsw6ltZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAnTW9kw6hsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnTnVtw6lybyBkZSBzw6lyaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdEaXNxdWUgZHVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnQ2FwYWNpdMOpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ0FkYXB0YXRldXIgcsOpc2VhdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCBzdXIgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnQWRyZXNzZSBJUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdBZGFwdGF0ZXVyIGdyYXBoaXF1ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdBdXRyZSDDqXF1aXBlbWVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICdEYXRlIGRcJ2V4cGlyYXRpb24gZGUgbGEgZ2FyYW50aWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnRGF0ZSBkXCdpbnN0YWxsYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1TDqWzDqXBob25lIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1TDqWzDqXBob25lIDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICdBZHJlc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ0FkcmVzc2UgcsOpc2VhdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ01hc3F1ZSBkdSBzb3VzIHLDqXNlYXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJ1Bhc3NlcmVsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnVHlwZSBkZSBsaWNlbnNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnQ2zDqSBkZSBsYSBsaWNlbnNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnUXVhbnRpdMOpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdGUgZFwnZXhwaXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlhJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnRXhwaXLDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ01haW50ZW5hbmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnUGlsb3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdQbGFuaWZpw6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnRW4gcsOpcGFyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1JldGlyw6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnUmV2dWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ1Rlc3QvUUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnUG9ydGFibGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ09yZGluYXRldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NlcnZldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdBdXRyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnTW9uaXRldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ0ltcHJpbWFudGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAnU3dpdGNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ1JvdXRldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdQb2ludCBkXCdhY2Nlc3MgV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWN1cml0eSBEZXZpY2UnfSA9ICdQw6lyaXBow6lyaXF1ZSBkZSBzw6ljdXJpdMOpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdFbGVtZW50IGRlIHNhdXZlZ2FyZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdTb3VyaXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdDbGF2aWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0NhbcOpcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnUsOpdHJvcHJvamVjdGV1cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ01vZGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnQ2FydGUgUENNQ0lBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdQw6lyaXBow6lyaXF1ZSBVU0InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnQmFzZSBwb3VyIFBvcnRhYmxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTY2FubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnQmF0aW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdFdGFnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnUGnDqGNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ0VtcGxhY2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ1ByaXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnRMOpcGFydGVtZW50IElUJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdBcHBsaWNhdGlvbiBDbGllbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ0FwcGxpY2F0aW9uIFNlcnZldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnT1MgQ2xpZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ09TIFNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnT3V0aWwgZFwnQWRtaW5pc3RyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnT3V0aWwgVXRpbGlzYXRldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdFbWJhcnF1w6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICdMaWNlbnNlIHVuaXF1ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ1BhciBVdGlsaXNhdGV1cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUGFyIHByb2Nlc3NldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJ1BhciBTZXJ2ZXVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAnUGFyIG5vZXVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnTGljZW5zZSBwYXIgdm9sdW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVycHJpc2UgTGljZW5jZSd9ID0gJ0xpY2Vuc2UgRW50cmVwcmlzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xpY2Vuc2UgRMOpdmVsb3BwZXVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICdEZW1vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ0xpbWl0w6llIGRhbnMgbGUgdGVtcHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZS9HcmF0aWNpZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICdPcGVuIFNvdXJjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmxpbWl0ZWQnfSA9ICdJbGxpbWl0w6knOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbmlzdHJhdGV1ci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW3DqHRyw6lzIHBvdXIgbFwnZXhlbXBsZSBkZSBwZXJtaXNzaW9ucyBkZSBncm91cGUgZGVzIGF0dHJpYnV0cyBkdSBDYXRhbG9ndWUgR8OpbsOpcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGVkaXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBoaXN0b3J5IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBkZWxldGUgY29uZmlnIGl0ZW1zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggY29uZmlnIGl0ZW1zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3RzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuICJBdXRvSW5jcmVtZW50IiBpbmNyZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBpbmNpZGVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY29uZmlnIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZWRpdCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIGNvbmZpZyBpdGVtIGhpc3RvcnkgKHJldmVyc2Ugb3JkZXJlZCkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2dsb2JhbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwb3N0cHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmVwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Byb2R1Y3RpdmUnfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdLb25maWd1csOhY2nDs2VsZW0tbWVuZWR6c21lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICdPc3p0w6FseS1tZWdoYXTDoXJvesOhcyBtw7Nkb3PDrXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtLW9zenTDoWx5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICdNZWdoYXTDoXJvesOhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdLb25maWd1csOhY2nDs2VsZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnU3rFsXLFkSBheiBvc3p0w6FseW9raG96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ1bDoWxhc3N6b24gZWd5IG9zenTDoWx5dCBhIGxpc3TDoWLDs2wgZWd5IMO6aiBrb25maWd1csOhY2nDs2VsZW0gbMOpdHJlaG96w6Fzw6Fob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnT3N6dMOhbHknOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbSB0w7ZtZWdlcyBtxbF2ZWxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnw5x6ZW1iZSDDoWxsw610w6FzaSDDoWxsYXBvdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJ0luY2lkZW5zw6FsbGFwb3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnSGl2YXRrb3rDoXMgZWd5IG3DoXNpayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnw4lydsOpbnl0ZWxlbiBrb25maWd1csOhY2nDs2VsZW0tc3rDoW0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJ0VneSBtw6FzaWsga29uZmlndXLDoWNpw7NlbGVtIHN6w6FtYSwgYW1lbGx5ZWwgw7Zzc3plIGtlbGwga8O2dG5pLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ1ZhbMOzYmFuIHTDtnLDtmxuaSBzemVyZXRuw6kgZXp0IGEga29uZmlndXLDoWNpw7NlbGVtZXQ/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0Ega29uZmlndXLDoWNpw7NlbGVtIG5ldmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ0EgbmV2ZXQgbcOhciBoYXN6bsOhbGrDoWsgYSBrb25maWd1csOhY2nDs2VsZW1layBhIGvDtnZldGtlesWRIHN6w6Ftb2trYWw6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICfDnHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnSW5jaWRlbnPDoWxsYXBvdCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtIGVsxZF6bcOpbnllaTogJXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ0vDtnJueWV6ZXQgYmXDoWxsw610w6Fzb2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtZWsgb2xkYWxhbmvDqW50JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnRWd5IMOhbHRhbMOhbm9zIElUU00ga29uZmlndXLDoWNpw7NlbGVtIHTDoWJsw6F6YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnw5x6ZW1iZSDDoWxsw610w6FzaSDDoWxsYXBvdHTDrXB1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnSmVsZW5sZWdpIGluY2lkZW5zw6FsbGFwb3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnSmVsZW5sZWdpIGluY2lkZW5zw6FsbGFwb3QgdMOtcHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1V0b2xzw7MgbcOzZG9zw610w6FzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnw5pqIHNhYmxvbiBsw6l0cmVob3rDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICdLZXJlc8OpcyBmdXR0YXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0tlcmVzc2VuIGF6IGVsxZF6xZEgdmVyemnDs2tiYW4gaXM/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbS1pbmZvcm3DoWNpw7NrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0plbGVubGVnaSDDvHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ1V0b2xqw6FyYSBtw7Nkb3PDrXRvdHRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT0snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ0VneSB2ZXJ6acOzIG1lZ2plbGVuw610w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ8OWc3N6ZXMgdmVyemnDsyBtZWdqZWxlbsOtdMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ1Zlcnppw7MgaW5jaWRlbnPDoWxsYXBvdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICdWZXJ6acOzIMO8emVtYmUgw6FsbMOtdMOhc2kgw6FsbGFwb3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICdWZXJ6acOzc3rDoW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbS12ZXJ6acOzIHLDqXN6bGV0ZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICdUdWxhamRvbnPDoWcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICdOaW5jcyBob3p6w6Fmw6lyw6lzIG1lZ2FkdmEgYXogb3N6dMOhbHlob3ohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICfDgXR0ZWtpbnTDqXM6IElUU00ga29uZmlndXLDoWNpw7NlbGVtJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJ05pbmNzIGtvbmZpZ3Vyw6FjacOzZWxlbS1hem9ub3PDrXTDsyBtZWdhZHZhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJ1N6w7xrc8OpZ2UgdmFuIGxlZ2Fsw6FiYiBlZ3kga2l2w6FsYXN6dG90dCBrb25maWd1csOhY2nDs2VsZW1yZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICdOaW5jcyDDrXLDoXNpIGhvenrDoWbDqXLDqXNlIGVoaGV6IGEga29uZmlndXLDoWNpw7NlbGVtaGV6OiAlcy4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJ0Eoeikg4oCeJXPigJ0ga29uZmlndXLDoWNpw7NlbGVtIG5lbSB0YWzDoWxoYXTDsyBheiBhZGF0YsOhemlzYmFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJ05lbSB2b2x0IGxlaGV0c8OpZ2VzIGEoeikgJXMga29uZmlndXLDoWNpw7NlbGVtLWF6b25vc8OtdMOzIHTDtnJsw6lzZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJ05lbSB0YWzDoWxoYXTDsyB2ZXJ6acOzIGEoeikgJXMga29uZmlndXLDoWNpw7NlbGVtLWF6b25vc8OtdMOzbsOhbCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnTmluY3Mga29uZmlndXLDoWNpw7NlbGVtLWF6b25vc8OtdMOzLCBrZXR0xZF6w6lzYXpvbm9zw610w7MgdmFneSBvc3p0w6FseWF6b25vc8OtdMOzIG1lZ2FkdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyBpcyBnaXZlbiEnfSA9ICdOaW5jcyBob3p6w6Fmw6lyw6lzIG1lZ2FkdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJ05pbmNzIG1lZ2hhdMOhcm96w6FzIG1lZ2hhdMOhcm96dmEgYSh6KSAlcyBvc3p0w6FseWhveiEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnTmVtIGxlaGV0IG1lZ2plbGVuw610ZW5pIGF6IGVsxZF6bcOpbnlla2V0LCBuaW5jcyBrb25maWd1csOhY2nDs2VsZW0tYXpvbm9zw610w7MgbWVnYWR2YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICdOZW0gbGVoZXQgbWVnamVsZW7DrXRlbmkgYXogZWzFkXptw6lueWVrZXQsIG5pbmNzZW5layBob3p6w6Fmw6lyw6lzaSBqb2dvayBtZWdhZHZhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJ0NJSGlzdG9yeTo6JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnTmluY3Mga29uZmlndXLDoWNpw7NlbGVtLWF6b25vc8OtdMOzIHZhZ3kgdmVyemnDs2F6b25vc8OtdMOzIG1lZ2FkdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJ05lbSBsZWhldCBtZWdqZWxlbsOtdGVuaSBhIGtvbmZpZ3Vyw6FjacOzZWxlbWV0LCBuaW5jc2VuZWsgaG96esOhZsOpcsOpc2kgam9nb2sgbWVnYWR2YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICdBKHopICVzIGtvbmZpZ3Vyw6FjacOzZWxlbS1hem9ub3PDrXTDsyBuZW0gdGFsw6FsaGF0w7MgYXogYWRhdGLDoXppc2JhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICdBKHopICVzIHZlcnppw7Nhem9ub3PDrXTDsyBuZW0gdGFsw6FsaGF0w7MgYXogYWRhdGLDoXppc2JhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAnbnlvbXRhdHRhOiAlcyDigJMgJXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICfDiXJ2w6lueXRlbGVuIG9zenTDoWx5YXpvbm9zw610w7MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnTmluY3Mgb3N6dMOhbHlhem9ub3PDrXTDsyBtZWdhZHZhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJ05pbmNzZW5layBob3p6w6Fmw6lyw6lzaSBqb2dvayBtZWdhZHZhIGVoaGV6IGF6IG9zenTDoWx5aG96ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnTmluY3MgdGFsw6FsYXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtIGtlcmVzw6lzaSBlcmVkbcOpbnllayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnTmVtIGxlaGV0IG1lZ2plbGVuw610ZW5pIGF6IGVsZW1ldCwgbmluY3NlbmVrIGhvenrDoWbDqXLDqXNpIGpvZ29rIG1lZ2FkdmEgYSBrb25maWd1csOhY2nDs2VsZW1oZXohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdBIGtvbmZpZ3Vyw6FjacOzZWxlbSDDvHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0Ega29uZmlndXLDoWNpw7NlbGVtIGluY2lkZW5zw6FsbGFwb3RhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ0VneSBlbGVtIGxlZ25hZ3lvYmIgc3rDoW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ0F6IMO8cmVzIG1lesWRayBhenQgamVsemlrLCBob2d5IGF6IGFrdHXDoWxpcyBtZXrFkWsgbWVndGFydMOhc3JhIGtlcsO8bG5layc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAnTW9kZWxsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdTb3JvemF0c3rDoW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdNZXJldmxlbWV6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnS2FwYWNpdMOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdIw6Fsw7N6YXRpIGNzYXRvbMOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIGEgREhDUCBmw7Zsw7Z0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVAtY8OtbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdHcmFmaWt1cyBjc2F0b2zDsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdFZ3nDqWIgYmVyZW5kZXrDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnR2FyYW5jaWEgbGVqw6FyYXRpIGlkxZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnVGVsZXDDrXTDqXMgZMOhdHVtYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnMS4gdGVsZWZvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnMi4gdGVsZWZvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICdFLW1haWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0PDrW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAnSMOhbMOzemF0aSBjw61tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAnQWxow6Fsw7N6YXRpIG1hc3prJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICfDgXRqw6Fyw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnTGljZW5jdMOtcHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnTGljZW5jIGt1bGNzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnTWVubnlpc8OpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdMZWrDoXJhdGkgaWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ0FkYXRob3Jkb3rDsyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnU3rDoW3DrXTDs2fDqXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICdIYXJkdmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICdIw6Fsw7N6YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICdTem9mdHZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnTGVqw6FydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ0thcmJhbnRhcnTDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQcsOzYmHDvHplbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnVGVydmV6ZXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ0phdsOtdMOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnVmlzc3phdm9udCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdWaXpzZ8OhbGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rlc3QvUUEnfSA9ICdUZXN6dGVsw6lzL1FBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhcHRvcCd9ID0gJ0xhcHRvcCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAnQXN6dGFsaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAnS2lzem9sZ8OhbMOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnRWd5w6liJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdOeW9tdGF0w7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAnS2FwY3NvbMOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ8OadHbDoWxhc3p0w7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdXTEFOIGhvenrDoWbDqXLDqXNpIHBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnQml6dG9uc8OhZ2kgZXN6a8O2eic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnQml6dG9uc8OhZ2kgbWVudMOpcyBlc3prw7Z6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAnRWfDqXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdCaWxsZW50ecWxemV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0thbWVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICdCZWFtZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICdNb2RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQSBrw6FydHlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0IgZXN6a8O2eic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICdEb2trb2zDsyDDoWxsb23DoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ0xhcG9sdmFzw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICfDiXDDvGxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ0VtZWxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnU3pvYmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ1JhY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnTXVua2FoZWx5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ0Vsb3N6dMOzIGRvYm96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnSVQtbMOpdGVzw610bcOpbnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICdXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnVGVsY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ0tsaWVucyBhbGthbG1hesOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnS8O2enRlcyByw6l0ZWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gPSAnS2lzem9sZ8OhbMOzIGFsa2FsbWF6w6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ0tsaWVucyBvcGVyw6FjacOzcyByZW5kc3plcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdLaXN6b2xnw6Fsw7Mgb3BlcsOhY2nDs3MgcmVuZHN6ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ0FkbWluaXN6dHLDoWNpw7NzIGVzemvDtnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnRmVsaGFzem7DoWzDs2kgZXN6a8O2eic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ0Jlw6FneWF6b3R0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnRWd5ZWTDvGxpIGxpY2VuYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ0ZlbGhhc3puw6Fsw7Nua8OpbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1Byb2Nlc3N6b3JvbmvDqW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICdLaXN6b2xnw6Fsw7Nua8OpbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICdDc29tw7Nwb250b25rw6ludCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ01lbm55aXPDqWdpIGxpY2VuYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdWw6FsbGFsYXRpIGxpY2VuYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0Zlamxlc3p0xZFpIGxpY2VuYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAnQmVtdXRhdMOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ0lkxZFiZW4ga29ybMOhdG96b3R0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnRnJlZXdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICdOecOtbHQgZm9ycsOhc8O6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ0tvcmzDoXRsYW4nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbmlzenRyw6FjacOzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnRWd5ZWRpIG7DqXYgZWxsZW7FkXJ6w6lzZSBraXrDoXLDs2xhZyB1Z3lhbmFiYmFuIGEga29uZmlndXLDoWNpw7NlbGVtIG9zenTDoWx5YmFuICjigJ5vc3p0w6FseeKAnSkgdmFneSBnbG9iw6FsaXNhbiAo4oCeZ2xvYsOhbGlz4oCdKSwgYW1lbHkgYXp0IGplbGVudGksIGhvZ3kgbWluZGVuIG1lZ2zDqXbFkSBrb25maWd1csOhY2nDs2VsZW0gZWd5IGZpw7NrYmEgbGVzeiBmZWx2w6l2ZSBhIGtldHTFkXrDqXNlayBrZXJlc8Opc2Vrb3IuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbWVrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICdLb25maWd1csOhY2nDs2VsZW0gaG96esOhYWTDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbSBzemVya2VzenTDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnS29uZmlndXLDoWNpw7NlbGVtIGVzZW3DqW55IG1vZHVsLCBhbWVseSBlbmdlZMOpbHllemkgYSBuYXBsw7N6w6FzdCBheiBlbMWRem3DqW55ZWtiZSBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtIGVsxZF6bcOpbnllaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnS29uZmlndXLDoWNpw7NlbGVtIG55b210YXTDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbSBuYWd5w610w6FzYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJ0tvbmZpZ3Vyw6FjacOzZWxlbS1zesOhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICdLb25maWd1csOhY2nDs2VsZW0ta29ybMOhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICdLb25maWd1csOhY2nDs21lbmVkenNtZW50LWFkYXRiw6F6aXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICdLb25maWd1csOhY2nDs2VsZW0gdMO2bWVnZXMgbW9kdWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0F6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQga29uZmlndXLDoWNpw7NlbGVtIGtlcmVzw6lzaSBow6F0dMOpcnByb2dyYW0gw7p0dsOhbGFzenTDs2phLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnTWVnaGF0w6Fyb3rDoXNvayBsw6l0cmVob3rDoXNhIMOpcyBrZXplbMOpc2UgYSBrb25maWd1csOhY2nDs2VsZW1la27DqWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICdNxbF2ZWxldGVrIG1lZ2hhdMOhcm96w6FzYSwgYWhvbCBlZ3kgYmXDoWxsw610w6Fzb2sgZ29tYiDDqXJoZXTFkSBlbCBhIGthcGNzb2x0IG9iamVrdHVtb2sgZmVsw7xsZXRpIGVsZW1lbiAoTGlua09iamVjdDo6Vmlld01vZGUgPSDigJ7DtnNzemV0ZXR04oCdKS4gTmUgZmVsZWRqZSwgaG9neSBlemVrbmVrIGEgbcWxdmVsZXRla25layByZW5kZWxrZXpuacO8ayBrZWxsIGEga8O2dmV0a2V6xZEgSlMgw6lzIENTUyBmw6FqbG9rIHJlZ2lzenRyw6Fsw6Fzw6F2YWw6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIMOpcyBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICdBIGpvZ29zdWx0c8OhZ29ra2FsIHJlbmRlbGtlesWRIGNzb3BvcnQgbWVnaGF0w6Fyb3rDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rYXQgYXogSVRTTSBrb25maWd1csOhY2nDs2VsZW1layBsw6l0cmVob3rDoXPDoWhveiBheiDDoWx0YWzDoW5vcyBmZWzDvGxldCBoYXN6bsOhbGF0w6F2YWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgc3rDvGtzw6lnZXMgam9nb3N1bHRzw6Fnb2thdCBheiBJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbWVrIHTDtnJsw6lzw6loZXogYXogw6FsdGFsw6Fub3MgZmVsw7xsZXQgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rYXQgYXogSVRTTSBrb25maWd1csOhY2nDs2VsZW1layBsZWvDqXLDqXPDqWhleiBheiDDoWx0YWzDoW5vcyBmZWzDvGxldCBoYXN6bsOhbGF0w6F2YWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgc3rDvGtzw6lnZXMgam9nb3N1bHRzw6Fnb2thdCBheiBJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbWVrIGtlcmVzw6lzw6loZXogYXogw6FsdGFsw6Fub3MgZmVsw7xsZXQgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rYXQgYXogSVRTTSBrb25maWd1csOhY2nDs2VsZW1layBmcmlzc8OtdMOpc8OpaGV6IGF6IMOhbHRhbMOhbm9zIGZlbMO8bGV0IGhhc3puw6FsYXTDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnRWd5IMOhdHRla2ludMWRIG1vZHVsdCBoYXTDoXJveiBtZWcgZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbSBsaXN0YSBraXMgbsOpemV0w6luZWsgbWVnamVsZW7DrXTDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJ1JlZ3Vsw6FyaXMga2lmZWplesOpc2VrZXQgaGF0w6Fyb3ogbWVnIGVnecOpbmlsZWcgbWluZGVuIGVneWVzIGtvbmZpZ3Vyw6FjacOzZWxlbSBvc3p0w6FseW7DoWwgYSBrb25maWd1csOhY2nDs2VsZW0gbmV2w6luZWsgZWxsZW7FkXJ6w6lzw6loZXosIHZhbGFtaW50IGEgbWVnZmVsZWzFkSBoaWJhw7x6ZW5ldGVrIG1lZ2plbGVuw610w6lzw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGF6IOKAnklUU01Db25maWdJdGVt4oCdIG9zenTDoWx5IGFsYXDDqXJ0ZWxtZXpldHQgYWxvYmpla3R1bcOhdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIENJIG1lZ2hhdMOhcm96w6FzLXN6ZXJrZXN6dMWRIHNvcmFpbmFrIHN6w6Ftw6F0IGF6IGFkbWluaXN6dHLDoWNpw7NzIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXogaW5jaWRlbnPDoWxsYXBvdG9rIHNvcnJlbmRqw6l0IGEgbGVnbWFnYXNhYmJ0w7NsIChww6lsZMOhdWwga3JpdGlrdXMpIGEgbGVnYWxhY3NvbnlhYmJpZyAocMOpbGTDoXVsIGZ1bmtjaW9uw6FsaXMpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYSBrYXBjc29sw7Nkw7Mgw7x6ZW1iZSDDoWxsw610w6FzaSDDoWxsYXBvdG9rYXQsIGFob2wgYSBrYXBjc29sdCBqZWd5ZWsgYmVmb2x5w6Fzb2xoYXRqw6FrIGVneSBrb25maWd1csOhY2nDs2VsZW0gw6FsbGFwb3TDoXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGtlcmVzw6lzaSBrb3Jsw6F0b3QgYXogQWdlbnRJVFNNQ29uZmlnSXRlbSBrw6lwZXJuecWRbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEga2VyZXPDqXNpIGtvcmzDoXRvdCBheiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIGvDqXBlcm55xZFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgbWVnamVsZW7DrXRldHQgb3N6bG9wb2thdCBhIGtvbmZpZ3Vyw6FjacOzZWxlbSDDoXR0ZWtpbnTFkWJlbi4gRW5uZWsgYSBiZcOhbGzDrXTDoXNuYWsgbmluY3MgaGF0w6FzYSBheiBvc3psb3AgaGVseXpldMOpcmUuIE1lZ2plZ3l6w6lzOiBheiBvc3p0w6FseSBvc3psb3AgbWluZGlnIGzDoXRoYXTDsywgaGEgYXog4oCew5Zzc3plc+KAnSBzesWxcsWRIGtpIHZhbiB2w6FsYXN6dHZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgbWVnamVsZW7DrXRldHQgb3N6bG9wb2thdCBhIGtvbmZpZ3Vyw6FjacOzZWxlbSBrZXJlc8WRYmVuLiBFbm5layBhIGJlw6FsbMOtdMOhc25hayBuaW5jcyBoYXTDoXNhIGF6IG9zemxvcCBoZWx5emV0w6lyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIENJLWsgbWVnamVsZW7DrXRldHQgb3N6bG9wYWl0IGEga29uZmlndXLDoWNpw7NlbGVtIMOhdHRla2ludMWRYmVuIGEgQ0kgb3N6dMOhbHl0w7NsIGbDvGdnxZFlbi4gTWluZGVuIGJlamVneXrDqXN0IGF6IG9zemxvcCBuZXZlIMOpcyBkdXBsYSBrZXR0xZFzcG9udCBlbMWRdGFnZ2FsIGtlbGwgZWxsw6F0bmkgKGF6YXogQ29tcHV0ZXI6OikuIFZhbiBuw6low6FueSBvbHlhbiBDSS1hdHRyaWLDunR1bSwgYW1lbHkga8O2esO2cyBtaW5kZW4gQ0ktdmVsIChww6lsZMOhdWwgYSBDb21wdXRlciBvc3p0w6FseW7DoWw6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIEF6IGVnecOpbmkgQ0ktYXR0cmliw7p0dW1vayBtZWdqZWxlbsOtdMOpc8OpaGV6LCBhaG9neSBhem9rIGEgQ0ktbWVnaGF0w6Fyb3rDoXNiYW4gbWVnIHZhbm5hayBhZHZhLCBhIGvDtnZldGtlesWRIHPDqW3DoXQga2VsbCBoYXN6bsOhbG5pIChww6lsZMOhdWwgYSBDb21wdXRlciBvc3p0w6FseW7DoWwpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSGEgZWd5IENJIG9zenTDoWx5aG96IG5pbmNzIGJlamVneXrDqXMsIGFra29yIGF6IGFsYXDDqXJ0ZWxtZXpldHQgb3N6bG9wb2sgbGVzem5layBtZWdqZWxlbsOtdHZlLCBhaG9neSBheiBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucyBiZcOhbGzDrXTDoXNiYW4gbWVnIHZhbiBoYXTDoXJvenZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIENJLWsgbWVnamVsZW7DrXRldHQgb3N6bG9wYWl0IGEga29uZmlndXLDoWNpw7NlbGVtIGtlcmVzxZFiZW4gYSBDSSBvc3p0w6FseXTDs2wgZsO8Z2fFkWVuLiBNaW5kZW4gYmVqZWd5esOpc3QgYXogb3N6bG9wIG5ldmUgw6lzIGR1cGxhIGtldHTFkXNwb250IGVsxZF0YWdnYWwga2VsbCBlbGzDoXRuaSAoYXpheiBDb21wdXRlcjo6KS4gVmFuIG7DqWjDoW55IG9seWFuIENJLWF0dHJpYsO6dHVtLCBhbWVseSBrw7Z6w7ZzIG1pbmRlbiBDSS12ZWwgKHDDqWxkw6F1bCBhIENvbXB1dGVyIG9zenTDoWx5bsOhbDogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gQXogZWd5w6luaSBDSS1hdHRyaWLDunR1bW9rIG1lZ2plbGVuw610w6lzw6loZXosIGFob2d5IGF6b2sgYSBDSS1tZWdoYXTDoXJvesOhc2JhbiBtZWcgdmFubmFrIGFkdmEsIGEga8O2dmV0a2V6xZEgc8OpbcOhdCBrZWxsIGhhc3puw6FsbmkgKHDDqWxkw6F1bCBhIENvbXB1dGVyIG9zenTDoWx5bsOhbCk6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBIYSBlZ3kgQ0kgb3N6dMOhbHlob3ogbmluY3MgYmVqZWd5esOpcywgYWtrb3IgYXogYWxhcMOpcnRlbG1lemV0dCBvc3psb3BvayBsZXN6bmVrIG1lZ2plbGVuw610dmUsIGFob2d5IGF6IElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zIGJlw6FsbMOtdMOhc2JhbiBtZWcgdmFuIGhhdMOhcm96dmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgQ0ktayBtZWdqZWxlbsOtdGV0dCBvc3psb3BhaXQgYSBrYXBjc29sYXRpIHTDoWJsYSBrb21wbGV4IG7DqXpldMOpYmVuIGEgQ0kgb3N6dMOhbHl0w7NsIGbDvGdnxZFlbi4gTWluZGVuIGJlamVneXrDqXN0IGF6IG9zemxvcCBuZXZlIMOpcyBkdXBsYSBrZXR0xZFzcG9udCBlbMWRdGFnZ2FsIGtlbGwgZWxsw6F0bmkgKGF6YXogQ29tcHV0ZXI6OikuIFZhbiBuw6low6FueSBvbHlhbiBDSS1hdHRyaWLDunR1bSwgYW1lbHkga8O2esO2cyBtaW5kZW4gQ0ktdmVsIChww6lsZMOhdWwgYSBDb21wdXRlciBvc3p0w6FseW7DoWw6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIEF6IGVnecOpbmkgQ0ktYXR0cmliw7p0dW1vayBtZWdqZWxlbsOtdMOpc8OpaGV6LCBhaG9neSBhem9rIGEgQ0ktbWVnaGF0w6Fyb3rDoXNiYW4gbWVnIHZhbm5hayBhZHZhLCBhIGvDtnZldGtlesWRIHPDqW3DoXQga2VsbCBoYXN6bsOhbG5pIChww6lsZMOhdWwgYSBDb21wdXRlciBvc3p0w6FseW7DoWwpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSGEgZWd5IENJIG9zenTDoWx5aG96IG5pbmNzIGJlamVneXrDqXMsIGFra29yIGF6IGFsYXDDqXJ0ZWxtZXpldHQgb3N6bG9wb2sgbGVzem5layBtZWdqZWxlbsOtdHZlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphLCBob2d5IG1lbHkga2FwY3NvbGF0dMOtcHVzb2sgKGEgamVneSBuw6l6xZFwb250asOhYsOzbCBlbG5ldmV6dmUpIGJlZm9secOhc29saGF0asOhayBlZ3kga2FwY3NvbHQga29uZmlndXLDoWNpw7NlbGVtIMOhbGxhcG90w6F0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEsIGhvZ3kgbWVseSBqZWd5dMOtcHVzIGJlZm9secOhc29saGF0amEgZWd5IGthcGNzb2x0IGtvbmZpZ3Vyw6FjacOzZWxlbSDDoWxsYXBvdMOhdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnw5x6ZW1iZSDDoWxsw610w6FzaSDDoWxsYXBvdCBzesOtbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICfDnHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90IHN6w61uZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJ8OcemVtYmUgw6FsbMOtdMOhc2kgw6FsbGFwb3R0w61wdXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnTGV0aWx0dmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdFbmdlZMOpbHllenZlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ0VuZ2Vkw6lseWV6aSBhIGtvbmZpZ3Vyw6FjacOzZWxlbSB0w7ZtZWdlcyBtxbF2ZWxldCBmdW5rY2nDs3QgYXogw7xneWludMOpesWRaSBlbMWRdMOpdHByb2dyYW1uw6FsLCBob2d5IGVneXN6ZXJyZSBlZ3luw6lsIHTDtmJiIGtvbmZpZ3Vyw6FjacOzZWxlbW1lbCBkb2xnb3poYXNzb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICdDc2FrIGEgZmVsc29yb2x0IGNzb3BvcnRva25hayBlbmdlZMOpbHllemkgYSBrb25maWd1csOhY2nDs2VsZW0gdMO2bWVnZXMgbcWxdmVsZXQgZnVua2Npw7N0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnRW5nZWTDqWx5ZXppIHZhZ3kgbGV0aWx0amEgYXp0IGEgZnVua2Npb25hbGl0w6FzdCwgYW1lbHkgYSBrb25maWd1csOhY2nDs2VsZW1layBlZ3llZGkgbmV2ZWl0IGVsbGVuxZFyemkuIEEgbGVoZXTFkXPDqWcgZW5nZWTDqWx5ZXrDqXNlIGVsxZF0dCBlbGxlbsWRcml6bmllIGtlbGwgYSByZW5kc3plcsOpdCwgaG9neSB2YW5uYWstZSBtw6FyIGzDqXRlesWRIGtvbmZpZ3Vyw6FjacOzZWxlbWVrIGtldHTFkXrDtnR0IG7DqXZ2ZWwuIEV6dCBtZWd0ZWhldGkgYSBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsIHBhcmFuY3Nmw6FqbGxhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnRXNlbcOpbnltb2R1bCBhIGtvbmZpZ3Vyw6FjacOzZWxlbSDDoWxsYXBvdMOhbmFrIGJlw6FsbMOtdMOhc8OhaG96IGVneSBqZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbSBoaXZhdGtvesOhc8Ohbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICdJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbSDDoXR0ZWtpbnTDqXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnRWd5IG1vZHVsIGVneSBvc3p0w6FsecOpcnQgZmVsZWzFkXMgY3NvcG9ydCBlbGxlbsWRcnrDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICdFZ3kgbW9kdWwgZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbcOpcnQgZmVsZWzFkXMgY3NvcG9ydCBlbGxlbsWRcnrDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICdFZ3kgbW9kdWwgSVRTTSBrb25maWd1csOhY2nDs2VsZW0gc3RhdGlzenRpa8OhayBlbMWRw6FsbMOtdMOhc8OhaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdPYmpla3R1bSBow6F0dMOpcnByb2dyYW0gbW9kdWwgcmVnaXN6dHLDoWNpw7MgYXogaW1wb3J0w6Fsw6FzL2V4cG9ydMOhbMOhcyBtb2R1bGhvei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnw4F0dGVraW50w6lzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BhcmFtw6l0ZXJlayBheiDDvHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90b2sgc3rDrW5laWhleiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGJlw6FsbMOtdMOhc29rIG7DqXpldMOpYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BhcmFtw6l0ZXJlayBheiDDvHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90b2tob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldCBiZcOhbGzDrXTDoXNvayBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW3DqXRlcmVrIGF6IMOhbHRhbMOhbm9zIGthdGFsw7NndXMgYXR0cmliw7p0dW1haW5hayBww6lsZGEgam9nb3N1bHRzw6FnIGNzb3BvcnRqYWlob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ1BhcmFtw6l0ZXJlayBheiBvbGRhbGFraG96IChhbWVseWVrZW4gYSBrb25maWd1csOhY2nDs2VsZW1layBtZWdqZWxlbm5laykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rIGF6IElUU00ga29uZmlndXLDoWNpw7NlbGVtIGvDqXBlcm55xZFqw6luZWsgaGFzem7DoWxhdMOhaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rIGF6IElUU00ga29uZmlndXLDoWNpw7NlbGVtIGtlcmVzw6lzaSBrw6lwZXJuecWRasOpbmVrIGhhc3puw6FsYXTDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Egc3rDvGtzw6lnZXMgam9nb3N1bHRzw6Fnb2sgYXogSVRTTSBrb25maWd1csOhY2nDs2VsZW0gbmFnecOtdMOhc2kga8OpcGVybnnFkWrDqW5layBoYXN6bsOhbGF0w6Fob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Egc3rDvGtzw6lnZXMgam9nb3N1bHRzw6Fnb2sgYXogSVRTTSBrb25maWd1csOhY2nDs2VsZW0gaG96esOhYWTDoXNhIGvDqXBlcm55xZFqw6luZWsgaGFzem7DoWxhdMOhaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQSBzesO8a3PDqWdlcyBqb2dvc3VsdHPDoWdvayBheiBJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbSBzemVya2VzenTDqXNlIGvDqXBlcm55xZFqw6luZWsgaGFzem7DoWxhdMOhaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBoaXN0b3J5IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQSBzesO8a3PDqWdlcyBqb2dvc3VsdHPDoWdvayBheiBJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbSBlbMWRem3DqW55ZWsga8OpcGVybnnFkWrDqW5layBoYXN6bsOhbGF0w6Fob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQSBzesO8a3PDqWdlcyBqb2dvc3VsdHPDoWdvayBheiBJVFNNIGtvbmZpZ3Vyw6FjacOzZWxlbSBueW9tdGF0w6FzYSBrw6lwZXJuecWRasOpbmVrIGhhc3puw6FsYXTDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICdBIHN6w7xrc8OpZ2VzIGpvZ29zdWx0c8OhZ29rIGEga29uZmlndXLDoWNpw7NlbGVtZWsgdMO2cmzDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICdLb25maWd1csOhY2nDs2VsZW1layBrZXJlc8Opc2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJ0tpdsOhbGFzenRqYSBhIGtvbmZpZ3Vyw6FjacOzZWxlbSBzesOhbWVsxZHDoWxsw610w7MgbW9kdWxqw6F0LiBBeiDigJ5BdXRvSW5jcmVtZW504oCdIG7DtnZlbGkgYSBrb25maWd1csOhY2nDs2VsZW0gc3rDoW3DoXQsIGEgaGFzem7DoWx0IFN5c3RlbUlELCBDb25maWdJdGVtQ2xhc3NJRCDDqXMgc3rDoW1sw6Fsw7Mgw6lydMOpa8OpdC4gQSBmb3Jtw6F0dW06IOKAnlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXLigJ0sIHDDqWxkw6F1bDogMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJ0VneSBrb25maWd1csOhY2nDs2VsZW0gaW5jaWRlbnPDoWxsYXBvdMOhbmFrIGF1dG9tYXRpa3VzIGJlw6FsbMOtdMOhc2EsIGFtaWtvciBlZ3kgamVneWV0IGthcGNzb2xuYWsgZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBheiDDvHplbWJlIMOhbGzDrXTDoXNpIMOhbGxhcG90b3QgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBrb25maWd1csOhY2nDs2VsZW0gdMO2bWVnZXMgbcWxdmVsZXQga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGF6IGluY2lkZW5zw6FsbGFwb3RvdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGtvbmZpZ3Vyw6FjacOzZWxlbSB0w7ZtZWdlcyBtxbF2ZWxldCBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY29uZmlnIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuLCBhbWVseSBsZWhldMWRdsOpIHRlc3ppIGVneSBrb25maWd1csOhY2nDs2VsZW0gaG96esOha2FwY3NvbMOhc8OhdCBlZ3kgbcOhc2lrIG9iamVrdHVtaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQga29uZmlndXLDoWNpw7NlbGVtIG5hZ3nDrXTDoXNpIG7DqXpldMOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGVneSBrb25maWd1csOhY2nDs2VsZW0gZWzFkXptw6lueWVpbmVrIGVsw6lyw6lzw6loZXogYXogw7xneWludMOpesWRaSBmZWzDvGxldCBrb25maWd1csOhY2nDs2VsZW0gw6F0dGVraW50xZFqw6liZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VneSBoaXZhdGtvesOhc3QgamVsZW7DrXQgbWVnIGEgbWVuw7xiZW4gZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbSBlbMWRem3DqW55ZWluZWsgZWzDqXLDqXPDqWhleiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4gYXogZWxlbSBuYWd5w610w6FzaSBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGVneSBrb25maWd1csOhY2nDs2VsZW0gdMO2cmzDqXPDqWhleiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4gYXogZWxlbSBuYWd5w610w6FzaSBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGVneSBrb25maWd1csOhY2nDs2VsZW0ga2V0dMWResOpc8OpaGV6IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQga29uZmlndXLDoWNpw7NlbGVtIMOhdHRla2ludMWRasOpYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGVneSBrb25maWd1csOhY2nDs2VsZW0ga2V0dMWResOpc8OpaGV6IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbiBheiBlbGVtIG5hZ3nDrXTDoXNpIG7DqXpldMOpYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZWRpdCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRWd5IGhpdmF0a296w6FzdCBqZWxlbsOtdCBtZWcgYSBtZW7DvGJlbiBlZ3kga29uZmlndXLDoWNpw7NlbGVtIHN6ZXJrZXN6dMOpc8OpaGV6IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbiBheiBlbGVtIG5hZ3nDrXTDoXNpIG7DqXpldMOpYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRWd5IGhpdmF0a296w6FzdCBqZWxlbsOtdCBtZWcgYSBtZW7DvGJlbiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGtvbmZpZ3Vyw6FjacOzZWxlbSBuYWd5w610w6FzaSBuw6l6ZXRoZXogdmFsw7Mgdmlzc3phdMOpcsOpc2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGVneSBrb25maWd1csOhY2nDs2VsZW0gbnlvbXRhdMOhc8OhaG96IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbiBheiBlbGVtIG5hZ3nDrXTDoXNpIG7DqXpldMOpYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VneSBoaXZhdGtvesOhc3QgamVsZW7DrXQgbWVnIGEgbWVuw7xiZW4gZWd5IGtvbmZpZ3Vyw6FjacOzZWxlbWJlIHTDtnJ0w6luxZEgbmFnecOtdMOhc2hveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGtvbmZpZ3Vyw6FjacOzZWxlbSDDoXR0ZWtpbnTFkWrDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIGNvbmZpZyBpdGVtIGhpc3RvcnkgKHJldmVyc2Ugb3JkZXJlZCkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGtvbmZpZ3Vyw6FjacOzZWxlbSBlbMWRem3DqW55ZWl0IChmb3Jkw610b3R0IHNvcnJlbmRiZW4pIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLCBlLmcuIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jLiBUaGUgZGVmYXVsdCBpcyBDb25maWdJdGVtIy4nfSA9CiAgICAgICAgJ0VneSBrb25maWd1csOhY2nDs2VsZW0gYXpvbm9zw610w7NqYSwgcMOpbGTDoXVsOiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gQXogYWxhcMOpcnRlbG1lemV0dDogQ29uZmlnSXRlbSMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnb3N6dMOhbHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnZ2xvYsOhbGlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmlkX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdQZW5nZWxvbGFhbiBpdGVtIGtvbmZpZ3VyYXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAndWJhaCBkZWZpbmlzaSBrZWxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pc2knOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnSXRlbSBrb25maWd1cmFzaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICdTYXJpbmdhbiB1bnR1ayBrZWxhcy1rZWxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICdQaWxpaCBzYXR1IGtlbGFzIGRhcmkgZGF0YXIgdW50dWsgbWVtYnVhdCBzZWJ1YWggaXRlbSBrb25maWd1cmFzaSBiYXJ1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnS2VsYXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdUaW5kYWthbiBtYXNhbCBJdGVtS29uZmlndXJhc2kgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnU3RhdHVzIHBlbnllYmFyYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICdTdGF0dXMgaW5zaWRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICdUYXV0YW4gdW50dWsga2UgbGFpbm55YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnTm9tb3IgaXRlbSBrb25maWd1cmFzaSB0aWRhayBzYWgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnSnVtbGFoIGl0ZW0ga29uZmlndXJhc2kgbGFpbm55YSB5YW5nIGFrYW4gZGkgaHVidW5na2FuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ05hbWEgaXRlbSBrb25maWd1cmFzaSBpbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ05hbWEgaW5pIHRlbGFoIGRpIGd1bmFrYW4gb2xlaCBJdGVtS29uZmlndXJhc2kgZGVuZ2FuIG5vbW9yKG5vbW9yLW5vbW9yKSBiZXJpa3V0OiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnU3RhdHVzIHBlbnllYmFyYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdLb25kaXNpIGluc2lkZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnU2V0dGluZyBLb250ZWtzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0l0ZW0ga29uZmlndXJhc2kgcGVyIGhhbGFtYW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnVGlwZSBzdGF0dXMgcGVueWViYXJhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnS29uZGlzaSBpbnNpZGVuIHNhYXQgaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJ1RpcGUgU3RhdHVzIGluc2lkZW4gc2FhdCBpbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnVGVyYWtoaXIgZGl1YmFoJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnQnVhdCBUZW1wbGF0ZSBiYXJ1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICdNdWxhaSBQZW5jYXJpYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQ2FyaSBkaSB2ZXJzaSBzZWJlbHVtbnlhIGp1Z2EgPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ0l0ZW0gS29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXNpIGl0ZW0ga29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnU3RhdHVzIHBlbnllYmFyYWFuIHNhYXQgaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ1RlcmFraGlyIGRpcnViYWggb2xlaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdUdW5qdWthbiBzYXR1IHZlcnNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAnVHVuanVrYW4gc2VtdWEgdmVyc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ1ZlcnNpIHN0YXR1cyBpbnNpZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJ1ZlcnNpIHN0YXR1cyBwZW55ZWJhcmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnTm9tb3IgdmVyc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ1JpbmNpYW4gdmVyc2kgaXRlbSBrb25maWd1cmFzaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ01pbGlrJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnU2VqYXJhaENJOjonOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICdJdGVtS29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnVGlkYWsgYWRhIGhhc2lsISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJ0tvbmZpZ3VyYXNpIHBlbmNhcmlhbiBuaWxhaSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdTdGF0dXMgcGVueWViYXJhbiBpdGVtIGtvbmZpZ3VyYXNpIGluaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ1N0YXR1cyBpbnNpZGVuIGl0ZW0ga29uZmlndXJhc2kgaW5pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ0p1bWxhaCBtYWtzaW11bSBkYXJpIDEgZWxlbWVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ0JpZGFuZyBrb3NvbmcgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIG5pbGFpIHNhYXQgaW5pIGRpc2ltcGFuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnTm9tb3Igc2VyaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICdDUFUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnUmFtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ0hhcmQgRGlzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJ0thcGFzaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdBZGFwdGVyIEphcmluZ2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIGxlYmloIGRhcmkgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnQWxhbWF0IElQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ0FkYXB0ZXIgZ3JhZmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ1BlcmFsYXRhbiBsYWlubnlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ1RhbmdnYWwga2FkYWx1YXJzYSBnYXJhbnNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ1RhbmdnYWwgaW5zdGFsYXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICdUZWxlcG9uIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVwb24gMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FsYW1hdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdBbGFtYXQgSmFyaW5nYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuZXQgTWFzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2F0ZXdheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdUaXBlIExpc2Vuc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICdLdW5jaSBsaXNlbnNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnS3VhbnRpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ1RhbmdnYWwgS2FkYWx1YXJzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlhJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnVGVsYWgga2FkYWx1YXJzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ1BlbWVsaWhhcmFhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ1BpbG90JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdUZWxhaCBkaXJlbmNhbmFrYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnUGVyYmFpa2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1BlbnNpdW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnVWxhc2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rlc3QvUUEnfSA9ICdVamkvUUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnTGFwdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdEZXNrdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdMYWluLWxhaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJ01vbml0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ1BlbmNldGFrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1R1a2FyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ1JvdXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1RpdGlrIGFrc2VzIFdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnUGVyYW5na2F0IGtlYW1hbmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdQZXJhbmdrYXQgQmFja3VwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAnTW91c2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdLZXlib2FyZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdLYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnQmVhbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdLYXJ0dSBQQ01DSUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ1BlcmFuZ2thdCBVU0InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnU3Rhc2l1biBkb2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ1BlbWluZGFpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnTWVtYmFuZ3VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnTGFudGFpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICdSdWFuZ2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnVGVtcGF0IGtlcmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ091dGxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0Zhc2lsaXRhcyBJVCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnQXBsaWthc2kgcGVsYW5nZ2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ0FwbGlrYXNpIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdPUyBwZWxhbmdnYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAnT1MgU2VydmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICdQZXJhbGF0YW4gQWRtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnUGVyYWxhdGFuIHBlbmdndW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnVGVydGFuYW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICdMaXNlbnNpIHR1bmdnYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICdQZXIgUGVuZ2d1bmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1BlciBQcm9zZXNvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUGVyIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ1BlciBOb2RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnTGlzZW5zaSBKaWxpZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMaXNlbnNpIHBlcnVzYWhhYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICdMaXNlbnNpIHBlbmdlbWJhbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RlbW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnRGliYXRhc2kgd2FrdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ1N1bWJlciBUZXJidWthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ1RpZGFrIHRlcmJhdGFzJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICdQZXJpa3NhIGhhbnlhIG5hbWEgdW5payBzYWphIGRpIGRhbGFtIGtlbGFzKFwna2VsYXNcJykgaXRlbWtvbmZpZ3VyYXNpIHlhbmcgc2FtYSBhdGF1IHNlY2FyYSBnbG9iYWwgKFwnZ2xvYmFsKSwgeWFuZyBiZXJhcnRpIHNldGlhcCBJdGVtS29uZmlndXJhc2kgeWFuZyBhZGEgYWthbiBkaXBlcmhpdHVuZ2thbiBrZXRpa2EgbWVuY2FyaSBkdXBsaWthdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdpdGVtIGtvbmZpZ3VyYXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vZHVsIHBlcmlzdGl3YSBpdGVtIGtvbmZpZ3VyYXNpIHlhbmcgbWVuZ2FrdGlma2FuIGxvZ2dpbmcga2Ugcml3YXlhdCBwYWRhIGFudGFybXVrYSBhZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJ0JhdGFzIGl0ZW0ga29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUm91dGVyIHBlbmNhcmlhbiBiYWNrZW5kIGl0ZW0ga29uZmlndXJhc2kgcGFkYSBhbnRhcm11a2EgYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnQnVhdCBkYW4gYXR1ciBkZWZpbmlzaSAtIGRlZmluaXNpIHVudHVrIGl0ZW0ga29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBpemluIHlhbmcgZGkgYnV0dWhrYW4gdW50dWsgbWVuY2lwdGFrYW4gaXRlbSBrb25maWd1cmFzaSBJVFNNIGRlbmdhbiBtZW5nZ3VuYWthbiBhbnRhcm11a2EgdW11bS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gaXppbiB5YW5nIGRpIGJ1dHVoa2FuIHVudHVrIG1lbmRhcGF0a2FuIGl0ZW0ga29uZmlndXJhc2kgSVRTTSBkZW5nYW4gbWVuZ2d1bmFrYW4gYW50YXJtdWthIHVtdW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBpemluIHlhbmcgZGkgYnV0dWhrYW4gdW50dWsgbWVuY2FyaSBpdGVtIGtvbmZpZ3VyYXNpIElUU00gZGVuZ2FuIG1lbmdndW5ha2FuIGFudGFybXVrYSB1bXVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gaXppbiB5YW5nIGRpIGJ1dHVoa2FuIHVudHVrIG1lbXBlcmJhcnVpIGl0ZW0ga29uZmlndXJhc2kgSVRTTSBkZW5nYW4gbWVuZ2d1bmFrYW4gYW50YXJtdWthIHVtdW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIG1vZHVsIGdhbWJhcmFuIHVudHVrIG1lbnVuanVrYW4gdGFtcGlsYW4ga2VjaWwgZGFyaSBzZWJ1YWggZGFmdGFyIGl0ZW0ga29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIGVrc3ByZXNpIHJlZ3VsYXIgc2VjYXJhIGluZGl2aWR1YWwgdW50dWsgc2V0aWFwIGtlbGFzIEl0ZW1Lb25maWd1cmFzaSB1bnR1ayBtZW1lcmlrc2EgbmFtYSBJdGVtS29uZmlndXJhc2kgdW50dWsgbWVudW5qdWthbiBwZXNhbiBlcnJvciB5YW5nIHNlc3VhaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gc3Vib2JqZWsgZGVmYXVsdCBkYXJpIGtlbGFzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4ganVtbGFoIGJhcmlzIHVudHVrIHBlbmd1YmFoIGRlZmluaXNpQ0kgcGFkYSBhbnRhcm11a2EgQWRtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gYmF0YXMgcGVuY2FyaWFuIHVudHVrIGxheWFyIEFnZW50SVRTTUNvbmZpZ0l0ZW0gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gYmF0YXMgcGVuY2FyaWFuIHVudHVrIExheWFyIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIGtvbG9tIHlhbmcgZGkgdHVuanVrYW4gcGFkYSBnYW1iYXJhbiBpdGVtIGtvbmZpZ3VyYXNpLiBQaWxpaGFuIGluaSB0aWRhayBtZW1wZW5nYXJ1aGkgcG9zaXNpIGtvbG9tLiBDYXRhdGFuOiBrb2xvbSBrZWxhcyBzZWxhbHUgdGVyc2VkaWEgamlrYSBzYXJpbmdhbiBcJ1NlbXVhXCcgZGlwaWxpaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4ga29sb20geWFuZyBkaXR1bmp1a2FuIGRpZGFsYW0gcGVuY2FyaWFuIGl0ZW0ga29uZmlndXJhc2kuIFBpbGloYW4gaW5pIHRpZGFrIG1lbXBlbmdhcnVoaSBwb3Npc2kga29sb20nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4ga29sb20geWFuZyBkaXR1bmp1a2FuIG9sZWggQ0kgZGkgZGFsYW0gZ2FtYmFyYW4gaXRlbSBrb25maWd1cmFzaSB0ZXJnYW50dW5nIHBhZGEga2VsYXMgQ0kuIFNldGlhcCBlbnRyaSBoYXJ1cyBkaWF3YWxpIGRlbmdhbiBuYW1hIGtlbGFzIGRhbiBkdWEgdGFuZGEgdGl0aWsgZHVhIChjb250b2hueWEga29tcHV0ZXI6OikuIEFkYSBiZWJlcmFwYSBDSS1BdHJpYnV0IHlhbmcgdW11bSBwYWRhIHNlbXVhIENJIChDb250b2ggdW50dWsga2VsYXMgS29tcHV0ZXI6IEtvbXB1dGVyOjpOYW1hLCBLb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBLb21wdXRlcjo6V2FrdHVwZW1idWF0YW4pLiBVbnR1ayBtZW51bmp1a2FuIENJLUF0cmlidXQgc2VjYXJhIGluZGl2aWR1YWwgc2VwZXJ0aSB5YW5nIGRpZGVmaW5pc2lrYW4gZGkgZGFsYW0gQ0ktRGVmaW5pc2ksIFNrZW1hIGJlcmlrdXQgaW5pIGhhcnVzIGRpIGd1bmFrYW4gKENvbnRvaCB1bnR1ayBrZWxhcyBLb21wdXRlcik6IEtvbXB1dGVyOjpIYXJkRGlzazo6MSwga29tcHV0ZXI6OkhhcmREaXNrOjoxOjprYXBhc2l0YXM6OjEsIGtvbXB1dGVyOjpIYXJkRGlzazo6MiwgS29tcHV0ZXI6OkhhcmREaXNrOjoyOjpLYXBhc2l0YXM6OjEuIEppa2EgdGlkYWsgYWRhIGVudHJpIHVudHVrIHNlYnVhaCBrZWxhcyBDSSwgTWFrYSBrb2xvbSBkZWZhdWx0IHlhbmcgYWthbiBkaXR1bmp1a2FuIHNlc3VhaSBkZW5nYW4geWFuZyBkaSB0ZW50dWthbiBwYWRhIHBlbmdhdHVyYW5JVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ01lbmRlZmluaXNpa2FuIGtvbG9tIHlhbmcgZGl0YW1waWxrYW4gZGFyaSBDSSBkYWxhbSBwZW5jYXJpYW4gY29uZmlnIGJhcmFuZyB0ZXJnYW50dW5nIHBhZGEga2VsYXMgQ0kuIFNldGlhcCBlbnRyaSBoYXJ1cyBkaWF3YWxpIGRlbmdhbiBuYW1hIGtlbGFzIGRhbiB0aXRpayBkdWEgZ2FuZGEgKGkuZS4gQ29tcHV0ZXI6OikuIEFkYSBiZWJlcmFwYSBDSS1BdHJpYnV0IHlhbmcgdW11bSB1bnR1ayBzZW11YSBDSSAoQ29udG9oIHVudHVrIEtvbXB1dGVyIGtlbGFzOiBLb21wdXRlciA6OiBOYW1hLCBLb21wdXRlciA6OiBDdXJEZXBsU3RhdGUsIEtvbXB1dGVyIDo6IENyZWF0ZVRpbWUpLiBVbnR1ayBtZW51bmp1a2thbiBpbmRpdmlkdSBDSS1BdHJpYnV0IHNlYmFnYWltYW5hIGRpZGVmaW5pc2lrYW4gZGFsYW0gQ0ktRGVmaW5pdGlvbiwgc2tlbWEgYmVyaWt1dCBoYXJ1cyBkaWd1bmFrYW4gKG1pc2FsbnlhIHVudHVrIEtvbXB1dGVyIGtlbGFzKTogIENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBKaWthIHRpZGFrIGFkYSBlbnRyaSB1bnR1ayBrZWxhcyBDSSwgbWFrYSBrb2xvbSBzdGFuZGFyIGRpdGFtcGlsa2FuIHNlYmFnYWltYW5hIGRpZGVmaW5pc2lrYW4gZGFsYW0gcGVuZ2F0dXJhbiBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJ01lbmRlZmluaXNpa2FuIGtvbG9tIHlhbmcgZGl0YW1waWxrYW4gZGFyaSBDSSBkaSBsaW5rIHRhYmVsIHRhbXBpbGFuIHlhbmcga29tcGxla3MsIHRlcmdhbnR1bmcgcGFkYSBrZWxhcyBDSS4gU2V0aWFwIGVudHJpIGhhcnVzIGRpYXdhbGkgZGVuZ2FuIG5hbWEga2VsYXMgZGFuIHRpdGlrIGR1YSBnYW5kYSAoaS5lLiBDb21wdXRlcjo6KS4gQWRhIGJlYmVyYXBhIENJLUF0cmlidXQgeWFuZyB1bXVtIHVudHVrIHNlbXVhIENJIChDb250b2ggdW50dWsgS29tcHV0ZXIga2VsYXM6IEtvbXB1dGVyIDo6IE5hbWEsIEtvbXB1dGVyIDo6IEN1ckRlcGxTdGF0ZSwgS29tcHV0ZXIgOjogQ3JlYXRlVGltZSkuIFVudHVrIG1lbnVuanVra2FuIGluZGl2aWR1IENJLUF0cmlidXQgc2ViYWdhaW1hbmEgZGlkZWZpbmlzaWthbiBkYWxhbSBDSS1EZWZpbml0aW9uLCBza2VtYSBiZXJpa3V0IGhhcnVzIGRpZ3VuYWthbiAobWlzYWxueWEgdW50dWsgS29tcHV0ZXIga2VsYXMpOiAgQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIEppa2EgdGlkYWsgYWRhIGVudHJpIHVudHVrIGtlbGFzIENJLCBtYWthIGtvbG9tIHN0YW5kYXIgZGl0YW1waWxrYW4gc2ViYWdhaW1hbmEgZGlkZWZpbmlzaWthbiBkYWxhbSBwZW5nYXR1cmFuIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICdDYWNhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICdEdXBsaWthdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnRGlha3RpZmthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICdNZW11bmdraW5rYW4gZml0dXIgaXRlbSBrb25maWd1cmFzaSB0aW5kYWthbiBtYXNzYWwgdW50dWsgYWdlbiBmcm9udGVuZCB1bnR1ayBiZWtlcmphIHBhZGEgbGViaWggZGFyaSBzYXR1IGl0ZW0ga29uZmlndXJhc2kgcGFkYSBzdWF0dSB3YWt0dS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJ01lbXVuZ2tpbmthbiBmaXR1ciB0aW5kYWthbiBtYXNzYWwgaXRlbSBrb25maWd1cmFzaSBoYW55YSB1bnR1ayBrZWxvbXBvayB0ZXJkYWZ0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICdNZW5nYWt0aWZrYW4gLyBtZW5vbmFrdGlma2FuIGZ1bmdzaSB1bnR1ayBtZW1lcmlrc2EgQ29uZmlnSXRlbXMgdW50dWsgbmFtYSB5YW5nIHVuaWsuIFNlYmVsdW0gbWVuZ2FrdGlma2FuIG9wc2kgaW5pIEFuZGEgaGFydXMgbWVtZXJpa3NhIHNpc3RlbSBhbmRhIHVudHVrIHByb2R1ay1jb25maWcgeWFuZyBzdWRhaCBhZGEgZGVuZ2FuIG5hbWEgZHVwbGlrYXQuIEFuZGEgZGFwYXQgbWVsYWt1a2FuIGluaSBkZW5nYW4gc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJ01vZHVsIHVudHVrIG1lbWVyaWtzYSBrZWxvbXBvayB5YW5nIGJlcnRhbmdndW5nIGphd2FiIHVudHVrIGtlbGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJ01vZHVsIHVudHVrIG1lbWVyaWtzYSBrZWxvbXBvayB5YW5nIGJlcnRhbmdndW5nIGphd2FiIHVudHVrIGl0ZW0ga29uZmlndXJhc2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnTW9kdWwgdW50dWsgbWVuZ2hhc2lsa2FuIHN0YXRpc3RpayBjb25maWcgYmFyYW5nIElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ09iamVrIGJhY2tlbmQgcGVuZGFmdGFyYW4gbW9kdWwgdW50dWsgbW9kdWwgaW1wb3IgLyBla3Nwb3IuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayB3YXJuYSBzdGF0ZSBwZW55ZWJhcmFuIGRhbGFtIHByZWZlcmVuc2kgbWVsaWhhdCBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgdW50dWsgc3RhdGUgcGVueWViYXJhbiBkYWxhbSBwcmVmZXJlbnNpIG1lbGloYXQgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayBncnVwIGNvbm90aCBwZXJpemluYW4gZGFyaSBhdHJpYnV0IGthdGFsb2cgdW11bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgdW50dWsgaGFsYW1hbiAoZGkgbWFuYSBpdGVtIGtvbmZpZ3VyYXNpIGFrYW4gZGl0YW1waWxrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnaXppbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gbGF5YXIgaXRlbSBrb25maWd1cmFzaSBJVFNNIGRpIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW4geWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmdndW5ha2FuIGtvbmZpZ3VyYXNpIElUU00gbGF5YXIgcGVuY2FyaWFuIGl0ZW0gZGFsYW0gYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW4geWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmdndW5ha2FuIGtvbmZpZ3VyYXNpIElUU00gaXRlbSBsYXlhciB6b29tIGRpIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW4geWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmdndW5ha2FuIGFkZCBJVFNNIGxheWFyIGl0ZW0ga29uZmlndXJhc2kgZGFsYW0gYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW4geWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmdndW5ha2FuIG1lbmdlZGl0IElUU00gbGF5YXIgaXRlbSBrb25maWd1cmFzaSBkYWxhbSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBoaXN0b3J5IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnaXppbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2VqYXJhaCBJVFNNIGxheWFyIGl0ZW0ga29uZmlndXJhc2kgZGFsYW0gYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJemluIFlhbmcgZGlwZXJsdWthbiB1bnR1ayByZXZpZXcgdXNpbmcgU2VqYXJhaCBJVFNNIExheWFyIEl0ZW0gS29uZmlndXJhc2kgQW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnTWVtaWxpaCBpdGVtIGtvbmZpZ3VyYXNpIG1vZHVsIGdlbmVyYXRvciBub21vci4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudCBub21vciBpdGVtIGtvbmZpZ3VyYXNpLCBTeXN0ZW1JRCwgeWFuZyBDb25maWdJdGVtQ2xhc3NJRCBkYW4gbWVqYSB5YW5nIGRpZ3VuYWthbi4gRm9ybWF0bnlhIGFkYWxhaCAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIG1pc2FsbnlhIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBdHVyIHN0YXR1cyBwZW55ZWJhcmFuIGRpIGl0ZW0ga29uZmlndXJhc2kgbGF5YXIgdGVyYmVzYXIgZGFyaSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQXR1ciBzdGF0dXMga2VqYWRpYW4gcGFkYSBpdGVtIGtvbmZpZ3VyYXNpIGxheWFyIHRlcmJlc2FyIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gbGluayBkYWxhbSBtZW51IHlhbmcgbWVtdW5na2lua2FuIG1lbmdodWJ1bmdrYW4gaXRlbSBrb25maWd1cmFzaSBkZW5nYW4gb2JqZWsgbGFpbiBkaSBjb25maWcgYmFyYW5nIHBhbmRhbmdhbiB6b29tIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gbGluayBkYWxhbSBtZW51IHVudHVrIG1lbmdha3NlcyBzZWphcmFoIGl0ZW0ga29uZmlndXJhc2kgcGFkYSBpdGVtIGtvbmZpZ3VyYXNpIGdhbWJhcmFuIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIGxpbmsgZGFsYW0gbWVudSB1bnR1ayBtZW5nYWtzZXMgc2VqYXJhaCBpdGVtIGtvbmZpZ3VyYXNpIGRhbGFtIHRhbXBpbGFuIHpvb20tbnlhIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gbGluayBkYWxhbSBtZW51IHVudHVrIG1lbmR1cGxpa2FzaSBpdGVtIGtvbmZpZ3VyYXNpIHBhZGEgaXRlbSBrb25maWd1cmFzaSBnYW1iYXJhbiBkYXJpIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBsaW5rIGRhbGFtIG1lbnUgdW50dWsgbWVuZHVwbGlrYXNpIGl0ZW0ga29uZmlndXJhc2kgZGFsYW0gdGFtcGlsYW4gem9vbS1ueWEgZGFyaSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIGxpbmsgZGFsYW0gbWVudSB1bnR1ayBtZW5nZWRpdCBpdGVtIGtvbmZpZ3VyYXNpIGRhbGFtIHRhbXBpbGFuIHpvb20tbnlhIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIGxpbmsgZGFsYW0gbWVudSB1bnR1ayBtZW5jZXRhayBpdGVtIGtvbmZpZ3VyYXNpIGRhbGFtIHRhbXBpbGFuIHpvb20tbnlhIGRhcmkgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byB6b29tIGludG8gYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjb25maWcgaXRlbSBoaXN0b3J5IChyZXZlcnNlIG9yZGVyZWQpIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBzZWphcmFoIGNvbmZpZyBpdGVtICh1cnV0YW4gdGVyYmFsaWspIGRpIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnUGVuZ2VuYWwgdW50dWsgaXRlbSBrb25maWd1cmFzaSwgbWlzYWxueWEgQ29uZmlnSXRlbSAjLCBNeUNvbmZpZyBJdGVtICMuIGRlZmF1bHQgYWRhbGFoIENvbmZpZ0l0ZW0gIy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uZSBkZWdsaSBlbGVtZW50aSBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pemlvbmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnRWxlbWVudG8gZGkgY29uZmlndXJhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnRmlsdHJvIHBlciBjbGFzc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnQ2xhc3NlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnQ29sbGVnYSBhIHVuIGFsdHJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0lsIG5vbWUgZGkgcXVlc3RvIGVsZW1lbnRvIGRpIGNvbmZpZ3VyYXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ1N0YXRvIGRpIGltcGxlbWVudGF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBTdGF0ZSd9ID0gJ1N0YXRvIGRlbGxcJ2luY2lkZW50ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdJbXBvc3RhemlvbmkgZGkgY29udGVzdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnU3RhdG8gYXR0dWFsZSBkZWxsXCdpbmNpZGVudGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1VsdGltYSBtb2RpZmljYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ0NyZWEgbnVvdm8gbW9kZWxsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnRXNlZ3VpIHJpY2VyY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQ2VyY2FyZSBhbmNoZSBpbiB2ZXJzaW9uaSBwcmVjZWRlbnRpPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnU3RhdG8gYXR0dWFsZSBkaSBpbXBsZW1lbnRhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAnVWx0aW1hIG1vZGlmaWNhIGRpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ01vc3RyYSB1bmEgdmVyc2lvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICdNb3N0cmEgdHV0dGUgbGUgdmVyc2lvbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICdOdW1lcm8gZGkgdmVyc2lvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ1Byb3ByaWV0w6AnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnTmVzc3VuIHJpc3VsdGF0byEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gU2VhcmNoIFJlc3VsdHMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnTG8gc3RhdG8gZGkgaW1wbGVtZW50YXppb25lIGRpIHF1ZXN0byBlbGVtZW50byBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0xvIHN0YXRvIGRpIGluY2lkZW50ZSBkaSBxdWVzdG8gZWxlbWVudG8gZGkgY29uZmlndXJhemlvbmUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTnVtZXJvIG1hc3NpbW8gZGkgdW4gZWxlbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbGxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdOdW1lcm8gc2VyaWFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICdDUFUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnUmFtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ0Rpc2NvIGZpc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnQ2FwYWNpdMOgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ1NjaGVkYSBkaSByZXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIHN1IERIQ1AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgQWRkcmVzcyd9ID0gJ0luZGlyaXp6byBJUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdTY2hlZGEgZ3JhZmljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdBbHRyaSBhcHBhcmF0aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICdEYXRhIGRpIHNjYWRlbnphIGRlbGxhIGdhcmFuemlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ0RhdGEgZGkgaW5zdGFsbGF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnVGVsZWZvbm8gMSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnVGVsZWZvbm8gMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0luZGlyaXp6byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdJbmRpcml6em8gZGkgcmV0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ01hc2NoZXJhIGRpIHJldGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJ0dhdGV3YXknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnVGlwbyBkaSBsaWNlbnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnQ2hpYXZlIGRpIGxpY2VuemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdRdWFudGl0w6AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJhdGlvbiBEYXRlJ30gPSAnRGF0YSBkaSBzY2FkZW56YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ1N1cHBvcnRvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnU2NhZHV0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ01hbnV0ZW56aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ1BpbG90JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdQaWFuaWZpY2F0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdSaXBhcmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnUml0aXJhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnUmV2aXNpb25hdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ1Rlc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnUG9ydGF0aWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdEZXNrdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BhbG1hcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAnU2VydmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnQWx0cm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJ01vbml0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ1N0YW1wYW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICdTd2l0Y2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAnUm91dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiBBY2Nlc3MgUG9pbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gZGkgc2ljdXJlenphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdEaXNwb3NpdGl2byBkaSBjb3BpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ01vdXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnVGFzdGllcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnVmlkZW9jYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnQmVhbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdTY2hlZGEgUENNQ0lBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdEaXNwb3NpdGl2byBVU0InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnRG9ja2luZyBTdGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTY2FubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnRWRpZmljaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdQaWFubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnU3RhbnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdBcm1hZGlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICdXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnVGVsY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ0FwcGxpY2F6aW9uZSBjbGllbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ01pZGRsZXdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gPSAnQXBwbGljYXppb25lIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdTTyBDbGllbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1NPIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnU3RydW1lbnRpIGRpIGFtbWluaXN0cmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICdTdHJ1bWVudGkgdXRlbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnSW50ZWdyYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnTGljZW56YSBzaW5nb2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnUGVyIHV0ZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUGVyIHByb2Nlc3NvcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFNlcnZlcid9ID0gJ1BlciBzZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICdQZXIgbm9kbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ0xpY2VuemEgcGVyIHZvbHVtZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMaWNlbnphIGF6aWVuZGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xpY2VuemEgZGkgc3ZpbHVwcG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RpbW9zdHJhdGl2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICdMaW1pdGF0YSBuZWwgdGVtcG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ09wZW4gU291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ0lsbGltaXRhdGEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdFbGVtZW50aSBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnQ3JlYSBlIGdlc3Rpc2NpIGxlIGRlZmluaXppb25pIHBlciBnbGkgZWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJ0RlZmluaXNjZSBpbCBzb3R0by1vZ2dldHRvIHByZWRlZmluaXRvIGRlbGxhIGNsYXNzZSBcJ0lUU01Db25maWdJdGVtXCcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uIE5vdGU6IENsYXNzIGNvbHVtbiBpcyBhbHdheXMgYXZhaWxhYmxlIGlmIGZpbHRlciBcJ0FsbFwnIGlzIHNlbGVjdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiBsaW5rIChuYW1lZCBmcm9tIHRoZSB0aWNrZXQgcGVyc3BlY3RpdmUpIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJ01vZHVsbyBwZXIgY29udHJvbGxhcmUgaWwgZ3J1cHBvIHJlc3BvbnNhYmlsZSBwZXIgdW5hIGNsYXNzZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICdNb2R1bG8gcGVyIGdlbmVyYXJlIGxlIHN0YXRpc3RpY2hlIGRlZ2xpIGVsZW1lbnRpIGRpIGNvbmZpZ3VyYXppb25lIElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHBlciBpIGdydXBwaSBkaSBwZXJtZXNzaSBkaSBlc2VtcGlvIGRlZ2xpIGF0dHJpYnV0aSBkZWwgY2F0YWxvZ28gZ2VuZXJhbGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ1BhcmFtZXRyaSBwZXIgbGUgcGFnaW5lIChuZWxsZSBxdWFsaSBnbGkgZWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUgc29ubyBtb3N0cmF0aSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfmp4vmiJDjgqLjgqTjg4bjg6DnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICfjgq/jg6njgrnlrprnvqnjgpLlpInmm7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ+iomOi/sCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdDb25maWcg44Ki44Kk44OG44OgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJ+OCr+ODqeOCueOBp+ODleOCo+ODq+OCvyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICfmlrDopo/jga7mp4vmiJDjgqLjgqTjg4bjg6DjgpLkvZzmiJDjgZnjgovjgavjga/jgIHjg6rjgrnjg4jjgYvjgonjgq/jg6njgrnjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICfjgq/jg6njgrknOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdJVFNNIOWkieabtOOCouOCpOODhuODoOS4gOaLrOOCouOCr+OCt+ODp+ODsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAn44OH44OX44Ot44Kk44Oh44Oz44OI54q25rOBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAn44Kk44Oz44K344OH44Oz44OI54q25rOBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJ+S7luOBqOODquODs+OCr+OBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAn44Kz44Oz44OV44Kj44Kw44Os44O844K344On44Oz44Ki44Kk44OG44Og44Gu5YCk44GM5LiN5q2j44Gn44GZISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICfku5bjga7mp4vmiJDjgqLjgqTjg4bjg6Djgbjjga7jg6rjg7Pjgq/mlbAnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBjb25maWcgaXRlbT8nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAn44GT44GuIOani+aIkOOCouOCpOODhuODoCDjga7lkI3np7AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ+OBk+OBruWQjeensOOBr+OBmeOBp+OBqyBOdW1iZXIocyk6ICVzIOOBruani+aIkOOCouOCpOODhuODoOOBp+S9v+eUqOS4reOBp+OBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAn5bGV6ZaL54q25rOBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAn44Kk44Oz44K344OH44Oz44OI54q25rOBJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ+OCs+ODs+ODhuOCreOCueODiOOBruioreWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICcx44Oa44O844K45q+O44Gu6Kit5a6a6aCF55uuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ+WxlemWi+OBrueKtuaFiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAn54++5Zyo44Gu44Kk44Oz44K344OH44Oz44OI54q25oWLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJ+ePvuWcqOOBruOCpOODs+OCt+ODh+ODs+ODiOeKtuaFi+OBruOCv+OCpOODlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICfmnIDntYLlpInmm7Tml6XmmYInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBOZXcgVGVtcGxhdGUnfSA9ICfmlrDopo/jg4bjg7Pjg5fjg6zjg7zjg4jjgpLkvZzmiJDjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVuIFNlYXJjaCd9ID0gJ+aknOe0ouOCkuWun+ihjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICfjg5fjg6zjg5Pjg6Xjg7zmmYLjgIHku6XliY3jga7jg5Djg7zjgrjjg6fjg7PjgoLmpJzntKLlr77osaHjgajjgZfjgb7jgZnjgYvvvJ8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfoqbPntLDoqK3lrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAn5aSJ5pu044Ki44Kk44OG44Og5oOF5aCxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ+ePvuWcqOOBruWxlemWi+eKtuaFiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICfmnIDntYLlpInmm7TogIUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAn6Kqs5piO44KS6KGo56S6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn44GZ44G544Gm44Gu6Kqs5piO44KS6KGo56S6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICfjgqTjg7Pjgrfjg4fjg7Pjg4jnirbmhYsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAn44OQ44O844K444On44Oz5bGV6ZaL54q25rOBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAn44OQ44O844K444On44Oz44OK44Oz44OQ44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICfmp4vmiJDjga7oqbPntLAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICfpoIXnm64nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfoqK3lrprpoIXnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAn57WQ5p6c44GM44GC44KK44G+44Gb44KT44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ+OBk+OBruioreWumumgheebruOBruWxlemWi+eKtuaFiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ+OBk+OBruioreWumumgheebruOBruOCpOODs+OCt+ODh+ODs+ODiOeKtuaFiyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICfkuIDjgqjjg6zjg6Hjg7Pjg4jjgYLjgZ/jgorjga7mnIDlpKfmlbAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAn56m65qyE44Gu6aCF55uu44Gv54++5Zyo44Gu5YCk44GM5L+d5oyB44GV44KM44KL44GT44Go5oSP5ZGz44GX44G+44GZJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICfjg6Ljg4fjg6snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VyaWFsIE51bWJlcid9ID0gJ+OCt+ODquOCouODq+ODiuODs+ODkOODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICdDUFUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnUkFNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ+ODj+ODvOODieODh+OCo+OCueOCryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJ+WuuemHjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICfjg43jg4Pjg4jjg6/jg7zjgq/jgqLjg4Djg5fjgr8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgb3ZlciBESENQJ30gPSAnREhDUOacieWKuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVAg44Ki44OJ44Os44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ+OCsOODqeODleOCo+ODg+OCr+OCouODgOODl+OCvyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICfjgZ3jga7ku5bjga7mqZ/lmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAn44Ov44Op44Oz44OG44Kj57WC5LqG5pelJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ+OCpOODs+OCueODiOODvOODq+aXpeS7mCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAn6Zu76KmxIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ+mbu+ipsSAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAn44Ki44OJ44Os44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ+ODjeODg+ODiOODr+ODvOOCr+OCouODieODrOOCuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ+OCteODluODjeODg+ODiOODnuOCueOCryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn44Ky44O844OI44Km44Kn44KkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ+ODqeOCpOOCu+ODs+OCueOCv+OCpOODlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ+ODqeOCpOOCu+ODs+OCueOCreODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ+aVsOmHjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICfmnInlirnmnJ/pmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICfjg6Hjg4fjgqPjgqInOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAn44ON44OD44OI44Ov44O844KvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICfmnJ/pmZDliIfjgownOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICfjg6Hjg7Pjg4bjg4rjg7PjgrknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICfjg5HjgqTjg63jg4Pjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ+ioiOeUuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICfkv67nkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ+W8lemAgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICfjg6zjg5Pjg6Xjg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ+ODhuOCueODiCAvIFFBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhcHRvcCd9ID0gJ+ODjuODvOODiFBDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICfjg4fjgrnjgq/jg4jjg4Pjg5cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ+OCteODvOODkCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ+S7lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAn44Oi44OL44K/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICfjg5fjg6rjg7Pjgr8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAn44K544Kk44OD44OBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ+ODq+ODvOOCvyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1dMQU4g44Ki44Kv44K744K544Od44Kk44Oz44OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ+OCu+OCreODpeODquODhuOCo+ODh+ODkOOCpOOCuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAn44OQ44OD44Kv44Ki44OD44OX44O744OH44OQ44Kk44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAn44Oe44Km44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAn44Kt44O844Oc44O844OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ+OCq+ODoeODqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICfjg5fjg63jgrjjgqfjgq/jgr/jg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICfjg6Ljg4fjg6AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdQQ01DSUEg44Kr44O844OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0Ljg4fjg5DjgqTjgrknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAn44OJ44OD44Kt44Oz44Kw44K544OG44O844K344On44OzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICfjgrnjgq3jg6Pjg4onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICfmp4vnr4knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICfliIfmjajjgaYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ+WupOWGhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAn44Op44OD44KvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ+iBt+WgtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICfjgqLjgqbjg4jjg6zjg4Pjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdJVOODleOCoeOCt+ODquODhuOCoyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICfpm7voqbHkvJrnpL4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ+OCr+ODqeOCpOOCouODs+ODiOOCveODleODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAn44Of44OJ44Or44Km44Kn44KiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ+OCteODvOODkOOCveODleODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICfjgq/jg6njgqTjgqLjg7Pjg4hPUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICfjgrXjg7zjg5BPUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAn566h55CG44OE44O844OrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ+ODpuODvOOCtuODu+ODhOODvOODqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ+Wfi+OCgei+vOOBv+OCquODluOCuOOCp+OCr+ODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ+OCt+ODs+OCsOODq+ODqeOCpOOCu+ODs+OCuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ+ODpuODvOOCtuavjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAn44OX44Ot44K744OD44K15q+OJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICfjgrXjg7zjg5Dmr44nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfjg47jg7zjg4nmr44nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfjg5zjg6rjg6Xjg7zjg6Djg6njgqTjgrvjg7PjgrknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn44Ko44Oz44K/44O844OX44Op44Kk44K644O744Op44Kk44K744Oz44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn6ZaL55m66ICF44Op44Kk44K744Oz44K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfjg4fjg6InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAn5pmC6ZaT5Yi26ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAn44OV44Oq44O844Km44Kn44KiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAn44Kq44O844OX44Oz44K944O844K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ+eEoeWItumZkCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ+euoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ+ani+aIkOOCouOCpOODhuODoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAn5qeL5oiQ44Ki44Kk44OG44Og44Gu5Yi26ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAn5qeL5oiQ44Ki44Kk44OG44Og44Gu5L2c5oiQ44G+44Gf44Gv5aSJ5pu0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn44K444Kn44ON44Oq44OD44Kv44Kk44Oz44K/44O844OV44Kn44Kk44K544KS55So44GE44GmSVRTTeani+aIkOOCkuS9nOaIkOOBmeOCi+aoqemZkOOCkuWumue+qeOBmeOCi+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICfjgrjjgqfjg43jg6rjg4Pjgq/jgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjgpLnlKjjgYTjgaZJVFNN5qeL5oiQ44KS5Y+W5b6X44GZ44KL5qip6ZmQ44KS5a6a576p44GZ44KL44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICfjgrjjgqfjg43jg6rjg4Pjgq/jgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjgpLnlKjjgYTjgaZJVFNN5qeL5oiQ44KS5qSc57Si44GZ44KL5qip6ZmQ44KS5a6a576p44GZ44KL44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICfjgrjjgqfjg43jg6rjg4Pjgq/jgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjgpLnlKjjgYTjgaZJVFNN5qeL5oiQ44KS5aSJ5pu044GZ44KL5qip6ZmQ44KS5a6a576p44GZ44KL44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICdJVFNNQ29uZmlnSXRlbeOCr+ODqeOCueOBruODh+ODleOCqeODq+ODiOODu+OCteODluOCquODluOCuOOCp+OCr+ODiOOCkuWumue+qeOBmeOCi+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICfnrqHnkIbjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrkgQ2wg5a6a576p44Ko44OH44Kj44K/44Gu6KGM5pWw44KS5a6a576p44GZ44KL44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnSVRTTeani+aIkOOCv+OCpOODhuODoOe1seioiOOCkueUn+aIkOOBmeOCi+OBn+OCgeOBruODouOCuOODpeODvOODqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAn5qaC6KaBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ+OCuOOCp+ODjeODqeODq+OCq+OCv+ODreOCsOWxnuaAp+OBruODkeODvOODn+ODg+OCt+ODp+ODs+OCsOODq+ODvOODl+OAgOOBruioreWumuWApCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHpvb20gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgaGlzdG9yeSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byB6b29tIGludG8gYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjb25maWcgaXRlbSBoaXN0b3J5IChyZXZlcnNlIG9yZGVyZWQpIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLCBlLmcuIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jLiBUaGUgZGVmYXVsdCBpcyBDb25maWdJdGVtIy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncG9zdHByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJlcHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcm9kdWN0aXZlJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdQZW5ndXJ1c2FuIENvbmZpZyBJdGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnVWJhaCBkZWZpbmlzaSBrZWxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pc2knOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnQ29uZmlnIEl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnTWVuYXBpcyBLZWxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICdQaWxpaCBLZWxhcyBkYXJpIHNlbmFyYWkgdW50dWsgbWV3dWp1ZGthbiBQZXJrYXJhIENvbmZpZyBiYXJ1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ0tlbGFzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnSXRlbUtvbmZpZyBJVFNNIFRpbmRha2FuIFB1a2FsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICdLZWFkYWFuIHBlcnR1a2FyYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICdLZWFkYWFuIGluc2lkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnUGF1dCBrZSBsYWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICdOb21ib3IgQmFyYW5nYW4gS29uZmlndXJhc2kgVGlkYWsgU2FoISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICdOb21ib3IgQmFyYW5nYW4gS29uZmlndXJhc2kgbGFpbiB1bnR1ayBkaXBhdXRrYW4gZGVuZ2FuLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ0FuZGEgYmVuYXIgaW5naW4gbWVtYnVhbmcgaXRlbSBjb25maWcgaW5pPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdOYW1hIGNvbmZpZyBpdGVtIGluaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAnTmFtYSBzdWRhaCBkaWd1bmFrYW4gb2xlaCBDb25maWdJdGVtcyBkZW5nYW4gTm9tYm9yKG5vbWJvci1ub21ib3IpIGJlcmlrdXQ6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdLZWFkYWFuIFBlcnR1a2FyYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdpbnNpZGVuIGtlYWRhYW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAna29udGVrcyBUZXRhcGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0l0ZW0gY29uZmlnIHBlciBoYWxhbWFuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ0plbmlzIFBlcnR1a2FyYW4gS2VhZGFhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnSW5zaWRlbiBrZWFkYWFuIHNlbWFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdOeWF0YWthbiBKZW5pcyBJbnNpZGVuIFNlbWFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICdUZXJraW5pIGJlcnViYWgnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBOZXcgVGVtcGxhdGUnfSA9ICdDaXB0YSBUZW1wbGF0IEJhaGFydSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnSmFsYW5rYW4gQ2FyaWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0p1Z2EgbWVuY2FyaSBkYWxhbSB2ZXJzaSBzZWJlbHVtbnlhPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ1BlcmthcmEga29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnTWFrbHVtYXQgQmFyYW5nYW4gS29uZmlndXJhc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnUGVydHVrYXJhbiBrZWFkYWFuIHNlbWFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdUZXJha2hpciBkaXViYWggb2xlaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdUdW5qdWtrYW4gc2F0dSB2ZXJzaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ1R1bmp1a2thbiBzZW11YSB2ZXJzaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnVmVyc2kgSW5zaWRlbiBOZWdlcmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnVmVyc2kgS2VhZGFhbiBQZXJ0dWthcmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnQmlsYW5nYW4gdmVyc2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ0tvbmZpZ3VyYXNpIFZlcnNpIEl0ZW0gS2VwZXJpbmNoaWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnaGFydGEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICdDSUhpc3Rvcnk6Oic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJ0NvbmZpZ0l0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnVGlhZGEgS2VwdXR1c2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJ0hhc2lsIGNhcmlhbiBDb25maWdJdGVtJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0tlYWRhYW4gcGVuZW1wYXRhbiBpdGVtIGluaSBjb25maWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdLZWFkYWFuIGluc2lkZW4gYmFnaSBjb25maWcgaXRlbSBpbmknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnQmlsYW5nYW4gbWFrc2ltdW0gc2F0dSBlbGVtZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnTWVkYW4ga29zb25nIG1lbnVuanVra2FuIGJhaGF3YSBuaWxhaSBzZW1hc2EgZGlzaW1wYW4nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdOb21ib3IgU2VyaWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSd9ID0gJ0NQVSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYW0nfSA9ICdtZW1vcmkgdXRhbWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZCBEaXNrJ30gPSAnQ2FrZXJhIEtlcmFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnTXVhdGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ05ldHdvcmsgQWRhcHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCBsZWJpaCBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdJUCBBZGRyZXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdQZW55ZXN1YWkgZ3JhZmlrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ1BlcmFsYXRhbiBsYWluLWxhaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnVGFyaWtoIFdhcmFudGkgUGVsdXB1dGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ1Bhc2FuZyBUYXJpa2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1RlbGVmb24gMSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnVGVsZWZvbiAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAnQWxhbWF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ0FsYW1hdCBSYW5na2FpYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuZXQgTWFzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2VyYmFuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdKZW5pcyBMZXNlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ0t1bmNpIExlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnS3VhbnRpdGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJhdGlvbiBEYXRlJ30gPSAnVGFyaWtoIFRhbWF0IFRlbXBvaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlhJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnVGFtYXQgVGVtcG9oJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAncGVueWVsZW5nZ2FyYWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnUGlsb3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ0RpcmFuY2FuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdNZW1iYWlraSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnYmVyc2FyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdtZW5na2FqaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVWppYW4vUUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnTGFwdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdEZXNrdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdQZWxheWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnbGFpbi1sYWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdwZW5jZXRhayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICdUdWthcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSb3V0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdwdXNhdCBha3NlcyBXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ1BlcmFudGkgS2VzZWxhbWF0YW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ1BlcmFsYXRhbiBCYWNrdXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICd0ZXRpa3VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnSnVydXRla25payc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdLYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnQmVhbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdQQ01DSUEgS2FkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdQZXJhbnRpIFVTQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICdEb2sgU3Rlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdQZW5naW1iYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdCYW5ndW5hbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ3RpbmdrYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ0JpbGlrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnVGVtcGF0IGtlcmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ091dGxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lUIEtlbXVkYWhhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxrbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnQXBsaWthc2kgcGVsYW5nZ2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ1Blcm1vaG9uYW4gUGVsYXlhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdPUyBQZWxhbmdnYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAnU2VydmVyIE9TJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICdBZG1pbiBUb29sJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ0FsYXQgcGVuZ2d1bmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICd0ZXJiZW5hbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ0xlc2VuIFNhaGFqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ3NldGlhcCBQZW5nZ3VuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAndW50dWsgUGVtcHJvc2VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICdTZXRpYXAgcGVsYXlhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ3BlciBOb2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICdMZXNlbiBKaWxpZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMZXNlbiBFbnRlcnByaXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAnTGVzZW4gUGVtYWp1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICdEZW1vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ21hc2EgVGVyaGFkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnRnJlZXdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICdTdW1iZXIgVGVyYnVrYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmxpbWl0ZWQnfSA9ICdUaWFkYSBiYXRhc2FuJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICdTZW1hayBuYW1hIHlhbmcgdW5payBzYWhhamEgZGkgZGFsYW0ga2VsYXMgQ29uZmlnSXRlbSB5YW5nIHNhbWEgKFwna2VsYXNcJykgYXRhdSBkaSBwZXJpbmdrYXQgZ2xvYmFsIChcJ2dsb2JhbFwnKSwgeWFuZyBiZXJtYWtzdWQgc2V0aWFwIENvbmZpZ0l0ZW0gc2VkaWEgYWRhIGRpYW1iaWwga2lyYSBrZXRpa2EgbWVuY2FyaSBwZW5kdWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ0JhcmFuZ2FuIEtvbmZpZ3VyYXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICdUYW1iYWggaXRlbSBjb25maWcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnRWRpdCBpdGVtIGNvbmZpZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vZHVsIGFjYXJhIGJhcmFuZ2FuIGtvbmZpZ3VyYXNpIHlhbmcgbWVtYmVuYXJrYW4gdW50dWsgbG9nIGtlIHNlamFyYWggZGFsYW0gYW50YXJhIG11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICdTZWphcmFoIGl0ZW0gY29uZmlnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICdDZXRhayBpdGVtIGNvbmZpZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICdadW0gaXRlbSBjb25maWcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnSGFkIEJhcmFuZ2FuIEtvbmZpZ3VyYXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJ0tvbmZpZ3VyYXNpIFBlbmd1cnVzYW4gUGFuZ2thbGFuIERhdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICdLb25maWd1cmFzaSBpdGVtIG1vZHVsIHB1a2FsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcgUm91dGVyIGNhcmlhbiBiZWxha2FuZyBiYXJhbmdhbiBrb25maWd1cmFzaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnQ2lwdGEgZGFuIHVydXMgdGFrcmlmYW4gdW50dWsgQmFyYW5nYW4gS29uZmlndXJhc2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICdUYWtyaWZrYW4gVGluZGFrYW4gZGltYW5hIGJ1dGFuZyB0ZXRhcGFuIGl0dSBhZGEgZGFsYW0gd2lkZ2V0IG9iamVrIGJlcnNhbWJ1bmcgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gU2lsYSBwYXN0aWthbiB5YW5nIFRpbmRha2FuIGluaSBwZXJsdSBkaWRhZnRhcmthbiB5YW5nIGJlcmlrdXQgZmFpbC1mYWlsIEpTIGRhbiBDU1M6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICdUYWtyaWZrYW4ga3VtcHVsYW4gdGVyc2VidXQgZGVuZ2FuIGtlaXppbmFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuY2lwdGEgYmFyYW5nYW4ga29uZmlndXJhc2kgSVRTTSBtZW5nZ3VuYWthbiBBbnRhcmEgTXVrYSBHZW5lcmlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnVGFrcmlma2FuIGtlaXppbmFuIHlhbmcgZGlwZXJsdWthbiB1bnR1ayBtZW1idWFuZyBpdGVtIGtvbmZpZ3VyYXNpIElUU00gbWVuZ2d1bmFrYW4gQW50YXJhbXVrYSBVbXVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZGFwYXRrYW4gYmFyYW5nYW4ga29uZmlndXJhc2kgSVRTTSBtZW5nZ3VuYWthbiBBbnRhcmEgTXVrYSBHZW5lcmlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuY2FyaSBiYXJhbmdhbiBrb25maWd1cmFzaSBJVFNNIG1lbmdndW5ha2FuIEFudGFyYSBNdWthIEdlbmVyaWsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4ga2ViZW5hcmFuIHlhbmcgZGlwZXJsdWthbiB1bnR1ayBtZW5nZW1hc2tpbmkgYmFyYW5nYW4ga29uZmlndXJhc2kgSVRTTSBtZW5nZ3VuYWthbiBBbnRhcmEgTXVrYSBHZW5lcmlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gbW9kdWwgZ2FtYmFyYW4gdW50dWsgbWVudW5qdWtrYW4gcGFuZGFuZ2FuIHlhbmcga2VjaWwgc2VuYXJhaSBpdGVtIGtvbmZpZ3VyYXNpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIHVuZ2thcGFuIGJpYXNhIHNlY2FyYSBpbmRpdmlkdSB1bnR1ayBzZXRpYXAga2VsYXMgSXRlbUtvbmZpZyB1bnR1ayBtZW1lcmlrc2EgbmFtYSBJdGVtS29uZmlnIGRhbiB1bnR1ayBtZW51bmp1a2thbiBtZXNlaiByYWxhdCBzZXBhZGFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRhcyBTdGFuZGFyZC1TdWJvYmplY3QgZGVyIEtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIGJpbGFuZ2FuIGJhcmlzIHVudHVrIGVkaXRvciBkZWZpbmlzaSBDSSBkYWxhbSBhbnRhcmEgbXVrYSBhZG1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnVGFrcmlma2FuIHN1c3VuYW4ga2VhZGFhbiBpbnNpZGVuIGRhcmlwYWRhIHRpbmdnaSAoY3RoLiBrcml0aWthbCkga2UgcmVuZGFoIChjdGguIGZ1bmdzaWFuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICdUYWtyaWZrYW4ga2VhZGFhbiBwZW5lbXBhdGFuIHlhbmcgcmVsZXZlbiBkaW1hbmEgdGlrZXQgYmVyc2FtYnVuZyBib2xlaCBtZW5qZWphc2thbiBzdGF0dXMgYmFnaSBDSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gaGFkIGNhcmlhbiB1bnR1ayBza3JpbiBJdGVtS29uZmlnSVRTTUFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGhhZCBjYXJpYW4gdW50dWsgc2tyaW4gQ2FyaWFuSXRlbUtvbmZpZ0lUU01BZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gcnVhbmdhbiBkaXR1bmp1a2thbiBkYWxhbSBnYW1iYXJhbiBrZXNlbHVydWhhbiBpdGVtIGtvbmZpZy4gUGlsaWhhbiBpbmkgdGlkYWsgbWVtcHVueWFpIGtlc2FuIGtlIGF0YXMga2VkdWR1a2FuIHJ1YW5nYW4uIE5vdGE6IHJ1YW5nYW4gS2VsYXMgc2VudGlhc2EgYWRhIGppa2EgcGVuYXBpcyBcJ1NlbXVhXCcgZGlwaWxpaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIHJ1YW5nYW4geWFuZyBkaXR1bmp1a2thbiBkYWxhbSBjYXJpYW4gaXRlbSBrb25maWcuIFBpbGloYW4gaW5pIHRpZGFrIG1lbXB1bnlhaSBrZXNhbiBrZSBhdGFzIGtlZHVkdWthbiB0aWFuZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIHJ1YW5nYW4gZGl0dW5qdWtrYW4gZGFyaXBhZGEgQ0lzIGRhbGFtIGdhbWJhcmFuIGtlc2VsdXJ1aGFuIGl0ZW0ga29uZmlnIGJlcmdhbnR1bmcga2VwYWRhIGtlbGFzIENJIC4gU2V0aWFwIHBlbnllcnRhYW4gaGVuZGFrbGFoIGRpbXVsYWthbiBkZW5nYW4gbmFtYSBrZWxhcyBkYW4gdGl0aWsgYmVydGluZGloIGR1YSAoaWFpdHUgS29tcHV0ZXI6OikuIFRlcmRhcGF0IGJlYmVyYXBhIHNpZmF0LUNJIHlhbmcgYWRhIHBhZGEga2VzZW11YSBDSXMgKGNvbnRvaCB1bnR1ayBrZWxhcyBLb21wdXRlcjpLb21wdXRlcjo6TmFtYSwgS29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgS29tcHV0ZXI6Ok1hc2FDaXB0YSkuIFVudHVrIG1lbnVuanVra2FuIHNpZmF0IGluZGl2aWR1IENJIHNlYmFnYWltYW5hIHlhbmcgZGl0YWtyaWZrYW4gZGFsYW0gRGVmaW5pc2ktQ0ksIHNraW0gYmVyaWt1dCBtZXN0aSBkaWd1bmFrYW4gKGNvbnRvaCB1bnR1ayBrZWxhcyBLb21wdXRlcik6IEtvbXB1dGVyOjpoYXJkZGlzazo6MSwgS29tcHV0ZXI6OmhhcmRkaXNrOjoxOjpLYXBhc2l0aTo6MSwga29tcHV0ZXI6OmhhcmRkaXNrOjoyLCBLb21wdXRlcjo6aGFyZGRpc2s6OjI6OkthcGFzaXRpOjoxLiBKaWthIHRpYWRhIHBlbnllcnRhYW4gdW50dWsga2VsYXMgQ0ksIG1ha2EgcnVhbmdhbiBkZWZhdWx0IGRpdHVuanVra2FuIHNlYmFnYWltYW5hIHlhbmcgZGl0YWtyaWZrYW4gZGFsYW0gSVRTTUtvbmZpZ0l0ZW06OkJhaGFnaWFuIERlcGFuOjpBZ2VudElUU01Lb25maWdJdGVtIyMjVHVuanVrUnVhbmdhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBydWFuZ2FuIGRpdHVuanVra2FuIGRhcmlwYWRhIENJcyBkYWxhbSBnYW1iYXJhbiBrZXNlbHVydWhhbiBpdGVtIGtvbmZpZyBiZXJnYW50dW5nIGtlcGFkYSBrZWxhcyBDSSAuIFNldGlhcCBwZW55ZXJ0YWFuIGhlbmRha2xhaCBkaW11bGFrYW4gZGVuZ2FuIG5hbWEga2VsYXMgZGFuIHRpdGlrIGJlcnRpbmRpaCBkdWEgKGlhaXR1IEtvbXB1dGVyOjopLiBUZXJkYXBhdCBiZWJlcmFwYSBzaWZhdC1DSSB5YW5nIGFkYSBwYWRhIGtlc2VtdWEgQ0lzIChjb250b2ggdW50dWsga2VsYXMgS29tcHV0ZXI6S29tcHV0ZXI6Ok5hbWEsIEtvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIEtvbXB1dGVyOjpNYXNhQ2lwdGEpLiBVbnR1ayBtZW51bmp1a2thbiBzaWZhdCBpbmRpdmlkdSBDSSBzZWJhZ2FpbWFuYSB5YW5nIGRpdGFrcmlma2FuIGRhbGFtIERlZmluaXNpLUNJLCBza2ltIGJlcmlrdXQgbWVzdGkgZGlndW5ha2FuIChjb250b2ggdW50dWsga2VsYXMgS29tcHV0ZXIpOiBLb21wdXRlcjo6aGFyZGRpc2s6OjEsIEtvbXB1dGVyOjpoYXJkZGlzazo6MTo6S2FwYXNpdGk6OjEsIGtvbXB1dGVyOjpoYXJkZGlzazo6MiwgS29tcHV0ZXI6OmhhcmRkaXNrOjoyOjpLYXBhc2l0aTo6MS4gSmlrYSB0aWFkYSBwZW55ZXJ0YWFuIHVudHVrIGtlbGFzIENJLCBtYWthIHJ1YW5nYW4gZGVmYXVsdCBkaXR1bmp1a2thbiBzZWJhZ2FpbWFuYSB5YW5nIGRpdGFrcmlma2FuIGRhbGFtIElUU01Lb25maWdJdGVtOjpCYWhhZ2lhbiBEZXBhbjo6QWdlbnRJVFNNS29uZmlnSXRlbSMjI1R1bmp1a1J1YW5nYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gcnVhbmdhbiBkaXR1bmp1a2thbiBDSXMgZGFsYW0gcGFuZGFuZ2FuIHBhdXRhbiBqYWR1YWwga29tcGxla3MsIGJlcmdhbnR1bmcga2VwYWRhIGtlbGFzIENJIC4gU2V0aWFwIHBlbnllcnRhYW4gaGVuZGFrbGFoIGRpbXVsYWthbiBkZW5nYW4gbmFtYSBrZWxhcyBkYW4gdGl0aWsgYmVydGluZGloIGR1YSAoaWFpdHUgS29tcHV0ZXI6OikuIFRlcmRhcGF0IGJlYmVyYXBhIFNpZmF0LXNpZmF0LUNJIHlhbmcgc2FtYSBrZXBhZGEgc2VtdWEgQ0lzIChjb250b2ggdW50dWsga2VsYXMgS29tcHV0ZXI6S29tcHV0ZXI6Ok5hbWEsIEtvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIEtvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVW50dWsgbWVudW5qdWtrYW4gc2lmYXQgaW5kaXZpZHUgQ0kgc2ViYWdhaW1hbmEgeWFuZyBkaXRha3JpZmthbiBkYWxhbSBEZWZpbmlzaS1DSSwgc2tpbSBiZXJpa3V0IG1lc3RpIGRpZ3VuYWthbiAoY29udG9oIHVudHVrIGtlbGFzIEtvbXB1dGVyKTogS29tcHV0ZXI6OmhhcmRkaXNrOjoxLCBLb21wdXRlcjo6aGFyZGRpc2s6OjE6OkthcGFzaXRpOjoxLCBrb21wdXRlcjo6aGFyZGRpc2s6OjIsIEtvbXB1dGVyOjpoYXJkZGlzazo6Mjo6S2FwYXNpdGk6OjEuIEppa2EgdGlhZGEgcGVueWVydGFhbiB1bnR1ayBrZWxhcyBDSSwgbWFrYSBydWFuZ2FuIGRlZmF1bHQgZGlwYXBhcmthbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnVGFrcmlma2FuIGplbmlzIHNhbWJ1bmdhbiB5YW5nIG1hbmEgKGRpbmFtYWthbiBkYXJpcGFkYSBwZXJzcGVrdGlmIHRpa2V0KSBib2xlaCBtZW5qZWphc2thbiBzdGF0dXMgYmFnaSBzYXR1IHNhbWJ1bmdhbiBDSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICdUYWtyaWZrYW4gamVuaXMgdGlrZXQgeWFuZyBtYW5hIGJvbGVoIG1lbmplamFza2FuIHN0YXR1cyBiYWdpIHNhdHUgc2FtYnVuZ2FuIENJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICdQZW5lbXBhdGFuIEtlYWRhYW4gV2FybmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnUGVuZW1wYXRhbiBLZWFkYWFuIFdhcm5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnUGVuZW1wYXRhbiBLZWFkYWFuIEplbmlzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJ1RpZGFrIGRpYm9sZWhrYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdEaWJvbGVoa2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ01lbWJvbGVoa2FuIGNpcmkgdGluZGFrYW4gcHVrYWwgaXRlbSBrb25maWd1cmFzaSB1bnR1ayBmcm9udGVuZCBlamVuIHVudHVrIGJla2VyamEgcGFkYSBsZWJpaCBkYXJpcGFkYSBzYXR1IGl0ZW0ga29uZmlndXJhc2kgcGFkYSBzYXR1IG1hc2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICdNZW1ib2xlaGthbiBjaXJpIGl0ZW0ga29uZmlndXJhc2kgdGluZGFrYW4gcHVrYWwgaGFueWEgdW50dWsga3VtcHVsYW4geWFuZyBkaXNlbmFyYWlrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICdNZW1ib2xlaGthbi9tZWx1bXB1aGthbiBmdW5nc2kgdW50dWsgbWVueWVtYWsgS29uZmlnSXRlbSB1bnR1ayBuYW1hLW5hbWEgeWFuZyB1bmlrLiBTZWJlbHVtIG1lbWJvbGVoa2FuIHBpbGloYW4gaW5pIGFuZGEgcGVybHUgbWVueWVtYWsgc2lzdGVtIGFuZGEgdW50dWsgYmFyYW5nYW4ga29uZmlnIHlhbmcgdGVsYWggc2VkaWEgYWRhIGRlbmdhbiBuYW1hIHlhbmcgc2FtYS4gQW5kYSBib2xlaCBtZWxha3VrYW4gaW5pIGRlbmdhbiBiaW4gc2tyaXAvb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICdNb2RlbCBhY2FyYSB1bnR1ayBtZW55ZWRpYWthbiBzdGF0dXMtaXRlbWNvbmZpZyBhdGFzIHNhbWJ1bmdhbi1pdGVtY29uZmlnLXRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJ3BhbmRhbmdhbiBpdGVtIGNvbmZpZyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJ01vZHVsIHVudHVrIG1lbnllbWFrIGt1bXB1bGFuIGJlcnRhbmdndW5namF3YWIgdW50dWsga2VsYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnTW9kdWwgdW50dWsgbWVueWVtYWsga3VtcHVsYW4gYmVydGFuZ2d1bmdqYXdhYiB1bnR1ayBpdGVtIGtvbmZpZ3VyYXNpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJ01vZHVsIHVudHVrIG1lbmphbmEgc3RhdGlzdGlrIGtvbmZpZyBpdGVtIElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ09iamVrdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ1BhbmRhbmdhbiBrZXNlbHVydWhhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgdW50dWsgd2FybmEga2VhZGFhbiBtZW5nYXR1ciBrZWR1ZHVrYW4gZGFsYW0gcGFwYXJhbiBwaWxpaGFuIGRhcmkgcGFwYXJhbiBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayBrZWFkYWFuIG1lbmdhdHVyIGtlZHVkdWthbiBkYWxhbSBwYXBhcmFuIHBpbGloYW4gZGFyaSBwYXBhcmFuIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayBjb250b2gga3VtcHVsYW4geWFuZyBkaWJlbmFya2FuIHBhZGEgY2lyaS1jaXJpIGthdGFsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayBtdWthIHN1cmF0IChkaSBtYW5hIGl0ZW0ga29uZmlndXJhc2kgZGl0dW5qdWtrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBrZWJlbmFyYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gaXRlbSBrb25maWd1cmFzaSBJVFNNIGRhbGFtIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW1lcmx1a2FuIGtlYmVuYXJhbiB1bnR1ayBtZW5nZ3VuYWthbiBza3JpbiBjYXJpYW4gaXRlbSBrb25maWd1cmFzaSBJVFNNIGRhbGFtIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBrZWJlbmFyYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4genVtIGl0ZW0ga29uZmlndXJhc2kgSVRTTSBkYWxhbSBwYXBhcmFuIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBrZWJlbmFyYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gdGFtYmFoIGl0ZW0ga29uZmlndXJhc2kgSVRTTSBkYWxhbSBwYXBhcmFuIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWVybHVrYW4ga2ViZW5hcmFuIHVudHVrIG1lbmdndW5ha2FuIHNrcmluIGVkaXQgaXRlbSBrb25maWd1cmFzaSBJVFNNIGRhbGFtIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBoaXN0b3J5IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBrZWJlbmFyYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gc2VqYXJhaCBpdGVtIGtvbmZpZ3VyYXNpIElUU00gZGFsYW0gcGFwYXJhbiBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBrZWJlbmFyYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gY2V0YWsgaXRlbSBrb25maWd1cmFzaSBJVFNNIGRhbGFtIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBkZWxldGUgY29uZmlnIGl0ZW1zLid9ID0gJ0tlaXN0aW1ld2Fhbi1rZWlzdGltZXdhYW4gZGlrZWhlbmRha2kgdW50dWsgbWVtYWRhbWthbiBiYXJhbmctYmFyYW5nIGNvbmZpZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICdDYXJpIGJhcmFuZy1iYXJhbmcgY29uZmlnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3RzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuICJBdXRvSW5jcmVtZW50IiBpbmNyZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJ30gPQogICAgICAgICdNZW1pbGloIGl0ZW0ga29uZmlndXJhc2kgbW9kdWwgcGVuamFuYSBub21ib3IuICJQZW5hbWJhaGFuQXV0byIgbWVuYW1iYWggYmlsYW5nYW4gaXRlbSB0YXRhcmFqYWgsIFNpc3RlbUlELCBLb25maWdJdGVtQ2xhc3NJRCBkYW4ga2F1bnRlciBkaWd1bmFrYW4uIEZvcm1hdCBpbmkgYWRhbGFoICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyICIsIGNvbnRvaG55YSAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnTWVuZW50dWthbiBrZWFkYWFuIGluc2lkZW4gYmFnaSBDSSBzZWNhcmEgYXV0b21hdGlrIGFwYWJpbGEgc3VhdHUgVGlrZXQgZGlzYW1idW5na2FuIGtlcGFkYSBzdWF0dSBDSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXQga2VhZGFhbiBwZW5lbXBhdGFuIGRhbGFtIHNrcmluIHB1a2FsIGl0ZW0ga29uZmlndXJhc2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0IGtlYWRhYW4gaW5zaWRlbiBkYWxhbSBza3JpbiBwdWthbCBpdGVtIGtvbmZpZ3VyYXNpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gcGF1dGFuIGRhbGFtIG1lbnUgeWFuZyBtZW1ib2xlaGthbiBtZW5naHVidW5na2FuIGl0ZW0ga29uZmlndXJhc2kgZGVuZ2FuIG9iamVrIGxhaW4gZGFsYW0gcGFuZGFuZ2FuIHp1bSBpdGVtIGtvbmZpZyBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrIHBhdXRhbiBkYWxhbSBtZW51IHVudHVrIG1lbmdha3NlcyBzZWphcmFoIGl0ZW0ga29uZmlndXJhc2kgZGkgZGFsYW0gZ2FtYmFyYW4ga2VzZWx1cnVoYW4gaXRlbSBrb25maWd1cmFzaSBhbnRhcmEgbXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBwYXV0YW4gZGFsYW0gbWVudSB1bnR1ayBtZW5nYWtzZXMgc2VqYXJhaCBpdGVtIGtvbmZpZ3VyYXNpIGRhbGFtIHBhbmRhbmdhbiB6dW0gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW51bmp1a2thbiBzYXR1IHNhbWJ1bmdhbiBrZXBhZGEgbWVudSB1bnR1ayBtZW1hZGFtIHNhdHUgYmFyYW5nIGtvbmZpZ3VyYXNpICBkYWxhbSBwYW5kYW5nYW4genVtbnlhIGRhcmlwYWRhIGFudGFyYW11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUdW5qdWsgcGF1dGFuIGRhbGFtIG1lbnUgdW50dWsgbWVueWFsaW4gaXRlbSBrb25maWd1cmFzaSBkaSBkYWxhbSBnYW1iYXJhbiBrZXNlbHVydWhhbiBpdGVtIGtvbmZpZ3VyYXNpIGFudGFyYSBtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBhdXRhbiBkYWxhbSBtZW51IHVudHVrIG1lbnlhbGluIGJhcmFuZ2FuIGtvbmZpZ3VyYXNpIGRhbGFtIHBhbmRhbmdhbiB6dW0gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBhdXRhbiBkYWxhbSBtZW51IHVudHVrIGVkaXQgYmFyYW5nYW4ga29uZmlndXJhc2kgZGFsYW0gcGFuZGFuZ2FuIHp1bSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnbWVudW5qdWtrYW4gc3VhdHUgc2FtYnVuZ2FuIHBhZGEgbWVudSB1bnR1ayBrZW1iYWxpIGRhbGFtIHpvb20gaXRlbSBrb25maWd1cmFzaSBkYXJpcGFkYSBhbnRhcmEgbXVrYSBhZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gcGF1dGFuIGRhbGFtIG1lbnUgdW50dWsgbWVuY2V0YWsgYmFyYW5nYW4ga29uZmlndXJhc2kgZGFsYW0gcGFuZGFuZ2FuIHp1bSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1ayBwYXV0YW4gZGFsYW0gbWVudSB1bnR1ayB6dW0ga2UgZGFsYW0gYmFyYW5nYW4ga29uZmlndXJhc2kgZGkgZGFsYW0gZ2FtYmFyYW4ga2VzZWx1cnVoYW4gYmFyYW5nYW4ga29uZmlndXJhc2kgYW50YXJhIG11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIGNvbmZpZyBpdGVtIGhpc3RvcnkgKHJldmVyc2Ugb3JkZXJlZCkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1ayBzZWphcmFoIGJhcmFuZ2FuIGtvbmZpZyAodXJ1dGFuIHRlcmJhbGlrKSBkYWxhbSBhbnRhcmEgbXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnUGVuZ2VjYW0gdW50dWsgaXRlbSBrb25maWd1cmFzaSwgY29udG9oOiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gRGVmYXVsdCBpYWxhaCBDb25maWdJdGVtIy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICdrZWxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICdnbG9iYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncG9zdHByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJlcHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcm9kdWN0aXZlJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJhc2pvbiBhdiBrb25maWd1cmFzam9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICdFbmRyZSBrbGFzc2VkZWZpbmlzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnS29uZmlndXJhc2pvbnNlbmhldHNrbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ0RlZmluaXNqb24nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnS29uZmlndXJhc2pvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICdGaWx0ZXIgZm9yIGtsYXNzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnVmVsZyBlbiBrbGFzc2UgZnJhIGxpc3RlbiBmb3Igw6Ugb3BwcmV0dGUgZW4gbnkga29uZmlndXJhc2pvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ0tsYXNzZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJ01hc3NlcmVkaWdlcmluZyBhdiBrb25maWd1cmFzam9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJ1Byb2R1a3Nqb25zc2V0dGluZ3N0aWxzdGFuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJ0hlbmRlbHNlc3RpbHN0YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJ0tvYmxlIHRpbCBlbiBhbm5lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ1ZpbCBkdSB2aXJrZWxpZyBmamVybmUgZGVubmUga29uZmlndXJhc2pvbnNlbmhldGVuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdOYXZuZXQgdGlsIGRlbm5lIGtvbmZpZ3VyYXNqb25zZW5oZXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdQcm9kdWtzam9uc3NldHRpbmdzdGlsc3RhbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdIZW5kZWxzZXN0aWxzdGFuZCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnSGlzdG9yaWVuIHRpbCBrb25maWd1cmFzam9uc2VuaGV0ZW46ICVzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdLb250ZWtzdHZhbGcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnS29uZmlndXJhc2pvbnNlbmhldGVyIHBlciBzaWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ1R5cGUgcHJvZHVrc2pvbnNzZXR0aW5nc3RpbHN0YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdOw6V2w6ZyZW5kZSBoZW5kZWxzZXN0aWxzdGFuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdOw6V2w6ZyZW5kZSB0eXBlIGhlbmRlbHNlc3RpbHN0YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1Npc3QgZW5kcmV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnTGFnIGVuIG55IG1hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnVXRmw7hyIHPDuGtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICdPZ3PDpSBzw7hrZSBpIHRpZGxpZ2VyZSB2ZXJzam9uZXI/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnS29uZmlndXJhc2pvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICdPcHBseXNuaW5nZXIgb20ga29uZmlndXJhc2pvbnNlbmhldGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ07DpXbDpnJlbmRlIHByb2R1a3Nqb25zc2V0dGluZ3N0aWxzdGFuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdTaXN0IGVuZHJldCBhdic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdWaXMgw6luIHZlcnNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICdWaXMgYWxsZSB2ZXJzam9uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ0hlbmRlbHNlc3RpbHN0YW5kIGZvciB2ZXJzam9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnUHJvZHVrc2pvbnNzZXR0aW5nc3RpbHN0YW5kIGZvciB2ZXJzam9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICdWZXJzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICdWZXJzam9uc2RldGFsamVyIGZvciBlbmhldGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnRWdlbnNrYXAnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICdLb25maWd1cmFzam9uc2VuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ0luZ2VuIHJlc3VsdGF0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gU2VhcmNoIFJlc3VsdHMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnUHJvZHVrc2pvbnNzZXR0aW5nc3RpbHN0YW5kIGZvciBkZW5uZSBrb25maWd1cmFzam9uc2VuaGV0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdIZW5kZWxzZXN0aWxzdGFuZGVuIGZvciBkZW5uZSBrb25maWd1cmFzam9uc2VuaGV0ZW4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTWFrcy4gYW50YWxsIGF2IGV0dCBlbGVtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ1RvbW1lIGZlbHRlciBpbmRpa2VyZXIgYXQgZGUgbsOldsOmcmVuZGUgdmVyZGllbmUgYmVob2xkZXMnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnU2VyaWVudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnUHJvc2Vzc29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ0ludGVybm1pbm5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ0hhcmRkaXNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnS2FwYXNpdGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ05ldHR2ZXJrc2tvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgb3ZlciBESENQJ30gPSAnSVAgZnJhIERIQ1AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgQWRkcmVzcyd9ID0gJ0lQLWFkcmVzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnR3JhZmlra29ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdBbm5ldCB1dHN0eXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnVXRsw7hwc2RhdG8gZm9yIGdhcmFudGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnSW5zdGFsbGFzam9uc2RhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1RlbGVmb24gMSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnVGVsZWZvbiAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAnQWRyZXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdOZXR0dmVya3NhZHJlc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAnU3VibmV0dG1hc2tlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICdSdXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdMaXNlbnN0eXBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnTGlzZW5zbsO4a2tlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ0FudGFsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdVdGfDpXIgZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlhJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnVXRnw6V0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ1ZlZGxpa2Vob2xkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnUGlsb3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ1BsYW5sYWd0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ1JlcGFyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1V0ZmFzZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnRXZhbHVlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9LdmFsaXRldHNrb250cm9sbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdCw6ZyYmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdTdGFzam9uw6ZyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdUamVuZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdBbm5ldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnU2tqZXJtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdTa3JpdmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N2aXRzaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSdXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1dMQU4tYmFzZXN0YXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnU2lra2VyaGV0c2VuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdCYWNrdXAtZW5oZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdNdXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdUYXN0YXR1cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdLYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnUHJvc2pla3TDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICdNb2RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQS1rb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0ItZW5oZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnRG9ra2luZ3N0YXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ1NrYW5uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdCeWduaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnRXRhc2plJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICdSb20nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ1JhY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnQXJiZWlkc3N0ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnS29udGFrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lULWZhc2lsaXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMb2thbG5ldHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxldXRzdHlyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdLbGllbnQtYXBwbGlrYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ01lbGxvbXZhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gPSAnVGplbmVyLWFwcGxpa2Fzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ0tsaWVudC1PUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdUamVuZXItT1MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ0FkbWluaXN0cmF0b3J2ZXJrdMO4eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICdCcnVrZXJ2ZXJrdMO4eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ0lubmVieWdkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnRW5rZWx0bGlzZW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnUGVyIEJydWtlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUGVyIFByb3Nlc3Nvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUGVyIFRqZW5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ1BlciBOb2RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnVm9sdW1saXNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnRW50ZXJwcmlzZS1saXNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICdVdHZpa2xlcmxpc2Vucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAnRGVtbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICdUaWRzYmVncmVuc2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnR3JhdGlzIHByb2dyYW12YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAnw4VwZW4ga2lsZGVrb2RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ1ViZWdyZW5zZXQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdLb25maWd1cmFzam9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJ0ZhcmdlIGZvciBwcm9kdWtzam9uc3NldHRpbmdzdGlsc3RhbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICdGYXJnZSBmb3IgcHJvZHVrc2pvbnNzZXR0aW5nc3RpbHN0YW5kLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnVHlwZSBwcm9kdWtzam9uc3NldHRpbmdzdGlsc3RhbmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnSW5ha3Rpdic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJ0FrdGl2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnT3ZlcnNpa3Qgb3ZlciBJVFNNIGtvbmZpZ3VyYXNqb25zZW5oZXRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ092ZXJzaWt0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJlIGZvciB0aWxnYW5nc2dydXBwZS1la3NlbXBlbCBpIGF0dHJpYnV0dGVuZSBmb3IgZ2VuZXJlbGwga2F0YWxvZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnU8O4ayBldHRlciBrb25maWd1cmFzam9uc2VuaGV0ZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICdrbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnZ2xvYmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdDb25maWd1cmF0aWUtaXRlbSBiZWhlZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICdXaWp6aWcgZGVmaW5pdGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICdEZWZpbml0aWUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnQ29uZmlndXJhdGllLWl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnRmlsdGVyIG9wIGtsYXNzZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnU2VsZWN0ZWVyIGVlbiBrbGFzc2UgdWl0IGRlIGxpanN0IG9tIGVlbiBuaWV1dyBjb25maWd1cmF0aWUtaXRlbSBhYW4gdGUgbWFrZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnS2xhc3NlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0RlIG5hYW0gdmFuIGRpdCBjb25maWd1cmF0aWUtaXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdTdGF0dXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdJbmNpZGVudHN0YXR1cyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdDb250ZXh0IEluc3RlbGxpbmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICdBYW50YWwgY29uZmlndXJhdGllLWl0ZW1zIHBlciBwYWdpbmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdBY3R1ZWxlIGluY2lkZW50c3RhdHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICdMYWFzdGUgd2lqemlnaW5nJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnT29rIGluIGVlcmRlcmUgdmVyc2llcyB6b2VrZW4/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnQ29uZmlndXJhdGllLWl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnQ29uZmlndXJhdGllLWl0ZW0gaW5mb3JtYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSA9ICdBY3R1ZWxlIHN0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdMYWFzdGUgd2lqemlnaW5nIGRvb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPSyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAnVG9vbiDDqcOpbiB2ZXJzaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICdUb29uIGFsbGUgdmVyc2llcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAnVmVyc2llIEluY2lkZW50LXN0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICdWZXJzaWVudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ0NvbmZpZ3VyYXRpZS1pdGVtIHZlcnNpZSBkZXRhaWxzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnQXR0cmlidXV0JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ0dlZW4gcmVzdWx0YWF0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdEZSBzdGF0dXMgdmFuIGRpdCBjb25maWd1cmF0aWUtaXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0RlIGluY2lkZW50c3RhdHVzIHZhbiBkaXQgY29uZmlndXJhdGllLWl0ZW0nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTWF4aW1hbGUgaG9ldmVlbGhlaWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnU2VyaWVudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdIYXJkZSBzY2hpamYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdDYXBhY2l0ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ05ldHdlcmsgYWRhcHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCB2aWEgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVAgYWRyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnVmlkZW9rYWFydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdPdmVyaWdlIHVpdHJ1c3RpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnRWluZGRhdHVtIGdhcmFudGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ0luc3RhbGxhdGllZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1RlbGVmb29uIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVmb29uIDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICdBZHJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdOZXR3ZXJrYWRyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuZXQgTWFzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2F0ZXdheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdMaWNlbnRpZXR5cGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICdMaWNlbnRpZXNsZXV0ZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdIb2V2ZWVsaGVpZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdFeHBpcmF0aWVkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlhJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnVmVybG9wZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICdJbiBvbmRlcmhvdWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQaWxvdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnR2VwbGFubmVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ0luIHJlcGFyYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnVWl0Z2VmYXNlZXJkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ1Jldmlldyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdMYXB0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ0Rlc2t0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ092ZXJpZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJ01vbml0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ1ByaW50ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAnU3dpdGNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ1JvdXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1dMQU4gQWNjZXNzIFBvaW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ1NlY3VyaXR5IGRldmljZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnQmFja3VwYXBwYXJhYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdNdWlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnVG9ldHNlbmJvcmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnQ2FtZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ0JlYW1lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ01vZGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnUENNQ0lBIGthYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdVU0IgYXBwYXJhYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9ja2luZyBTdGF0aW9uJ30gPSAnRG9ja2luZyBzdGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTY2FubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnR2Vib3V3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnRXRhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ0thbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ1dlcmtwbGVrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ0FhbnNsdWl0aW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnU2VydmVycnVpbXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdDbGllbnR0b2VwYXNzaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ1NlcnZlcnRvZXBhc3NpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnQ2xpZW50IGJlc3R1cmluZ3NzeXN0ZWVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1NlcnZlciBiZXN0dXJpbmdzc3lzdGVlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnQWRtaW4gVG9vbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICdVc2VyIFRvb2wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdFbWJlZGRlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ1NpbmdsZSBMaWNlbmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnUGVyIGdlYnJ1aWtlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUGVyIENQVSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUGVyIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ1BlciBub2RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnVm9sdW1lIExpY2VudGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVycHJpc2UgTGljZW5jZSd9ID0gJ0VudGVycHJpc2VsaWNlbnRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ09udHdpa2tlbGFhcnNsaWNlbnRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAnRGVtbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICdUaW1lIHJlc3RyaWN0ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ09wZW4gU291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ09uZ2VsaW1pdGVlcmQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdDb25maWd1cmF0aWUtaXRlbXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ0Fhbm1ha2VuIGVuIGJlaGVyZW4gdmFuIGRlZmluaXRpZXMgdm9vciBjb25maWd1cmF0aWUtaXRlbXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJzIHZvb3IgZGUgdm9vcmJlZWxkIHBlcmltc3NpZWdyb2VwZW4gdmFuIGRlIGFsZ2VtZW5lIGNhdGFsb2cgYXR0cmlidXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdaYXJ6xIVkemFuaWUgQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICdabWllxYQgZGVmaW5pY2rEmSBrbGFzeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJ0tsYXNhIENJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICdEZWZpbmljamEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAnQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnRmlsdHIgZGxhIGtsYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnWmF6bmFjeiBrbGFzxJkgbmEgbGnFm2NpZSBhYnkgdXR3b3J6ecSHIG5vd2UgQ0kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnS2xhc2EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJ1N0YW4gemRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdOYXp3YSB0ZWdvIENJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICdOYXp3YSBqZXN0IGp1xbwgdcW8eXdhbmEgcHJ6ZXogQ0kgbyBuYXN0xJlwdWrEhWN5Y2ggbnVtZXJhY2g6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdTdGFuIHdkcm/FvGVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdTdGFuIHpkYXJ6ZW5pYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdVc3Rhd2llbmlhIGtvbnRla3N0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICdMaWN6YmEgQ0kgbmEgc3Ryb25pZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICdUeXAgc3RhbnUgd2Ryb8W8ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnQWt0dWFsbnkgc3Rhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdBa3R1YWxueSB0eXAgc3RhbnUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnT3N0YXRuaW8gem1pZW5pb25lJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnVXR3w7NyeiBub3d5IHN6YWJsb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVuIFNlYXJjaCd9ID0gJ1VydWNob20gd3lzenVraXdhbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1V3emdsxJlkbmnEhyBwb3ByemVkbmllIHdlcnNqZT8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICdDSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2plIG8gQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnQWt0dWFsbnkgc3RhbiB3ZHJvxbxlbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ09zdGF0bmlvIHptaWVuaW9uZSBwcnpleic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICdQb2thxbwgamVkbsSFIHdlcnNqxJkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAnUG9rYcW8IHdzenlzdGtpZSB3ZXJzamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ1N0YW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnV2Vyc2phJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICdTemN6ZWfDs8WCeSB3ZXJzamkgQ0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICdXxYJhxZtjaXdvxZvEhyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogSVRTTSBDb25maWdJdGVtJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgZG9uXCd0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtOiAlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIGNvbmZpZ2l0ZW0gSUQgJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJ0NJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdTdGFuIHdkcm/FvGVuaWEgdGVnbyBDSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ1N0YW4gemRhcnplbmlhIHRlZ28gQ0knOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTWFrc3ltYWxuYSBsaWN6YmEgd3lzdMSFcGllxYQgcG9qZWRueWN6ZWdvIGVsZW1ldG50dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICdQdXN0ZSBwb2xhIHpuYWN6YWrEhSwgxbxlIHphdHJ6eW1hbmUgYsSZZMSFIGJpZcW8xIVjZSB3YXJ0b8WbY2knOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdOdW1lciBzZXJ5am55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSd9ID0gJ1Byb2Nlc29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdEeXNrIHR3YXJkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJ1BvamVtbm/Fm8SHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ0thcnRhIHNpZWNpb3dhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0FkcmVzIElQIHogREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnQWRyZXMgSVAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnS2FydGEgZ3JhZmljem5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ1Bvem9zdGHFgmUgd3lwb3NhxbxlbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdGEgd3lnYcWbbmnEmWNpYSBnd2FyYW5jamknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnRGF0YSBpbnN0YWxhY2ppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICdUZWxlZm9uIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVmb24gMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FkcmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ0FkcmVzIHNpZWNpb3d5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAnTWFza2Egc2llY2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJ0JyYW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ1R5cCBsaWNlbmNqaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ0tsdWN6IGxpY2VuY3lqbnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdJbG/Fm8SHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdGEgd3lnYcWbbmnEmWNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ05vxZtuaWsnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICdXeWdhc8WCbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ1V0cnp5bWFuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQaWxvdGHFvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnUGxhbm93YW55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ05hcHJhd2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1d5Y29mYW55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ1ByemVnbMSFZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdMYXB0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ0Rlc2t0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1Nlcndlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ0lubmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJ01vbml0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ0RydWthcmthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N3aXRjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSdXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ0FjY2VzcyBQb2ludCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWN1cml0eSBEZXZpY2UnfSA9ICdVcnrEhWR6ZW5pZSB6YWJlenBpZWN6YWrEhWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICdVcnrEhWR6ZW5pZSBkbyB0d29yemVuaWEga29waWkgemFwYXNvd2VqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAnTXlzemthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnS2xhd2lhdHVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdLYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnUHJvamVrdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdLYXJ0YSBQQ01DSUEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ1VyesSFZHplbmllIFVTQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICdTdGFjamEgZG9rdWrEhWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTa2FuZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdCdWR5bmVrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnUGnEmXRybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnUG9rw7NqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ01pZWpzY2UgcHJhY3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnUHVua3Qgc3ByemVkYcW8eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0R6aWHFgiBJVCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ1dMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICdHU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnQXBsaWthY2phIGtsaWVuY2thJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ0FwbGlrYWNqYSBzZXJ3ZXJvd2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnU3lzdGVtIGtsaWVuY2tpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1N5c3RlbSBzZXJ3ZXJvd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ05hcnrEmWR6aWUgYWRtaW5pc3RyYXRvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnTmFyesSZZHppZSBVxbx5dGtvd25pa2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdPc2Fkem9ueSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ1BvamVkecWEY3phIGxpY2VuY2phJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnTmEgVcW8eXRrb3duaWthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICdOYSBwcm9jZXNvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnTmEgc2Vyd2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAnTmEgdXJ6xIVkemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICdaYmlvcmN6YSBsaWNlbmNqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMaWNlbmNqYSBFbnRlcnByaXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAnTGljZW5jamEgZGV2ZWxvcGVyc2thJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICdEZW1vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ0N6YXNvd28gb2dyYW5pY3pvbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdGcmVld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ09wZW4gc291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ0JleiBsaW1pdHUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnTGltaXQgbGljemJ5IENJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnVHdvcnplbmllIGkgemFyesSFZHphbmllIGRlZmluaWNqYW1pIGVsZW1lbnTDs3cga29uZmlndXJhY2ppLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9yZGVyIG9mIGluY2lkZW50IHN0YXRlcyBmcm9tIGhpZ2ggKGUuZy4gY3JpY2l0YWwpIHRvIGxvdyAoZS5nLiBmdW5jdGlvbmFsKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSByZWxldmFudCBkZXBsb3ltZW50IHN0YXRlcyB3aGVyZSBsaW5rZWQgdGlja2V0cyBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldyBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnV3nFgsSFY3pvbnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdXxYLEhWN6b255JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldy4nfSA9ICdQcnplZ2zEhWQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBkbGEgcHJ6eWvFgmFkb3d5Y2ggZ3J1cCB1cHJhd25pZcWEIGF0cnlidXTDs3cga2F0YWxvZ3UgZ8WCw7N3bmVnby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRlIEl0ZW5zIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnTXVkYXIgZGVmaW5pw6fDo28gZGUgY2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnQ2xhc3NlIGRvIEl0ZW0gZGUgQ29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ0RlZmluacOnw6NvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQWRkCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSd9ID0gJ0l0ZW0gZGUgQ29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnRmlsdHJvIHBhcmEgQ2xhc3Nlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBDbGFzcyBmcm9tIHRoZSBsaXN0IHRvIGNyZWF0ZSBhIG5ldyBDb25maWcgSXRlbS4nfSA9ICdTZWxlY2lvbmUgdW1hIGNsYXNzZSBhIHBhcnRpciBkYSBsaXN0YSBwYXJhIGNyaWFyIHVtIG5vdm8gaXRlbSBkZSBjb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdDbGFzc2UnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdBw6fDo28gZW0gTWFzc2EgZW0gSUNzIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJ0VzdGFkbyBkZSBpbXBsYW50YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnRXN0YWRvIGRlIGluY2lkZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICdBc3NvY2lhciBhIG91dHJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICdOw7ptZXJvIGRlIEl0ZW0gZGUgQ29uZmlndXJhw6fDo28gaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICdPIG7Dum1lcm8gZGUgb3V0cm8gSXRlbSBkZSBDb25maWd1cmHDp8OjbyBwYXJhIGFzc29jaWFyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ0Rlc2VqYSByZWFsbWVudGUgZXhjbHVpciBlc3RlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ08gbm9tZSBkZXN0ZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICdOb21lIGrDoSBlbSB1c28gcGVsb3MgSUNzIGNvbSBvcyBzZWd1aW50ZXMgTsO6bWVybyhzKTogJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbXBsYW50YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnSGlzdMOzcmljbyBkbyBJdGVtIGRlIENvbmZpZ3VyYcOnw6NvOiAlcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnQ29uZmlndXJhw6fDtWVzIGRlIENvbnRleHRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0l0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIHBvciBww6FnaW5hJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnVW1hIHRhYmVsYSBnZW7DqXJpY2EgZGUgSXRlbnMgZGUgQ29uZmlndXJhw6fDo28gR1NUSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICdUaXBvIGRlIEVzdGFkbyBkZSBJbXBsYW50YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZG8gSW5jaWRlbnRlIEF0dWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJ0VzdGFkbyBBdHVhbCBkZSBJbmNpZGVudGUgcG9yIHRpcG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnw5psdGltYSBtb2RpZmljYcOnw6NvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnQ3JpYXIgbm92byBNb2RlbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVuIFNlYXJjaCd9ID0gJ0V4ZWN1dGFyIFBlc3F1aXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1Byb2N1cmFyIG5hcyB2ZXLDtWVzIGFudGVyaW9yZXMgdGFtYsOpbT8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICdJdGVtIGRlIGNvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJ0luZm9ybWHDp8OjbyBkbyBJdGVtIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbXBsYW50YcOnw6NvIEF0dWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ8OabHRpbWEgbW9kaWZpY2HDp8OjbyBwb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAnVmlzdWFsaXphciB1bWEgdmVyc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ1Zpc3VhbGl6YXIgdG9kYXMgYXMgdmVyc8O1ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbmNpZGVudGUgZGEgVmVyc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgSW1wbGFudGHDp8OjbyBkYSBWZXJzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAnTsO6bWVybyBkYSB2ZXJzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICdEZXRhbGhlcyBkYSBWZXJzw6NvIGRvIEl0ZW0gZGUgQ29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICdQcm9wcmllZGFkZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJ05lbmh1bSBhY2Vzc28gcGFyYSBhIGNsYXNzZSDDqSBkYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogSVRTTSBDb25maWdJdGVtJ30gPSAnVmlzw6NvIGdlcmFsOiBJVFNNIENvbmZpZ0l0ZW0nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnTmVuaHVtIENvbmZpZ0l0ZW1JRCDDqSBkYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJ1ZvY8OqIHByZWNpc2Egc2VsZWNpb25hciBwZWxvIG1lbm9zIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnVm9jw6ogbsOjbyB0ZW0gYWNlc3NvIGRlIGVzY3JpdGEgcGFyYSBlc3RlIGl0ZW0gZGUgY29uZmlndXJhw6fDo286ICVzLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnSXRlbSBkZSBjb25maWd1cmHDp8OjbyAiJXMiIG7Do28gZW5jb250cmFkbyBuYSBiYXNlIGRlIGRhZG9zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBleGNsdWlyIG8gSUQgZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJ05lbmh1bWEgdmVyc8OjbyBlbmNvbnRyYWRhIHBhcmEgbyBDb25maWdJdGVtSUQgJXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJ05lbmh1bSBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG91IENsYXNzSUQgw6kgZGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJ05lbmh1bSBhY2Vzc28gw6kgZGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnTmVuaHVtYSBkZWZpbmnDp8OjbyBwYXJhIGEgY2xhc3NlICVzISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICdOw6NvIMOpIHBvc3PDrXZlbCBleGliaXIgaGlzdMOzcmljby4gTmVuaHVtIENvbmZpZ0l0ZW1JRCDDqSBkYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJ07Do28gw6kgcG9zc8OtdmVsIGV4aWJpciBoaXN0w7NyaWNvLiBOZW5odW0gZGlyZWl0byBkZSBhY2Vzc28gw6kgZGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICdDSUhpc3Rvcnk6Oic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJ05lbmh1bSBDb25maWdJdGVtSUQgb3UgVmVyc2lvbklEIMOpIGRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBleGliaXIgaXRlbSBkZSBjb25maWd1cmHDp8Ojby4gTmVuaHVtIGRpcmVpdG8gZGUgYWNlc3NvIMOpIGRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnQ29uZmlnSXRlbUlEICVzIG7Do28gZW5jb250cmFkbyBuYSBiYXNlIGRlIGRhZG9zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJ1ZlcnNpb25JRCAlcyBuw6NvIGVuY29udHJhZG8gbmEgYmFzZSBkZSBkYWRvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJ0l0ZW0gZGUgY29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJ0ltcHJlc3NvIHBvciAlcyBlbSAlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJ0NsYXNzSUQgaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJ05lbmh1bSBDbGFzc0lEIMOpIGRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJ30gPSAnTmVuaHVtIGRpcmVpdG8gZGUgYWNlc3NvIHBhcmEgZXN0YSBjbGFzc2Ugw6kgZGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJ05lbmh1bSByZXN1bHRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnUmVzdWx0YWRvcyBkYSBwZXNxdWlzYSBkZSBJdGVucyBkZSBjb25maWd1cmHDp8Ojbyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnTsOjbyBmb2kgcG9zc8OtdmVsIGV4aWJpciBpdGVtLiBOZW5odW0gZGlyZWl0byBkZSBhY2Vzc28gcGFyYSBDb25maWdJdGVtIMOpIGRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdPIGVzdGFkbyBkZSBpbXBsYW50YcOnw6NvIGRlc3RlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdPIGVzdGFkbyBkZSBpbmNpZGVudGUgZGVzdGUgaXRlbSBkZSBjb25maWd1cmHDp8Ojbyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdOw7ptZXJvIG3DoXhpbW8gZGUgdW0gZWxlbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnT3MgY2FtcG9zIHZhemlvcyBpbmRpY2FtIHF1ZSBvcyB2YWxvcmVzIGF0dWFpcyBzw6NvIG1hbnRpZG9zJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICdNb2RlbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VyaWFsIE51bWJlcid9ID0gJ07Dum1lcm8gZGUgU8OpcmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSd9ID0gJ1Byb2Nlc3NhZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ01lbcOzcmlhIFJBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdEaXNjbyBSw61naWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhcGFjaXR5J30gPSAnQ2FwYWNpZGFkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdBZGFwdGFkb3IgZGUgUmVkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdFbmRlcmXDp28gSVAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnQWRhcHRhZG9yIEdyw6FmaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ091dHJvIEVxdWlwYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdGEgZGUgRXhwaXJhw6fDo28gZGEgR2FyYW50aWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnRGF0YSBJbnN0YWxhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ1RlbGVmb25lIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVmb25lIDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnRS1NYWlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICdFbmRlcmXDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAnRW5kZXJlw6dvIGRlIFJlZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdNw6FzY2FyYSBkZSBTdWJyZWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICdSb3RlYWRvciBQYWRyw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ1RpcG8gZGUgTGljZW7Dp2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICdDaGF2ZSBkZSBMaWNlbsOnYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ1F1YW50aWRhZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJhdGlvbiBEYXRlJ30gPSAnRGF0YSBkZSBFeHBpcmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ03DrWRpYSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnQ29tcHV0YWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJ0hhcmR3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICdSZWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnU29mdHdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJ0V4cGlyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAnTWFudXRlbsOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnUGlsb3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdQbGFuZWphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAnUmVwYXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICdSZXRpcmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdSZXZpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdGUgZGUgUXVhbGlkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhcHRvcCd9ID0gJ05vdGVib29rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdEZXNrdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdTZXJ2aWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ091dHJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdJbXByZXNzb3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N3aXRjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSb3RlYWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ1dMQU4gQWNjZXNzIFBvaW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ0Rpc3Bvc2l0aXZvIGRlIFNlZ3VyYW7Dp2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ0Rpc3Bvc2l0aXZvIGRlIEJhY2t1cCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ01vdXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnVGVjbGFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdDw6JtZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ1Byb2pldG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdDYXJ0w6NvIFBDTUNJQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gVVNCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJ0RvY2tpbmcgU3RhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAnU2Nhbm5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ1ZlcnPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdBbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnU2FsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnUmFjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICdMb2NhbCBkZSBUcmFiYWxobyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRsZXQnfSA9ICdUb21hZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdEZXBhcnRhbWVudG8gZGUgVEknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnUkVERSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGVjb211bmljYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdBcGxpY2HDp8OjbyBDbGllbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ0FwbGljYcOnw6NvIFNlcnZpZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ1NPIENsaWVudGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAnU08gU2Vydmlkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ0ZlcnJhbWVudGEgZGUgQWRtaW5pc3RyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ0ZlcnJhbWVudGEgZG8gVXN1w6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICdJbnRlZ3JhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICdMaWNlbsOnYSDDmm5pY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICdQb3IgVXN1w6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1BvciBQcm9jZXNzYWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUG9yIFNlcnZpZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAnUG9yIE7Dsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ0xpY2Vuw6dhIHBvciBWb2x1bWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnTGljZW7Dp2EgQ29ycG9yYXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICdMaWNlbsOnYSBkZSBEZXNlbnZvbHZlZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICdEZW1vbnN0cmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIFJlc3RyaWN0ZWQnfSA9ICdUZW1wbyBSZXN0cml0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ0xpdnJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAnQ8OzZGlnbyBhYmVydG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnSWxpbWl0YWRhJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW5pc3RyYcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnVmVyaWZpcXVlIHNlIG8gbm9tZSDDqSDDum5pY28gYXBlbmFzIGRlbnRybyBkYSBtZXNtYSBjbGFzc2UgZGUgSUMgKFwnY2xhc3NlKSBvdSBnbG9iYWxtZW50ZSAoXCdnbG9iYWxcJyksIG8gcXVlIHNpZ25pZmljYSBxdWUgY2FkYSBJQyBleGlzdGVudGUgw6kgbGV2YWRvIGVtIGNvbnRhIGFvIHByb2N1cmFyIHBvciBkdXBsaWNhw6fDtWVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdJdGVucyBkZSBDb25maWd1cmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnQWRpY2lvbmFyIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnRWRpdGFyIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50byBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIHF1ZSBwZXJtaXRlIHJlZ2lzdHJhciBvIGhpc3TDs3JpY28gZGEgaW50ZXJmYWNlIGRvIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICdIaXN0w7NyaXZvIGRvIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJ0ltcHJlc3PDo28gZG8gaXRlbSBkZSBjb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICdab29tIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICdDb25maWdJdGVtTnVtYmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJ0xpbWl0ZSBkZSBJdGVtIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJ0NvbmZpZ3VyYcOnw6NvIGRvIEdlcmVuY2lhbWVudG8gZG8gQmFuY28gZGUgRGFkb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICdNw7NkdWxvIGRlIGHDp8OjbyBlbSBtYXNzYSBlbSBJdGVucyBkZSBDb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUm90ZWFkb3IgZGUgcGVzcXVpc2EgZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyBkYSBpbnRlcmZhY2UgZG8gYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgYXMgZGVmaW5pw6fDtWVzIGRlIEl0ZW5zIGRlIENvbmZpZ3VyYcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnRGVmaW5hIEHDp8O1ZXMgb25kZSB1bSBib3TDo28gZGUgY29uZmlndXJhw6fDtWVzIGVzdMOhIGRpc3BvbsOtdmVsIG5vIHdpZGdldCBkZSBvYmpldG9zIHZpbmN1bGFkb3MgKExpbmtPYmplY3Q6OlZpZXdNb2RlPSJjb21wbGV4IikuIE9ic2VydmUgcXVlIGVzc2FzIGHDp8O1ZXMgZGV2ZW0gdGVyIHJlZ2lzdHJhZG8gb3Mgc2VndWludGVzIGFycXVpdm9zIEpTIGUgQ1NTOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBlIENvcmUuQWdlbnQgLkxpbmtPYmplY3QuanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICdEZWZpbmlyIG8gZ3J1cG8gZGUgcGVybWlzc2lvbmFtZW50by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhcyBwZXJtaXNzw7VlcyByZXF1ZXJpZGFzIHBhcmEgY3JpYXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28gSVRTTSB1c2FuZG8gYSBJbnRlcmZhY2UgR2Vuw6lyaWNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGEgcGVybWlzc8OjbyBuZWNlc3PDoXJpbyBwYXJhIHJlbW92ZXIgSXRlbnMgZGUgQ29uZmlndXJhw6fDo28gdXNhbmRvIGEgSW50ZXJmYWNlIEdlbsOpcmljYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhcyBwZXJtaXNzw7VlcyByZXF1ZXJpZGFzIHBhcmEgb2J0ZXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28gSVRTTSB1c2FuZG8gYSBJbnRlcmZhY2UgR2Vuw6lyaWNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGFzIHBlcm1pc3PDtWVzIHJlcXVlcmlkYXMgcGFyYSBsb2NhbGl6YXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28gSVRTTSB1c2FuZG8gYSBJbnRlcmZhY2UgR2Vuw6lyaWNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGFzIHBlcm1pc3PDtWVzIHJlcXVlcmlkYXMgcGFyYSBhdHVhbGl6YXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28gSVRTTSB1c2FuZG8gYSBJbnRlcmZhY2UgR2Vuw6lyaWNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICdEZWZpbmUgdW0gbcOzZHVsbyBkZSB2aXPDo28gZ2VyYWwgcGFyYSBtb3N0cmFyIGEgdmlzw6NvIHBlcXVlbmEgZGEgbGlzdGEgZGUgaXRlbnMgZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICdEZWZpbmllIGV4cHJlc3PDtWVzIHJlZ3VsYXJlcyBpbmRpdmlkdWFsbWVudGUgcGFyYSBjYWRhIGNsYXNzZSBkZSBJQyBwYXJhIHZlcmlmaWNhciBvIG5vbWUgZG8gSUMgZSBwYXJhIGV4aWJpciBhcyBtZW5zYWdlbnMgZGUgZXJybyBjb3JyZXNwb25kZW50ZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICdEZWZpbmUgbyBzdWJvYmpldG8gcGFkcsOjbyBkYSBjbGFzc2UgXCdJVFNNQ29uZmlnSXRlbVwnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBuw7ptZXJvIGRlIGxpbmhhcyBkbyBlZGl0b3IgZGUgZGVmaW5pw6fDo28gZG8gSUMgbmEgaW50ZXJmYWNlIGRlIGFkbWluaXN0cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnRGVmaW5lIGEgb3JkZW0gZG9zIGVzdGFkb3MgZGUgaW5jaWRlbnRlIGRlIGFsdG8gKGV4OiBjcsOtdGljbykgcGFyYSBiYWl4byAoZXg6IGZ1bmNpb25hbCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICdEZWZpbmUgb3MgZXN0YWRvcyBkZSBpbXBsYW50YcOnw6NvIG9uZGUgY2hhbWFkb3MgYXNzb2NpYWRvcyBwb2RlbSBhZmV0YXIgbyBlc3RhZG9zIGRlIHVtIElDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtIHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGxpbWl0ZSBkZSBwZXNxdWlzYSBwYXJhIGEgdGVsYSBBZ2VudElUU01Db25maWdJdGVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGxpbWl0ZSBkZSBwZXNxdWlzYSBwYXJhIGEgdGVsYSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICdEZWZpbmUgYXMgY29sdW5hcyBleGliaWRhcyBuYSB2aXPDo28gZ2VyYWwgZGUgaXRlbnMgZGUgY29uZmlndXJhw6fDo28uIEVzdGEgb3DDp8OjbyBuw6NvIHRlbSBlZmVpdG8gbmEgcG9zacOnw6NvIGRhIGNvbHVuYS4gTm90YTogQSBjb2x1bmEgY2xhc3NlIGVzdMOhIHNlbXByZSBkaXNwb27DrXZlbCBzZSBvIGZpbHRybyAiVG9kb3MiIGVzdGl2ZXIgc2VsZWNpb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJ0RlZmluZSBhcyBjb2x1bmFzIG1vc3RyYWRhcyBuYSBidXNjYSBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvLiBFc3RhIG9ww6fDo28gbsOjbyB0ZW0gZWZlaXRvIHNvYnJlIGEgcG9zacOnw6NvIGRhIGNvbHVuYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnRGVmaW5lIGFzIGNvbHVuYXMgZGUgSUNzIGV4aWJpZGFzIG5hIHZpc8OjbyBnZXJhbCBkZSBpdGVucyBkZSBjb25maWd1cmHDp8OjbywgZGVwZW5kZW5kbyBkYSBjbGFzc2UgZG8gSUMuIENhZGEgZW50cmFkYSBkZXZlIHNlciBwcmVmaXhhZGEgY29tIG8gbm9tZSBkYSBjbGFzc2UgZSBkdXBsbyBkb2lzIHBvbnRvcyAoZXguIENvbXB1dGFkb3I6OikuIEjDoSBhbGd1bnMgYXRyaWJ1dG9zIGRlIElDIHF1ZSBzw6NvIGNvbXVucyBhIHRvZG9zIG9zIElDcyAodGFsIGNvbW8gYSBjbGFzc2UgQ29tcHV0YWRvcjogQ29tcHV0YWRvcjo6Tm9tZSwgQ29tcHV0YWRvcjo6RXN0YWRvSW1wbEF0dWFsLCBDb21wdXRhZG9yOjpIb3JhQ3JpYWNhbykuIFBhcmEgZXhpYmlyIGF0cmlidXRvcyBkZSBJQyBpbmRpdmlkdWFsbWVudGUgY29tbyBkZWZpbmlkbyBuYSBkZWZpbmnDp8OjbyBkbyBJQywgbyBzZWd1aW50ZSBlc3F1ZW1hIGRldmUgc2VyIHVzYWRvIChjbGFzc2UgQ29tcHV0YWRvciwgcG9yIGV4ZW1wbG8pOiBDb21wdXRhZG9yOjpEaXNjb1JpZ2lkbzo6MSwgQ29tcHV0YWRvcjo6RGlzY29SaWdpZG86OjE6OkNhcGFjaWRhZGU6OjEsIENvbXB1dGFkb3I6OkRpc2NvUmlnaWRvOjoyLCBDb21wdXRhZG9yOjpEaXNjb1JpZ2lkbzo6Mjo6Q2FwYWNpZGFkZTo6MS4gU2UgbsOjbyBow6EgZW50cmFkYSBwYXJhIGEgY2xhc3NlIElDLCBlbnTDo28gYXMgY29sdW5hcyBwYWRyw6NvIHPDo28gZXhpYmlkYXMgY29tbyBkZWZpbmlkbyBuYSBjb25maWd1cmHDp8OjbyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ0RlZmluZSBhcyBjb2x1bmFzIGRlIElDcyBleGliaWRhcyBuYSB0ZWxhIGRlIHBlc3F1aXNhIGRlIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvLCBkZXBlbmRlbmRvIGRhIGNsYXNzZSBkbyBJQy4gQ2FkYSBlbnRyYWRhIGRldmUgc2VyIHByZWZpeGFkYSBjb20gbyBub21lIGRhIGNsYXNzZSBlIGR1cGxvIGRvaXMgcG9udG9zIChleC4gQ29tcHV0YWRvcjo6KS4gSMOhIGFsZ3VucyBhdHJpYnV0b3MgZGUgSUMgcXVlIHPDo28gY29tdW5zIGEgdG9kb3Mgb3MgSUNzICh0YWwgY29tbyBhIGNsYXNzZSBDb21wdXRhZG9yOiBDb21wdXRhZG9yOjpOb21lLCBDb21wdXRhZG9yOjpFc3RhZG9JbXBsQXR1YWwsIENvbXB1dGFkb3I6OkhvcmFDcmlhY2FvKS4gUGFyYSBleGliaXIgYXRyaWJ1dG9zIGRlIElDIGluZGl2aWR1YWxtZW50ZSBjb21vIGRlZmluaWRvIG5hIGRlZmluacOnw6NvIGRvIElDLCBvIHNlZ3VpbnRlIGVzcXVlbWEgZGV2ZSBzZXIgdXNhZG8gKGNsYXNzZSBDb21wdXRhZG9yLCBwb3IgZXhlbXBsbyk6IENvbXB1dGFkb3I6OkRpc2NvUmlnaWRvOjoxLCBDb21wdXRhZG9yOjpEaXNjb1JpZ2lkbzo6MTo6Q2FwYWNpZGFkZTo6MSwgQ29tcHV0YWRvcjo6RGlzY29SaWdpZG86OjIsIENvbXB1dGFkb3I6OkRpc2NvUmlnaWRvOjoyOjpDYXBhY2lkYWRlOjoxLiBTZSBuw6NvIGjDoSBlbnRyYWRhIHBhcmEgYSBjbGFzc2UgSUMsIGVudMOjbyBhcyBjb2x1bmFzIHBhZHLDo28gc8OjbyBleGliaWRhcyBjb21vIGRlZmluaWRvIG5hIGNvbmZpZ3VyYcOnw6NvIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnRGVmaW5lIGFzIGNvbHVuYXMgZGUgSUNzIGV4aWJpZGFzIG5hIHRlbGEgZGUgdGFiZWxhIGNvbXBsZXhhIGRlIGxpbmtzLCBkZXBlbmRlbmRvIGRhIGNsYXNzZSBkbyBJQy4gQ2FkYSBlbnRyYWRhIGRldmUgc2VyIHByZWZpeGFkYSBjb20gbyBub21lIGRhIGNsYXNzZSBlIGR1cGxvIGRvaXMgcG9udG9zIChleC4gQ29tcHV0YWRvcjo6KS4gSMOhIGFsZ3VucyBhdHJpYnV0b3MgZGUgSUMgcXVlIHPDo28gY29tdW5zIGEgdG9kb3Mgb3MgSUNzICh0YWwgY29tbyBhIGNsYXNzZSBDb21wdXRhZG9yOiBDb21wdXRhZG9yOjpOb21lLCBDb21wdXRhZG9yOjpFc3RhZG9JbXBsQXR1YWwsIENvbXB1dGFkb3I6OkhvcmFDcmlhY2FvKS4gUGFyYSBleGliaXIgYXRyaWJ1dG9zIGRlIElDIGluZGl2aWR1YWxtZW50ZSBjb21vIGRlZmluaWRvIG5hIGRlZmluacOnw6NvIGRvIElDLCBvIHNlZ3VpbnRlIGVzcXVlbWEgZGV2ZSBzZXIgdXNhZG8gKGNsYXNzZSBDb21wdXRhZG9yLCBwb3IgZXhlbXBsbyk6IENvbXB1dGFkb3I6OkRpc2NvUmlnaWRvOjoxLCBDb21wdXRhZG9yOjpEaXNjb1JpZ2lkbzo6MTo6Q2FwYWNpZGFkZTo6MSwgQ29tcHV0YWRvcjo6RGlzY29SaWdpZG86OjIsIENvbXB1dGFkb3I6OkRpc2NvUmlnaWRvOjoyOjpDYXBhY2lkYWRlOjoxLiBTZSBuw6NvIGjDoSBlbnRyYWRhIHBhcmEgYSBjbGFzc2UgSUMsIGVudMOjbyBhcyBjb2x1bmFzIHBhZHLDo28gc8OjbyBleGliaWRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnRGVmaW5lIHF1YWwgdGlwbyBkZSBhc3NvY2lhw6fDo28gKG5vbWVhZG8gYSBwYXJ0aXIgZGEgcGVyc3BlY3RpdmEgZG8gY2hhbWFkbykgcG9kZSBhZmV0YXIgbyBlc3RhZG8gZGUgdW0gSUMgYXNzb2NpYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJ0RlZmluZSBxdWFsIHRpcG8gZGUgY2hhbWFkbyBwb2RlIGFmZXRhciBvIGVzdGFkbyBkZSB1bSBJQyBhc3NvY2lhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJ0NvciBkbyBFc3RhZG8gZGUgSW1wbGFudGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJ0NvciBkbyBFc3RhZG8gZGUgSW1wbGFudGHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJ1RpcG8gZG8gRXN0YWRvIGRlIEltcGxhbnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICdEZXNhYmlsaXRhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICdIYWJpbGl0YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ0hhYmlsaXRhIGEgZnVuw6fDo28gZGUgYcOnw6NvIGVtIG1hc3NhIGVtIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUgcGFyYSB0cmFiYWxoYXIgZW0gbWFpcyBkZSB1bSBJQyBwb3IgdmV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAnSGFiaWxpdGEgYSBmdW7Dp8OjbyBkZSBhw6fDo28gZW0gbWFzc2EgZW0gaXRlbnMgZGUgY29uZmlndXJhw6fDo28gYXBlbmFzIHBhcmEgZ3J1cG9zIGxpc3RhZG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnSGFiaWxpdGEvZGVzYWJpbGl0YSBhIGZ1bmNpb25hbGlkYWRlIGRlIHZlcmlmaWNhw6fDo28gZGUgbm9tZXMgw7puaWNvcyBkZSBJQ3MuIEFudGVzIGRlIGhhYmlsaXRhciBlc3RhIG9ww6fDo28sIHZvY8OqIGRldmUgdmVyaWZpY2FyIHNlIGjDoSBJQ3MgY29tIG5vbWVzIGR1cGxpY2Fkb3MgZW0gc2V1IHNpc3RlbWEuIFZvY8OqIHBvZGUgZmF6ZXIgaXNzbyBwb3IgbWVpbyBkbyBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBFdmVudG8gcGFyYSBjb25maWd1cmFyIG8gZXN0YWRvIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gcXVhbmRvIHVtIGNoYW1hZG8gZm9yIGFzc29jaWFkbyBhIHVtIElDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJ1Zpc8OjbyBHZXJhbCAgZG8gSXRlbSBkZSBDb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICdNw7NkdWxvIHBhcmEgdmVyaWZpY2FyIG8gZ3J1cG8gcmVzcG9uc8OhdmVsIHBvciB1bWEgY2xhc3NlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gcGFyYSB2ZXJpZmljYXIgbyBncnVwbyByZXNwb25zw6F2ZWwgcG9yIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnTcOzZHVsbyBwYXJhIGdlcmFyIGVzdGF0w61zdGljYXMgZG8gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdNb2R1bG8gZGUgcmVnaXN0cm8gZGUgb2JqZXRvIHBhcmEgbyBtw7NkdWxvIGRlIGltcG9ydGHDp8Ojby9leHBvcnRhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ1Zpc8OjbyBHZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGNvbG9yIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBwYXJhIGEgY29yIGRvcyBlc3RhZG9zIGRlIGltcGxhbnRhw6fDo28gbmEgdGVsYSBkZSBwcmVmZXLDqm5jaWFzIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGFyw6JtZXRyb3MgZGUgZXN0YWRvIGRlIGltcGxhbnRhw6fDo28gbmFzIHByZWZlcsOqbmNpYXMgZGUgZXhpYmnDp8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBkbyBncnVwb3MgZGUgcGVybWlzc8OjbyBkZSBleGVtcGxvIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBkYXMgcMOhZ2luYXMgKG5hcyBxdWFpcyBvcyBpdGVucyBkZSBjb25maWd1cmHDp8OjbyBzw6NvIG1vc3RyYWRvcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIGEgdGVsYSBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIElUU00gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIGEgdGVsYSBkZSBwZXNxdWlzYSBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIElUU00gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBhIHRlbGEgZGUgZGV0YWxoZXMgZG8gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBhIHRlbGEgZGUgYWRpw6fDo28gZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGVkacOnw6NvIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gSVRTTSBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIGEgdGVsYSBkZSBoaXN0w7NyaWNvIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gSVRTTSBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBhIHRlbGEgZGUgaW1wcmVzc8OjbyBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIElUU00gbmEgaW50ZXJmYWNlIGRvIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBkZWxldGUgY29uZmlnIGl0ZW1zLid9ID0gJ1ByaXZpbMOpZ2lvcyBuZWNlc3PDoXJpb3MgcGFyYSBhcGFnYXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnUHJvY3VyYXIgaXRlbnMgZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJ1NlbGVjaW9uYSBvIG3Ds2R1bG8gZGUgZ2VyYcOnw6NvIGRlIG7Dum1lcm8gZGUgaXRlbSBkZSBjb25maWd1cmHDp8Ojby4gIkF1dG9pbmNyZW1lbnRvIiBpbmNyZW1lbnRhIG8gbsO6bWVybyBkbyBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvLCBvIFN5c3RlbUlELCBvIENvbmZpZ0l0ZW1DbGFzc0lEIGUgbyBDb3VudGVyIHPDo28gdXNhZG9zLiBPIGZvcm1hdG8gw6kgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBwb3IgZXhlbXBsbywgMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJ0NvbmZpZ3VyYXIgbyBlc3RhZG8gZGUgdW0gSUMgYXV0b21hdGljYW1lbnRlIHF1YW5kbyB1bSBDaGFtYWRvIGZvciBhc3NvY2lhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQ29uZmlndXJhIG8gZXN0YWRvIGRlIGltcGxhbnRhw6fDo28gbmEgdGVsYSBkZSBhw6fDo28gZW0gbWFzc2EgZGUgSUNzIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NvbmZpZ3VyYSBvIGVzdGFkbyBkZSBpbmNpZGVudGUgbmEgdGVsYSBkZSBhw6fDo28gZW0gbWFzc2EgZGUgSUNzIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBxdWUgcGVybWl0ZSBhc3NvY2lhciB1bSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIGNvbSB1bSBvdXRybyBvYmpldG8gbmEgdmlzw6NvIGRlIGRldGFsaGVzIGRvIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgYWNlc3NhciBvIGhpc3TDs3JpY28gZGUgdW0gSUMgbmEgdmlzw6NvIGdlcmFsIGRlIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhY2Vzc2FyIG8gaGlzdMOzcmljbyBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIHZpc8OjbyBkZSBkZXRhbGhlcyBkbyBtZXNtbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhcGFnYXIgbyBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIFZpc8OjbyBEZXRhbGhhZGEgbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgZHVwbGljYXIgdW0gSUMgbmEgdmlzw6NvIGdlcmFsIGRlIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBkdXBsaWNhciB1bSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIHZpc8OjbyBkZSBkZXRhbGhlcyBkbyBtZXNtbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZWRpdCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIGVkaXRhciB1bSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIHZpc8OjbyBkZSBkZXRhbGhlcyBkbyBtZXNtbyBuYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIHJldG9ybmFyIMOgIHRlbGEgZGUgdmlzw6NvIGRlIGRldGFsaGVzIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgaW1wcmltaXIgdW0gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBuYSB2aXPDo28gZGUgZGV0YWxoZXMgZG8gbWVzbW8gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgZGV0YWxoYXIgdW0gSUMgbmEgdmlzw6NvIGdlcmFsIGRlIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjb25maWcgaXRlbSBoaXN0b3J5IChyZXZlcnNlIG9yZGVyZWQpIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgbyBoaXN0w7NyaWNvIGRvIGl0ZW0gY29uZmlndXJhw6fDo28gKG9yZGVtIHJldmVyc2EpIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICdPIGlkZW50aWZpY2Fkb3IgcGFyYSB1bSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvLCBleC4gSXRlbUNvbmZpZyMsIE1ldUl0ZW1Db25maWcjLiBPIHBhZHLDo28gw6kgSXRlbUNvbmZpZyMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnY2xhc3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnZ2xvYmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0w6NvIGRlIEl0ZW5zIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnTXVkYXIgZGVmaW5pw6fDo28gZGUgY2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIENsYXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICdEZWZpbmnDp8Ojbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdJdGVtIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJ0ZpbHRybyBwYXJhIENsYXNzZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnU2VsZWNpb25lIHVtYSBjbGFzc2UgYSBwYXJ0aXIgZGEgbGlzdGEgcGFyYSBjcmlhciB1bSBub3ZvIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnQ2xhc3NlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtQnVsawogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICdFc3RhZG8gZGUgSW1wbGVtZW50YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnRXN0YWRvIGRlIGluY2lkZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBjb25maWcgaXRlbT8nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnTyBub21lIGRlc3RlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEltcGxlbWVudGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBTdGF0ZSd9ID0gJ0VzdGFkbyBkZSBJbmNpZGVudGUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnQ29uZmlndXJhw6fDtWVzIGRlIENvbnRleHRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0l0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvIHBvciBww6FnaW5hJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ1RpcG8gZGUgRXN0YWRvIGRlIEltcGxlbWVudGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRvIEluY2lkZW50ZSBBdHVhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdFc3RhZG8gQXR1YWwgZGUgSW5jaWRlbnRlIHBvciB0aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ8OabHRpbWEgbW9kaWZpY2HDp8Ojbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ0NyaWFyIG5vdm8gTW9kZWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICdFeGVjdXRhciBQZXNxdWlzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICdQcm9jdXJhciBuYXMgdmVyc8O1ZXMgYW50ZXJpb3JlcyB0YW1iw6ltPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ0l0ZW0gZGUgY29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw6NvIGRvIEl0ZW0gZGUgQ29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEltcGxlbWVudGHDp8OjbyBBdHVhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICfDmmx0aW1hIG1vZGlmaWNhw6fDo28gcG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ1Zpc3VhbGl6YXIgdW1hIHZlcnPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICdWaXN1YWxpemFyIHRvZGFzIGFzIHZlcnPDtWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGEgVmVyc8OjbyBkZSBJbmNpZGVudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJ07Dum1lcm8gZGEgdmVyc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gVmVyc2lvbiBEZXRhaWxzJ30gPSAnRGV0YWxoZXMgZGEgVmVyc8OjbyBkbyBJdGVtIGRlIENvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3BlcnR5J30gPSAnUHJvcHJpZWRhZGUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICdJdGVtIGRlIGNvbmZpZ3VyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdPIGVzdGFkbyBkZSBpbXBsZW1lbnRhw6fDo28gZG8gaXRlbSBkZSBjb25maWd1cmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ08gZXN0YWRvIGRlIGluY2lkZW50ZSBkZXN0ZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ07Dum1lcm8gbcOheGltbyBkZSB1bSBlbGVtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICdPcyBjYW1wb3MgdmF6aW9zIGluZGljYW0gcXVlIG9zIHZhbG9yZXMgYXR1YWlzIHPDo28gbWFudGlkb3MnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnTsO6bWVybyBkZSBTw6lyaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnUHJvY2Vzc2Fkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAnTWVtw7NyaWEgUkFNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ0Rpc2NvIFLDrWdpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdDYXBhY2lkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ0FkYXB0YWRvciBkZSBSZWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0RIQ1AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgQWRkcmVzcyd9ID0gJ0VuZGVyZcOnbyBJUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdBZGFwdGFkb3IgR3LDoWZpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAnT3V0cm8gRXF1aXBhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnRGF0YSBkZSBFeHBpcmHDp8OjbyBkYSBHYXJhbnRpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICdEYXRhIEluc3RhbGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnVGVsZWZvbmUgMSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAyJ30gPSAnVGVsZWZvbmUgMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0VuZGVyZcOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdFbmRlcmXDp28gZGUgUmVkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ03DoXNjYXJhIGRlIHJlZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdUaXBvIGRlIExpY2Vuw6dhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnQ2hhdmUgZGUgTGljZW7Dp2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdRdWFudEFudGlndWlkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdGEgZGUgRXhwaXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICdNZWRpYSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJ0V4cGlyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAnTWFudXRlbsOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnUGlsb3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdQbGFuZWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdSZXBhcmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAnUmV0aXJhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAnUmV2aXPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ1Rlc3RlIGRlIFF1YWxpZGFkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdwb3J0w6F0aWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ8OBcmVhICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAnU2Vydmlkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdPdXRybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdJbXByZXNzb3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N3aXRjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb3V0ZXInfSA9ICdSb3V0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gZGUgU2VndXJhbsOnYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gZGUgQmFja3VwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdXNlJ30gPSAncmF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXlib2FyZCd9ID0gJ1RlY2xhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnQ8OibWFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICdQcm9qZXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BsYWNhIFBDTUNJQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnRGlzcG9zaXRpdm8gVVNCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAnU2Nhbm5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ1Byw6lkaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdQaXNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICdTYWxhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAnTG9jYWwgZGUgVHJhYmFsaG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnVG9tYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAnRGVwYXJ0YW1lbnRvIGRlIFRJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ1JFREUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGVjb211bmljYcOnw7Vlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnQXBsaWNhw6fDo28gQ2xpZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ1NlcnZpZG9yIEFwbGljYWNpb25hbCAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnU08gQ2xpZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdTTyBTZXJ2aWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnRmVycmFtZW50YSBkZSBBZG1pbmlzdHJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnRmVycmFtZW50YSBkZSBVdGlsaXphZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnSW50ZWdyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnTGljZW7Dp2Egw5puaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBVc2VyJ30gPSAnUG9yIFV0aWxpemFkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1BvciBQcm9jZXNzYWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUG9yIFNlcnZpZG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBOb2RlJ30gPSAnUG9yIFBvc3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZvbHVtZSBMaWNlbmNlJ30gPSAnTGljZW7Dp2EgcG9yIFZvbHVtZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdMaWNlbsOnYSBDb3Jwb3JhdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xpY2Vuw6dhIGRlIGRlc2Vudm9sdmltZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAnRGVtb25zdHJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnVGVtcG8gUmVzdHJpdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlZXdhcmUnfSA9ICdMaXZyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ0PDs2RpZ28gYWJlcnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ0lsaW1pdGFkYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ0FkbWluaXN0cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdJdGVucyBkZSBDb25maWd1cmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50byBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIHF1ZSBwZXJtaXRlIHJlZ2lzdGFyIG8gaGlzdMOzcmljbyBkYSBpbnRlcmZhY2UgZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICdMaW1pdGUgZGUgSXRlbXMgZGUgQ29uZmlndXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUm91dGVyIGRlIHBlc3F1aXNhIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gZGEgaW50ZXJmYWNlIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ0NyaWFyIGUgZ2VyaXIgYXMgZGVmaW5pw6fDtWVzIGRlIEl0ZW5zIGRlIENvbmZpZ3VyYcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnRGVmaW5pciBBY8Onw7VlcyBvbmRlIHVtIGJvdMOjbyBkZSBjb25maWd1cmHDp8O1ZXMgZXN0w6EgZGlzcG9uw612ZWwgbmEgd2lkZ2V0IHRoZSBvYmplY3RvcyBsaWdhZG9zIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuICBFc3RhcyBBY8Onw7VlcyBkZXZlbSBlc3RhciByZWdpc3RhZGFzIG5vcyBzZWd1aW50ZXMgZmljaGVpcm9zIEpTIGUgQ1NTOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1cGRhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICdEZWZpbmUgdW0gbcOzZHVsbyBkZSB2aXN0YSBnZXJhbCBwYXJhIG1vc3RyYXIgYSB2aXN0YSBwZXF1ZW5hIGRhIGxpc3RhIGRlIGl0ZW5zIGRlIGNvbmZpZ3VyYcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICdEZWZpbmUgbyBzdWJvYmpldG8gcG9yIG9taXNzw6NvIGRhIGNsYXNzZSBcJ0lUU01Db25maWdJdGVtXCcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uIE5vdGU6IENsYXNzIGNvbHVtbiBpcyBhbHdheXMgYXZhaWxhYmxlIGlmIGZpbHRlciBcJ0FsbFwnIGlzIHNlbGVjdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJ0RlZmluZSBhcyBjb2x1bmFzIG1vc3RyYWRhcyBuYSBidXNjYSBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvLiBFc3RhIG9ww6fDo28gbsOjbyB0ZW0gZWZlaXRvIHNvYnJlIGEgcG9zacOnw6NvIGRhIGNvbHVuYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICdNw7NkdWxvIHBhcmEgdmVyaWZpY2FyIG8gZ3J1cG8gcmVzcG9uc8OhdmVsIHBvciB1bWEgY2xhc3NlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gcGFyYSB2ZXJpZmljYXIgbyBncnVwbyByZXNwb25zw6F2ZWwgcG9yIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnTcOzZHVsbyBwYXJhIGdlcmFyIGVzdGF0w61zdGljYXMgZG8gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdNb2R1bG8gZGUgcmVnaXN0byBkZSBvYmpldG8gcGFyYSBvIG3Ds2R1bG8gZGUgaW1wb3J0YcOnw6NvL2V4cG9ydGHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGFyw6JtZXRyb3MgZGUgZXN0YWRvIGRlIGltcGxlbWVudGHDp8OjbyBuYXMgcHJlZmVyw6puY2lhcyBkZSB2aXN1YWxpemHDp8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBkbyBncnVwb3MgZGUgcGVybWlzc8OjbyBkZSBleGVtcGxvIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIGFyZSBzaG93bikuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBkYXMgcMOhZ2luYXMgKG5hcyBxdWFpcyBvcyBpdGVucyBkZSBjb25maWd1cmHDp8OjbyBzw6NvIHZpc3VhbGl6YWRvcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIG8gZm9ybXVsw6FyaW8gZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIG8gZm9ybXVsw6FyaW8gZGUgcGVzcXVpc2EgZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBvIGZvcm11bMOhcmlvIGRlIGRldGFsaGVzIGRvIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gSVRTTSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBvIGZvcm11bMOhcmlvIGRlIGFkacOnw6NvIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gSVRTTSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgbyBmb3JtdWzDoXJpbyBkZSBlZGnDp8OjbyBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIElUU00gZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1c2FyIG8gZm9ybXVsw6FyaW8gZGUgaGlzdMOzcmljbyBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvIElUU00gZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXNhciBvIGZvcm11bMOhcmlvIGRlIGltcHJlc3PDo28gZGUgaXRlbSBkZSBjb25maWd1cmHDp8OjbyBJVFNNIG5hIGludGVyZmFjZSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnU2VsZWNpb25hIG8gbcOzZHVsbyBkZSBnZXJhw6fDo28gZGUgbsO6bWVybyBkZSBpdGVtIGRlIGNvbmZpZ3VyYcOnw6NvLiAiQXV0b2luY3JlbWVudG8iIGluY3JlbWVudGEgbyBuw7ptZXJvIGRvIGl0ZW0gZGUgY29uZmlndXJhw6fDo28sIG8gU3lzdGVtSUQsIG8gQ29uZmlnSXRlbUNsYXNzSUQgZSBvIENvdW50ZXIgc8OjbyB1dGlsaXphZG9zLiBPIGZvcm1hdG8gw6kgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBwb3IgZXhlbXBsbywgMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBpbmNpZGVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY29uZmlnIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHF1ZSBwZXJtaXRlIGFzc29jaWFyIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gYSBvdXRybyBvYmpldG8gbmEgdmlzdGEgZGUgZGV0YWxoZXMgZG8gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhY2VkZXIgbyBoaXN0w7NyaWNvIGRlIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gbmEgdmlzdGEgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgZHVwbGljYXIgdW0gaXRlbSBkZSBjb25maWd1cmHDp8OjbyBuYSB2aXN0YSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgZWRpdGFyIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gbmEgdmlzdGEgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIGltcHJpbWlyIHVtIGl0ZW0gZGUgY29uZmlndXJhw6fDo28gbmEgdmlzdGEgZGUgZGV0YWxoZXMgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG8gaGlzdMOzcmljbyBkbyBpdGVtIGNvbmZpZ3VyYcOnw6NvIChvcmRlbSBpbnZlcnNhKSBubyBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NsYXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2dsb2JhbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwb3N0cHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmVwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Byb2R1Y3RpdmUnfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvQtdC90LjQtSDQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC90YvQvNC4INC10LTQuNC90LjRhtCw0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbid9ID0gJ9CY0LfQvNC10L3QuNGC0Ywg0L7Qv9C40YHQsNC90LjQtSDQutC70LDRgdGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ9Ce0L/QuNGB0LDQvdC40LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtJ30gPSAn0J7RgdC90L7QstC90YvQtSDRgdGA0LXQtNGB0YLQstCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJ9Ck0LjQu9GM0YLRgCDQtNC70Y8g0LrQu9Cw0YHRgdC+0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAn0JLRi9Cx0LXRgNC40YLQtSDQutC70LDRgdGBINC40Lcg0YHQv9C40YHQutCwINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC90L7QstC+0Lkg0JrQlSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ9Ca0LvQsNGB0YEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdJVFNNIENvbmZpZ0l0ZW0g0LzQsNGB0YHQvtCy0L7QtSDQtNC10LnRgdGC0LLQuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjQvdGG0LjQtNC10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJ9Ch0LLRj9C30LDRgtGMINGBINC00YDRg9Cz0LjQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAn0J3QtdCy0LXRgNC90YvQuSDQvdC+0LzQtdGAINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3QvtC5INC10LTQuNC90LjRhtGLISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICfQmtC+0LvQuNGH0LXRgdGC0LLQviDQtNGA0YPQs9C40YUg0JrQlSDQtNC70Y8g0YHQstGP0LfRi9Cy0LDQvdC40Y8uJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9CY0LzRjyDRjdGC0L7Qs9C+INGD0YfQtdGC0L3QvtCz0L4g0Y3Qu9C10LzQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAn0JjQvNGPINGD0LbQtSDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LTRgNGD0LPQvtC5INCa0JUg0YHQviDRgdC70LXQtNGD0Y7RidC40Lwg0L3QvtC80LXRgNC+0LwgKNCw0LzQuCk6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjQvdGG0LjQtNC10L3RgtCwJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ9Cf0LDRgNCw0LzQtdGC0YDRiyDQutC+0L3RgtC10LrRgdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAn0JrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QvdGL0YUg0LXQtNC40L3QuNGGINC90LAg0YHRgtGA0LDQvdC40YbRgyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICfQotC40L8g0KHQvtGB0YLQvtGP0L3QuNGPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICfQotC10LrRg9GJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LjQvdGG0LjQtNC10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJ9Ci0LjQvyDQotC10LrRg9GJ0LXQs9C+INGB0L7RgdGC0L7Rj9C90LjRjyDQuNC90YbQuNC00LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAn0JLRgNC10LzRjyDQv9C+0YHQu9C10LTQvdC10LPQviDQuNC30LzQtdC90LXQvdC40Y8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBOZXcgVGVtcGxhdGUnfSA9ICfQodC+0LfQtNCw0YLRjCDQvdC+0LLRi9C5INGI0LDQsdC70L7QvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAn0JLRi9C/0L7Qu9C90LjRgtGMINC/0L7QuNGB0LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAn0JjRgdC60LDRgtGMINC4INCyINC/0YDQtdC00YvQtNGD0YnQuNGFINCy0LXRgNGB0LjRj9GFPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ9Ca0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3QsNGPINC10LTQuNC90LjRhtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBJbmZvcm1hdGlvbid9ID0gJyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQmtC+0L3RhC4g0LXQtC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAn0KLQtdC60YPRidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ9CQ0LLRgtC+0YAg0L/QvtGB0LvQtdC00L3QtdCz0L4g0LjQt9C80LXQvdC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ9Cf0L7QutCw0LfQsNGC0Ywg0L7QtNC90YMg0LLQtdGA0YHQuNGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn0J/QvtC60LDQt9Cw0YLRjCDQstGB0LUg0LLQtdGA0YHQuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjQvdGG0LjQtNC10L3RgtCwINCy0LXRgNGB0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LLQtdGA0YHQuNC4INC+0LHRitC10LrRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAn0J3QvtC80LXRgCDQstC10YDRgdC40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ9Cf0L7Qu9C90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRjyDQviDQmtCVINCy0YvQsdGA0LDQvdC90L7QuSDQstC10YDRgdC40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICfQodCy0L7QudGB0YLQstC+JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnQ0lIaXN0b3J5OjonOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC90LDRjyDQtdC00LjQvdC40YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENsYXNzSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFJlc3VsdCEnfSA9ICfQndC10YIg0YDQtdC30YPQu9GM0YLQsNGC0LAv0KDQtdGI0LXQvdC40Y8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAn0KDQtdC30YPQu9GM0YLQsNGC0Ysg0L/QvtC40YHQutCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3Ri9GFINC10LTQuNC90LjRhic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0Y3RgtC+0Lkg0JrQlSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9Ch0L7RgdGC0L7Rj9C90LjQtSDQuNC90YbQuNC00LXQvdGC0LAg0LTQu9GPINGN0YLQvtC5INCa0JUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAn0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INC+0LTQvdC+0LPQviDRjdC70LXQvNC10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ9Cf0YPRgdGC0YvQtSDQv9C+0LvRjyDQv9C+0LrQsNC30YvQstCw0Y7Rgiwg0YfRgtC+INGC0LXQutGD0YnQuNC1INC30L3QsNGH0LXQvdC40Y8g0YHQvtGF0YDQsNC90Y/RgtGB0Y8nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ9Cc0L7QtNC10LvRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAn0KHQtdGA0LjQudC90YvQuSDQvdC+0LzQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSd9ID0gJ9Cm0J/Qoyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYW0nfSA9ICfQntCX0KMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZCBEaXNrJ30gPSAn0JbQtdGB0YLQutC40Lkg0LTQuNGB0LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICfQntCx0YrQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRhcHRlcid9ID0gJ9Ch0LXRgtC10LLQvtC5INCw0LTQsNC/0YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQINC/0L4gREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVAg0LDQtNGA0LXRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICfQktC40LTQtdC+INCw0LTQsNC/0YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ9CU0YDRg9Cz0L7QtSDQvtCx0L7RgNGD0LTQvtCy0LDQvdC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAn0KHRgNC+0Log0LjRgdGC0LXRh9C10L3QuNGPINCz0LDRgNCw0L3RgtC40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAn0JTQsNGC0LAg0YPRgdGC0LDQvdC+0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICfQotC10LvQtdGE0L7QvSAxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICfQotC10LvQtdGE0L7QvSAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAn0JDQtNGA0LXRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICfQodC10YLQtdCy0L7QuSDQsNC00YDQtdGBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAn0JzQsNGB0LrQsCDQv9C+0LTRgdC10YLQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn0KjQu9GO0LcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAn0KLQuNC/INC70LjRhtC10L3Qt9C40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICfQm9C40YbQtdC90LfQuNC+0L3QvdGL0Lkg0LrQu9GO0YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICfQmtC+0LvQuNGH0LXRgdGC0LLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICfQodGA0L7QuiDQu9C40YbQtdC90LfQuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lZGlhJ30gPSAn0JzRg9C70YzRgtC40LzQtdC00LjQudC90YvQtSDRgdGA0LXQtNGB0YLQstCwJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcHV0ZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJ9Ch0LXRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICfQo9GB0YLQsNGA0LXQu9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAn0KLQtdGF0L3QuNGH0LXRgdC60L7QtSDQvtCx0YHQu9GD0LbQuNCy0LDQvdC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICfQrdC60YHQv9C10YDQuNC80LXQvdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICfQl9Cw0L/Qu9Cw0L3QuNGA0L7QstCw0L3QvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ9Cg0LXQvNC+0L3Rgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAn0KHQv9C40YHQsNC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3J30gPSAn0K3QutGB0L/QtdGA0YLQuNC30LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ9Ci0LXRgdGC0LjRgNC+0LLQsNC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfQndC+0YPRgtCx0YPQuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXNrdG9wJ30gPSAn0J3QsNGB0YLQvtC70YzQvdGL0Lkg0J/Qmic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAn0KHQtdGA0LLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAn0JTRgNGD0LPQvtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfQnNC+0L3QuNGC0L7RgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAn0J/RgNC40L3RgtC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAn0JrQvtC80LzRg9GC0LDRgtC+0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAn0JzQsNGA0YjRgNGD0YLQuNC30LDRgtC+0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSA9ICdXTEFOINGC0L7Rh9C60LAg0LTQvtGB0YLRg9C/0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAn0KHQvNCw0YDRgi3QutCw0YDRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICfQo9GB0YLRgNC+0LnRgdGC0LLQviDQsdGN0LrQsNC/0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICfQnNGL0YjQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAn0JrQu9Cw0LLQuNCw0YLRg9GA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAn0JrQsNC80LXRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ9Cf0YDQvtC10LrRgtC+0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICfQnNC+0LTQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAnUENNQ0lBINC60LDRgNGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVNCIERldmljZSd9ID0gJ1VTQiDRg9GB0YLRgNC+0LnRgdGC0LLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfQlNC+0Lot0YHRgtCw0L3RhtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ9Ch0LrQsNC90LXRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ9CX0LTQsNC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ9Ct0YLQsNC2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICfQmtCw0LHQuNC90LXRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAn0KHRgtC+0LnQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ9Cg0LDQsdC+0YfQtdC1INC80LXRgdGC0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAn0KDQvtC30LXRgtC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICfQmNCiINC+0LHRitC10LrRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMQU4nfSA9ICfQodC10YLQtdCy0LDRjyDQutCw0YDRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICdXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnVGVsY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ9Ca0LvQuNC10L3RgtGB0LrQvtC1INC/0YDQuNC70L7QttC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICfQn9GA0L7QvNC10LbRg9GC0L7Rh9C90L7QtSDQn9CeJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ9Ch0LXRgNCy0LXRgNC90L7QtSDQv9GA0LjQu9C+0LbQtdC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICfQmtC70LjQtdC90YLRgdC60LDRjyDQntChJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ9Ch0LXRgNCy0LXRgNC90LDRjyDQntChJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICfQodC40YHRgtC10LzQvdGL0LUg0YPRgtC40LvQuNGC0YsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAn0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0YPRgtC40LvQuNGC0YsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1iZWRkZWQnfSA9ICfQktGB0YLRgNC+0LXQvdC90YvQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ9Ce0LTQvdC+0LrRgNCw0YLQvdCw0Y8g0LvQuNGG0LXQvdC30LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ9Cd0LAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICfQndCwINCm0J/Qoyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAn0J3QsCDRgdC10YDQstC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfQndCwINC90L7QtNGDKNGD0LfQtdC7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ9Ca0L7RgNC/0L7RgNCw0YLQuNCy0L3QsNGPINC70LjRhtC10L3Qt9C40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn0JrQvtGA0L/QvtGA0LDRgtC40LLQvdCw0Y8g0LvQuNGG0LXQvdC30LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ9Cb0LjRhtC10L3Qt9C40Y8g0LTQu9GPINGA0LDQt9GA0LDQsdC+0YLRh9C40LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vJ30gPSAn0JTQtdC80L4t0LLQtdGA0YHQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ9Ce0LPRgNCw0L3QuNGH0LXQvdC90LDRjyDQv9C+INCy0YDQtdC80LXQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAn0JHQtdGB0L/Qu9Cw0YLQvdC+0LUg0J/Qnic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ9Cf0J4g0YEg0L7RgtC60YDRi9GC0YvQvCDQutC+0LTQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ9CR0LXQtyDQvtCz0YDQsNC90LjRh9C10L3QuNC5JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAn0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICfQn9GA0L7QstC10YDQutCwINGD0L3QuNC60LDQu9GM0L3QvtGB0YLQuCDQmNC80LXQvdC4INCy0L3Rg9GC0YDQuCDRgtC10LrRg9GJ0LXQs9C+INC60LvQsNGB0YHQsCDQmtCVKFwnY2xhc3NcJykg0LjQu9C4INCz0LvQvtCx0LDQu9GM0L3QviAoXCdnbG9iYWxcJyks0YfRgtC+INC+0LfQvdCw0YfQsNC10YIsINGH0YLQviDQu9GO0LHQsNGPINGB0YPRidC10YHRgtCy0YPRjtGJ0LDRjyDQmtCVINGD0YfQuNGC0YvQstCw0LXRgtGB0Y8g0L/RgNC4INC/0L7QuNGB0LrQtSDQtNGD0LHQu9C40LrQsNGC0L7QsiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zJ30gPSAn0JrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QvdGL0LUg0LXQtNC40L3QuNGG0YsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQ29uZmlnIGl0ZW0gKNCa0JUpIGV2ZW50IG1vZHVsZSDQstC10LTRg9GJ0LjQuSDQt9Cw0L/QuNGB0Ywg0LIg0LjRgdGC0L7RgNC40Y4g0LIg0LDQs9C10L3RgtGB0LrQvtC8INC40L3RgtC10YDRhNC10LnRgdC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICcg0JvQuNC80LjRgiDQmtCVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0LvRjCDQv9C+0LjRgdC60LAg0JrQlSDQsiDQsNCz0LXQvdGC0YHQutC+0Lwg0LjQvdGC0LXRgNGE0LXQudGB0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ9Ch0L7Qt9C00LDQvdC40LUg0Lgg0YPQv9GA0LDQstC70LXQvdC40LUg0L7Qv9C40YHQsNC90LjRj9C80Lgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QvdGL0YUg0LXQtNC40L3QuNGGLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINCU0LXQudGB0YLQstC40Y8vQWN0aW9ucyDQutC+0LPQtNCwINC60L3QvtC/0LrQsCDQvdCw0YHRgtGA0L7QudC60Lgg0LTQvtGB0YLRg9C/0L3QsCDQsiDRgdCy0Y/Qt9Cw0L3QvdC+0Lwg0LLQuNC00LbQtdGC0LUgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0J7QsdGA0LDRgtC40YLQtSDQstC90LjQvNCw0L3QuNC1LCDRh9GC0L4g0Y3RgtC4INCU0LXQudGB0YLQstC40Y8vQWN0aW9ucyDQtNC+0LvQttC90Ysg0LjQvNC10YLRjCDQt9Cw0YDQtdCz0LjRgdGC0YDQuNGA0L7QstCw0L3QvdGL0LUgSlMg0LjQu9C4IENTUyDRhNCw0LnQu9GLOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyDQuCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0YLRjCDRgtGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyBJVFNNINCa0JUg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCBHZW5lcmljIEludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8gSVRTTSDQmtCVINGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10LwgR2VuZXJpYyBJbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLRgNC10LHRg9C10LzRi9C1INC/0YDQsNCy0LAg0LTQu9GPINC/0L7QuNGB0LrQsCBJVFNNINCa0JUg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCBHZW5lcmljIEludGVyZmFjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQvtC00L3QvtCy0LvQtdC90LjRjyBJVFNNINCa0JUg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCBHZW5lcmljIEludGVyZmFjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LzQvtC00YPQu9GMINC/0YDQvtGB0LzQvtGC0YDQsCDQmtCVINCyINC60YDQsNGC0LrQvtC8INCy0LjQtNC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW5kaXZpZHVhbGx5IGZvciBlYWNoIENvbmZpZ0l0ZW0gY2xhc3MgdG8gY2hlY2sgdGhlIENvbmZpZ0l0ZW0gbmFtZSBhbmQgdG8gc2hvdyBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2VzLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGA0LXQs9GD0LvRj9GA0L3Ri9C1INCy0YvRgNCw0LbQtdC90LjRjyDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0L7RgtC00LXQu9GM0L3QvtCz0L4g0LrQu9Cw0YHRgdCwINC00LvRjyDQv9GA0L7QstC10YDQutC4INC40LzQtdC9INCa0JUg0Lgg0LLRi9C00LDRh9C4INGB0L7QvtCx0YnQtdC90LjQuSDQvtCxINC+0YjQuNCx0LrQsNGFLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGD0LzQsNC70YfQuNCy0LDQvNGL0Lkg0L/QvtC00L7QsdGK0LXQutGCINC00LvRjyDQutC70LDRgdGB0LAgXCdJVFNNQ29uZmlnSXRlbVwnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QuiDQtNC70Y8g0YDQtdC00LDQutGC0L7RgNCwINC+0L/QuNGB0LDQvdC40Lkg0JrQlSAoQ0kpINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LTQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC70LjQvNC40YIg0L/QvtC40YHQutCwINC+0LHRitC10LrRgtC+0LIg0LTQu9GPINGN0LrRgNCw0L3QsCBBZ2VudElUU01Db25maWdJdGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC70LjQvNC40YIg0L/QvtC40YHQutCwINC+0LHRitC10LrRgtC+0LIg0LTQu9GPINGN0LrRgNCw0L3QsCBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdC/0LjRgdC+0Log0L/QvtC60LDQt9GL0LLQsNC10LzRi9GFINGB0YLQvtC70LHRhtC+0LIg0LIg0L7QsdC30L7RgNC1INCa0JUuINCt0YLQvtGCINC/0LDRgNCw0LzQtdGC0YAg0L3QtSDQstC70LjRj9C10YIg0L3QsCDQuNGFINC/0L7RgNGP0LTQvtC6LiDQn9C+0LzQvdC40YLQtTog0KHRgtC+0LvQsdC10YYg0JrQu9Cw0YHRgSDQtNC+0YHRgtGD0L/QtdC9INGC0L7Qu9GM0LrQviDQv9GA0Lgg0YPRgdC70L7QstC40Lgg0LLRi9Cx0L7RgNCwINCyINGE0LjQu9GM0YLRgNC1ICLQktGB0LUiKEFsbCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0L/QuNGB0L7QuiDQv9C+0LrQsNC30YvQstCw0LXQvNGL0YUg0YHRgtC+0LvQsdGG0L7QsiDQsiDRgNC10LfRg9C70YzRgtCw0YLQsNGFINC/0L7QuNGB0LrQsCDQmtCVLiDQrdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC90LUg0LLQu9C40Y/QtdGCINC90LAg0L/QvtGA0Y/QtNC+0Log0LjRhSDQvtGC0L7QsdGA0LDQttC10L3QuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQv9C40YHQvtC6INC+0YLQvtCx0YDQsNC20LDQtdC80YvRhSDRgdGC0L7Qu9Cx0YbQvtCyINC/0YDQuCDQv9GA0L7RgdC80L7RgtGA0LUg0YHQv9C40YHQutC+0LIg0JrQlSDQsiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0LrQu9Cw0YHRgdCwLiDQmtCw0LbQtNC+0LUg0LjQvNGPINCw0YLRgNC40LHRg9GC0LAg0LTQvtC70LbQvdC+INC40LzQtdGC0Ywg0LIg0LrQsNGH0LXRgdGC0LLQtSDQv9GA0LXRhNC40LrRgdCwIC0g0LjQvNGPINC60LvQsNGB0YHQsCDQuCDQtNCy0LAg0LTQstC+0LXRgtC+0YfQuNGPIChpLmUuIENvbXB1dGVyOjopLiDQldGB0YLRjCDRgNGP0LQg0LDRgtGA0LjQsdGD0YLQvtCyLCDQvtCx0YnQuNGFINC00LvRjyDQstGB0LXRhSDQutC70LDRgdGB0L7QsiAo0L3QsNC/0YDQuNC80LXRgCwg0LTQu9GPINC60LvQsNGB0YHQsCBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4g0JTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0LjQvdC00LjQstC40LTRg9Cw0LvRjNC90YvRhSDQsNGC0YDQuNCx0YPRgtC+0LIsINGB0L/QtdGG0LjRhNC40YfQvdGL0YUg0LTQu9GPINC60L7QvdC60YDQtdGC0L3QvtCz0L4g0LrQu9Cw0YHRgdCwINC40Lcg0L7Qv9C40YHQsNC90LjRjyDQmtCVIChDSS1EZWZpbml0aW9uKSwg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINGB0LvQtdC00YPRjtGJ0LjQuSDRgdC40L3RgtCw0LrRgdC40YEgKNC90LDQv9GA0LjQvNC10YAsINC00LvRjyDQutC70LDRgdGB0LAgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4g0JXRgdC70Lgg0L3QtdGCINCw0YLRgNC40LHRg9GC0L7QsiDQtNC70Y8g0LrQvtC90LrRgNC10YLQvdC+0LPQviDQutC70LDRgdGB0LAsINC+0YLQvtCx0YDQsNC20LDRjtGC0YHRjyDRgdGC0L7Qu9Cx0YbRiyDQt9Cw0LTQsNC90L3Ri9C1INC/0LDRgNCw0LzQtdGC0YDQvtC8IElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0L/QuNGB0L7QuiDQvtGC0L7QsdGA0LDQttCw0LXQvNGL0YUg0YHRgtC+0LvQsdGG0L7QsiDQsiDRgNC10LfRg9C70YzRgtCw0YLQsNGFINC/0L7QuNGB0LrQsCDQmtCVINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDQstGL0LHRgNCw0L3QvdC+0LPQviDQutC70LDRgdGB0LAuINCa0LDQttC00L7QtSDQuNC80Y8g0LDRgtGA0LjQsdGD0YLQsCDQtNC+0LvQttC90L4g0LjQvNC10YLRjCDQsiDQutCw0YfQtdGB0YLQstC1INC/0YDQtdGE0LjQutGB0LAgLSDQuNC80Y8g0LrQu9Cw0YHRgdCwINC4INC00LLQsCDQtNCy0L7QtdGC0L7Rh9C40Y8gKGkuZS4gQ29tcHV0ZXI6OikuINCV0YHRgtGMINGA0Y/QtCDQsNGC0YDQuNCx0YPRgtC+0LIsINC+0LHRidC40YUg0LTQu9GPINCy0YHQtdGFINC60LvQsNGB0YHQvtCyICjQvdCw0L/RgNC40LzQtdGALCDQtNC70Y8g0LrQu9Cw0YHRgdCwIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiDQlNC70Y8g0L7RgtC+0LHRgNCw0LbQtdC90LjRjyDQuNC90LTQuNCy0LjQtNGD0LDQu9GM0L3Ri9GFINCw0YLRgNC40LHRg9GC0L7Qsiwg0YHQv9C10YbQuNGE0LjRh9C90YvRhSDQtNC70Y8g0LrQvtC90LrRgNC10YLQvdC+0LPQviDQutC70LDRgdGB0LAg0LjQtyDQvtC/0LjRgdCw0L3QuNGPINCa0JUgKENJLURlZmluaXRpb24pLCDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0YHQu9C10LTRg9GO0YnQuNC5INGB0LjQvdGC0LDQutGB0LjRgSAo0L3QsNC/0YDQuNC80LXRgCwg0LTQu9GPINC60LvQsNGB0YHQsCBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiDQldGB0LvQuCDQvdC10YIg0LDRgtGA0LjQsdGD0YLQvtCyINC00LvRjyDQutC+0L3QutGA0LXRgtC90L7Qs9C+INC60LvQsNGB0YHQsCwg0L7RgtC+0LHRgNCw0LbQsNGO0YLRgdGPINGB0YLQvtC70LHRhtGLINC30LDQtNCw0L3QvdGL0LUg0L/QsNGA0LDQvNC10YLRgNC+0LwgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0L/QtdGA0LXRh9C10L3RjCDQvtGC0L7QsdGA0LDQttCw0LXQvNGL0YUg0YHRgtC+0LvQsdGG0L7QsiDQvtGC0L7QsdGA0LDQttCw0LXQvNGL0YUg0JrQlSDQsiDRgtCw0LHQu9C40YbQtSDQv9GA0Lgg0YHQvtC30LTQsNC90LjQuCDRgdCy0Y/Qt9C4LCDQsiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0LrQu9Cw0YHRgdCwLiDQmtCw0LbQtNC+0LUg0LjQvNGPINCw0YLRgNC40LHRg9GC0LAg0LTQvtC70LbQvdC+INC40LzQtdGC0Ywg0LIg0LrQsNGH0LXRgdGC0LLQtSDQv9GA0LXRhNC40LrRgdCwIC0g0LjQvNGPINC60LvQsNGB0YHQsCDQuCDQtNCy0LAg0LTQstC+0LXRgtC+0YfQuNGPIChpLmUuIENvbXB1dGVyOjopLiDQldGB0YLRjCDRgNGP0LQg0LDRgtGA0LjQsdGD0YLQvtCyLCDQvtCx0YnQuNGFINC00LvRjyDQstGB0LXRhSDQutC70LDRgdGB0L7QsiAo0L3QsNC/0YDQuNC80LXRgCwg0LTQu9GPINC60LvQsNGB0YHQsCBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4g0JTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0LjQvdC00LjQstC40LTRg9Cw0LvRjNC90YvRhSDQsNGC0YDQuNCx0YPRgtC+0LIsINGB0L/QtdGG0LjRhNC40YfQvdGL0YUg0LTQu9GPINC60L7QvdC60YDQtdGC0L3QvtCz0L4g0LrQu9Cw0YHRgdCwINC40Lcg0L7Qv9C40YHQsNC90LjRjyDQmtCVIChDSS1EZWZpbml0aW9uKSwg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINGB0LvQtdC00YPRjtGJ0LjQuSDRgdC40L3RgtCw0LrRgdC40YEgKNC90LDQv9GA0LjQvNC10YAsINC00LvRjyDQutC70LDRgdGB0LAgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4g0JXRgdC70Lgg0L3QtdGCINCw0YLRgNC40LHRg9GC0L7QsiDQtNC70Y8g0LrQvtC90LrRgNC10YLQvdC+0LPQviDQutC70LDRgdGB0LAsINC+0YLQvtCx0YDQsNC20LDRjtGC0YHRjyDRgdGC0L7Qu9Cx0YbRiyDQt9Cw0LTQsNC90L3Ri9C1INC/0LDRgNCw0LzQtdGC0YDQvtC8IElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICfQntGC0LrQu9GO0YfQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICfQktC60LvRjtGH0LXQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ9CS0LrQu9GO0YfQsNC10YIg0LLQvtC30LzQvtC20L3QvtGB0YLRjCDQvNCw0YHRgdC+0LLRi9GFINC00LXQudGB0YLQstC40Lkg0YEg0JrQlSDQtNC70Y8g0LjQvdGC0LXRgNGE0LXQudGB0LAg0LDQs9C10L3RgtCwINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0L3QtdGB0LrQvtC70YzQutC40LzQuCDQmtCVINC+0LTQvdC+0LLRgNC10LzQtdC90L3Qvi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJ9CS0LrQu9GO0YfQsNC10YIg0LLQvtC30LzQvtC20L3QvtGB0YLRjCDQvNCw0YHRgdC+0LLRi9GFINC00LXQudGB0YLQstC40Lkg0YEg0JrQlSDRgtC+0LvRjNC60L4g0LTQu9GPINC/0LXRgNC10YfQuNGB0LvQtdC90L3Ri9GFINCz0YDRg9C/0L8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICfQktC60LvRjtGH0LDQtdGCL9Cy0YvQutC70Y7Rh9Cw0LXRgiDQv9GA0L7QstC10YDQutGDINGD0L3QuNC60LDQu9GM0L3QvtGB0YLQuCDQuNC80LXQvSDQmtCVLiDQlNC+INCy0LrQu9GO0YfQtdC90LjRjyDRjdGC0L7Qs9C+INC/0LDRgNCw0LzQtdGC0YDQsCwg0L/RgNC+0LLQtdGA0YzRgtC1INCy0LDRiNGDINCR0JQg0L3QsCDQvdCw0LvQuNGH0LjQtSDQtNGD0LHQu9C40LrQsNGC0L7QsiDQuNC80LXQvSDQmtCVLiDQktGLINC80L7QttC10YLQtSDRgdC00LXQu9Cw0YLRjCDRjdGC0L4g0YEg0L/QvtC80L7RidGM0Y4g0YHQutGA0LjQv9GC0LAgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAn0JzQvtC00YPQu9GMINC00LvRjyDQv9GA0L7QstC10YDQutC4INCz0YDRg9C/0L/RiyDQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7QuSDQt9CwINC60LvQsNGB0YEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICfQnNC+0LTRg9C70Ywg0LTQu9GPINC/0YDQvtCy0LXRgNC60Lgg0LPRgNGD0L/Qv9GLINC+0YLQstC10YLRgdGC0LLQtdC90L3QvtC5INC30LAg0JrQlSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJ9Cc0L7QtNGD0LvRjCDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0YHRgtCw0YLQuNGB0YLQuNC60Lgg0L/QviDQmtCVLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uINC00LvRjyDQvNC+0LTRg9C70Y8gSW1wb3J0L0V4cG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAn0J7QsdC30L7RgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0LDRgNCw0LzQtdGC0YDRiyDQtNC70Y8g0YbQstC10YLQvtCyINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjRhSDRgdC+0YHRgtC+0Y/QvdC40Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0JrQlSDQsiDQvdCw0YHRgtGA0L7QudC60LDRhSDQvtCx0LfQvtGA0L7QsiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QsNGA0LDQvNC10YLRgNGLINC00LvRjyDRgdC+0YHRgtC+0Y/QvdC40Lkg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0JrQlSDQsiDQvdCw0YHRgtGA0L7QudC60LDRhSDQvtCx0LfQvtGA0L7QsiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ9Cf0LDRgNCw0LzQtdGC0YDRiyDQtNC70Y8g0L/RgNC40LzQtdGA0L3Ri9GFINCz0YDRg9C/0L/QvtCy0YvRhSDQv9GA0LDQsiDQtNC70Y8g0LDRgtGA0LjQsdGD0YLQvtCyINCe0LHRidC10LPQviDQutCw0YLQsNC70L7Qs9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ9Cf0LDRgNCw0LzQtdGC0YDRiyDRgdGC0YDQsNC90LjRhiAo0L3QsCDQutC+0YLQvtGA0YvRhSDQvtGC0L7QsdGA0LDQttCw0Y7RgtGB0Y8g0JrQlSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ci0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQvtCx0LfQvtGA0LAg0JrQlSDQsiBDTURCINCw0LPQtdC90YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KLRgNC10LHRg9C10LzRi9C1INC/0YDQsNCy0LAg0LTQu9GPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINC/0L7QuNGB0LrQsCDQsiBDTURCINCw0LPQtdC90YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ci0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQv9C+0LvQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAg0JrQlSAoem9vbSB2aWV3KSDQsiBDTURCINCw0LPQtdC90YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KLRgNC10LHRg9C10LzRi9C1INC/0YDQsNCy0LAg0LTQu9GPINC00L7QsdCw0LLQu9C10L3QuNGPINCa0JUg0LIgQ01EQiDQsNCz0LXQvdGC0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGVkaXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQotGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDRgdC+0LTQtdGA0LbQuNC80L7Qs9C+INCa0JUg0LIgQ01EQiDQsNCz0LXQvdGC0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQotGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0L/RgNC+0YHQvNC+0YLRgNCwINC40YHRgtC+0YDQuNC4INGB0L7QtNC10YDQttC40LzQvtCz0L4g0JrQlSDQsiBDTURCINCw0LPQtdC90YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQotGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0L/QtdGH0LDRgtC4INGF0LDRgNCw0LrRgtC10YDQuNGB0YLQuNC6INCa0JUg0LIgQ01EQiDQsNCz0LXQvdGC0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJ9CS0YvQsdC+0YAg0LzQvtC00YPQu9GPINCz0LXQvdC10YDQsNGG0LjQuCDQvdC+0LzQtdGA0LAg0JrQlS4gIkF1dG9JbmNyZW1lbnQiINC/0L7RgdC70LXQtNC+0LLQsNGC0LXQu9GM0L3QviDRg9Cy0LXQu9C40YfQuNCy0LDQtdGCINC90L7QvNC10YAg0L3QsCAxLtCU0LvRjyDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0L3QvtC80LXRgNCwINC40YHQv9C+0LvRjNC30YPRjtGC0YHRjyBTeXN0ZW1JRCwgQ29uZmlnSXRlbUNsYXNzSUQg0Lgg0YHRh9C10YLRh9C40LouINCk0L7RgNC80LDRgiAtICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwg0YIu0LUuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVwbG95bWVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQvtGB0YLQvtGP0L3QuNC1INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINC90LAg0Y3QutGA0LDQvdC1INC80LDRgdGB0L7QstGL0YUg0LTQtdC50YHRgtCy0LjQuSDRgSDQmtCVINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQuNC90YbQuNC00LXQvdGC0LAg0L3QsCDRjdC60YDQsNC90LUg0LzQsNGB0YHQvtCy0YvRhSDQtNC10LnRgdGC0LLQuNC5INGBINCa0JUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINC/0YPQvdC60YIg0LzQtdC90Y4g0KHQstGP0LfQsNGC0YwgKExpbmspINC00LvRjyDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4INGB0LLRj9C30Lgg0JrQlSDRgSDQtNGA0YPQs9C40Lwg0L7QsdGK0LXQutGC0L7QvCDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LvQvdC+0LPQviAoem9vbSB2aWV3KSDQv9GA0L7RgdC80L7RgtGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9GD0L3QutGCINC80LXQvdGOINC00LvRjyDQtNC+0YHRgtGD0L/QsCDQuiDQuNGB0YLQvtGA0LjQuCDQmtCVINC/0YDQuCDQv9GA0L7RgdC80L7RgtGA0LUg0JrQlSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINC/0YPQvdC60YIg0LzQtdC90Y4g0JjRgdGC0L7RgNC40Y8g0LTQu9GPINC/0YDQvtGB0LzQvtGC0YDQsCDQuNGB0YLQvtGA0LjQuCDQmtCVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/Rg9C90LrRgiDQvNC10L3RjiDQlNGD0LHQu9C40YDQvtCy0LDRgtGMINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC90L7QstC+0Lkg0JrQlSDQv9GD0YLQtdC8INC60L7Qv9C40YDQvtCy0LDQvdC40Y8g0YXQsNGA0LDQutGC0LXRgNC40YHRgtC40Log0YLQtdC60YPRidC10Lkg0JrQlSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9GD0L3QutGCINC80LXQvdGOINCU0YPQsdC70LjRgNC+0LLQsNGC0Ywg0LTQu9GPINGB0L7Qt9C00LDQvdC40Y8g0L3QvtCy0L7QuSDQmtCVINC/0YPRgtC10Lwg0LrQvtC/0LjRgNC+0LLQsNC90LjRjyDRhdCw0YDQsNC60YLQtdGA0LjRgdGC0LjQuiDRgtC10LrRg9GJ0LXQuSDQmtCVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9GD0L3QutGCINC80LXQvdGOINCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC00LvRjyDQuNC30LzQtdC90LXQvdC40Y8g0YXQsNGA0LDQutGC0LXRgNC40YHRgtC40Log0JrQlSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/Rg9C90LrRgiDQvNC10L3RjiDQndCw0LfQsNC0INC/0YDQuCDQv9C+0LTRgNC+0LHQvdC+0Lwg0L/RgNC+0YHQvNC+0YLRgNC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3Ri9GFINC10LTQuNC90LjRhiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/Rg9C90LrRgiDQvNC10L3RjiDQn9C10YfQsNGC0Ywg0LTQu9GPINC/0LXRh9Cw0YLQuCDRhdCw0YDQsNC60YLQtdGA0LjRgdGC0LjQuiDQmtCVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byB6b29tIGludG8gYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBvdmVydmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/Rg9C90LrRgiDQvNC10L3RjiDQtNC70Y8g0L/QvtC00YDQvtCx0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwINCa0JUg0L/RgNC4INC+0LHQt9C+0YDQtSDQmtCVINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQtyDQuNGB0YLQvtGA0LjQuCDRgdC+0LTQtdGA0LbQuNC80L7Qs9C+INCa0JUgKNC/0L7RgNGP0LTQvtC6INC/0L7QutCw0LfQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLCBlLmcuIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jLiBUaGUgZGVmYXVsdCBpcyBDb25maWdJdGVtIy4nfSA9CiAgICAgICAgJ9CY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAICjQv9GA0LXRhNC40LrRgSkg0Log0L3QvtC80LXRgNGDINCa0JUsINGCLtC1INCa0JVf4oSWLCDQmtCVIywg0KPRh9C10YLQvdGL0Llf0Y3Qu9C10LzQtdC90YJf4oSWLiDQn9C+INGD0LzQvtC70YfQsNC90LjRjiAtIENvbmZpZ0l0ZW0jICjQuNC70Lgg0LXQs9C+INC/0LXRgNC10LLQvtC0KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0N5cmxfSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JVFNNQ29uZmlnSXRlbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLRmdCw0ZrQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40Lwg0YHRgtCw0LLQutCw0LzQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbid9ID0gJ9CU0LXRhNC40L3QuNGG0LjRmNCwINC60LvQsNGB0LUg0L/RgNC+0LzQtdC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICfQmtC70LDRgdCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24nfSA9ICfQlNC10YTQuNC90LjRhtC40ZjQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdCwINGB0YLQsNCy0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICfQpNC40LvRgtC10YAg0LfQsCDQutC70LDRgdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ9CY0LfQsNCx0LXRgNC40YLQtSDQutC70LDRgdGDINC40Lcg0LvQuNGB0YLQtSDRgNCw0LTQuCDQutGA0LXQuNGA0LDRmtCwINC90L7QstC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ9Ca0LvQsNGB0LAnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICfigJ5JVFNN4oCdINC80LDRgdC+0LLQvdCwINCw0LrRhtC40ZjQsCDQvdCwINGC0LjQutC10YLRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAn0KHRgtCw0YLRg9GBINGA0LDRgdC/0L7RgNC10ZLQuNCy0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAn0KHRgtCw0ZrQtSDQuNC90YbQuNC00LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAn0J/QvtCy0LXQttC4INGB0LAg0LTRgNGD0LPQuNC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ29uZmlndXJhdGlvbiBJdGVtIG51bWJlciEnfSA9ICfQndC10LjRgdC/0YDQsNCy0LDQvSDQsdGA0L7RmCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAn0JHRgNC+0Zgg0LTRgNGD0LPQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSDQt9CwINC/0L7QstC10LfQuNCy0LDRmtC1Lic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ9CU0LAg0LvQuCDRgdGC0LLQsNGA0L3QviDQttC10LvQuNGC0LUg0LTQsCDQvtCx0YDQuNGI0LXRgtC1INC+0LLRgyDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdGDINGB0YLQsNCy0LrRgz8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAn0J3QsNC30LjQsiDQvtCy0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ9Cd0LDQt9C40LIg0ZjQtSDQstC10Zsg0YMg0YPQv9C+0YLRgNC10LHQuCDQvdCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjQvCDRgdGC0LDQstC60LDQvNCwINCx0YDQvtGYOiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAn0KHRgtCw0YLRg9GBINGA0LDRgdC/0L7RgNC10ZLQuNCy0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAn0KHRgtCw0ZrQtSDQuNC90YbQuNC00LXQvdGC0LAnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJ9CY0YHRgtC+0YDQuNGY0LDRgiDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtTogJXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ9Cf0L7QtNC10YjQsNCy0LDRmtC1INC60L7QvdGC0LXQutGB0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSDQv9C+INGB0YLRgNCw0L3QuCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJ9CT0LXQvdC10YDQuNGH0LrQsCDRgtCw0LHQtdC70LAgSVRTTSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICfQotC40L8g0YHRgtCw0YLRg9GB0LAg0YDQsNGB0L/QvtGA0LXRktC40LLQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ID0gJ9Ci0YDQtdC90YPRgtC90L4g0YHRgtCw0ZrQtSDQuNC90YbQuNC00LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAn0KLQuNC/INGC0YDQtdC90YPRgtC90L7QsyDRgdGC0LDRgtGD0YHQsCDQuNC90YbQuNC00LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAn0JfQsNC00ZrQuCDQv9GD0YIg0L/RgNC+0LzQtdGa0LXQvdC+JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAn0J3QsNC/0YDQsNCy0Lgg0L3QvtCy0Lgg0YjQsNCx0LvQvtC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICfQn9C+0LrRgNC10L3QuCDQv9GA0LXRgtGA0LDQs9GDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ9Cf0YDQtdGC0YDQsNC20LjRgtC1INC4INGDINC/0YDQtdGC0YXQvtGC0L3QuNC8INCy0LXRgNC30LjRmNCw0LzQsD8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdCwINGB0YLQsNCy0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICfQmNC90YTQvtGA0LzQsNGG0LjRmNCwINC+INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L7RmCDRgdGC0LDQstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAn0KLRgNC10L3Rg9GC0L3QuCDRgdGC0LDRgtGD0YEg0YDQsNGB0L/QvtGA0LXRktC40LLQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAn0J/RgNC+0LzQtdC90LjQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ9CjINGA0LXQtNGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgb25lIHZlcnNpb24nfSA9ICfQn9GA0LjQutCw0LbQuCDRmNC10LTQvdGDINCy0LXRgNC30LjRmNGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn0J/QvtC60LDQttC4INGB0LLQtSDQstC10YDQt9C40ZjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAn0JLQtdGA0LfQuNGY0LAgLSDRgdGC0LDRgtGD0YEg0LjQvdGG0LjQtNC10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJ9CS0LXRgNC30LjRmNCwIC0g0YHRgtCw0YLRg9GBINC/0YDQuNC80LXQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAn0JHRgNC+0Zgg0LLQtdGA0LfQuNGY0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ9CU0LXRgtCw0ZnQuCDQstC10YDQt9C40ZjQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ9Ch0LLQvtGY0YHRgtCy0L4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICfQndC40ZjQtSDQtNCw0YIg0L/RgNC40YHRgtGD0L8g0LrQu9Cw0YHQuCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJ9Cf0YDQtdCz0LvQtdC0OiBJVFNNINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJ9Cd0LjRmNC1INC00LDRgiDQmNCUINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0KHRgtCw0LLQutC1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJ9Cf0L7RgtGA0LXQsdC90LAg0ZjQtSDQsdCw0YAg0ZjQtdC00L3QsCDQuNC30LDQsdGA0LDQvdCwINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LAg0YHRgtCw0LLQutCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgZG9uXCd0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtOiAlcy4nfSA9CiAgICAgICAgJ9Cd0LXQvNCw0YLQtSDQv9GA0LDQstC+INGD0L/QuNGB0LAg0LfQsCDQvtCy0YMg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3RgyDRgdGC0LDQstC60YM6ICVzLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAn0JrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QsCDRgdGC0LDQstC60LAg4oCeJXPigJ0g0L3QuNGY0LUg0L3QsNGS0LXQvdCwINGDINCx0LDQt9C4INC/0L7QtNCw0YLQsNC60LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIGNvbmZpZ2l0ZW0gSUQgJXMhJ30gPSAn0J3QuNGY0LUg0LHQuNC70L4g0LzQvtCz0YPRm9C1INC+0LHRgNC40YHQsNGC0Lgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3RgyDRgdGC0LDQstC60YMgSUQgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICfQndC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC90LAg0LLQtdGA0LfQuNGY0LAg0LfQsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdGDINGB0YLQsNCy0LrRgyBJRCAlcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAn0J3QuNGB0YMg0LTQsNGC0LggQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCDQuNC70LggQ2xhc3NJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJ9Cd0LjRmNC1INC00LDRgiDQv9GA0LjRgdGC0YPQvyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAn0J3QuNGY0LUg0L/RgNC+0L3QsNGS0LXQvdCwINC00LXRhNC40L3QuNGG0LjRmNCwINC30LAg0LrQu9Cw0YHRgyAlcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAn0J3QtSDQvNC+0LbQtSDRgdC1INC/0YDQuNC60LDQt9Cw0YLQuCDQuNGB0YLQvtGA0LjRmNCw0YIsINGY0LXRgCDQvdC40ZjQtSDQtNCw0YIgSUQg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAn0J3QtSDQvNC+0LbQtSDRgdC1INC/0YDQuNC60LDQt9Cw0YLQuCDQuNGB0YLQvtGA0LjRmNCw0YIsINC90LjRmNC1INC00LDRgiDQv9GA0LjRgdGC0YPQvyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICdDSUhpc3Rvcnk6Oic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJ9Cd0LjRgdGDINC00LDRgtC4IENvbmZpZ0l0ZW1JRCDQuNC70LggVmVyc2lvbklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICfQndC1INC80L7QttC1INGB0LUg0L/RgNC40LrQsNC30LDRgtC4INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LAg0YHRgtCw0LLQutCwLCDQvdC40ZjQtSDQtNCw0YIg0L/RgNC40YHRgtGD0L8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAn0JrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QsCDRgdGC0LDQstC60LAgSUQgJXMg0L3QuNGY0LUg0L3QsNGS0LXQvdCwINGDINCx0LDQt9C4INC/0L7QtNCw0YLQsNC60LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAn0JLQtdGA0LfQuNGY0LAgSUQgJXMg0L3QuNGY0LUg0L3QsNGS0LXQvdCwINGDINCx0LDQt9C4INC/0L7QtNCw0YLQsNC60LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdCwINGB0YLQsNCy0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAn0YjRgtCw0LzQv9Cw0L3RgyDQvtC0INGB0YLRgNCw0L3QtSAlcyDRgyAlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJ9Cd0LXQuNGB0L/RgNCw0LLQsNC9INCY0JQg0JrQu9Cw0YHQtSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICfQndC40ZjQtSDQtNCw0YIg0JjQlCDQmtC70LDRgdC1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJ9Cd0LjRmNC1INC00LDRgiDQv9GA0LjRgdGC0YPQvyDQvtCy0L7RmCDQutC70LDRgdC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAn0J3QtdC80LAg0YDQtdC30YPQu9GC0LDRgtCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJ9Cg0LXQt9GD0LvRgtCw0YIg0L/RgNC10YLRgNCw0LPQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICfQndC1INC80L7QttC1INGB0LUg0L/RgNC40LrQsNC30LDRgtC4INGB0YLQsNCy0LrQsCwg0L3QuNGY0LUg0LTQsNGCINC/0YDQuNGB0YLRg9C/INC30LAg0L7QstGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90YMg0YHRgtCw0LLQutGDISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAn0KHRgtCw0YLRg9GBINC/0YDQuNC80LXQvdC1INC+0LLQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9Ch0YLQsNGC0YPRgSDQuNC90YbQuNC00LXQvdGC0LAg0L7QstC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9PYmplY3RCYWNrZW5kL0lUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ9Cc0LDQutGB0LjQvNCw0LvQvdC4INCx0YDQvtGYINGY0LXQtNC90L7QsyDQtdC70LXQvNC10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ9Cf0YDQsNC30L3QsCDQv9C+0ZnQsCDRg9C60LDQt9GD0ZjRgyDQtNCwINGb0LUg0LDQutGC0YPQtdC70L3QtSDQstGA0LXQtNC90L7RgdGC0Lgg0LHQuNGC0Lgg0LfQsNC00YDQttCw0L3QtSc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAn0JzQvtC00LXQuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAn0KHQtdGA0LjRmNGB0LrQuCDQsdGA0L7RmCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICfQn9GA0L7RhtC10YHQvtGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ9Cg0JDQnCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICfQp9Cy0YDRgdGC0Lgg0LTQuNGB0LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICfQmtCw0L/QsNGG0LjRgtC10YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAn0JzRgNC10LbQvdC4INCw0LTQsNC/0YLQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ+KAnklQ4oCdINC/0YDQtdC60L4g4oCeREhDUOKAnSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAn4oCeSVDigJ0g0JDQtNGA0LXRgdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ9CT0YDQsNGE0LjRh9C60Lgg0LDQtNCw0L/RgtC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAn0JTRgNGD0LPQsCDQvtC/0YDQtdC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAn0JTQsNGC0YPQvCDQuNGB0YLQuNGG0LDRmtCwINCz0LDRgNCw0L3RhtC40ZjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICfQlNCw0YLRg9C8INC40L3RgdGC0LDQu9Cw0YbQuNGY0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ9Ci0LXQu9C10YTQvtC9IDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ9Ci0LXQu9C10YTQvtC9IDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAn0JjQvNC10ZjQuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAn0JDQtNGA0LXRgdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ9Cc0YDQtdC20L3QsCDQsNC00YDQtdGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICfQn9C+0LTQvNGA0LXQttC90LAg0LzQsNGB0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn0JzRgNC10LbQvdC4INC/0YDQvtC70LDQtyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICfQotC40L8g0LvQuNGG0LXQvdGG0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICfQm9C40YbQtdC90YbQvdC4INC60ZnRg9GHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAn0JrQvtC70LjRh9C40L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICfQlNCw0YLRg9C8INC40YHRgtC40YbQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICfQnNC10LTQuNGY0LAnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJ9Cg0LDRh9GD0L3QsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmR3YXJlJ30gPSAn0KXQsNGA0LTQstC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayd9ID0gJ9Cc0YDQtdC20LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICfQodC+0YTRgtCy0LXRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAn0JjRgdGC0LXQutC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICfQntC00YDQttCw0LLQsNGa0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICfQn9C40LvQvtGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICfQn9C70LDQvdC40YDQsNC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyJ30gPSAn0J3QsCDQv9C+0L/RgNCw0LLRhtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICfQoNCw0YHRhdC+0LTQvtCy0LDQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ9Cg0LXRhtC10L3Qt9C40ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAn0KLQtdGB0YIv0J7Qmic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfQm9Cw0L/RgtC+0L8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ9CU0LXRgdC60YLQvtC/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICfQodC10YDQstC10YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICfQlNGA0YPQs9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfQnNC+0L3QuNGC0L7RgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAn0KjRgtCw0LzQv9Cw0YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3dpdGNoJ30gPSAn0KHQstC40YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAn0KDRg9GC0LXRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOIEFjY2VzcyBQb2ludCd9ID0gJ+KAnldMQU7igJ0g0L/RgNC40YHRgtGD0L/QvdCwINGC0LDRh9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAn0KHQuNCz0YPRgNC90L7RgdC90Lgg0YPRgNC10ZLQsNGYJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICfQo9GA0LXRktCw0Zgg0LfQsCDRgNC10LfQtdGA0LLQvdC1INC60L7Qv9C40ZjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ9Cc0LjRiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXlib2FyZCd9ID0gJ9Ci0LDRgdGC0LDRgtGD0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICfQmtCw0LzQtdGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAn0J/RgNC+0ZjQtdC60YLQvtGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAn0JzQvtC00LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ+KAnlBDTUNJQeKAnSDQutCw0YDRgtC40YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAn4oCeVVNC4oCdINGD0YDQtdGS0LDRmCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfQn9GA0LjQutGZ0YPRh9C90LAg0YHRgtCw0L3QuNGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ9Ch0LrQtdC90LXRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ9CX0LPRgNCw0LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ9Ch0L/RgNCw0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ9Ch0L7QsdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICfQoNC10LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAn0KDQsNC00L3QviDQvNC10YHRgtC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ9Cj0YLQuNGH0L3QuNGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICfQmNCiINC+0LHRmNC10LrQsNGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ+KAnkxBTuKAnSAtINC70L7QutCw0LvQvdCwINC80YDQtdC20LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ+KAnldMQU7igJ0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICfigJ5HU03igJ0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAn0JrQu9C40ZjQtdC90YLRgdC60LAg0LDQv9C70LjQutCw0YbQuNGY0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ9Cf0L7RgdGA0LXQtNC90LjRh9C60Lgg0L/RgNC+0LPRgNCw0LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gPSAn0KHQtdGA0LLQtdGA0YHQutCwINCw0L/Qu9C40LrQsNGG0LjRmNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ9Ca0LvQuNGY0LXQvdGC0YHQutC4INCe0KEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyIE9TJ30gPSAn0KHQtdGA0LLQtdGA0YHQutC4INCe0KEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ9CQ0LTQvNC40L3QuNGB0YLRgNCw0YLQuNCy0L3QuCDQsNC70LDRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFRvb2wnfSA9ICfQmtC+0YDQuNGB0L3QuNGH0LrQuCDQsNC70LDRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ9Cj0LPRgNCw0ZLQtdC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAn0J/QvtGY0LXQtNC40L3QsNGH0L3QsCDQu9C40YbQtdC90YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ9Cf0L4g0LrQvtGA0LjRgdC90LjQutGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBQcm9jZXNzb3InfSA9ICfQn9C+INC/0YDQvtGG0LXRgdC+0YDRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAn0J/QviDRgdC10YDQstC10YDRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ9Cf0L4g0YfQstC+0YDRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ9Ca0L7Qu9C40YfQuNC90YHQutC1INC70LjRhtC10L3RhtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVycHJpc2UgTGljZW5jZSd9ID0gJ9Ca0L7QvNC/0LDQvdC40ZjRgdC60LAg0LvQuNGG0LXQvdGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSA9ICfQoNCw0LfQstC+0ZjQvdCwINC70LjRhtC10L3RhtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfQlNC10LzQvtC90YHRgtGA0LDRhtC40L7QvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ9CS0YDQtdC80LXQvdGB0LrQuCDQvtCz0YDQsNC90LjRh9C10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ9CR0LXRgdC/0LvQsNGC0L3QuCAqKic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ9Ce0YLQstC+0YDQtdC90Lgg0LrQvtC0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ9Cd0LXQvtCz0YDQsNC90LjRh9C10L3Qvic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ9CQ0LTQvNC40L0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICfQn9GA0L7QstC10YDQsCDRmNC10LTQuNC90YHRgtCy0LXQvdC+0LMg0LjQvNC10L3QsCDRgdCw0LzQviDRgyDQvtC60LLQuNGA0YMg0LjRgdGC0LUg0LrQu9Cw0YHQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4ICjigJ7QutC70LDRgdCw4oCdKSDQuNC70Lgg0LPQu9C+0LHQsNC70L3QviAo4oCe0LPQu9C+0LHQsNC70L3QvuKAnSksINGI0YLQviDQt9C90LDRh9C4INC00LAg0ZjQtSDRgdCy0LDQutCwINC/0L7RgdGC0L7RmNC10ZvQsCDQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdCwINGB0YLQsNCy0LrQsCDRg9C30LXRgtCwINGDINC+0LHQt9C40YAg0YMg0L/RgNC+0LLQtdGA0Lgg0LTRg9C/0LvQuNC60LDRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICfQmtC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAn0JTQvtC00LDQstCw0ZrQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICfQo9GA0LXRktC40LLQsNGa0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuCDQutC+0ZjQuCDQvtC80L7Qs9GD0ZvQsNCy0LAg0LHQtdC70LXQttC10ZrQtSDRgyDQuNGB0YLQvtGA0LjRmNCw0YIg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJ9CY0YHRgtC+0YDQuNGY0LDRgiDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAn0KjRgtCw0LzQv9CwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAn0JTQtdGC0LDRmdC90Lgg0L/RgNC40LrQsNC3INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvdC1INGB0YLQsNCy0LrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJ0NvbmZpZ0l0ZW1OdW1iZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAn0J7Qs9GA0LDQvdC40YfQtdGa0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJ9Ce0LPRgNCw0L3QuNGH0LXRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60Lgg0L/QviDRgdGC0YDQsNC90LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICfQkdCw0LfQsCDQv9C+0LTQsNGC0LDQutCwINGD0L/RgNCw0LLRmdCw0ZrQsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40ZjQvtC8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAn0JzQvtC00YPQuyDQvNCw0YHQvtCy0L3QtSDQsNC60YbQuNGY0LUg0L3QsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40Lwg0YHRgtCw0LLQutCw0LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QsCDRgdGC0LDQstC60LAg0L/RgNC10YLRgNCw0LbRg9GY0LUg0L/QvtC30LDQtNC40L3RgdC60Lgg0YDRg9GC0LXRgCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBkZWZpbml0aW9ucyBmb3IgQ29uZmlndXJhdGlvbiBJdGVtcy4nfSA9ICfQmtGA0LXQuNGA0LDRmtC1INC4INGD0L/RgNCw0LLRmdCw0ZrQtSDQtNC10YTQuNC90LjRhtC40ZjQsCDQt9CwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQkNC60YbQuNGY0LUg0LPQtNC1INGY0LUg0LTRg9Cz0LzQtSDQv9C+0YHRgtCw0LLQutC4INC00L7RgdGC0YPQv9C90L4g0YMg0L/QvtCy0LXQt9Cw0L3QvtC8INCz0YDQsNGE0LjRh9C60L7QvCDQtdC70LXQvNC10L3RgtGDINC+0LHRmNC10LrRgtCwIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuINCc0L7Qu9C40LzQviDQtNCwINC40LzQsNGC0LUg0L3QsCDRg9C80YMg0LTQsCDQvtCy0LUg0JDQutGG0LjRmNC1INC80L7RgNCw0ZjRgyDQtNCwINCx0YPQtNGDINGA0LXQs9C40YHRgtGA0L7QstCw0L3QtSDRgyDRgdC70LXQtNC10ZvQuNC8IEpTINC4IENTUyDQtNCw0YLQvtGC0LXQutCw0LzQsDogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMg0LggQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAn0JTQtdGE0LjQvdC40YHQsNGZ0LUg0LPRgNGD0L/QtSDRgdCwINC/0YDQsNCy0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQvdC10L7Qv9GF0L7QtNC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDQutGA0LXQuNGA0LDRmtC1INCY0KLQodCcINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60Lgg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0L7Qv9GI0YLQtdCzINC40L3RgtC10YDRhNC10ZjRgdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQv9C+0YLRgNC10LHQvdC1INC00L7Qt9Cy0L7Qu9C1INC30LAg0LHRgNC40YHQsNGa0LUg4oCeSVRTTeKAnSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4INC60YDQvtC3INC+0L/RiNGC0Lgg0LjQvdGC0LXRgNGE0LXRmNGBLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQvdC10L7Qv9GF0L7QtNC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDQtNC+0LHQuNGY0LDRmtC1INCY0KLQodCcINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60Lgg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0L7Qv9GI0YLQtdCzINC40L3RgtC10YDRhNC10ZjRgdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQvdC10L7Qv9GF0L7QtNC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDQv9GA0LXRgtGA0LDQs9GDINCY0KLQodCcINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60Lgg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0L7Qv9GI0YLQtdCzINC40L3RgtC10YDRhNC10ZjRgdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQvdC10L7Qv9GF0L7QtNC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDQsNC20YPRgNC40YDQsNGa0LUg0JjQotCh0Jwg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuCDQutC+0YDQuNGI0ZvQtdGa0LXQvCDQvtC/0YjRgtC10LMg0LjQvdGC0LXRgNGE0LXRmNGB0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0LzQvtC00YPQuyDQv9GA0LXQs9C70LXQtNCwINC30LAg0LzQsNC70Lgg0L/RgNC40LrQsNC3INC70LjRgdGC0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuC4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INGA0LXQs9GD0LvQsNGA0L3QtSDQuNC30YDQsNC30LUg0LfQsCDRgdCy0LDQutGDINC60LvQsNGB0YMg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0YDQsNC00Lgg0L/RgNC+0LLQtdGA0LUg0L3QsNC30LjQstCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC4INC/0YDQuNC60LDQt9CwINC/0YDQuNC/0LDQtNCw0ZjRg9Gb0LjRhSDQv9C+0YDRg9C60LAg0L4g0LPRgNC10YjQutCw0LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L/QvtC00L7QsdGY0LXQutCw0YIg0LrQu9Cw0YHQtSDigJ5JVFNNINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LAg0YHRgtCw0LLQutCw4oCdLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INCx0YDQvtGYINGA0LXQtNC+0LLQsCDQt9CwINC10LTQuNGC0L7RgCDQtNC10YTQuNC90LjRhtC40ZjQtSDQmtChINGDINCw0LTQvNC40L3QuNGB0YLRgNCw0YLQuNCy0L3QvtC8INC40L3RgtC10YDRhNC10ZjRgdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INGA0LXQtNC+0YHQu9C10LQg0LjQvdGG0LjQtNC10L3RgtC90LjRhSDRgdGC0LDRmtCwINC+0LQg0LLQuNGB0L7QutC+0LMgKNC90L/RgCDQutGA0LjRgtC40YfQvdC+KSDQtNC+INC90LjRgdC60L7QsyAo0L3Qv9GAINGE0YPQvdC60YbQuNC+0L3QsNC70L3QvikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDRgNC10LvQtdCy0LDQvdGC0L3QsCDRgdGC0LDRmtCwINGA0LDRgdC/0L7RgNC10ZLQuNCy0LDRmtCwINCz0LTQtSDQv9C+0LLQtdC30LDQvdC4INGC0LjQutC10YLQuCDQvNC+0LPRgyDQtNCwINGD0YLQuNGH0YMg0L3QsCDRgdGC0LDRgtGD0YEg0JrQoS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INCz0YDQsNC90LjRhtGDINC/0YDQtdGC0YDQsNCz0LUg0LfQsCDQtdC60YDQsNC9IEFnZW50SVRTTUNvbmZpZ0l0ZW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQs9GA0LDQvdC40YbRgyDQv9GA0LXRgtGA0LDQs9C1INC30LAg0LXQutGA0LDQvSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC/0YDQuNC60LDQt9Cw0L3QtSDQutC+0LvQvtC90LUg0YMg0L/RgNC10LPQu9C10LTRgyDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4LiDQntCy0LAg0L7Qv9GG0LjRmNC1INC90LXQvNCwINGD0YLQuNGG0LDRmCDQvdCwINC/0L7Qt9C40YbQuNGY0LUg0LrQvtC70L7QvdCwLiDQndCw0L/QvtC80LXQvdCwOiDQkNC60L4g0ZjQtSDQuNC30LDQsdGA0LDQvSDRhNC40LvRgtC10YAg4oCe0KHQstC14oCdINC60LvQsNGB0LAg0LrQvtC70L7QvdC1INGY0LUg0YPQstC10Log0LTQvtGB0YLRg9C/0L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9GA0LjQutCw0LfQsNC90LUg0LrQvtC70L7QvdC1INGDINC/0YDQtdGC0YDQsNC30Lgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuC4g0J7QstCwINC+0L/RhtC40ZjQtSDQvdC10LzQsCDRg9GC0LjRhtCw0Zgg0L3QsCDQv9C+0LfQuNGG0LjRmNC1INC60L7Qu9C+0L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9GA0LjQutCw0LfQsNC90LUg0LrQvtC70L7QvdC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60Lgg0YMg0L/RgNC10LPQu9C10LTRgyDRgyDQt9Cw0LLQuNGB0L3QvtGB0YLQuCDQvtC0INC60LvQsNGB0LUuINCh0LLQsNC60Lgg0YPQvdC+0YEg0LzQvtGA0LAg0YHQsNC00YDQttCw0YLQuCDQv9GA0LXRhNC40LrRgSDRgdCwINC90LDQt9C40LLQvtC8INC60LvQsNGB0LUg0Lgg0LTQstC+0YLQsNGH0LrQvtC8ICjQvdC/0YAuIENvbXB1dGVyOjopLiDQn9C+0YHRgtC+0ZjQuCDQv9Cw0YAg0LDRgtGA0LjQsdGD0YLQsCDQutC+0ZjQuCDRgdGDINC30LDRmNC10LTQvdC40YfQutC4INC30LAg0YHQstC1INC60LvQsNGB0LUgKNC90L/RgC4g0LfQsCDQutC70LDRgdGDIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiDQl9CwINC/0YDQuNC60LDQtyDQv9C+0ZjQtdC00LjQvdCw0YfQvdC40YUg0LDRgtGA0LjQsdGD0YLQsCDQuNC3INC00LXRhNC40L3QuNGG0LjRmNC1LCDQvNC+0YDQsNGC0LUg0LrQvtGA0LjRgdGC0LjRgtC4INGB0LvQtdC00LXRm9GDINGI0LXQvNGDICjQv9GA0LjQvNC10YAg0LfQsCDQutC70LDRgdGDIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuINCj0LrQvtC70LjQutC+INC90LUg0L/QvtGB0YLQvtGY0Lgg0YPQvdC+0YEg0LfQsCDQv9C+0ZjQtdC00LjQvdCw0YfQvdGDINC60LvQsNGB0YMsINCx0LjRm9C1INC/0YDQuNC60LDQt9Cw0L3QtSDQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QtSDQutC+0LvQvtC90LUg0LTQtdGE0LjQvdC40YHQsNC90LUg0YMgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC/0YDQuNC60LDQt9Cw0L3QtSDQutC+0LvQvtC90LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuCDRgyDQv9GA0LXRgtGA0LDQt9C4INGDINC30LDQstC40YHQvdC+0YHRgtC4INC+0LQg0LrQu9Cw0YHQtS4g0KHQstCw0LrQuCDRg9C90L7RgSDQvNC+0YDQsCDRgdCw0LTRgNC20LDRgtC4INC/0YDQtdGE0LjQutGBINGB0LAg0L3QsNC30LjQstC+0Lwg0LrQu9Cw0YHQtSDQuCDQtNCy0L7RgtCw0YfQutC+0LwgKNC90L/RgC4gQ29tcHV0ZXI6OikuINCf0L7RgdGC0L7RmNC4INC/0LDRgCDQsNGC0YDQuNCx0YPRgtCwINC60L7RmNC4INGB0YMg0LfQsNGY0LXQtNC90LjRh9C60Lgg0LfQsCDRgdCy0LUg0LrQu9Cw0YHQtSAo0L3Qv9GALiDQt9CwINC60LvQsNGB0YMgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuINCX0LAg0L/RgNC40LrQsNC3INC/0L7RmNC10LTQuNC90LDRh9C90LjRhSDQsNGC0YDQuNCx0YPRgtCwINC40Lcg0LTQtdGE0LjQvdC40YbQuNGY0LUsINC80L7RgNCw0YLQtSDQutC+0YDQuNGB0YLQuNGC0Lgg0YHQu9C10LTQtdGb0YMg0YjQtdC80YMgKNC/0YDQuNC80LXRgCDQt9CwINC60LvQsNGB0YMgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4g0KPQutC+0LvQuNC60L4g0L3QtSDQv9C+0YHRgtC+0ZjQuCDRg9C90L7RgSDQt9CwINC/0L7RmNC10LTQuNC90LDRh9C90YMg0LrQu9Cw0YHRgywg0LHQuNGb0LUg0L/RgNC40LrQsNC30LDQvdC1INC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC1INC60L7Qu9C+0L3QtSDQtNC10YTQuNC90LjRgdCw0L3QtSDRgyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0L/RgNC40LrQsNC30LDQvdC1INC60L7Qu9C+0L3QtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4INGDINGC0LDQsdC10LvQuCDQstC10LfQsCDRgyDQt9Cw0LLQuNGB0L3QvtGB0YLQuCDQvtC0INC60LvQsNGB0LUuINCh0LLQsNC60Lgg0YPQvdC+0YEg0LzQvtGA0LAg0YHQsNC00YDQttCw0YLQuCDQv9GA0LXRhNC40LrRgSDRgdCwINC90LDQt9C40LLQvtC8INC60LvQsNGB0LUg0Lgg0LTQstC+0YLQsNGH0LrQvtC8ICjQvdC/0YAuIENvbXB1dGVyOjopLiDQn9C+0YHRgtC+0ZjQuCDQv9Cw0YAg0LDRgtGA0LjQsdGD0YLQsCDQutC+0ZjQuCDRgdGDINC30LDRmNC10LTQvdC40YfQutC4INC30LAg0YHQstC1INC60LvQsNGB0LUgKNC90L/RgC4g0LfQsCDQutC70LDRgdGDIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiDQl9CwINC/0YDQuNC60LDQtyDQv9C+0ZjQtdC00LjQvdCw0YfQvdC40YUg0LDRgtGA0LjQsdGD0YLQsCDQuNC3INC00LXRhNC40L3QuNGG0LjRmNC1LCDQvNC+0YDQsNGC0LUg0LrQvtGA0LjRgdGC0LjRgtC4INGB0LvQtdC00LXRm9GDINGI0LXQvNGDICjQv9GA0LjQvNC10YAg0LfQsCDQutC70LDRgdGDIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuINCj0LrQvtC70LjQutC+INC90LUg0L/QvtGB0YLQvtGY0Lgg0YPQvdC+0YEg0LfQsCDQv9C+0ZjQtdC00LjQvdCw0YfQvdGDINC60LvQsNGB0YMsINCx0LjRm9C1INC/0YDQuNC60LDQt9Cw0L3QtSDQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QtSDQutC+0LvQvtC90LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiBsaW5rIChuYW1lZCBmcm9tIHRoZSB0aWNrZXQgcGVyc3BlY3RpdmUpIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LrQvtGY0Lgg0YLQuNC/INCy0LXQt9C1ICjQs9C70LXQtNCw0L3QviDQuNC3INC/0LXRgNGB0L/QtdC60YLQuNCy0LUg0YLQuNC60LXRgtCwKSDQvNC+0LbQtSDQtNCwINGD0YLQuNGH0LUg0L3QsCDQv9C+0LLQtdC30LDQvdGDINCa0KEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQutC+0ZjQuCDRgtC40L8g0YLQuNC60LXRgtCwINC80L7QttC1INC00LAg0YPRgtC40YfQtSDQvdCwINGB0YLQsNGC0YPRgSDQv9C+0LLQtdC30LDQvdC1INCa0KEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfQkdGA0LjRgdCw0ZrQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAn0JHQvtGY0LAg0YHRgtCw0YLRg9GB0LAg0YDQsNGB0L/QvtGA0LXRktC40LLQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICfQkdC+0ZjQsCDRgdGC0LDRgtGD0YHQsCDRgNCw0YHQv9C+0YDQtdGS0LjQstCw0ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJ9Ci0LjQvyDRgdGC0LDRgtGD0YHQsCDRgNCw0YHQv9C+0YDQtdGS0LjQstCw0ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICfQntC90LXQvNC+0LPRg9Gb0LXQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICfQlNGD0L/Qu9C40LrQsNGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICfQntC80L7Qs9GD0ZvQtdC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ9Ce0LzQvtCz0YPRm9Cw0LLQsCDQvNCw0YHQvtCy0L3RgyDQsNC60YbQuNGY0YMg0L3QsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40Lwg0YHRgtCw0LLQutCw0LzQsCDRgyDQv9GA0LjRgdGC0YPQv9C90L7QvCDRgdC40YHRgtC10LzRgyDQvtC/0LXRgNCw0YLQtdGA0LAg0L3QsCDQstC40YjQtSDQvtC0INGY0LXQtNC90LUg0YHRgtCw0LLQutC1INC40YHRgtC+0LLRgNC10LzQtdC90L4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICfQkNC60YLQuNCy0LjRgNCwINGB0LLQvtGY0YHRgtCy0L4g0LzQsNGB0L7QstC90LUg0LDQutGG0LjRmNC1INC90LAg0LrQvtC90YTQuNCz0LjRgNCw0YbQuNC+0L3QuNC8INGB0YLQsNCy0LrQsNC80LAg0YHQsNC80L4g0LfQsCDQuNC30LvQuNGB0YLQsNC90LUg0LPRgNGD0L/QtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJ9CQ0LrRgtC40LLQuNGA0LAv0LTQtdCw0LrRgtC40LLQuNGA0LAg0YTRg9C90LrRhtC40ZjRgyDQt9CwINC/0YDQvtCy0LXRgNGDINGY0LXQtNC40L3RgdGC0LLQtdC90L7RgdGC0Lgg0LjQvNCw0L3QsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4LiDQn9GA0LUg0LDQutGC0LjQstC40YDQsNGa0LAg0L7QstC1INC+0L/RhtC40ZjQtSDRgtGA0LXQsdCw0YLQtSDQv9GA0L7QstC10YDQuNGC0Lgg0YMg0LLQsNGI0LXQvCDRgdC40YHRgtC10LzRgyDQv9C+0YHRgtC+0ZjQsNGa0LUg0LTRg9C/0LvQuNC60LDRgtCwINC90LAg0L/QvtGB0YLQvtGY0LXRm9C40Lwg0YHRgtCw0LLQutCw0LzQsC4g0KLQviDQvNC+0LbQtdGC0LUg0YPRgNCw0LTQuNGC0Lgg0L/QvtC80L7Rm9GDINGB0LrRgNC40L/RgtCwIOKAnmJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGzigJ0uICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LfQsCDQv9C+0LTQtdGI0LDQstCw0ZrQtSDRgdGC0LDRgtGD0YHQsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC40YUg0YHRgtCw0LLQutC4INC/0YDQuNC70LjQutC+0Lwg0L/QvtGB0YLQsNCy0ZnQsNGa0LAg0LLQtdC30LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAn0J/RgNC10LPQu9C10LQg4oCeSVRTTeKAnSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICfQnNC+0LTRg9C7INC30LAg0L/RgNC+0LLQtdGA0YMg0LPRgNGD0L/QtSDQvtC00LPQvtCy0L7RgNC90LUg0LfQsCDQutC70LDRgdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0Lsg0LfQsCDQv9GA0L7QstC10YDRgyDQs9GA0YPQv9C1INC+0LTQs9C+0LLQvtGA0L3QtSDQt9CwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90YMg0YHRgtCw0LLQutGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJ9Cc0L7QtNGD0Lsg0LfQsCDQs9C10L3QtdGA0LjRgdCw0ZrQtSDRgdGC0LDRgtC40YHRgtC40LrQtSDigJ5JVFNN4oCdINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LjRhSDRgdGC0LDQstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ9Cg0LXQs9C40YHRgtGA0LDRhtC40ZjQtSDigJ5iYWNrZW5k4oCdINC80L7QtNGD0LvQsCDQvtCx0ZjQtdC60YLQsCDQt9CwINGD0LLQvtC3L9C40LfQstC+0Lcg0LzQvtC00YPQuy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAn0J/RgNC10LPQu9C10LQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QsNGA0LDQvNC10YLRgNC4INC30LAg0LHQvtGY0LUg0YHRgtCw0YLRg9GB0LAg0L/RgNC40LzQtdC90LUg0L3QsCDQv9GA0LjQutCw0LfRgyDQv9C+0YHRgtCw0LLQutC4INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9Cw0YDQsNC80LXRgtGA0Lgg0LfQsCDRgdGC0LDRgtGD0YHQtSDQv9GA0LjQvNC10L3QtSDQvdCwINC/0YDQuNC60LDQt9GDINC/0L7RgdGC0LDQstC60Lgg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfQn9Cw0YDQsNC80LXRgtGA0Lgg0LfQsCDQsNGC0YDQuNCx0YPRgtC1INGD0LfQvtGA0LrQsCDQs9GA0YPQv9C1INC30LAg0LTQvtC30LLQvtC70LUg0L7Qv9GI0YLQtdCzINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAn0J/QsNGA0LDQvNC10YLRgNC4INC30LAg0YHRgtGA0LDQvdC40YbQtSAo0L3QsCDQutC+0ZjQuNC80LAg0YHRgyDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSDQv9GA0LjQutCw0LfQsNC90LUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwIElUU00g0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7RgtGA0LXQsdC90LUg0LTQvtC30LLQvtC70LUg0LfQsCDRg9C/0L7RgtGA0LXQsdGDINC10LrRgNCw0L3QsCDQv9GA0LXRgtGA0LDQs9C1IElUU00g0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHpvb20gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0YLRgNC10LHQvdC1INC00L7Qt9Cy0L7Qu9C1INC30LAg0YPQv9C+0YLRgNC10LHRgyDQtdC60YDQsNC90LAg0LTQtdGC0LDQu9C90L7QsyDQv9GA0LjQutCw0LfQsCBJVFNNINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0YLRgNC10LHQvdC1INC00L7Qt9Cy0L7Qu9C1INC30LAg0YPQv9C+0YLRgNC10LHRgyDQtdC60YDQsNC90LAg0LTQvtC00LDQstCw0ZrQsCBJVFNNINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwINC40LfQvNC10L3QtSBJVFNNINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBoaXN0b3J5IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwINC40YHRgtC+0YDQuNGY0LDRgtCwIElUU00g0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwINGI0YLQsNC80L/QtSBJVFNNINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBkZWxldGUgY29uZmlnIGl0ZW1zLid9ID0gJ9Cf0L7RgtGA0LXQsdC90LAg0L/RgNCw0LLQsCDQt9CwINCx0YDQuNGB0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggY29uZmlnIGl0ZW1zLid9ID0gJ9Cf0YDQtdGC0YDQsNCz0LAg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QuNGFINGB0YLQsNCy0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAn0JHQuNGA0LAg0LzQvtC00YPQuyDQvtC/0LXRgNCw0YLQvtGA0LAg0LDRg9GC0L7QvNCw0YLRgdC60L7QsyDRg9Cy0LXRm9Cw0ZrQsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtS4g0J7Qv9C10YDQsNGC0L7RgCDQsNGD0YLQvtC80LDRgtGB0LrQvtCzINGD0LLQtdGb0LDRmtCwINC/0L7QstC10ZvQsNCy0LAg0LHRgNC+0Zgg0YHRgtCw0LLQutC1LCDRgdC40YHRgtC10LzRgdC60Lgg0JjQlCwg0JjQlCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INC60LvQsNGB0LUg0Lgg0LrQvtGA0LjRiNGC0LXQvdC4INCx0YDQvtGY0LDRhy4g0KTQvtGA0LzQsNGCINGY0LUg4oCeU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlcuKAnSwg0L3Qv9GAIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICfQn9C+0YHRgtCw0LLRmdCwINGB0YLQsNGa0LUg0LjQvdGG0LjQtNC10L3RgtCwINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC60LDQtNCwINGY0LUg0YLQuNC60LXRgiDQv9C+0LLQtdC30LDQvSDRgdCwINGB0YLQsNCy0LrQvtC8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0YHRgtCw0YLRg9GBINC/0YDQuNC80LXQvdC1INC90LAg0LXQutGA0LDQvdGDINC80LDRgdC+0LLQvdC1INCw0LrRhtC40ZjQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0YHRgtCw0YLRg9GBINC40L3RhtC40LTQtdC90YLQsCDQvdCwINC10LrRgNCw0L3RgyDQvNCw0YHQvtCy0L3QtSDQsNC60YbQuNGY0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CjINC80LXQvdC40ZjRgyDQv9GA0LjQutCw0LfRg9GY0LUg0LLQtdC30YMg0LrQvtGY0LAg0L7QvNC+0LPRg9Gb0LDQstCwINC/0L7QstC10LfQuNCy0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGB0LAg0LTRgNGD0LPQuNC8INC+0LHRmNC10LrRgtC+0Lwg0L3QsCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRmNC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0L/RgNC40YHRgtGD0L8g0LjRgdGC0L7RgNC40ZjQsNGC0YMg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0L3QsCDQv9GA0LXQs9C70LXQtNGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KMg0LzQtdC90LjRmNGDINC/0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDQt9CwINC/0YDQuNGB0YLRg9C/INC40YHRgtC+0YDQuNGY0LDRgtGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC90LAg0LTQtdGC0LDRmdC90L7QvCDQv9GA0LjQutCw0LfRgyDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KMg0LzQtdC90LjRmNGDINC/0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDQt9CwINCx0YDQuNGB0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC90LAg0ZrQtdC90L7QvCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0YPQvNC90L7QttCw0LLQsNGa0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0L3QsCDQv9GA0LXQs9C70LXQtNGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KMg0LzQtdC90LjRmNGDINC/0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDQt9CwINGD0LzQvdC+0LbQsNCy0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC90LAg0ZrQtdC90L7QvCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CjINC80LXQvdC40ZjRgyDQv9GA0LjQutCw0LfRg9GY0LUg0LLQtdC30YMg0LfQsCDQuNC30LzQtdC90YMg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUg0L3QsCDRmtC10L3QvtC8INC00LXRgtCw0ZnQvdC+0Lwg0L/RgNC40LrQsNC30YMg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KMg0LzQtdC90LjRmNGDINC/0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDQt9CwINC/0L7QstGA0LDRgtCw0Log0L3QsCDQtNC10YLQsNGZ0L3QuCDQv9GA0LjQutCw0Lcg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QtSDRgdGC0LDQstC60LUgINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0YjRgtCw0LzQv9GDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC90LAg0ZrQtdC90L7QvCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0LTQtdGC0LDRmdC90Lgg0L/RgNC40LrQsNC3INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1INC90LAg0L/RgNC10LPQu9C10LTRgyDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC1INGB0YLQsNCy0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjb25maWcgaXRlbSBoaXN0b3J5IChyZXZlcnNlIG9yZGVyZWQpIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9GA0LjQutCw0LfRg9GY0LUg0LjRgdGC0L7RgNC40ZjQsNGCINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LUg0YHRgtCw0LLQutC1ICjQvtCx0YDQvdGD0YIg0YDQtdC00L7RgdC70LXQtCkg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAn0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LfQsCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdGDINGB0YLQsNCy0LrRgywg0L3Qv9GAINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LDQodGC0LDQstC60LAjLCDQnNC+0ZjQsNCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LDQodGC0LDQstC60LAjLiDQn9C+0LTRgNCw0LfRg9C80LXQstCw0L3QviDRmNC1INCa0L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90LDQodGC0LDQstC60LAjLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbGFzcyd9ID0gJ9C60LvQsNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAn0LPQu9C+0LHQsNC70L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwb3N0cHJvZHVjdGl2ZSd9ID0gJ9C/0L7RgdGCLdC/0YDQvtC00YPQutGG0LjRmNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICfQv9GA0LUt0L/RgNC+0LTRg9C60YbQuNGY0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJ9C/0YDQvtC00YPQutGG0LjRmNCwJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0xhdG5fSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JVFNNQ29uZmlnSXRlbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ1VwcmF2bGphbmplIGtvbmZpZ3VyYWNpb25pbSBzdGF2a2FtYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbid9ID0gJ0RlZmluaWNpamEga2xhc2UgcHJvbWVuZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJ0tsYXNhIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pY2lqYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdLb25maWd1cmFjaW9uYSBzdGF2a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnRmlsdGVyIHphIGtsYXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ0l6YWJlcml0ZSBrbGFzdSBpeiBsaXN0ZSByYWRpIGtyZWlyYW5qYSBub3ZlIGtvbmZpZ3VyYWNpb25lIHN0YXZrZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdLbGFzYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJ+KAnklUU03igJ0gbWFzb3ZuYSBha2NpamEgbmEgdGlrZXR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICdTdGF0dXMgcmFzcG9yZcSRaXZhbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnU3RhbmplIGluY2lkZW50YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICdQb3Zlxb5pIHNhIGRydWdpbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnTmVpc3ByYXZhbiBicm9qIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAnQnJvaiBkcnVnZSBrb25maWd1cmFjaW9uZSBzdGF2a2UgemEgcG92ZXppdmFuamUuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnRGEgbGkgc3R2YXJubyDFvmVsaXRlIGRhIG9icmnFoWV0ZSBvdnUga29uZmlndXJhY2lvbnUgc3Rhdmt1Pyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdOYXppdiBvdmUga29uZmlndXJhY2lvbmUgc3RhdmtlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICdOYXppdiBqZSB2ZcSHIHUgdXBvdHJlYmkgbmEga29uZmlndXJhY2lvbmltIHN0YXZrYW1hIGJyb2o6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICdTdGF0dXMgcmFzcG9yZcSRaXZhbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnU3RhbmplIGluY2lkZW50YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnSXN0b3JpamF0IGtvbmZpZ3VyYWNpb25lIHN0YXZrZTogJXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ1BvZGXFoWF2YW5qZSBrb250ZWtzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAnS29uZmlndXJhY2lvbmUgc3RhdmtlIHBvIHN0cmFuaSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3U21hbGwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgZ2VuZXJpYyBJVFNNIENvbmZpZ3VyYXRpb24gSXRlbSB0YWJsZSd9ID0gJ0dlbmVyacSNa2EgdGFiZWxhIElUU00ga29uZmlndXJhY2lvbmUgc3RhdmtlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ1RpcCBzdGF0dXNhIHJhc3BvcmXEkWl2YW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnVHJlbnV0bm8gc3RhbmplIGluY2lkZW50YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICdUaXAgdHJlbnV0bm9nIHN0YXR1c2EgaW5jaWRlbnRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1phZG5qaSBwdXQgcHJvbWVuamVubyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ05hcHJhdmkgbm92aSDFoWFibG9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICdQb2tyZW5pIHByZXRyYWd1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1ByZXRyYcW+aXRlIGkgdSBwcmV0aG90bmltIHZlcnppamFtYT8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICdLb25maWd1cmFjaW9uYSBzdGF2a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpamEgbyBrb25maWd1cmFjaW9ub2ogc3RhdmtpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ1RyZW51dG5pIHN0YXR1cyByYXNwb3JlxJFpdmFuamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAnUHJvbWVuaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdVIHJlZHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ1ByaWthxb5pIGplZG51IHZlcnppanUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhbGwgdmVyc2lvbnMnfSA9ICdQb2thxb5pIHN2ZSB2ZXJ6aWplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICdWZXJ6aWphIC0gc3RhdHVzIGluY2lkZW50YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIERlcGxveW1lbnQgU3RhdGUnfSA9ICdWZXJ6aWphIC0gc3RhdHVzIHByaW1lbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBOdW1iZXInfSA9ICdCcm9qIHZlcnppamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyd9ID0gJ0RldGFsamkgdmVyemlqZSBrb25maWd1cmFjaW9uZSBzdGF2a2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICdTdm9qc3R2byc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJ05pamUgZGF0IHByaXN0dXAga2xhc2khJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICdQcmVnbGVkOiBJVFNNIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICdOaWplIGRhdCBJRCBLb25maWd1cmFjaW9uZSBTdGF2a2UhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnUG90cmVibmEgamUgYmFyIGplZG5hIGl6YWJyYW5hIEtvbmZpZ3VyYWNpb25hIHN0YXZrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICdOZW1hdGUgcHJhdm8gdXBpc2EgemEgb3Z1IGtvbmZpZ3VyYWNpb251IHN0YXZrdTogJXMuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICdLb25maWd1cmFjaW9uYSBzdGF2a2Eg4oCeJXPigJ0gbmlqZSBuYcSRZW5hIHUgYmF6aSBwb2RhdGFrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICdOaWplIGJpbG8gbW9ndcSHZSBvYnJpc2F0aSBrb25maWd1cmFjaW9udSBzdGF2a3UgSUQgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICdOaWplIHByb25hxJFlbmEgdmVyemlqYSB6YSBrb25maWd1cmFjaW9udSBzdGF2a3UgSUQgJXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJ05pc3UgZGF0aSBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIGlsaSBDbGFzc0lEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnTmlqZSBkYXQgcHJpc3R1cCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnTmlqZSBwcm9uYcSRZW5hIGRlZmluaWNpamEgemEga2xhc3UgJXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJ05lIG1vxb5lIHNlIHByaWthemF0aSBpc3RvcmlqYXQsIGplciBuaWplIGRhdCBJRCBrb25maWd1cmFjaW9uZSBzdGF2a2UhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnTmUgbW/FvmUgc2UgcHJpa2F6YXRpIGlzdG9yaWphdCwgbmlqZSBkYXQgcHJpc3R1cCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICdDSUhpc3Rvcnk6Oic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJ05pc3UgZGF0aSBDb25maWdJdGVtSUQgaWxpIFZlcnNpb25JRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnTmUgbW/FvmUgc2UgcHJpa2F6YXRpIGtvbmZpZ3VyYWNpb25hIHN0YXZrYSwgbmlqZSBkYXQgcHJpc3R1cCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICdLb25maWd1cmFjaW9uYSBzdGF2a2EgSUQgJXMgbmlqZSBuYcSRZW5hIHUgYmF6aSBwb2RhdGFrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICdWZXJ6aWphIElEICVzIG5pamUgbmHEkWVuYSB1IGJhemkgcG9kYXRha2EhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICdLb25maWd1cmFjaW9uYSBzdGF2a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJ8WhdGFtcGFudSBvZCBzdHJhbmUgJXMgdSAlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJ05laXNwcmF2YW4gSUQgS2xhc2UhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnTmlqZSBkYXQgSUQgS2xhc2UhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJ30gPSAnTmlqZSBkYXQgcHJpc3R1cCBvdm9qIGtsYXNpISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAnTmVtYSByZXp1bHRhdGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAnUmV6dWx0YXQgcHJldHJhZ2Uga29uZmlndXJhY2lvbmloIHN0YXZraSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnTmUgbW/FvmUgc2UgcHJpa2F6YXRpIHN0YXZrYSwgbmlqZSBkYXQgcHJpc3R1cCB6YSBvdnUga29uZmlndXJhY2lvbnUgc3Rhdmt1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnU3RhdHVzIHByaW1lbmUgb3ZlIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ1N0YXR1cyBpbmNpZGVudGEgb3ZlIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYWtzaW1hbG5pIGJyb2ogamVkbm9nIGVsZW1lbnRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ1ByYXpuYSBwb2xqYSB1a2F6dWp1IGRhIMSHZSBha3R1ZWxuZSB2cmVkbm9zdGkgYml0aSB6YWRyxb5hbmUnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICdTZXJpanNraSBicm9qJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSd9ID0gJ1Byb2Nlc29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICfEjHZyc3RpIGRpc2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdLYXBhY2l0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAnTXJlxb5uaSBhZGFwdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ+KAnklQ4oCdIHByZWtvIOKAnkRIQ1DigJ0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgQWRkcmVzcyd9ID0gJ+KAnklQ4oCdIEFkcmVzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICdHcmFmacSNa2kgYWRhcHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdEcnVnYSBvcHJlbWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAnRGF0dW0gaXN0aWNhbmphIGdhcmFuY2lqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICdEYXR1bSBpbnN0YWxhY2lqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAnVGVsZWZvbiAxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICdUZWxlZm9uIDInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnSW1lamwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FkcmVzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdNcmXFvm5hIGFkcmVzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ1BvZG1yZcW+bmEgbWFza2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2F0ZXdheSd9ID0gJ01yZcW+bmkgcHJvbGF6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ1RpcCBsaWNlbmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAnTGljZW5jbmkga2xqdcSNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAnS29sacSNaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ0RhdHVtIGlzdGljYW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ01lZGlqYSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnUmHEjXVuYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGFyZHdhcmUnfSA9ICdIYXJkdmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICdNcmXFvmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICdTb2Z0dmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICdJc3Rla2xvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAnT2Ryxb5hdmFuamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICdQaWxvdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAnUGxhbmlyYW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ05hIHBvcHJhdmNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICdSYXNob2RvdmFubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdSZWNlbnppamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ1Rlc3QvT0snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFwdG9wJ30gPSAnTGFwdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdEZXNrdG9wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BEQSd9ID0gJ1BEQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXInfSA9ICdTZXJ2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdEcnVnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb25pdG9yJ30gPSAnTW9uaXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAnxaB0YW1wYcSNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N3aXRjaCd9ID0gJ1N2acSNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JvdXRlcid9ID0gJ1J1dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAn4oCeV0xBTuKAnSBwcmlzdHVwbmEgdGHEjWthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlY3VyaXR5IERldmljZSd9ID0gJ1NpZ3Vybm9zbmkgdXJlxJFhaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnVXJlxJFhaiB6YSByZXplcnZuZSBrb3BpamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdNacWhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnVGFzdGF0dXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbWVyYSd9ID0gJ0thbWVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZWFtZXInfSA9ICdQcm9qZWt0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZW0nfSA9ICdNb2RlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ+KAnlBDTUNJQeKAnSBrYXJ0aWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICfigJ5VU0LigJ0gdXJlxJFhaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICdQcmlrbGp1xI1uYSBzdGFuaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjYW5uZXInfSA9ICdTa2VuZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdaZ3JhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdTcHJhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnU29iYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnUmVrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ1JhZG5vIG1lc3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ1V0acSNbmljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lUIG9iamVrYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAn4oCeTEFO4oCdIC0gbG9rYWxuYSBtcmXFvmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV0xBTid9ID0gJ+KAnldMQU7igJ0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVsY28nfSA9ICdUZWxjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHU00nfSA9ICfigJ5HU03igJ0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gPSAnS2xpamVudHNrYSBhcGxpa2FjaWphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdQb3NyZWRuacSNa2kgcHJvZ3JhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICdTZXJ2ZXJza2EgYXBsaWthY2lqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdLbGlqZW50c2tpIE9TJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ1NlcnZlcnNraSBPUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAnQWRtaW5pc3RyYXRpdm5pIGFsYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnS29yaXNuacSNa2kgYWxhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ1VncmHEkWVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnUG9qZWRpbmHEjW5hIGxpY2VuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICdQbyBrb3Jpc25pa3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFByb2Nlc3Nvcid9ID0gJ1BvIHByb2Nlc29ydSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUG8gc2VydmVydSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ1BvIMSNdm9ydSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWb2x1bWUgTGljZW5jZSd9ID0gJ0tvbGnEjWluc2tlIGxpY2VuY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnS29tcGFuaWpza2EgbGljZW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ1JhenZvam5hIGxpY2VuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ0RlbW9uc3RyYWNpb25pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ1ZyZW1lbnNraSBvZ3JhbmnEjWVubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ0Jlc3BsYXRuaSAqKic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ090dm9yZW5pIGtvZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmxpbWl0ZWQnfSA9ICdOZW9ncmFuacSNZW5vJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIG9ubHkgd2l0aGluIHRoZSBzYW1lIENvbmZpZ0l0ZW0gY2xhc3MgKFwnY2xhc3NcJykgb3IgZ2xvYmFsbHkgKFwnZ2xvYmFsXCcpLCB3aGljaCBtZWFucyBldmVyeSBleGlzdGluZyBDb25maWdJdGVtIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuJ30gPQogICAgICAgICdQcm92ZXJhIGplZGluc3R2ZW5vZyBpbWVuYSBzYW1vIHUgb2t2aXJ1IGlzdGUga2xhc2Uga29uZmlndXJhY2lvbmloIHN0YXZraSAo4oCea2xhc2HigJ0pIGlsaSBnbG9iYWxubyAo4oCeZ2xvYmFsbm/igJ0pLCDFoXRvIHpuYcSNaSBkYSBqZSBzdmFrYSBwb3N0b2plxIdhIEtvbmZpZ3VyYWNpb25hIHN0YXZrYSB1emV0YSB1IG9iemlyIHUgcHJvdmVyaSBkdXBsaWthdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ0tvbmZpZ3VyYWNpb25lIHN0YXZrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnRG9kYXZhbmplIGtvbmZpZ3VyYWNpb25lIHN0YXZrZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICdVcmXEkWl2YW5qZSBrb25maWd1cmFjaW9uZSBzdGF2a2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb2R1bCBkb2dhxJFhamEga29uZmlndXJhY2lvbmloIHN0YXZraSBrb2ppIG9tb2d1xIdhdmEgYmVsZcW+ZW5qZSB1IGlzdG9yaWphdCB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJ0lzdG9yaWphdCBrb25maWd1cmFjaW9uZSBzdGF2a2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJ8WgdGFtcGEga29uZmlndXJhY2lvbmUgc3RhdmtlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnRGV0YWxqbmkgcHJpa2F6IGtvbmZpZ3VyYWNpbmUgc3RhdmtlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnQ29uZmlnSXRlbU51bWJlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICdPZ3JhbmnEjWVuamUga29uZmlndXJhY2lvbmUgc3RhdmtlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICdPZ3JhbmnEjWVuamUga29uZmlndXJhY2lvbmloIHN0YXZraSBwbyBzdHJhbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICdCYXphIHBvZGF0YWthIHVwcmF2bGphbmphIGtvbmZpZ3VyYWNpam9tLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnTW9kdWwgbWFzb3ZuZSBha2NpamUgbmEga29uZmlndXJhY2lvbmltIHN0YXZrYW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdLb25maWd1cmFjaW9uYSBzdGF2a2EgcHJldHJhxb51amUgcG96YWRpbnNraSBydXRlciB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAnS3JlaXJhbmplIGkgdXByYXZsamFuamUgZGVmaW5pY2lqYSB6YSBrb25maWd1cmFjaW9uZSBzdGF2a2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICdEZWZpbmnFoWUgQWtjaWplIGdkZSBqZSBkdWdtZSBwb3N0YXZraSBkb3N0dXBubyB1IHBvdmV6YW5vbSBncmFmacSNa29tIGVsZW1lbnR1IG9iamVrdGEgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gTW9saW1vIGRhIGltYXRlIG5hIHVtdSBkYSBvdmUgQWtjaWplIG1vcmFqdSBkYSBidWR1IHJlZ2lzdHJvdmFuZSB1IHNsZWRlxIdpbSBKUyBpIENTUyBkYXRvdGVrYW1hOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBpIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJ0RlZmluaXNhbGplIGdydXBlIHNhIHByYXZpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmnFoWUgbmVvcGhvZG5lIGRvenZvbGUgemEga3JlaXJhbmplIElUU00ga29uZmlndXJhY2lvbmloIHN0YXZraSBrb3JpxaHEh2VuamVtIG9wxaF0ZWcgaW50ZXJmZWpzYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb3RyZWJuZSBkb3p2b2xlIHphIGJyaXNhbmplIOKAnklUU03igJ0ga29uZmlndXJhY2lvbmloIHN0YXZraSBrcm96IG9wxaF0aSBpbnRlcmZlanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZ2V0IElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmnFoWUgbmVvcGhvZG5lIGRvenZvbGUgemEgZG9iaWphbmplIElUU00ga29uZmlndXJhY2lvbmloIHN0YXZraSBrb3JpxaHEh2VuamVtIG9wxaF0ZWcgaW50ZXJmZWpzYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBzZWFyY2ggSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBuZW9waG9kbmUgZG96dm9sZSB6YSBwcmV0cmFndSBJVFNNIGtvbmZpZ3VyYWNpb25paCBzdGF2a2kga29yacWhxIdlbmplbSBvcMWhdGVnIGludGVyZmVqc2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmnFoWUgbmVvcGhvZG5lIGRvenZvbGUgemEgYcW+dXJpcmFuamUgSVRTTSBrb25maWd1cmFjaW9uaWggc3RhdmtpIGtvcmnFocSHZW5qZW0gb3DFoXRlZyBpbnRlcmZlanNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICdEZWZpbmnFoWUgbW9kdWwgcHJlZ2xlZGEgemEgbWFsaSBwcmlrYXogbGlzdGUga29uZmlndXJhY2lvbmloIHN0YXZraS4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICdPZHJlxJF1amUgcmVndWxhcm5lIGl6cmF6ZSB6YSBzdmFrdSBrbGFzdSBrb25maWd1cmFjaW9uZSBzdGF2a2UgcmFkaSBwcm92ZXJlIG5heml2YSBrb25maWd1cmFjaW9uZSBzdGF2a2UgaSBwcmlrYXphIHByaXBhZGFqdcSHaWggcG9ydWthIG8gZ3JlxaFrYW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnT2RyZcSRdWplIHBvZHJhenVtZXZhbmkgcG9kb2JqZWthdCBrbGFzZSDigJ5JVFNNIEtvbmZpZ3VyYWNpb25hIHN0YXZrYeKAnS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIGJyb2ogcmVkb3ZhIHphIGVkaXRvciBkZWZpbmljaWplIEtTIHUgYWRtaW5pc3RyYXRpdm5vbSBpbnRlcmZlanN1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICdPZHJlxJF1amUgcmVkb3NsZWQgaW5jaWRlbnRuaWggc3RhbmphIG9kIHZpc29rb2cgKG5wciBrcml0acSNbm8pIGRvIG5pc2tvZyAobnByIGZ1bmtjaW9uYWxubykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnT2RyZcSRdWplIHJlbGV2YW50bmEgc3RhbmphIHJhc3BvcmXEkWl2YW5qYSBnZGUgcG92ZXphbmkgdGlrZXRpIG1vZ3UgZGEgdXRpxI11IG5hIHN0YXR1cyBLUy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmnFoWUgZ3JhbmljdSBwcmV0cmFnZSB6YSBla3JhbiBBZ2VudElUU01Db25maWdJdGVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBncmFuaWN1IHByZXRyYWdlIHphIGVrcmFuIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwcmlrYXphbmUga29sb25lIHUgcHJlZ2xlZHUga29uZmlndXJhY2lvbmloIHN0YXZraS4gT3ZhIG9wY2lqZSBuZW1hIHV0aWNhaiBuYSBwb3ppY2lqZSBrb2xvbmEuIE5hcG9tZW5hOiBBa28gamUgaXphYnJhbiBmaWx0ZXIg4oCeU3Zl4oCdIGtsYXNhIGtvbG9uZSBqZSB1dmVrIGRvc3R1cG5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdEZWZpbmnFoWUgcHJpa2F6YW5lIGtvbG9uZSB1IHByZXRyYXppIGtvbmZpZ3VyYWNpb25paCBzdGF2a2kuIE92YSBvcGNpamUgbmVtYSB1dGljYWogbmEgcG96aWNpamUga29sb25hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICdEZWZpbmnFoWUgcHJpa2F6YW5lIGtvbG9uZSBrb25maWd1cmFjaW9uaWggc3RhdmtpIHUgcHJlZ2xlZHUgdSB6YXZpc25vc3RpIG9kIGtsYXNlLiBTdmFraSB1bm9zIG1vcmEgc2FkcsW+YXRpIHByZWZpa3Mgc2EgbmF6aXZvbSBrbGFzZSBpIGR2b3RhxI1rb20gKG5wci4gQ29tcHV0ZXI6OikuIFBvc3RvamkgcGFyIGF0cmlidXRhIGtvamkgc3UgemFqZWRuacSNa2kgemEgc3ZlIGtsYXNlIChucHIuIHphIGtsYXN1IENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBaYSBwcmlrYXogcG9qZWRpbmHEjW5paCBhdHJpYnV0YSBpeiBkZWZpbmljaWplLCBtb3JhdGUga29yaXN0aXRpIHNsZWRlxId1IMWhZW11IChwcmltZXIgemEga2xhc3UgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gVWtvbGlrbyBuZSBwb3N0b2ppIHVub3MgemEgcG9qZWRpbmHEjW51IGtsYXN1LCBiacSHZSBwcmlrYXphbmUgcG9kcmF6dW1ldmFuZSBrb2xvbmUgZGVmaW5pc2FuZSB1IElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHByaWthemFuZSBrb2xvbmUga29uZmlndXJhY2lvbmloIHN0YXZraSB1IHByZXRyYXppIHUgemF2aXNub3N0aSBvZCBrbGFzZS4gU3Zha2kgdW5vcyBtb3JhIHNhZHLFvmF0aSBwcmVmaWtzIHNhIG5heml2b20ga2xhc2UgaSBkdm90YcSNa29tIChucHIuIENvbXB1dGVyOjopLiBQb3N0b2ppIHBhciBhdHJpYnV0YSBrb2ppIHN1IHphamVkbmnEjWtpIHphIHN2ZSBrbGFzZSAobnByLiB6YSBrbGFzdSBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gWmEgcHJpa2F6IHBvamVkaW5hxI1uaWggYXRyaWJ1dGEgaXogZGVmaW5pY2lqZSwgbW9yYXRlIGtvcmlzdGl0aSBzbGVkZcSHdSDFoWVtdSAocHJpbWVyIHphIGtsYXN1IENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIFVrb2xpa28gbmUgcG9zdG9qaSB1bm9zIHphIHBvamVkaW5hxI1udSBrbGFzdSwgYmnEh2UgcHJpa2F6YW5lIHBvZHJhenVtZXZhbmUga29sb25lIGRlZmluaXNhbmUgdSBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBwcmlrYXphbmUga29sb25lIGtvbmZpZ3VyYWNpb25paCBzdGF2a2kgdSB0YWJlbGkgdmV6YSB1IHphdmlzbm9zdGkgb2Qga2xhc2UuIFN2YWtpIHVub3MgbW9yYSBzYWRyxb5hdGkgcHJlZmlrcyBzYSBuYXppdm9tIGtsYXNlIGkgZHZvdGHEjWtvbSAobnByLiBDb21wdXRlcjo6KS4gUG9zdG9qaSBwYXIgYXRyaWJ1dGEga29qaSBzdSB6YWplZG5pxI1raSB6YSBzdmUga2xhc2UgKG5wci4gemEga2xhc3UgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFphIHByaWtheiBwb2plZGluYcSNbmloIGF0cmlidXRhIGl6IGRlZmluaWNpamUsIG1vcmF0ZSBrb3Jpc3RpdGkgc2xlZGXEh3UgxaFlbXUgKHByaW1lciB6YSBrbGFzdSBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBVa29saWtvIG5lIHBvc3RvamkgdW5vcyB6YSBwb2plZGluYcSNbnUga2xhc3UsIGJpxIdlIHByaWthemFuZSBwb2RyYXp1bWV2YW5lIGtvbG9uZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnT2RyZcSRdWplIGtvamkgdGlwIHZlemUgKGdsZWRhbm8gaXogcGVyc3Bla3RpdmUgdGlrZXRhKSBtb8W+ZSBkYSB1dGnEjWUgbmEgcG92ZXphbnUgS1MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnT2RyZcSRdWplIGtvamkgdGlwIHRpa2V0YSBtb8W+ZSBkYSB1dGnEjWUgbmEgc3RhdHVzIHBvdmV6YW5lIEtTLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnQnJpc2FuamUga29uZmlndXJhY2lvbmUgc3RhdmtlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICdCb2phIHN0YXR1c2EgcmFzcG9yZcSRaXZhbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnQm9qYSBzdGF0dXNhIHJhc3BvcmXEkWl2YW5qYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJ1RpcCBzdGF0dXNhIHJhc3BvcmXEkWl2YW5qYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICdPbmVtb2d1xIdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICdEdXBsaWthdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnT21vZ3XEh2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ09tb2d1xIdhdmEgbWFzb3ZudSBha2NpanUgbmEga29uZmlndXJhY2lvbmltIHN0YXZrYW1hIHUgcHJpc3R1cG5vbSBzaXN0ZW11IG9wZXJhdGVyYSBuYSB2acWhZSBvZCBqZWRuZSBzdGF2a2UgaXN0b3ZyZW1lbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICdBa3RpdmlyYSBzdm9qc3R2byBtYXNvdm5lIGFrY2lqZSBuYSBrb25maWdpcmFjaW9uaW0gc3RhdmthbWEgc2FtbyB6YSBpemxpc3RhbmUgZ3J1cGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICdBa3RpdmlyYS9kZWFrdGl2aXJhIGZ1bmtjaWp1IHphIHByb3ZlcnUgamVkaW5zdHZlbm9zdGkgaW1hbmEga29uZmlndXJhY2lvbmloIHN0YXZraS4gUHJlIGFrdGl2aXJhbmphIG92ZSBvcGNpamUgdHJlYmF0ZSBwcm92ZXJpdGkgdSB2YcWhZW0gc2lzdGVtdSBwb3N0b2phbmplIGR1cGxpa2F0YSBuYSBwb3N0b2plxIdpbSBzdGF2a2FtYS4gVG8gbW/FvmV0ZSB1cmFkaXRpIHBvbW/Eh3Ugc2tyaXB0YSDigJ5iaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBs4oCdLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAnTW9kdWwgZG9nYcSRYWphIHphIHBvZGXFoWF2YW5qZSBzdGF0dXNhIGtvbmZpZ3VyYWNpb25paCBzdGF2a2kgcHJpbGlrb20gcG9zdGF2bGphbmphIHZlemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gY29uZmlnIGl0ZW0gb3ZlcnZpZXcuJ30gPSAnUHJlZ2xlZCDigJ5JVFNN4oCdIGtvbmZpZ3VyYWNpb25lIHN0YXZrZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICdNb2R1bCB6YSBwcm92ZXJ1IGdydXBlIG9kZ292b3JuZSB6YSBrbGFzdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICdNb2R1bCB6YSBwcm92ZXJ1IGdydXBlIG9kZ292b3JuZSB6YSBrb25maWd1cmFjaW9udSBzdGF2a3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAnTW9kdWwgemEgZ2VuZXJpc2FuamUgc3RhdGlzdGlrZSDigJ5JVFNN4oCdIGtvbmZpZ3VyYWNpb25paCBzdGF2a2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ1JlZ2lzdHJhY2lqZSDigJ5iYWNrZW5k4oCdIG1vZHVsYSBvYmpla3RhIHphIHV2b3ovaXp2b3ogbW9kdWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ1ByZWdsZWQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHphIGJvamUgc3RhdHVzYSBwcmltZW5lIG5hIHByaWthenUgcG9zdGF2a2kgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQYXJhbWV0cmkgemEgc3RhdHVzZSBwcmltZW5lIG5hIHByaWthenUgcG9zdGF2a2kgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHphIGF0cmlidXRlIHV6b3JrYSBncnVwZSB6YSBkb3p2b2xlIG9wxaF0ZWcga2F0YWxvZ2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHphIHN0cmFuaWNlIChuYSBrb2ppbWEgc3Uga29uZmlndXJhY2lvbmUgc3RhdmtlIHByaWthemFuZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQb3RyZWJuZSBkb3p2b2xlIHphIHVwb3RyZWJ1IGVrcmFuYSBJVFNNIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvdHJlYm5lIGRvenZvbGUgemEgdXBvdHJlYnUgZWtyYW5hIHByZXRyYWdlIElUU00ga29uZmlndXJhY2lvbmUgc3RhdmtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvdHJlYm5lIGRvenZvbGUgemEgdXBvdHJlYnUgZWtyYW5hIGRldGFsbm9nIHByaWthemEgSVRTTSBrb25maWd1cmFjaW9uZSBzdGF2a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQb3RyZWJuZSBkb3p2b2xlIHphIHVwb3RyZWJ1IGVrcmFuYSBkb2RhdmFuamEgSVRTTSBrb25maWd1cmFjaW9uZSBzdGF2a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG90cmVibmUgZG96dm9sZSB6YSB1cG90cmVidSBla3JhbmEgaXptZW5lIElUU00ga29uZmlndXJhY2lvbmUgc3RhdmtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgaGlzdG9yeSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvdHJlYm5lIGRvenZvbGUgemEgdXBvdHJlYnUgZWtyYW5hIGlzdG9yaWphdGEgSVRTTSBrb25maWd1cmFjaW9uZSBzdGF2a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvdHJlYm5lIGRvenZvbGUgemEgdXBvdHJlYnUgZWtyYW5hIMWhdGFtcGUgSVRTTSBrb25maWd1cmFjaW9uZSBzdGF2a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBkZWxldGUgY29uZmlnIGl0ZW1zLid9ID0gJ1BvdHJlYm5hIHByYXZhIHphIGJyaXNhbmplIGtvbmZpZ3VyYWNpb25lIHN0YXZrZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICdQcmV0cmFnYSBrb25maWd1cmFjaW9uaWggc3RhdmtpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3RzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuICJBdXRvSW5jcmVtZW50IiBpbmNyZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlELkNvbmZpZ0l0ZW1DbGFzc0lELkNvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJ30gPQogICAgICAgICdCaXJhIG1vZHVsIG9wZXJhdG9yYSBhdXRvbWF0c2tvZyB1dmXEh2FuamEga29uZmlndXJhY2lvbmUgc3RhdmtlLiBPcGVyYXRvciBhdXRvbWF0c2tvZyB1dmXEh2FuamEgcG92ZcSHYXZhIGJyb2ogc3RhdmtlLCBzaXN0ZW1za2kgSUQsIElEIGtvbmZpZ3VyYWNpb25lIGtsYXNlIGkga29yacWhdGVuaSBicm9qYcSNLiBGb3JtYXQgamUg4oCeU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlcuKAnSwgbnByIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgYSBDSSBhdXRvbWF0aWNhbGx5IHdoZW4gYSBUaWNrZXQgaXMgTGlua2VkIHRvIGEgQ0kuJ30gPQogICAgICAgICdQb3N0YXZsamEgc3RhbmplIGluY2lkZW50YSBrb25maWd1cmFjaW9uZSBzdGF2a2Uga2FkYSBqZSB0aWtldCBwb3ZlemFuIHNhIHN0YXZrb20uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHN0YXR1cyBwcmltZW5lIG5hIGVrcmFudSBtYXNvdm5lIGFrY2lqZSBrb25maWd1cmFjaW9uZSBzdGF2a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgaW5jaWRlbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHN0YXR1cyBpbmNpZGVudGEgbmEgZWtyYW51IG1hc292bmUgYWtjaWplIGtvbmZpZ3VyYWNpb25lIHN0YXZrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1UgbWVuaWp1IHByaWthenVqZSB2ZXp1IGtvamEgb21vZ3XEh2F2YSBwb3Zleml2YW5qZSBrb25maWd1cmFjaW9uZSBzdGF2a2Ugc2EgZHJ1Z2ltIG9iamVrdG9tIG5hIGRldGFsam5vbSBwcmlrYXp1IGtvbmZpZ3VyYWNpamUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcmlzdHVwIGlzdG9yaWphdHUga29uZmlndXJhY2lvbmUgc3RhdmtlIG5hIHByZWdsZWR1IGtvbmZpZ3VyYWNpb25lIHN0YXZrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcmlzdHVwIGlzdG9yaWphdHUga29uZmlndXJhY2lvbmUgc3RhdmtlIG5hIGRldGFsam5vbSBwcmlrYXp1IHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkZWxldGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVSBtZW5panUgcHJpa2F6dWplIHZlenUgemEgYnJpc2FuamUga29uZmlndXJhY2lvbmUgc3RhdmtlIG5hIG5qZW5vbSBkZXRhbGpub20gcHJpa2F6dSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1UgbWVuaWp1IHByaWthenVqZSB2ZXp1IHphIHVtbm/FvmF2YW5qZSBrb25maWd1cmFjaW9uZSBzdGF2a2UgbmEgcHJlZ2xlZHUga29uZmlndXJhY2lvbmUgc3RhdmtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBkdXBsaWNhdGUgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1UgbWVuaWp1IHByaWthenVqZSB2ZXp1IHphIHVtbm/FvmF2YW5qZSBrb25maWd1cmFjaW9uZSBzdGF2a2UgbmEgbmplbm9tIGRldGFsam5vbSBwcmlrYXp1IHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBpem1lbnUga29uZmlndXJhY2lvbmUgc3RhdmtlIG5hIG5qZW5vbSBkZXRhbGpub20gcHJpa2F6dSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVSBtZW5panUgcHJpa2F6dWplIHZlenUgemEgcG92cmF0YWsgbmEgZGV0YWxqbmkgcHJpa2F6IGtvbmZpZ3VyYWNpb25lIHN0YXZrZSAgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSDFoXRhbXB1IGtvbmZpZ3VyYWNpb25lIHN0YXZrZSBuYSBuamVub20gZGV0YWxqbm9tIHByaWthenUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBkZXRhbGpuaSBwcmlrYXoga29uZmlndXJhY2lvbmUgc3RhdmtlIG5hIHByZWdsZWR1IGtvbmZpZ3VyYWNpb25lIHN0YXZrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIGlzdG9yaWphdCBrb25maWd1cmFjaW9uZSBzdGF2a2UgKG9icm51dCByZWRvc2xlZCkgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLCBlLmcuIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jLiBUaGUgZGVmYXVsdCBpcyBDb25maWdJdGVtIy4nfSA9CiAgICAgICAgJ0lkZW50aWZpa2F0b3IgemEga29uZmlndXJhY2lvbnUgc3Rhdmt1LCBucHIgS29uZmlndXJhY2lvbmFTdGF2a2EjLCBNb2phS29uZmlndXJhY2lvbmFTdGF2a2EjLiBQb2RyYXp1bWV2YW5vIGplIEtvbmZpZ3VyYWNpb25hU3RhdmthIy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICdrbGFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICdnbG9iYWxubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwb3N0cHJvZHVjdGl2ZSd9ID0gJ3Bvc3QtcHJvZHVrY2lqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmVwcm9kdWN0aXZlJ30gPSAncHJlLXByb2R1a2NpamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJ3Byb2R1a2NpamEnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN2X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdIYW50ZXJpbmcgYXYga29uZmlndXJhdGlvbnNlbmhldGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnw4RuZHJhIGtsYXNzZGVmaW5pdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBDbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uJ30gPSAnRGVmaW5pdGlvbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdLb25maWd1cmF0aW9uc2VuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgQ2xhc3Nlcyd9ID0gJ0ZpbHRyZXJhIGtsYXNzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAnVsOkbGogZW4ga2xhc3MgZnLDpW4gbGlzdGFuIGbDtnIgYXR0IHNrYXBhIGVuIG55IGtvbmZpZ3VyYXRpb25zZW5oZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdLbGFzcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnRHJpZnRsw6RnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJ0luY2lkZW50bMOkZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byBhbm90aGVyJ30gPSAnTMOkbmthIHRpbGwgYW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBjb25maWcgaXRlbT8nfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnTmFtbmV0IHDDpSBkZW5uYSBrb25maWd1cmF0aW9uc2VuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICdOYW1uZXQgYW52w6RuZHMgcmVkYW4gaSBrb25maWd1cmF0aW9uc2VuaGV0ZXIgbWVkIGbDtnJsamFuZGUgbnVtbWVyOiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnRHJpZnRsw6RnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBTdGF0ZSd9ID0gJ0luY2lkZW50bMOkZ2UnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAnQW5wYXNzYSB2eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICdLb25maWd1cmF0aW9uc2VuaGV0ZXIgcGVyIHNpZGEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAnRHJpZnRsw6RnZXN0eXBlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gPSAnTnV2YXJhbmRlIGluY2lkZW50bMOkZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnTnV2YXJhbmRlIHR5cCBhdiBpbmNpZGVudGzDpGdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1NlbmFzdCDDpG5kcmFkJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAnU2thcGEgbnkgbWFsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAnVXRmw7ZyIHPDtmtuaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1PDtmsgw6R2ZW4gaSB0aWRpZ2FyZSB2ZXJzaW9uZXI/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtWm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnS29uZmlndXJhdGlvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hdGlvbiBvbSBrb25maWd1cmF0aW9uc2VuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ051dmFyYW5kZSBkcmlmdGzDpGdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ1NlbmFzdCDDpG5kcmFkIGF2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ1Zpc2EgZW4gdmVyc2lvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ1Zpc2EgYWxsYSB2ZXJzaW9uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSd9ID0gJ0luY2lkZW50bMOkZ2UgZsO2ciB2ZXJzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJ1ZlcnNpb25zbnVtbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICdWZXJzaW9uc2luZm9ybWF0aW9uIGbDtnIga29uZmlndXJhdGlvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ0VnZW5za2FwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnS29uZmlndXJhdGlvbnNlbmhldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcmludGVkIGJ5ICVzIGF0ICVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENsYXNzSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFJlc3VsdCEnfSA9ICdJbmdldCByZXN1bHRhdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gU2VhcmNoIFJlc3VsdHMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRHJpZnRsw6RnZSBmw7ZyIGtvbmZpZ3VyYXRpb25zZW5oZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdJbmNpZGVudGzDpGdlIGbDtnIga29uZmlndXJhdGlvbnNlbmhldCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYXggYW50YWwgYXYgZXR0IGVsZW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnVG9tbWEgZsOkbHQgYW5nZXIgYXR0IHRpZGlnYXJlIHbDpHJkZW4gc2thIGFudsOkbmRhcy4nOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbCd9ID0gJ01vZGVsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJpYWwgTnVtYmVyJ30gPSAnU2VyaWVudW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JBTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdIw6VyZGRpc2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdLYXBhY2l0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAnTsOkdHZlcmtza29ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCDDtnZlciBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdJUC1hZHJlc3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAnR3JhZmlra29ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBFcXVpcG1lbnQnfSA9ICdBbm5hbiB1dHJ1c3RuaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ1Npc3RhIGRhZyBmw7ZyIGdhcmFudGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnSW5zdGFsbGF0aW9uc2RhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICdUZWxlZm9uIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1RlbGVmb24gMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0FkcmVzcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdOw6R0dmVya3NhZHJlc3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VibmV0IE1hc2snfSA9ICdTdWJuw6R0bWFzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAnR2F0ZXdheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIFR5cGUnfSA9ICdMaWNlbnN0eXBlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ0xpY2Vuc255Y2tlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ03DpG5nZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdMw7ZwZXIgdXQgZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICdNZWRpYSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJ0zDtnB0IHV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01haW50ZW5hbmNlJ30gPSAnVW5kZXJow6VsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ1BpbG90JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdQbGFubGFnZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdSZXBlcmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldGlyZWQnfSA9ICdQZW5zaW9uZXJhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICfDlnZlcnN5bic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAnVGVzdC9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdMYXB0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ0Rlc2t0b3AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ0FubmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICdNb25pdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW50ZXInfSA9ICdTa3JpdmFyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICdTd2l0Y2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAnUm91dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiBBY2Nlc3NwdW5rdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWN1cml0eSBEZXZpY2UnfSA9ICdTw6RrZXJoZXRzdXRydXN0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnQmFja3VwZW5oZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdNdXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICdUYW5nZW50Ym9yZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICdLYW1lcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAnQmVhbWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAnTW9kZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUENNQ0lBIENhcmQnfSA9ICdQQ01DSUEta29ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnVVNCLWVuaGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJ0RvY2tuaW5nc3N0YXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ1NjYW5uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVpbGRpbmcnfSA9ICdCeWdnbmFkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAnVsOlbmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAnUnVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICdSYWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtwbGFjZSd9ID0gJ0FyYmV0c3BsYXRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ1bDpGdna29udGFrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lULWJ5Z2duYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTEFOJ30gPSAnTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4nfSA9ICdXTEFOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAnVGVsY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR1NNJ30gPSAnR1NNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBBcHBsaWNhdGlvbid9ID0gJ0tsaWVudGFwcGxpa2F0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pZGRsZXdhcmUnfSA9ICdNaWRkbGV3YXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBBcHBsaWNhdGlvbid9ID0gJ1NlcnZlcmFwcGxpa2F0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBPUyd9ID0gJ0tsaWVudC1PUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdTZXJ2ZXItT1MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gVG9vbCd9ID0gJ0FkbWluaXN0cmF0aW9uc3Zlcmt0eWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnQW52w6RuZGFydmVya3R5Zyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ0VtYmVkZGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpbmdsZSBMaWNlbmNlJ30gPSAnRW5zdGFrYSBsaWNlbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIFVzZXInfSA9ICdQZXIgYW52w6RuZGFyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnUGVyIHByb2Nlc3Nvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnUGVyIHNlcnZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgTm9kZSd9ID0gJ1BlciBub2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICdWb2x5bWxpY2Vucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbnRlcnByaXNlIExpY2VuY2UnfSA9ICdFbnRlcnByaXNlbGljZW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAnVXR2ZWNrbGFybGljZW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICdEZW1vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgUmVzdHJpY3RlZCd9ID0gJ1RpZHNiZWdyw6Ruc2FkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnRnJlZXdhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBTb3VyY2UnfSA9ICfDlnBwZW4ga8OkbGxrb2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5saW1pdGVkJ30gPSAnT2JlZ3LDpG5zYWQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMnfSA9ICdLb25maWd1cmF0aW9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gYWRkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBlZGl0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBldmVudCBtb2R1bGUgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gaGlzdG9yeSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSB6b29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtTnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJ0JlZ3LDpG5zbmluZyBrb25maWd1cmF0aW9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBkZWZpbml0aW9ucyBmb3IgQ29uZmlndXJhdGlvbiBJdGVtcy4nfSA9ICdTa2FwYSBvY2ggaGFudGVyYSBkZWZpbml0aW9uZXIgZsO2ciBrb25maWd1cmF0aW9uc2VuaGV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gY3JlYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBkZWxldGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1cGRhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0FuZ2VyIGFudGFsIHJhZGVyIGbDtnIgS0UtZWRpdG9ybiBpIGFkbWluZ3LDpG5zc25pdHRldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICdJbmFrdGl2ZXJhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJ0FrdGl2ZXJhZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZ2VuZXJhdGUgSVRTTSBjb25maWcgaXRlbSBzdGF0aXN0aWNzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyYXIgZsO2ciBleGVtcGVsIHDDpSBiZWjDtnJpZ2hldHNlZ3J1cHBlciBpIGdydW5ka2F0YWxvZ2VucyBhdHRyaWJ1dC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN3X0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdVc2FuaWRpIHdhIHVzaW1hbWl6aSB3YSBraXBlbmdlbGUgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBjbGFzcyBkZWZpbml0aW9uJ30gPSAnQmFkaWxpIHVmYWZhbnV6aSB3YSB0YWJha2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ1VmYWZhbnV6aSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdVc2FuaWRpIHdhIEtpcGVuZ2VsZSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAnQ2h1amEga3dhIGFqaWxpIHlhIG1hdGFiYWthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ0NoYWd1YSB0YWJha2Ega3V0b2thIGt3ZW55ZSBvcm9kaGEgeWEga3V0ZW5nZW5lemEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGtpcHlhLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdUYWJha2EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENvbmZpZ0l0ZW0gQnVsayBBY3Rpb24nfSA9ICdWaXRlbmRvIHZ5YSB3aW5naSB2eWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgc3RhdGUnfSA9ICdIYWxpIHlhIGt1dHVtaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgc3RhdGUnfSA9ICdIYWxpIHlhIHR1a2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJ1VuZ2FuaXNoYSBuYSBueWluZ2luZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnTmFtYmEgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIG4gYmF0aWxpISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbnVtYmVyIG9mIGFub3RoZXIgQ29uZmlndXJhdGlvbiBJdGVtIHRvIGxpbmsgd2l0aC4nfSA9ICdOYW1iYSB5YSBraXBlbmdlbGUga2luZ2luZSBjaGEgdXNhbmlkaSBjaGEga3V1bmdhbmlzaGEgbmFjaG8uJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0ppbmEgbGEgaGlraSBraXBlbmdlbGUgY2hhIHVzYW5pZGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJ0ppbmEgaGlsaSB0YXlhcmkgbGltZWt3aXNoYSB0dW1pa2FuYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgY2hlbnllIG5hbWJhIGkoeilmdWF0YXpvOiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAnSGFsaSB5YSBrdXR1bWlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAnSGFsaSB5YSB0dWtpbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdNaXBhbmdpbGlvIHlhIG11a3RhZGhhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ1ZpcGVuZ2VsZSB2eWEgdXNhbmlkaSBrd2Ega2lsYSB1a3VydXNhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZSd9ID0gJ0FpbmEgeWEgaGFsaSB5YSBrdXR1bWlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICdIYWxpIHlhIHR1a2lvIGxhIHNhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAnQWluYSB5YSBoYWxpIHlhIHR1a2lvIGxhIHNhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAnTXdpc2hvIGt1YmFkaWxpc2h3YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ1RlbmdlbmV6YSBraW9sZXpvIGtpcHlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICdUYWZ1dGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnUGlhIHRhZnV0YSBrYXRpa2EgdG9sZW8gbGlsaWxvcGl0YT8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICdLaXBlbmdlbGUgY2hhIFVzYW5pZGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAnVGFhcmlmYSB6YSBraXBlbmdlbGUgY2hhIHVzYW5pZGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAnSGFsaSB5YSBrdXR1bWlhIHlhIHNhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkIGJ5J30gPSAnTXdpc2hvIGt1YmFkaWxpc2h3YSBuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ1Nhd2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ09ueWVzaGEgdG9sZW8gbW9qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ09ueWVzaGEgbWF0b2xlbyB5b3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICdUb2xlbyBsYSBoYWxpIHlhIHR1a2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJ0hhbGkgeWEgdG9sZW8gbGEga3V0dW1pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJ05hbWJhIHlhIHRvbGVvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICdUb2xlbyBsYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga3dhIHVuZGFuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICdNYWxpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgdG8gQ2xhc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENvbmZpZ0l0ZW0nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NJSGlzdG9yeTo6J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWdJdGVtJ30gPSAnS2lwZW5nZWxlIGNoYSB1c2FuaWRpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByaW50ZWQgYnkgJXMgYXQgJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgQ2xhc3NJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUmVzdWx0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdIYWxpIHlhIG1hdHVtaXppIHlhIGhpaSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnSGFsaSB5YSB0dWtpbyB5YSBoaWtpIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdLaW1hIGNoYSBqdXUgY2hhIG5hbWJhIHlhIGVsZW1lbnRpIG1vamF3YXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ1VnYSB6aWxpem93YXppIHppbmFvbnllc2hhIGt3YW1iYSB0aGFtYW5pIHphIHNhc2EgemltZXdla3dhLic7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAnTWZhbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VyaWFsIE51bWJlcid9ID0gJ05hbWJhIHRhbWJ1bGlzaGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ1JhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICdEaXNraSBrdXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICdVd2V6byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICdBZGFwdGEgeWEgbXRhbmRhbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBvdmVyIERIQ1AnfSA9ICdJUCBrd2EgREhDUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnQW53YW5pIHlhIElQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyYXBoaWMgQWRhcHRlcid9ID0gJ0FkYXB0YSB5YSBNY2hvcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAnVmlmYWEgdmluZ2luZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICdUYXJlaGUgeWEga3Vpc2hhIGt3IGF1ZGhhbWluaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAnVGFyZWhlIHlhIGt1c2FraW5pc2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICdTaW11IHlhIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ1NpbXUgeWEgMic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFLU1haWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkcmVzcyd9ID0gJ0Fud2FuaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkZHJlc3MnfSA9ICdBbndhbmkgeWEgbXRhbmRhbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ1N1Ym5ldCBtYXNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICdLaWNoYW5nYW5pc2hpIG10YW5kYW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAnQWluYSB5YSBsZXNlbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBLZXknfSA9ICdOZW5vIGt1dSBsYSBsZXNlbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVhbnRpdHknfSA9ICdXaW5naSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICdUYXJlaGUgeWEgbXdpc2hvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lZGlhJ30gPSAnTWlkaWEnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnTXRhbmRhbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2Z0d2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmVkJ30gPSAnSW1laXNoYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ01hdGVuZ2VuZXpvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BpbG90J30gPSAnS3dhbnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQnfSA9ICdJbGl5b3Bhbmd3YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICdSZWtlYmlzaGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ1N0YWFmdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICdNYXBpdGlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rlc3QvUUEnfSA9ICdKYXJpYmlvLyBNYXN3YWxpIG5hIE1hamlidSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICdLb21weXV0YSB5YSBta29ub25pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rlc2t0b3AnfSA9ICdFbmVvIGthemknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUERBJ30gPSAnUERBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlcid9ID0gJ1NldmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdFbmdpbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9uaXRvcid9ID0gJ01vbml0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmludGVyJ30gPSAnS2ljaGFwaXNoaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICdTd2ljaGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAnS2lwYW5nYSBuamlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnS2l1bmdvIHVmaWtpdnUgY2hhIFdMQU4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAnS2lmYWEgY2hhIHVsaW56aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrdXAgRGV2aWNlJ30gPSAnS2lmYWEgY2hhIGNoZWxlem8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICdLaXBhbnlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tleWJvYXJkJ30gPSAnQm9hYm9ueWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAnS2FtZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ1Byb2plY3Rvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ01vZGVtdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ0thZGkgeWEgUENNQ0lBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VTQiBEZXZpY2UnfSA9ICdLaWZhYSBjaGEgVVNCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvY2tpbmcgU3RhdGlvbid9ID0gJ0tpdHVvIGVnZXNoaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAnS2l0YW1iYXpvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAnSmVuZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmxvb3InfSA9ICdTYWthZnUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9vbSd9ID0gJ0NodW1iYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYWNrJ30gPSAnUmFjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICdFbmVvIGxhIGthemknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAnU2VoZW11IHlhIGt1dG9rZWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgRmFjaWxpdHknfSA9ICdQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICdQcm9ncmFtdS10dW1pemkgYSBtdGVqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWRkbGV3YXJlJ30gPSAnTWlkZGxld2FyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICdTZXZhIHlhIHByb2dyYW11LXR1bWl6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgT1MnfSA9ICdPUyB5YSBtdGVqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgT1MnfSA9ICdPUyB5YSBzZXZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIFRvb2wnfSA9ICdLaWZhYSBjaGEga2lvbmdvemknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlciBUb29sJ30gPSAnS2lmYWEgY2hhIG10dW1pYWppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtYmVkZGVkJ30gPSAnUGFraWNod2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2luZ2xlIExpY2VuY2UnfSA9ICdMZXNlbmkgbW9qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ0t3YSBtdHVtaWFqaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAnS3dhIGtpY2hha2F0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgU2VydmVyJ30gPSAnS3dhIHNldmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICdLd2EgZnVuZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICdMZXNlbmkgeWEgc2F1dGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAnTGVzZW5pIHlhIEVudGVycHJpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXZlbG9wZXIgTGljZW5jZSd9ID0gJ0xlc2VuaSB5YSBtdGVuZ2VuZXphamknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtbyd9ID0gJ09ueWVzaG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAnTXVkYSB1bWV6dWlsaXdhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAnUHJvZ3JhbXUgeWEgYnVyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ0NoYW56byBjaGEgd2F6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmxpbWl0ZWQnfSA9ICdIYWluYSBraWtvbW8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJ0FuZ2FsaWEgbWFqaW5hIHlhIGtpcGVrZWUgdHUga2F0aWthIHRhYmFrYSBzYXdhIGxhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSAoXCdUYWJha2FcJykgYXUgem90ZSAoXCdab3RlXCcpLCBhbWJheW8gaW5hbWFhbmlzaGEga2lsYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga2lsaWNob3BvIGtpbWVqdW11aXNod2Egd2FrYXRpIG5ha2FsYSBwYWNoYSB6aW5hYW5nYWxpd2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ1ZpcGVuZ2VsZSB2eWEgdXNhbmlkaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTYW5pZGkgbW9kdWxpIHlhIHR1a2lvIHlhIGtpcGVuZ2VsZSBhbWJhY2hvIGtpbmF3ZXplc2hhIGt1aW5naWEga2F0aWthIGhpc3RvcmlhIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnS2lrb21vIGNoYSBraXBlbmdlbGUgY2hhIHVzYW5pZGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIGxpbWl0IHBlciBwYWdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgRGF0YWJhc2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBidWxrIG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnS2lwYW5nYSBuamlhIGNoYSBtYXppbmdpcmEgeWEgbnl1bWEgY2hhIHV0YWZ1dGFqaSB3YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgY2hhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ1RlbmdlbmV6YSBuYSBzaW1hbWlhIHVmYWZhbnV6aSB3YSB2aXBlbmdlbGUgdnlhIHVzYW5pZGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBydWh1c2EgemluYXpvaGl0YWppa2Ega3V0ZW5nZW5lemEgdmlwZW5nZWxlIHZ5YSB1c2FuaWRpIHZ5YSBJVFNNIGt3YSBrdXR1bWlhIGtpb2xlc3VyYSBjaGEgamVuZXJpa2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgcnVodXNhIHppbmF6b2hpdGFqaWthIGt1cGF0YXZpcGVuZ2VsZSB2eWEgdXNhbmlkaSB2eWEgSVRTTSBrd2Ega3V0dW1pYSBraW9sZXN1cmEgY2hhIGplbmVyaWtpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBydWh1c2EgemluYXpvaGl0YWppa2Ega3V0YWZ1dGEgdmlwZW5nZWxlIHZ5YSB1c2FuaWRpIHZ5YSBJVFNNIGt3YSBrdXR1bWlhIGtpb2xlc3VyYSBjaGEgamVuZXJpa2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHJ1aHVzYSB6aW5hem9oaXRhamlrYSBrdXNhc2lzaGEgdmlwZW5nZWxlIHZ5YSB1c2FuaWRpIHZ5YSBJVFNNIGt3YSBrdXR1bWlhIGtpb2xlc3VyYSBjaGEgamVuZXJpa2kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjb25maWd1cmF0aW9uIGl0ZW0gbGlzdC4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgbW9kdWxpIHlhIG1hcGl0aW8ga3Vvbnllc2hhIG1hbmRoYXJpIG5kb2dvIHlhIG9yb2RoYSB5YSB2aXBlbmdlbGUgdnlhIHVzYW5pZGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHNlbWkgemEgbWFyYSBrd2EgbWFyYSBtb2phbW9qYSBrd2Ega2lsYSB0YWJha2EgbGEga2lwZW5nZWxlIGNoIHVzYW5pZGkga3VhbmdhbGlhIGppbmEgbGEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIG5hIGt1b255ZXNoYSB1anVtYmUgd2EgbWFrb3NhIHlhbmF5b2h1c2lhbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyBcJ0lUU01Db25maWdJdGVtXCcuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpcGVuZ2VsZSBjaGEgY2hhZ3VvIG1zaW5naSBjaGEgdGFiYWthIGxhIFwnS2lwZW5nZWxlY2hhIFVzYW5pZGkgY2hhIElUU01cJy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBuYW1iYSB5YSBzYWZ1IG1sYWxvIGt3YSBtaGFyaXJpIHdhIHVmYWZhbnV6aSB3YSBDSSBrYXRpa2Ega2lvbGVzdXJhIGNoYSBraW9uZ296aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICdJbmF3ZXplc2hhIHVwZW8gd2Ega3V0YWZ1dGEga3dhIHNrZXJpbmkgeWEgS2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBraWtvbW8gY2hhIGt1dGFmdXRhIGt3YSBza3JpbmkgeWEgS3V0YWZ1dGEgS2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNICBjaGEgV2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgc2FmdSB3aW1hIHpvdGUgemlsaXpvb255ZXNod2Ega2F0aWthIG1hcGl0aW8geWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpLiBIaWxpIGNoYWd1byBoYWxpbmEgbWFkaGFyYSBrYXRpa2EgbmFmYXNpIHlhIHNhZnV3aW1hLiBLaWRva2V6bzogVGFiYWthIGxhIHNhZnV3aW1hIGxpbmFwYXRpa2FuYSBtYXJhIHpvdGUga2FtYSBraWNodWppbyBcJ1Z5b3RlXCcgaXRhY2hhZ3VsaXdhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHNhZnUgd2ltYSB6aWxpem9vbnllc2h3YSBrYXRpa2EgdXRhZnV0YWppIHdhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaS4gQ2hhZ3VvIGhpbGkgaGFsaW5hIG1hZGhhcmEga2F0aWthIG5hZmFzaSB5YSBzYWZ1d2ltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBzYWZ1IHdpbWEgemEgQ0kgemlsaXpvb255ZXNod2Ega2F0aWthIG1hcGl0aW8geWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGt1dGVnZW1lYW5hIG5hIHRhYmFrYSBsYSBDSS4gS2lsYSBpbmdpem8gbGF6aW1hIGxpd2UgbmEga2lhbWJpc2hpIGF3YWxpIGppbmEgbGEgdGFiYWthIG5hIDo6ICggbWZhbm8gVGFyYWtpbGlzaGk6OilLdW5hIHZpdW1iaSB2aWNoYWNoZSB2eWEgQ0kgYW1iYXZ5byB2aXBvIGt3YSBDSSB6b3RlIChtZmFubyBrd2VueWUgdGFiYWthIGxhIHRhcmFraWxpc2hpOiB0YXJha2lsaXNoaTo6amluYSwgVGFyYWtpbGlzaGk6OkhhbGkgeWFDdXJEZXAsIFRhcmFraWxpc2hpOjpNdWRhIHdhIGt1dGVuZ2VuZXphKS4gS3Vvbnllc2hhIGtpdW1iaSBjaGEgQ0kga2ltb2phIGtpbW9qYSBrYW1hIHZpbGl2eW8gZmFmYW51bGl3YSBrd2VueWUgdWZhZmFudXppIHdhIENJLCBtcGFuZ2lsaW8gdWZ1YXRhbyBsYXppbWEgdXR1bWlrZSAobWZhbm8ga3dlbnllIHRhYmFrYSB0YXJha2lsaXNoaSk6IFRhcmFraWxpc2hpOjpkaXNraSBrdXU6OjEsIFRhcmFraWxpc2hpOjpEaXNraSBrdXUgbmd1bXU6OjFVd2V6bzo6MSwgVGFyYWtpbGlzaGk6OkRpc2tpIGt1dSBuZ3VtdTo6MiwgVGFyYWtpbGlzaGk6OkRpc2tpIGt1dSBuZ3VtdTo6Mjo6VXdlem86OjEuIEthbWEgaGFrdW5hIGluZ2l6byBrd2EgdGFiYWthIGxhIENJLCBzYWZ1d2ltYSBjaGFndW8gbXNpbmdpIHppbmFvbnllc2h3YSBrYW1hIHppbGl2eW9mYWZhbnVsaXdhIGthdGlrYSBtcGFuZ2lsaW8KSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgc2FmdSB3aW1hIHphIENJIHppbGl6b29ueWVzaHdhIGthdGlrYSBrdXRhZnV0YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga3V0ZWdlbWVhbmEgbmEgdGFiYWthIGxhIENJLiBLaWxhIGluZ2l6byBsYXppbWEgbGl3ZSBuYSBraWFtYmlzaGkgYXdhbGkgamluYSBsYSB0YWJha2EgbmEgOjogKCBtZmFubyBUYXJha2lsaXNoaTo6KUt1bmEgdml1bWJpIHZpY2hhY2hlIHZ5YSBDSSBhbWJhdnlvIHZpcG8ga3dhIENJIHpvdGUgKG1mYW5vIGt3ZW55ZSB0YWJha2EgbGEgdGFyYWtpbGlzaGk6IHRhcmFraWxpc2hpOjpqaW5hLCBUYXJha2lsaXNoaTo6SGFsaSB5YUN1ckRlcCwgVGFyYWtpbGlzaGk6Ok11ZGEgd2Ega3V0ZW5nZW5lemEpLiBLdW9ueWVzaGEga2l1bWJpIGNoYSBDSSBraW1vamEga2ltb2phIGthbWEgdmlsaXZ5byBmYWZhbnVsaXdhIGt3ZW55ZSB1ZmFmYW51emkgd2EgQ0ksIG1wYW5naWxpbyB1ZnVhdGFvIGxhemltYSB1dHVtaWtlIChtZmFubyBrd2VueWUgdGFiYWthIHRhcmFraWxpc2hpKTogVGFyYWtpbGlzaGk6OmRpc2tpIGt1dTo6MSwgVGFyYWtpbGlzaGk6OkRpc2tpIGt1dSBuZ3VtdTo6MVV3ZXpvOjoxLCBUYXJha2lsaXNoaTo6RGlza2kga3V1IG5ndW11OjoyLCBUYXJha2lsaXNoaTo6RGlza2kga3V1IG5ndW11OjoyOjpVd2V6bzo6MS4gS2FtYSBoYWt1bmEgaW5naXpvIGt3YSB0YWJha2EgbGEgQ0ksIHNhZnV3aW1hIGNoYWd1byBtc2luZ2kgemluYW9ueWVzaHdhIGthbWEgemlsaXZ5b2ZhZmFudWxpd2Ega2F0aWthIG1wYW5naWxpbwpJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgbGluayB0YWJsZSBjb21wbGV4IHZpZXcsIGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBzYWZ1IHdpbWEgemEgQ0kgemlsaXpvb255ZXNod2Ega2F0aWthIG1hbmRoYXJpIHlhIGplZHdhbGkgdGF0YSBsYSBraXVuZ28sa3V0ZWdlbWVhbmEgbmEgdGFiYWthIGxhIENJLiBLaWxhIGluZ2l6byBsYXppbWEgbGl3ZSBuYSBraWFtYmlzaGkgYXdhbGkgamluYSBsYSB0YWJha2EgbmEgOjogKCBtZmFubyBUYXJha2lsaXNoaTo6KS5LdW5hIHZpdW1iaSB2aWNoYWNoZSB2eWEgQ0kgYW1iYXZ5byB2aXBvIGt3YSBDSSB6b3RlIChtZmFubyBrd2VueWUgdGFiYWthIGxhIHRhcmFraWxpc2hpOiB0YXJha2lsaXNoaTo6amluYSwgVGFyYWtpbGlzaGk6OkhhbGkgeWFDdXJEZXAsIFRhcmFraWxpc2hpOjpNdWRhIHdhIGt1dGVuZ2VuZXphKS4gS3Vvbnllc2hhIGtpdW1iaSBjaGEgQ0kga2ltb2phIGtpbW9qYSBrYW1hIHZpbGl2eW8gZmFmYW51bGl3YSBrd2VueWUgdWZhZmFudXppIHdhIENJLCBtcGFuZ2lsaW8gdWZ1YXRhbyBsYXppbWEgdXR1bWlrZSAobWZhbm8ga3dlbnllIHRhYmFrYSB0YXJha2lsaXNoaSk6IFRhcmFraWxpc2hpOjpkaXNraSBrdXU6OjEsIFRhcmFraWxpc2hpOjpEaXNraSBrdXUgbmd1bXU6OjFVd2V6bzo6MSwgVGFyYWtpbGlzaGk6OkRpc2tpIGt1dSBuZ3VtdTo6MiwgVGFyYWtpbGlzaGk6OkRpc2tpIGt1dSBuZ3VtdTo6Mjo6VXdlem86OjEuIEthbWEgaGFrdW5hIGluZ2l6byBrd2EgdGFiYWthIGxhIENJLCBzYWZ1d2ltYSBjaGFndW8gbXNpbmdpIHppbmFvbnllc2h3YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIGxpbmsgKG5hbWVkIGZyb20gdGhlIHRpY2tldCBwZXJzcGVjdGl2ZSkgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgd2hpY2ggdHlwZSBvZiB0aWNrZXQgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgbGlua2VkIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc2FibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgZm9yIHRoZSBhZ2VudCBmcm9udGVuZCB0byB3b3JrIG9uIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpdGVtIGF0IGEgdGltZS4nfSA9CiAgICAgICAgJ0luYXdlemVzaGEga2lwZW5nZWxlIGNoYSBraXRlbmRvIGNoIHdpbmdpIGNoYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga3dhIG1haW5naXJhIHlhIG1iZWxlIHlhIHdha2FsYSBrdWZhbnlhIGthemkga2F0aWthIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSB6YWlkaSB5YSBraW1vamEga3dhIG11ZGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICdJbmF3ZXplc2hhIGtpcGVuZ2VsZSBjaGEga2l0ZW5kbyBjaGEgd2luZ2kgY2hhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSBrd2EgbWFrdW5kaSB5YWxpeW9vcm9kaGVzaHdhIHR1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAnV2V6ZXNoYS9LdXRvd2V6ZXNoYSBraXRlbmRlYWthemkgY2hhIGt1YW5nYWxpYSB2aXBlbmdlbGUgdnlhIHVzYW5pZGkga3dhIG1hamluYSB5YSBwZWtlZS4gS2FibGEgeWEga3V3ZXplc2hhIGNoYWd1byBoaWxpIHVuYXRha2l3YSBrdWFuZ2FsaWEgbWZ1bW8gd2FrbyBrd2EgdmlwZW5nZWxlIHZ5YSB1c2FuaWRpIGthbWEgdmlwbyB0YXlhcmkga3dhIG1hamluYSBuYWthbGEgcGFjaGEuIFVuYXdlemEga3VmYW55YSBoaXZpIG5hIG1hYW5kaWtvIGJpbi9vdHJzLiBJVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICdNb2R1bGkgeWEga3VhbmdhbGlhIG1ha3VuZGkgeWFuYXlvaHVzaWthIG5hIHRhYmFrYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICdNb2R1bGUgeWEga3VhbmdhbGlhIG1ha3VuZGkgeWFuYXlvaHVzaWthIG5hIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICdNb2R1bGkgeWEga3V0ZW5nZW5lemEgdGFrd2ltdSB6YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgY2hhIElUU00+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ1VzYWppbGkgd2EgbW9kdWxpIHlhIG1hemluZ2lyYSB5YSBueXVtYSB5YSBraXBlbmdlZSBrd2EgbW9kdWxpIHlhIEt1aW5naXphL2t1aGFtaXNoYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcyBjb2xvciBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVmlnZXpvIGt3YSBhamlsaSB5YSByYW5naSB5YSBoYWxpIHphIG1hdHVtaXppIGthbWEgbWFuZGhhcmkgeWEgbWFwZW5kZWxlbyB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlcyB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdWaWdlem8ga3dhIGFqaWxpIHlhIGhhbGkgemEgbWF0dW1pemkga2FtYSBtYW5kaGFyaSB5YSBtYXBlbmRlbGVvIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdWaWdlem8ga3dhIG1mYW5vIHJ1aHVzYSB6YSB2aWt1bmRpIGt3YSBzaWZhIHphIGthdGFsb2dpIHphIHVqdW1sYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnVmlnZXpvIGt3YSBhamlsaSB5YSB1a3VyYXNhIChhbWJhdnlvIHZpcGVuZ2VsZSB2eWEgdXNhbmlkaSB2aW1lb255ZXNod2EpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgY2hhIElUU00ga2F0aWthIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWhpdGFqaSBydWh1c2Ega3V0dW1pYSBza3JpbmkgeWEga3V0YWZ1dGEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSBpbGl5b2t1endhIHlhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSBjaGEgSVRTTSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgY2hhIElUU00ga2lsaWNob29uZ2V6YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWhpdGFqaSBydWh1c2Ega3V0dW1pYSBza3JpbmkgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNIGtpbGljaG9oYXJpcml3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgaGlzdG9yeSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWhpdGFqaSBydWh1c2Ega3V0dW1pYSBza3JpbmkgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBJVFNNIGNoYSBoaXN0b3JpYSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFoaXRhamkgcnVodXNhIGt1dHVtaWEgc2tyaW5pIHlhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSBjaGEgSVRTTSBjaGEga3VjaGFwaXNoYSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAnSW5hY2hhZ3VhIG1vZHVsaSB5YSBrdXphbGlzaGEgbmFtYmEgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpLiAiT25nZXphT3RvbWF0aWtpIiBpbmFvbmdlemEgbmFtYmEgeWEga2lwZW5nZWxlIHlhIHVzYW5pZGksIGtpdGFtYnVsaXNobyBjaGEgbWZ1bW8sIGtpdGFtYnVsaXNobyBjaGEgdGFiYWthIGxhIGtpcGVuZ2VsZSBzYW5pZGkgbmEga2loZXNhYnVqaSB2aW5hdHVtaWthLiBVbWJpem8gbmkgIktpdGFtYnVsaXNobyBjaGEgbWZ1bW8ua2l0YW1idWxpc2hvIGNoYSB0YWJha2EgbGEga2lwZW5nZWxlIHNhbmlkaS5LaWhlc2FidWppIi4gbWZhbm8gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYXdla2EgaGFsaSB5YSBrdXR1bWlhIGthdGlrYSBza3JpbmkgeWEgd2luZ2kgd2Ega2lwZW5nZWxlIGNoYSB1c2FuaWRpIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBpbmNpZGVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmF3ZWthIGhhbGkgeWEgdHVraW8ga2F0aWthIHNrcmluaSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY29uZmlndXJhdGlvbiBpdGVtIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNvbmZpZyBpdGVtIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBraW9uZ28ga2F0aWthIG1lbnl1IGFtYmFjaG8ga2luYXVuZ2FuaXNoYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgbmEga2lwZW5nZWUga2luZ2luZSBrYXRpa2EgbWFuZGhhcmkgaWxpeW9rdXp3YSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgeWEga2lvbGV1c3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYW9ueWVzaGEga2l1bmdvIGt3ZW55ZSAgbWVueXUga3V3ZXphIGt1ZmlraWEgaGlzdG9yaWEgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGthdGlrYSBtYXBpdGlvIHlhIGtpcGVuZ2VsZSB5YSB1c2FuaWRpIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIGtpdW5nbyBrd2VueWUgIG1lbnl1IGt1d2V6YSBrdWZpa2lhIGhpc3RvcmlhIHlhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSBrYXRpa2EgbWFuZGhhcmkgeWFrZSBpbGl5b2t1endhIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09ueWVzaGEga2l1bmdvIGthdGlrYSBtZW55dSBrdXRvYSBuYWthbGEgcGFjaGEgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGthdGlrYSBtYXBpdGlvIHlhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT255ZXNoYSBraXVuZ28ga2F0aWthIG1lbnl1IGt1dG9hIG5ha2FsYSBwYWNoYSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga2F0aWthIG1hbmRoYXJpIHlha2UgeWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGNoYSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09ueWVzaGEga2l1bmdvIGthdGlrYSBtZW55dSBrdWhhcmlyaSAga2lwZW5nZWxlIGNoYSB1c2FuaWRpIGthdGlrYSBtYW5kaGFyaSB5YWtlIGlsaXlva3V6d2EgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPbnllc2hhIGtpdW5nbyBrYXRpa2EgbWVueXUga3VjaGFwaXNoYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga2F0aWthIG1hbmRoYXJpIHlha2UgaWxpeW9rdXp3YSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHpvb20gaW50byBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPbnllc2hhIGtpdW5nbyBrYXRpa2EgbWVueXUga3VrdXphIGthdGlrYSBraXBlbmdlbGUgY2hhIHVzYW5pZGkga2F0aWthIG1hcGl0aW8geWEga2lwZW5nZWxlIGNoYSB1c2FuaWRpIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBoaXN0b3JpYSB5YSBraXBlbmdlbGUgY2hhIHVzYW5pZGkgKGt3YSBtcGFuZ2lsaW8gd2Ega3VydWRpIG55dW1hKSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICdLaXRhbWJ1bGlzaGkgY2hhIGtpcGVuZ2VsZSBjaGEgdXNhbmlkaSwgbWZhbm8uQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIENoYWd1LW1zaW5naSBuaSBDb25maWdJdGVtIy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnRoX1RIX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfguIHguLLguKPguIjguLHguJTguIHguLLguKMgQ29uZmlnIEl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICfguJnguLTguKLguLLguKHguILguK3guIfguITguKXguLLguKrguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ+C4meC4tOC4ouC4suC4oSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdDb25maWcgSXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIENsYXNzZXMnfSA9ICfguJXguLHguKfguIHguKPguK3guIfguKrguLPguKvguKPguLHguJrguITguKXguLLguKonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgQ2xhc3MgZnJvbSB0aGUgbGlzdCB0byBjcmVhdGUgYSBuZXcgQ29uZmlnIEl0ZW0uJ30gPSAn4LmA4Lil4Li34Lit4LiB4LiE4Lil4Liy4Liq4LiI4Liy4LiB4Lij4Liy4Lii4LiB4Liy4Lij4LiX4Li14LmI4LiI4Liw4Liq4Lij4LmJ4Liy4LiHIENvbmZpZyBJdGVtIOC5g+C4q+C4oeC5iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ+C4hOC4peC4suC4qic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJ+C4geC4suC4o+C4l+C4s+C4h+C4suC4meC5gOC4m+C5h+C4meC4geC4peC4uOC5iOC4oeC4guC4reC4hyBJVFNNIENvbmZpZ0l0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBzdGF0ZSd9ID0gJ+C4quC4luC4suC4meC4oOC4suC4nuC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBzdGF0ZSd9ID0gJ+C4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C5gOC4q+C4leC4uOC4geC4suC4o+C4k+C5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvIGFub3RoZXInfSA9ICfguYDguIrguLfguYjguK3guKHguYLguKLguIfguYTguJvguJfguLXguYjguK3guLfguYjguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISd9ID0gJ+C4iOC4s+C4meC4p+C4meC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguJ30gPSAn4LiI4Liz4LiZ4Lin4LiZ4LiC4Lit4LiH4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4Lit4Li34LmI4LiZ4LmG4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LmC4Lii4LiHJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZmlnIGl0ZW0/J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJyDguIrguLfguYjguK3guILguK3guIfguKPguLLguKLguIHguLLguKPguIHguLLguKPguJXguLHguYnguIfguITguYjguLLguJnguLXguYlcJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyd9ID0KICAgICAgICAn4LiK4Li34LmI4Lit4LiX4Li14LmI4LiW4Li54LiB4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZ4LmC4LiU4LiiIENvbmZpZ0l0ZW1zIOC4oeC4teC4iOC4s+C4meC4p+C4meC4lOC4seC4h+C4leC5iOC4reC5hOC4m+C4meC4teC5iSAocyk6ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUnfSA9ICfguKrguJbguLLguJnguKDguLLguJ7guIHguLLguKPguYPguIrguYnguIfguLLguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICfguKrguJbguLLguJnguKDguLLguJ7guILguK3guIfguYDguKvguJXguYzguIHguLLguKPguJPguYwnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mIENvbmZpZyBJdGVtOiAlcyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb250ZXh0IFNldHRpbmdzJ30gPSAn4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LiC4LmJ4Lit4LiE4Lin4Liy4LihJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyBwZXIgcGFnZSd9ID0gJ0NvbmZpZyBJdGVtcyDguYPguJnguYHguJXguYjguKXguLDguKvguJnguYnguLInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAn4Lib4Lij4Liw4LmA4Lig4LiX4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICfguKrguJbguLLguJnguKDguLLguJ7guILguK3guIfguYDguKvguJXguYzguIHguLLguKPguJPguYzguJvguLHguIjguIjguLjguJrguLHguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAn4Lib4Lij4Liw4LmA4Lig4LiX4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LmA4Lir4LiV4LmM4LiB4Liy4Lij4LiT4LmM4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ+C4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC5geC4m+C4peC4h+C4peC5iOC4suC4quC4uOC4lCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ+C4quC4o+C5ieC4suC4h+C5geC4oeC5iOC5geC4muC4muC5g+C4q+C4oeC5iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAn4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4Lij4LiE4LmJ4LiZ4Lir4LiyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ+C4hOC5ieC4meC4q+C4suC5gOC4p+C4reC4o+C5jOC4iuC4seC5iOC4meC4l+C4teC5iOC5geC4peC5ieC4p+C4lOC5ieC4p+C4ouC4q+C4o+C4t+C4reC5hOC4oeC5iD8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfguKPguLLguKLguIHguLLguKPguIHguLLguKPguIHguLPguKvguJnguJTguITguYjguLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAn4LiC4LmJ4Lit4Lih4Li54Lil4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4LiyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ+C4quC4luC4suC4meC4oOC4suC4nuC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC4m+C4seC4iOC4iOC4uOC4muC4seC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICfguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIfguKXguYjguLLguKrguLjguJTguYLguJTguKInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICfguYLguK3guYDguIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvbmUgdmVyc2lvbid9ID0gJ+C5geC4quC4lOC4h+C4q+C4meC4tuC5iOC4h+C5gOC4p+C4reC4o+C5jOC4iuC4seC5iOC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGFsbCB2ZXJzaW9ucyd9ID0gJ+C5geC4quC4lOC4h+C5gOC4p+C4reC4o+C5jOC4iuC4seC5iOC4meC4l+C4seC5ieC4h+C4q+C4oeC4lCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIEluY2lkZW50IFN0YXRlJ30gPSAn4LmA4Lin4Lit4Lij4LmM4LiK4Lix4LmI4LiZ4LiC4Lit4LiH4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gRGVwbG95bWVudCBTdGF0ZSd9ID0gJ+C5gOC4p+C5iOC4reC4o+C5jOC4iuC4seC5iOC4meC4quC4luC4suC4meC4oOC4suC4nuC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uIE51bWJlcid9ID0gJ+C4q+C4oeC4suC4ouC5gOC4peC4guC5gOC4p+C4reC4o+C5jOC4iuC4seC5ieC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gVmVyc2lvbiBEZXRhaWxzJ30gPSAn4LmA4LiZ4Li34LmJ4Lit4Lir4Liy4LmA4Lin4Lit4Lij4LmM4LiK4Lix4LmI4LiZIENvbmZpZ3VyYXRpb24gSXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9wZXJ0eSd9ID0gJ+C4hOC4uOC4k+C4quC4oeC4muC4seC4leC4tCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogSVRTTSBDb25maWdJdGVtJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtQnVsay5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgQ29uZmlndXJhdGlvbiBJdGVtISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgZG9uXCd0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtOiAlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIGNvbmZpZ2l0ZW0gSUQgJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHZlcnNpb24gZm91bmQgZm9yIENvbmZpZ0l0ZW1JRCAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgb3IgVmVyc2lvbklEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbklEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbSd9ID0gJ0NvbmZpZ0l0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAn4LmE4Lih4LmI4Lih4Li14Lic4Lil4Lil4Lix4Lie4LiY4LmMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfguKrguJbguLLguJnguKDguLLguJ7guIHguLLguKPguJ7guLHguJLguJnguLLguIHguLLguKPguILguK3guIcgY29uZmlnIGl0ZW0g4LiZ4Li14LmJICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ+C4quC4luC4suC4meC4oOC4suC4nuC5gOC4q+C4leC4uOC4geC4suC4o+C4k+C5jOC4guC4reC4hyBjb25maWcgaXRlbSDguJnguLUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAn4LiI4Liz4LiZ4Lin4LiZ4Liq4Li54LiH4Liq4Li44LiU4LiC4Lit4LiH4Lir4LiZ4Li24LmI4LiH4Lit4Li44Lib4LiB4Lij4LiT4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ+C5gOC4guC4leC4guC5ieC4reC4oeC4ueC4peC4p+C5iOC4suC4h+C5gOC4m+C4peC5iOC4suC4muC5iOC4h+C4iuC4teC5ieC4p+C5iOC4suC4hOC5iOC4suC4m+C4seC4iOC4iOC4uOC4muC4seC4meC4iOC4sOC4luC4ueC4geC5gOC4geC5h+C4muC5hOC4p+C5iSc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAn4LmC4Lih4LmA4LiU4LilJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICfguKvguKHguLLguKLguYDguKXguILguIvguLXguYDguKPguLXguKLguKUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAn4LiL4Li14Lie4Li14Lii4Li5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ+C5geC4o+C4oSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICfguK7guLLguKPguYzguJTguJTguLTguKrguIHguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICfguITguKfguLLguKHguIjguLgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAn4LiB4Liy4Lij4LmM4LiU4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmA4LiE4Lij4Li34Lit4LiC4LmI4Liy4LiiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ0lQIOC4nOC5iOC4suC4mSBESENQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICfguJfguLXguYjguK3guKLguLnguYjguYTguK3guJ7guLUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAn4LiV4Lix4Lin4Lib4Lij4Lix4Lia4LiV4LmI4Lit4LiB4Lij4Liy4Lif4Lif4Li04LiEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ+C4reC4uOC4m+C4geC4o+C4k+C5jOC4reC4t+C5iOC4mSDguYYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gPSAn4LiB4Liy4Lij4Lij4Lix4Lia4Lib4Lij4Liw4LiB4Lix4LiZ4Lin4Lix4LiZ4Lir4Lih4LiU4Lit4Liy4Lii4Li4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgRGF0ZSd9ID0gJ+C4p+C4seC4meC4leC4tOC4lOC4leC4seC5ieC4hyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSAxJ30gPSAn4LmC4LiX4Lij4Lio4Lix4Lie4LiX4LmMIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ+C5guC4l+C4o+C4qOC4seC4nuC4l+C5jCAyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAn4LiX4Li14LmI4Lit4Lii4Li54LmIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ+C4l+C4teC5iOC4reC4ouC4ueC5iOC5gOC4hOC4o+C4t+C4reC4guC5iOC4suC4oic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ+C5gOC4hOC4o+C4t+C4reC4guC5iOC4suC4ouC4ouC5iOC4reC4ouC4oeC4suC4quC5jOC4gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn4Lib4Lij4Liw4LiV4Li54Liq4Lix4LiN4LiN4Liy4LiTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ+C4m+C4o+C4sOC5gOC4oOC4l+C4peC4suC4ouC5gOC4i+C4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ+C4geC4uOC4jeC5geC4iOC4peC4suC4ouC5gOC4i+C4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ+C4iOC4s+C4meC4p+C4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICfguKfguLHguJnguKvguKHguJTguK3guLLguKLguLgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICfguKHguLXguYDguJTguLXguKInOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICfguKvguKHguJTguK3guLLguKLguLgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICfguIHguLLguKPguJTguLnguYHguKXguKPguLHguIHguKnguLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICfguIHguLLguKPguJnguLPguKPguYjguK3guIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ+C4geC4suC4o+C4p+C4suC4h+C5geC4nOC4mSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICfguIvguYjguK3guKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ+C5gOC4geC4qeC4teC4ouC4kyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICfguJXguLHguKfguK3guKLguYjguLLguIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ+C4l+C4lOC4quC4reC4mi9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfguYHguKXguYfguJvguJfguYfguK3guJsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ+C5gOC4lOC4quC4l+C4reC4myc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAn4LmA4LiL4Li04Lij4LmM4Lif4LmA4Lin4Lit4Lij4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAn4Lit4Li34LmI4LiZ4LmGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfguIjguK3guKDguLLguJ4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ+C5gOC4hOC4o+C4t+C5iOC4reC4h+C4nuC4tOC4oeC4nuC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICfguKrguLHguJrguYDguJvguKXguLXguYjguKLguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAn4LmA4Lij4Liy4LmA4LiV4Lit4Lij4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAn4LiI4Li44LiU4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWN1cml0eSBEZXZpY2UnfSA9ICfguK3guLjguJvguIHguKPguJPguYzguKPguLHguIHguKnguLLguITguKfguLLguKHguJvguKXguK3guJTguKDguLHguKInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFja3VwIERldmljZSd9ID0gJ+C4reC4uOC4m+C4geC4o+C4k+C5jOC4quC4s+C4o+C4reC4h+C4guC5ieC4reC4oeC4ueC4pSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3VzZSd9ID0gJ+C5gOC4oeC5ieC4suC4quC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXlib2FyZCd9ID0gJ+C5geC4m+C5ieC4meC4nuC4tOC4oeC4nuC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW1lcmEnfSA9ICfguIHguKXguYnguK3guIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVhbWVyJ30gPSAn4Lic4Li54LmJ4LiE4Liy4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVtJ30gPSAn4LmC4Lih4LmA4LiU4LihJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BDTUNJQSBDYXJkJ30gPSAn4Lia4Lix4LiV4LijIFBDTUNJQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAn4Lit4Li44Lib4LiB4Lij4LiT4LmMIFVTQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfguKrguJbguLLguJnguLUgRG9ja2luZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2FubmVyJ30gPSAn4LmA4LiE4Lij4Li34LmI4Lit4LiH4Liq4LmB4LiB4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1aWxkaW5nJ30gPSAn4LiB4Liy4Lij4Liq4Lij4LmJ4Liy4LiHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zsb29yJ30gPSAn4LiK4Lix4LmJ4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jvb20nfSA9ICfguKvguYnguK3guIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFjayd9ID0gJ+C4iOC4s+C4nuC4p+C4gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrcGxhY2UnfSA9ICfguJfguLXguYjguJfguLPguIfguLLguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0bGV0J30gPSAn4LmA4Lit4Liy4LiX4LmM4LmA4Lil4LmH4LiXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIEZhY2lsaXR5J30gPSAn4Liq4Li04LmI4LiH4Lit4Liz4LiZ4Lin4Lii4LiE4Lin4Liy4Lih4Liq4Liw4LiU4Lin4LiB4LiU4LmJ4Liy4LiZ4LmE4Lit4LiX4Li1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAnV0xBTic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWxjbyd9ID0gJ1RlbGNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICfguYHguK3guJ7guKXguLTguYDguITguIrguLHguJnguILguK3guIfguKXguLnguIHguITguYnguLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ+C4oeC4tOC4lOC5gOC4lOC4tOC5ieC4peC5geC4p+C4ouC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICfguYHguK3guJ7guKXguLTguYDguITguIrguLHguJnguYDguIvguLTguKPguYzguJ/guYDguKfguK3guKPguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAnT1Mg4LiC4Lit4LiH4Lil4Li54LiB4LiE4LmJ4LiyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ09TIOC5gOC4i+C4tOC4o+C5jOC4n+C5gOC4p+C4reC4o+C5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAn4LmA4LiE4Lij4Li34LmI4Lit4LiH4Lih4Li34Lit4LmB4Lit4LiU4Lih4Li04LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ+C5gOC4hOC4o+C4t+C5iOC4reC4h+C4oeC4t+C4reC4guC4reC4h+C4nOC4ueC5ieC5g+C4iuC5iSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ+C4geC4suC4o+C4neC4seC4h+C4leC4seC4pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ+C4peC4suC4ouC5gOC4i+C4meC4leC5jOC5gOC4lOC4teC4ouC4pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ+C4leC5iOC4reC4nOC4ueC5ieC5g+C4iuC5iSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAn4Liq4Liz4Lir4Lij4Lix4Lia4LiV4Lix4Lin4Lib4Lij4Liw4Lih4Lin4Lil4Lic4LilJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICfguJXguYjguK3guYDguIvguLTguKPguYzguJ/guYDguKfguK3guKPguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfguJXguYjguK3guKvguJnguLbguYjguIfguYLguKvguJnguJQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfguKXguLLguKLguYDguIvguJnguJXguYzguK3guLjguJvguIHguKPguJPguYzguYDguKrguLXguKLguIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn4Lil4Liy4Lii4LmA4Lin4LiZ4LiV4LmM4LmA4Lit4LmH4LiZ4LmA4LiV4Lit4Lij4LmM4LmE4Lie4Lij4Liq4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn4Lil4Liy4Lii4LmA4LiL4LiZ4LiV4LmM4Lic4Li54LmJ4Lie4Lix4LiS4LiZ4LiyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfguIHguLLguKPguKrguLLguJjguLTguJUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAn4LmA4Lin4Lil4LiyIOC4iOC4s+C4geC4seC4lCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVld2FyZSd9ID0gJ+C4n+C4o+C4teC5geC4p+C4o+C5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFNvdXJjZSd9ID0gJ+C5guC4reC5gOC4nuC4meC4i+C4reC4o+C5jOC4qic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmxpbWl0ZWQnfSA9ICfguYTguKHguYjguIjguLPguIHguLHguJQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgb25seSB3aXRoaW4gdGhlIHNhbWUgQ29uZmlnSXRlbSBjbGFzcyAoXCdjbGFzc1wnKSBvciBnbG9iYWxseSAoXCdnbG9iYWxcJyksIHdoaWNoIG1lYW5zIGV2ZXJ5IGV4aXN0aW5nIENvbmZpZ0l0ZW0gaXMgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4nfSA9CiAgICAgICAgJ+C4leC4o+C4p+C4iOC4quC4reC4muC4iuC4t+C5iOC4reC5gOC4ieC4nuC4suC4sOC5gOC4l+C5iOC4suC4meC4seC5ieC4meC4l+C4teC5iOC4reC4ouC4ueC5iOC5g+C4mSBDb25maWdJdGVtIOC4iuC4seC5ieC4meC5gOC4lOC4teC4ouC4p+C4geC4seC4mSAo4LiK4Lix4LmJ4LiZKSDguKvguKPguLfguK3guJfguLHguYnguIfguKvguKHguJQgKOC4l+C4seC5ieC4h+C4q+C4oeC4lCkg4LiL4Li24LmI4LiH4Lir4Lih4Liy4Lii4LiE4Lin4Liy4Lih4Lin4LmI4LiyQ29uZmlnSXRlbSDguJfguLXguYjguKHguLXguK3guKLguLnguYjguJfguLHguYnguIfguKvguKHguJTguIjguLDguJbguLnguIHguJnguLPguYDguILguYnguLLguJrguLHguI3guIrguLXguYDguJ7guLfguYjguK3guITguYnguJnguKvguLLguKPguLLguKLguIHguLLguKPguJfguLXguYjguIvguYnguLPguIHguLHguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zJ30gPSAnQ29uZmlnIEl0ZW1zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGFkZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZWRpdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5guC4oeC4lOC4ueC4peC4geC4tOC4iOC4geC4o+C4o+C4oeC4guC4reC4h0NvbmZpZyBpdGVtIOC4l+C4teC5iOC4iuC5iOC4p+C4ouC5g+C4q+C5ieC5gOC4guC5ieC4suC4quC4ueC5iOC4o+C4sOC4muC4muC4m+C4o+C4sOC4p+C4seC4leC4tOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4quC4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBoaXN0b3J5Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBwcmludC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gem9vbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbU51bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gTGltaXQnfSA9ICfguIHguLLguKPguIjguLPguIHguLHguJQgQ29uZmlndXJhdGlvbiBJdGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NvbmZpZ3VyYXRpb24gSXRlbSDguITguYnguJnguKvguLIgYmFja2VuZCByb3V0ZXIg4LiC4Lit4LiH4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBkZWZpbml0aW9ucyBmb3IgQ29uZmlndXJhdGlvbiBJdGVtcy4nfSA9ICfguKrguKPguYnguLLguIfguYHguKXguLDguIjguLHguJTguIHguLLguKPguITguLPguJnguLTguKLguLLguKHguKrguLPguKvguKPguLHguJogQ29uZmlndXJhdGlvbiBJdGVtcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBjcmVhdGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4quC4tOC4l+C4mOC4tOC5jOC4l+C4teC5iOC4iOC4s+C5gOC4m+C5h+C4meC5g+C4meC4geC4suC4o+C4quC4o+C5ieC4suC4h+C4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNN4LmC4LiU4Lii4LmD4LiK4LmJ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiX4Lix4LmI4Lin4LmE4LibJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4quC4tOC4l+C4mOC4tOC5jOC4l+C4teC5iOC4iOC4s+C5gOC4m+C5h+C4meC5g+C4meC4geC4suC4o+C5gOC4reC4suC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNN4LmC4LiU4Lii4LmD4LiK4LmJ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiX4Lix4LmI4Lin4LmE4LibJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gc2VhcmNoIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguKrguLTguJfguJjguLTguYzguJfguLXguYjguIjguLPguYDguJvguYfguJnguYPguJnguIHguLLguKPguITguYnguJnguKvguLLguKPguLLguKLguIHguLLguKPguIHguLLguKPguJXguLHguYnguIfguITguYjguLIgSVRTTeC5guC4lOC4ouC5g+C4iuC5ieC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4l+C4seC5iOC4p+C5hOC4myc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Liq4Li04LiX4LiY4Li04LmM4LiX4Li14LmI4LiI4Liz4LmA4Lib4LmH4LiZ4LmD4LiZ4LiB4Liy4Lij4Lit4Lix4Lie4LmA4LiU4LiV4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIElUU03guYLguJTguKLguYPguIrguYnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguJfguLHguYjguKfguYTguJsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LmC4Lih4LiU4Li54Lil4Lig4Liy4Lie4Lij4Lin4Lih4LmD4LiZ4LiB4Liy4Lij4LmB4Liq4LiU4LiH4Lih4Li44Lih4Lih4Lit4LiH4LiC4LiZ4Liy4LiU4LmA4Lil4LmH4LiB4LiC4Lit4LiH4Lij4Liy4Lii4LiB4Liy4LijICBDb25maWd1cmF0aW9uIEl0ZW1zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJnguLTguJ7guIjguJnguYzguJfguLHguYjguKfguYTguJvguYDguJvguYfguJnguKPguLLguKLguJrguLjguITguITguKXguYPguJlDb25maWdJdGVtIOC5geC4leC5iOC4peC4sOC4iuC4seC5ieC4mSDguYDguJ7guLfguYjguK3guJXguKPguKfguIjguKrguK3guJrguIrguLfguYjguK0gQ29uZmlnSXRlbSDguYHguKXguLDguYDguJ7guLfguYjguK3guYHguKrguJTguIfguILguYnguK3guITguKfguLLguKHguJzguLTguJTguJ7guKXguLLguJTguJfguLXguYjguKrguK3guJTguITguKXguYnguK3guIfguIHguLHguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4reC4muC5gOC4iOC4geC4leC5jOC4ouC5iOC4reC4ouC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4hOC4peC4suC4qiBcJ0lUU01Db25maWdJdGVtXCcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIHRoZSBDSSBkZWZpbml0aW9uIGVkaXRvciBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiI4Liz4LiZ4Lin4LiZ4LmB4LiW4Lin4Liq4Liz4Lir4Lij4Lix4Lia4LiV4Lix4Lin4LmB4LiB4LmJ4LmE4LiC4LiB4Liy4Lij4LiZ4Li04Lii4Liy4LihIENJIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4quC4guC4reC4h+C4nOC4ueC5ieC4lOC4ueC5geC4peC4o+C4sOC4muC4mic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguILguLXguJTguIjguLPguIHguLHguJTguILguK3guIfguIHguLLguKPguITguYnguJnguKvguLLguKrguLPguKvguKPguLHguJrguKvguJnguYnguLLguIjguK0gQWdlbnRJVFNNQ29uZmlnSXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzZWFyY2ggbGltaXQgZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIHNjcmVlbi4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4guC4teC4lOC4iOC4s+C4geC4seC4lOC4guC4reC4h+C4geC4suC4o+C4hOC5ieC4meC4q+C4suC4quC4s+C4q+C4o+C4seC4muC4q+C4meC5ieC4suC4iOC4rSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC4reC4peC4seC4oeC4meC5jOC4l+C4teC5iOC4iOC4sOC5geC4quC4lOC4h+C5g+C4meC4oOC4suC4nuC4o+C4p+C4oeC4guC4reC4h2NvbmZpZyBpdGVtIOC4leC4seC4p+C5gOC4peC4t+C4reC4geC4meC4teC5ieC4iOC4sOC5hOC4oeC5iOC4oeC4teC4nOC4peC4leC5iOC4reC4leC4s+C5geC4q+C4meC5iOC4h+C4guC4reC4h+C4hOC4reC4peC4seC4oeC4meC5jCDguKvguKHguLLguKLguYDguKvguJXguLg6IOC4o+C4sOC4lOC4seC4muC4guC4reC4h+C4hOC4reC4peC4seC4oeC4meC5jOC4quC4suC4oeC4suC4o+C4luC5g+C4iuC5ieC5hOC4lOC5ieC5gOC4quC4oeC4reC4luC5ieC4suC4leC4seC4p+C4geC4o+C4reC4hyBcJ+C4l+C4seC5ieC4h+C4q+C4oeC4lFwnIOC4luC4ueC4geC5gOC4peC4t+C4reC4gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguK3guKXguLHguKHguJnguYzguJfguLXguYjguIjguLDguYHguKrguJTguIfguYPguJnguIHguLLguKPguITguYnguJnguKvguLIgY29uZmlnIGl0ZW0g4LiV4Lix4Lin4LmA4Lil4Li34Lit4LiB4LiZ4Li14LmJ4LiI4Liw4LmE4Lih4LmI4Lih4Li14Lic4Lil4LiV4LmI4Lit4LiV4Liz4LmB4Lir4LiZ4LmI4LiH4LiC4Lit4LiH4LiE4Lit4Lil4Lix4Lih4LiZ4LmMICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIG9mIENJcyBpbiB0aGUgY29uZmlnIGl0ZW0gb3ZlcnZpZXcgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguK3guKXguLHguKHguJnguYzguJfguLXguYjguYHguKrguJTguIcgQ0lzIOC5g+C4meC4oOC4suC4nuC4o+C4p+C4oeC4guC4reC4h+C4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4i+C4tuC5iOC4h+C4guC4tuC5ieC4meC4reC4ouC4ueC5iOC4geC4seC4muC4hOC4peC4suC4qiBDSSDguKPguLLguKLguIHguLLguKPguIHguLLguKPguJvguYnguK3guJnguYHguJXguYjguKXguLDguKPguLLguKLguIHguLLguKPguIjguLDguJXguYnguK3guIfguJnguLPguKvguJnguYnguLLguJTguYnguKfguKLguIrguLfguYjguK3guITguKXguLLguKrguYHguKXguLDguYDguITguKPguLfguYjguK3guIfguKvguKHguLLguKLguJfguKfguLTguKDguLLguITguITguLnguYggKOC5gOC4iuC5iOC4meC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDogOikg4Lih4Li14LmB4Lit4LiV4LiX4Lij4Li04Lia4Li04Lin4LiV4LmMIENJIOC5gOC4nuC4teC4ouC4h+C5hOC4oeC5iOC4geC4teC5iOC5geC4reC4leC4l+C4o+C4tOC4muC4tOC4p+C4leC5jCDguJfguLXguYjguYPguIrguYnguIHguLHguJnguJfguLHguYjguKfguYTguJvguYPguJkgQ0lzIOC4l+C4seC5ieC4h+C4q+C4oeC4lCAo4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4Liq4Liz4Lir4Lij4Lix4Lia4LiE4Lil4Liy4Liq4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOiDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OuC4iuC4t+C5iOC4rSwg4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjpDdXJEZXBsU3RhdGUsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo6Q3JlYXRlVGltZSkg4LmD4LiZ4LiB4Liy4Lij4LmB4Liq4LiU4LiH4LmB4Lit4LiV4LiX4Lij4Li04Lia4Li04Lin4LiV4LmMIENJIOC4leC4suC4oeC4l+C4teC5iOC4geC4s+C4q+C4meC4lOC5hOC4p+C5ieC5g+C4meC4hOC4s+C4meC4tOC4ouC4suC4oSBDSSDguIjguLDguJXguYnguK3guIfguYPguIrguYnguKPguLnguJvguYHguJrguJrguJXguYjguK3guYTguJvguJnguLXguYko4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4Liq4Liz4Lir4Lij4Lix4Lia4LiE4Lil4Liy4Liq4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMKTog4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjrguK7guLLguKPguYzguJTguJTguLTguKrguIHguYw6OjEsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64Liu4Liy4Lij4LmM4LiU4LiU4Li04Liq4LiB4LmMOjoxOjrguITguKfguLLguKHguIjguLg6OjEsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64Liu4Liy4Lij4LmM4LiU4LiU4Li04Liq4LiB4LmMOjoyLCDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OuC4ruC4suC4o+C5jOC4lOC4lOC4tOC4quC4geC5jDo6Mjo64LiE4Lin4Liy4Lih4LiI4Li4OjoxICDguKvguLLguIHguYTguKHguYjguKHguLXguIHguLLguKPguJvguYnguK3guJnguITguKXguLLguKrguJfguLXguYggQ0kg4LmB4Lil4LmJ4Lin4LiE4Lit4Lil4Lix4Lih4LiZ4LmM4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiI4Liw4LmB4Liq4LiU4LiH4LiV4Liy4Lih4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiU4LmE4Lin4LmJ4LmD4LiZ4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIElUU01Db25maWdJdGVtIDo6RnJvbnRlbmQgOjogQWdlbnRJVFNNQ29uZmlnSXRlbSAjIyMgU2hvd0NvbHVtbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC4reC4peC4seC4oeC4meC5jOC4l+C4teC5iOC5geC4quC4lOC4hyBDSXMg4LmD4LiZ4LiB4Liy4Lij4LiE4LmJ4LiZ4Lir4Liy4LiC4Lit4LiH4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LiL4Li24LmI4LiH4LiC4Li24LmJ4LiZ4Lit4Lii4Li54LmI4LiB4Lix4Lia4LiE4Lil4Liy4LiqIENJIOC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4m+C5ieC4reC4meC5geC4leC5iOC4peC4sOC4o+C4suC4ouC4geC4suC4o+C4iOC4sOC4leC5ieC4reC4h+C4meC4s+C4q+C4meC5ieC4suC4lOC5ieC4p+C4ouC4iuC4t+C5iOC4reC4hOC4peC4suC4quC5geC4peC4sOC5gOC4hOC4o+C4t+C5iOC4reC4h+C4q+C4oeC4suC4ouC4l+C4p+C4tOC4oOC4suC4hOC4hOC4ueC5iCAo4LmA4LiK4LmI4LiZ4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOiA6KSDguKHguLXguYHguK3guJXguJfguKPguLTguJrguLTguKfguJXguYwgQ0kg4LmA4Lie4Li14Lii4LiH4LmE4Lih4LmI4LiB4Li14LmI4LmB4Lit4LiV4LiX4Lij4Li04Lia4Li04Lin4LiV4LmMIOC4l+C4teC5iOC5g+C4iuC5ieC4geC4seC4meC4l+C4seC5iOC4p+C5hOC4m+C5g+C4mSBDSXMg4LiX4Lix4LmJ4LiH4Lir4Lih4LiUICjguJXguLHguKfguK3guKLguYjguLLguIfguKrguLPguKvguKPguLHguJrguITguKXguLLguKrguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6IOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64LiK4Li34LmI4LitLCDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OkN1ckRlcGxTdGF0ZSwg4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjpDcmVhdGVUaW1lKSDguYPguJnguIHguLLguKPguYHguKrguJTguIfguYHguK3guJXguJfguKPguLTguJrguLTguKfguJXguYwgQ0kg4LiV4Liy4Lih4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiU4LmE4Lin4LmJ4LmD4LiZ4LiE4Liz4LiZ4Li04Lii4Liy4LihIENJIOC4iOC4sOC4leC5ieC4reC4h+C5g+C4iuC5ieC4o+C4ueC4m+C5geC4muC4muC4leC5iOC4reC5hOC4m+C4meC4teC5iSjguJXguLHguKfguK3guKLguYjguLLguIfguKrguLPguKvguKPguLHguJrguITguKXguLLguKrguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYwpOiDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OuC4ruC4suC4o+C5jOC4lOC4lOC4tOC4quC4geC5jDo6MSwg4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjrguK7guLLguKPguYzguJTguJTguLTguKrguIHguYw6OjE6OuC4hOC4p+C4suC4oeC4iOC4uDo6MSwg4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjrguK7guLLguKPguYzguJTguJTguLTguKrguIHguYw6OjIsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64Liu4Liy4Lij4LmM4LiU4LiU4Li04Liq4LiB4LmMOjoyOjrguITguKfguLLguKHguIjguLg6OjEg4Lir4Liy4LiB4LmE4Lih4LmI4Lih4Li14LiB4Liy4Lij4Lib4LmJ4Lit4LiZ4LiE4Lil4Liy4Liq4LiX4Li14LmIIENJIOC5geC4peC5ieC4p+C4hOC4reC4peC4seC4oeC4meC5jOC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4iOC4sOC5geC4quC4lOC4h+C4leC4suC4oeC4l+C4teC5iOC4geC4s+C4q+C4meC4lOC5hOC4p+C5ieC5g+C4meC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNNQ29uZmlnSXRlbSA6OkZyb250ZW5kIDo6IEFnZW50SVRTTUNvbmZpZ0l0ZW0gIyMjIFNob3dDb2x1bW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguK3guKXguLHguKHguJnguYzguJfguLXguYjguYHguKrguJTguIcgQ0lzIOC5g+C4meC4leC4suC4o+C4suC4h+C4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC5guC4ouC4h+C4oeC4uOC4oeC4oeC4reC4h+C4l+C4teC5iOC4i+C4seC4muC4i+C5ieC4reC4meC4i+C4tuC5iOC4h+C4guC4tuC5ieC4meC4reC4ouC4ueC5iOC4geC4seC4muC4hOC4peC4suC4qiBDSSDguKPguLLguKLguIHguLLguKPguIHguLLguKPguJvguYnguK3guJnguYHguJXguYjguKXguLDguKPguLLguKLguIHguLLguKPguIjguLDguJXguYnguK3guIfguJnguLPguKvguJnguYnguLLguJTguYnguKfguKLguIrguLfguYjguK3guITguKXguLLguKrguYHguKXguLDguYDguITguKPguLfguYjguK3guIfguKvguKHguLLguKLguJfguKfguLTguKDguLLguITguITguLnguYggKOC5gOC4iuC5iOC4meC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDogOikg4Lih4Li14LmB4Lit4LiV4LiX4Lij4Li04Lia4Li04Lin4LiV4LmMIENJIOC5gOC4nuC4teC4ouC4h+C5hOC4oeC5iOC4geC4teC5iOC5geC4reC4leC4l+C4o+C4tOC4muC4tOC4p+C4leC5jCDguJfguLXguYjguYPguIrguYnguIHguLHguJnguJfguLHguYjguKfguYTguJvguYPguJkgQ0lzIOC4l+C4seC5ieC4h+C4q+C4oeC4lCAo4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4Liq4Liz4Lir4Lij4Lix4Lia4LiE4Lil4Liy4Liq4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOiDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OuC4iuC4t+C5iOC4rSwg4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjpDdXJEZXBsU3RhdGUsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo6Q3JlYXRlVGltZSkg4LmD4LiZ4LiB4Liy4Lij4LmB4Liq4LiU4LiH4LmB4Lit4LiV4LiX4Lij4Li04Lia4Li04Lin4LiV4LmMIENJIOC4leC4suC4oeC4l+C4teC5iOC4geC4s+C4q+C4meC4lOC5hOC4p+C5ieC5g+C4meC4hOC4s+C4meC4tOC4ouC4suC4oSBDSSDguIjguLDguJXguYnguK3guIfguYPguIrguYnguKPguLnguJvguYHguJrguJrguJXguYjguK3guYTguJvguJnguLXguYko4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4Liq4Liz4Lir4Lij4Lix4Lia4LiE4Lil4Liy4Liq4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMKTog4LiE4Lit4Lih4Lie4Li04Lin4LmA4LiV4Lit4Lij4LmMOjrguK7guLLguKPguYzguJTguJTguLTguKrguIHguYw6OjEsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64Liu4Liy4Lij4LmM4LiU4LiU4Li04Liq4LiB4LmMOjoxOjrguITguKfguLLguKHguIjguLg6OjEsIOC4hOC4reC4oeC4nuC4tOC4p+C5gOC4leC4reC4o+C5jDo64Liu4Liy4Lij4LmM4LiU4LiU4Li04Liq4LiB4LmMOjoyLCDguITguK3guKHguJ7guLTguKfguYDguJXguK3guKPguYw6OuC4ruC4suC4o+C5jOC4lOC4lOC4tOC4quC4geC5jDo6Mjo64LiE4Lin4Liy4Lih4LiI4Li4OjoxIOC4q+C4suC4geC5hOC4oeC5iOC4oeC4teC4geC4suC4o+C4m+C5ieC4reC4meC4hOC4peC4suC4quC4l+C4teC5iCBDSSDguYHguKXguYnguKfguITguK3guKXguLHguKHguJnguYzguYDguKPguLTguYjguKHguJXguYnguJnguIjguLDguYHguKrguJTguIfguJXguLLguKHguJfguLXguYjguIHguLPguKvguJnguJTguYTguKfguYnguYPguJnguIHguLLguKPguJXguLHguYnguIfguITguYjguLIgSVRTTUNvbmZpZ0l0ZW0gOjpGcm9udGVuZCA6OiBBZ2VudElUU01Db25maWdJdGVtICMjIyBTaG93Q29sdW1ucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAn4LiL4LmJ4LizJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAn4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Lij4Liy4Lii4LiB4Liy4Lij4LiE4Li44LiT4Lil4Lix4LiB4Lip4LiT4Liw4LiC4Lit4LiH4LiB4Liy4Lij4LiX4Liz4LiH4Liy4LiZ4LmA4Lib4LmH4LiZ4LiB4Lil4Li44LmI4LihIOC4quC4s+C4q+C4o+C4seC4muC4n+C4o+C4reC4meC4leC5jOC5gOC4reC4meC4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jOC5gOC4nuC4t+C5iOC4reC4l+C4s+C4h+C4suC4meC4geC4seC4muC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC4l+C4teC5iOC4oeC4teC4oeC4suC4geC4geC4p+C5iOC4suC4q+C4meC4tuC5iOC4h+C5g+C4meC4q+C4meC4tuC5iOC4h+C4hOC4o+C4seC5ieC4hyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIG9ubHkgZm9yIHRoZSBsaXN0ZWQgZ3JvdXBzLid9ID0KICAgICAgICAn4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Lij4Liy4Lii4LiB4Liy4Lij4LiE4Li44LiT4Lil4Lix4LiB4Lip4LiT4Liw4LiC4Lit4LiH4LiB4Liy4Lij4LiX4Liz4LiH4Liy4LiZ4LmA4Lib4LmH4LiZ4LiB4Lil4Li44LmI4Lih4LmA4LiJ4Lie4Liy4Liw4Liq4Liz4Lir4Lij4Lix4Lia4LiB4Lil4Li44LmI4Lih4LiX4Li14LmI4Lij4Liw4Lia4Li44LmE4Lin4LmJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMvZGlzYWJsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgQ29uZmlnSXRlbXMgZm9yIHVuaXF1ZSBuYW1lcy4gQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSBzaG91bGQgY2hlY2sgeW91ciBzeXN0ZW0gZm9yIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zIHdpdGggZHVwbGljYXRlIG5hbWVzLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUgc2NyaXB0IGJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGwuJ30gPQogICAgICAgICfguYDguJvguLTguJQgLyDguJvguLTguJTguIHguLLguKPguYPguIrguYnguIfguLLguJnguJ/guLHguIfguIHguYzguIrguLHguYjguJnguYDguJ7guLfguYjguK3guJXguKPguKfguIjguKrguK3guJogQ29uZmlnSXRlbXMg4Liq4Liz4Lir4Lij4Lix4Lia4LiK4Li34LmI4Lit4LiX4Li14LmI4LmE4Lih4LmI4LiL4LmJ4Liz4LiB4Lix4LiZIOC4geC5iOC4reC4meC5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4leC4seC4p+C5gOC4peC4t+C4reC4geC4meC4teC5ieC4hOC4uOC4k+C4hOC4p+C4o+C4leC4o+C4p+C4iOC4quC4reC4muC4o+C4sOC4muC4muC4guC4reC4h+C4hOC4uOC4k+C4quC4s+C4q+C4o+C4seC4muC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4l+C4teC5iOC4oeC4teC4reC4ouC4ueC5iOC5geC4peC5ieC4p+C4lOC5ieC4p+C4ouC4iuC4t+C5iOC4reC4l+C4teC5iOC4i+C5ieC4s+C4geC4seC4mSDguITguLjguJPguKrguLLguKHguLLguKPguJbguJfguLPguYDguIrguYjguJnguJnguLXguYnguJTguYnguKfguKLguKrguITguKPguLTguJvguJXguYzguJTguLHguIfguJXguYjguK3guYTguJvguJnguLXguYkgYmluIC8gb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZW50IG1vZHVsZSB0byBzZXQgY29uZmlnaXRlbS1zdGF0dXMgb24gdGlja2V0LWNvbmZpZ2l0ZW0tbGluay4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGNvbmZpZyBpdGVtIG92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLid9ID0gJ+C5guC4oeC4lOC4ueC4peC5g+C4meC4geC4suC4o+C4leC4o+C4p+C4iOC4quC4reC4muC4nOC4ueC5ieC4o+C4seC4muC4nOC4tOC4lOC4iuC4reC4muC4geC4peC4uOC5iOC4oeC4quC4s+C4q+C4o+C4seC4muC4hOC4peC4suC4qic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbS4nfSA9CiAgICAgICAgJ+C5guC4oeC4lOC4ueC4peC5g+C4meC4geC4suC4o+C4leC4o+C4p+C4iOC4quC4reC4muC4nOC4ueC5ieC4o+C4seC4muC4nOC4tOC4lOC4iuC4reC4muC4geC4peC4uOC5iOC4oeC4quC4s+C4q+C4o+C4seC4miBjb25maWd1cmF0aW9uIGl0ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICfguYLguKHguJTguLnguKXguKrguKPguYnguLLguIfguKrguJbguLTguJXguLQgSVRTTSBjb25maWcgaXRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICfguIHguLLguKPguKXguIfguJfguLDguYDguJrguLXguKLguJnguYLguKHguJTguLnguKUgT2JqZWN0IGJhY2tlbmQg4Liq4Liz4Lir4Lij4Lix4Lia4LmC4Lih4LiU4Li54Lil4LiZ4Liz4LmA4LiC4LmJ4Liy4Lir4Lij4Li34Lit4Liq4LmI4LiH4Lit4Lit4LiBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4nuC4suC4o+C4suC4oeC4tOC5gOC4leC4reC4o+C5jOC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4nuC4seC4kuC4meC4suC4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C4quC4teC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4nuC4suC4o+C4suC4oeC4tOC5gOC4leC4reC4o+C5jOC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4nuC4seC4kuC4meC4suC4quC4luC4suC4meC4oOC4suC4nuC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfguJ7guLLguKPguLLguKHguLTguYDguJXguK3guKPguYzguKrguLPguKvguKPguLHguJrguJXguLHguKfguK3guKLguYjguLLguIfguIHguKXguLjguYjguKHguJfguLXguYjguYTguJTguYnguKPguLHguJrguK3guJnguLjguI3guLLguJXguILguK3guIfguYHguK3guJXguJfguKPguLTguJrguLTguKfguJXguYzguYHguITguYfguJXguJXguLLguKXguYfguK3guIHguJfguLHguYjguKfguYTguJsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAn4Lie4Liy4Lij4Liy4Lih4Li04LmA4LiV4Lit4Lij4LmM4Liq4Liz4Lir4Lij4Lix4Lia4LmB4LiV4LmI4Lil4Liw4Lir4LiZ4LmJ4LiyKOC4i+C4tuC5iOC4hyBjb25maWd1cmF0aW9uIGl0ZW1zIOC5geC4quC4lOC4hyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C4reC4meC4uOC4jeC4suC4leC4tOC5g+C4meC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C4reC4meC4uOC4jeC4suC4leC4tOC5g+C4meC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4hOC5ieC4meC4q+C4suC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHpvb20gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIjguLPguYDguJvguYfguJnguJXguYnguK3guIfguKHguLXguIHguLLguKPguK3guJnguLjguI3guLLguJXguLTguYPguJnguIHguLLguKPguYPguIrguYnguIfguLLguJnguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguIvguLnguKHguKPguLLguKLguIHguLLguKPguIHguLLguKPguJXguLHguYnguIfguITguYjguLIgSVRTTSDguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIjguLPguYDguJvguYfguJnguJXguYnguK3guIfguKHguLXguIHguLLguKPguK3guJnguLjguI3guLLguJXguLTguYPguJnguIHguLLguKPguYPguIrguYnguIfguLLguJnguIHguLLguKPguYDguJ7guLTguYjguKHguYPguJnguKvguJnguYnguLLguIjguK3guKPguLLguKLguIHguLLguKPguIHguLLguKPguJXguLHguYnguIfguITguYjguLIgSVRTTSDguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiI4Liz4LmA4Lib4LmH4LiZ4LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4Lit4LiZ4Li44LiN4Liy4LiV4Li04LmD4LiZ4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4LmB4LiB4LmJ4LmE4LiC4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIElUU00g4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgaGlzdG9yeSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C4reC4meC4uOC4jeC4suC4leC4tOC5g+C4meC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC4m+C4o+C4sOC4p+C4seC4leC4tOC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4siBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIHByaW50IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiI4Liz4LmA4Lib4LmH4LiZ4LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4Lit4LiZ4Li44LiN4Liy4LiV4Li04LmD4LiZ4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4Lie4Li04Lih4Lie4LmM4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lij4Liy4Lii4LiB4Liy4Lij4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIElUU00g4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAn4LmA4Lil4Li34Lit4LiB4Lir4Lih4Liy4Lii4LmA4Lil4LiC4Lij4Liy4Lii4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LiV4Lix4Lin4LiB4Liz4LmA4LiZ4Li04LiU4LmC4Lih4LiU4Li54LilICJBdXRvSW5jcmVtZW50IiDguIjguLDguYDguJ7guLTguYjguKHguKvguKHguLLguKLguYDguKXguILguKPguLLguKLguIHguLLguKPguIHguLPguKvguJnguJTguITguYjguLIgU3lzdGVtSUQgQ29uZmlnSXRlbUNsYXNzSUQg4LmB4Lil4Liw4LiV4Lix4Lin4LiZ4Lix4Lia4LiX4Li14LmI4Lih4Li14LiB4Liy4Lij4LmD4LiK4LmJIOC4o+C4ueC4m+C5geC4muC4muC4hOC4t+C4rSAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIg4LmA4LiK4LmI4LiZIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBhIENJIGF1dG9tYXRpY2FsbHkgd2hlbiBhIFRpY2tldCBpcyBMaW5rZWQgdG8gYSBDSS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBkZXBsb3ltZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4leC4seC5ieC4h+C4hOC5iOC4suC4quC4luC4suC4meC4sOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4o+C4suC4ouC4geC4suC4o+C5gOC4m+C5h+C4meC4geC4peC4uOC5iOC4oeC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBpbmNpZGVudCBzdGF0ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguJXguLHguYnguIfguITguYjguLLguKrguJbguLLguJnguLDguILguK3guIfguYDguKvguJXguLjguIHguLLguKPguJPguYzguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguYnguIfguITguYjguLLguKPguLLguKLguIHguLLguKPguYDguJvguYfguJnguIHguKXguLjguYjguKHguILguK3guIfguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjb25maWd1cmF0aW9uIGl0ZW0gd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY29uZmlnIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYDguJ7guLfguYjguK3guKXguLTguIfguITguYzguKPguLLguKLguIHguLLguKPguIHguLLguKPguJXguLHguYnguIfguITguYjguLLguIHguLHguJrguK3guK3guJrguYDguIjguIHguITguYzguK3guLfguYjguJnguYPguJnguIHguLLguKPguIvguLnguKHguYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYPguJnguIHguLLguKPguJfguLXguYjguIjguLDguYDguILguYnguLLguIrguKHguJvguKPguLDguKfguLHguJXguLTguILguK3guIcgY29uZmlndXJhdGlvbiBpdGVtIOC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4l+C4seC5iOC4p+C5hOC4m+C4guC4reC4h2NvbmZpZ3VyYXRpb24gaXRlbeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYPguJnguIHguLLguKPguJfguLXguYjguIjguLDguYDguILguYnguLLguIrguKHguJvguKPguLDguKfguLHguJXguLTguILguK3guIcgY29uZmlndXJhdGlvbiBpdGVtIOC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4geC4suC4o+C4i+C4ueC4oeC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZHVwbGljYXRlIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4peC4tOC4h+C4hOC5jOC5g+C4meC5gOC4oeC4meC4ueC5g+C4meC4geC4suC4o+C4l+C4teC5iOC4iOC4sOC4iOC4s+C4peC4reC4hyBjb25maWd1cmF0aW9uIGl0ZW0g4LmD4LiZ4Lih4Li44Lih4Lih4Lit4LiH4LiX4Lix4LmI4Lin4LmE4Lib4LiC4Lit4LiHY29uZmlndXJhdGlvbiBpdGVtIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lil4Li04LiH4LiE4LmM4LmD4LiZ4LmA4Lih4LiZ4Li54LmD4LiZ4LiB4Liy4Lij4LiX4Li14LmI4LiI4Liw4LiI4Liz4Lil4Lit4LiHY29uZmlndXJhdGlvbiBpdGVtIOC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4geC4suC4o+C4i+C4ueC4oeC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4peC4tOC4h+C4hOC5jOC5g+C4meC5gOC4oeC4meC4ueC5g+C4meC4geC4suC4o+C4l+C4teC5iOC4iOC4sOC5geC4geC5ieC5hOC4giBjb25maWd1cmF0aW9uIGl0ZW0g4LmD4LiZ4Lih4Li44Lih4Lih4Lit4LiH4LiB4Liy4Lij4LiL4Li54Lih4LiC4Lit4LiH4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKXguLTguIfguITguYzguYPguJnguYDguKHguJnguLnguYPguJnguIHguLLguKPguJfguLXguYjguIjguLDguJ7guLTguKHguJ7guYwgY29uZmlndXJhdGlvbiBpdGVtIOC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4geC4suC4o+C4i+C4ueC4oeC4guC4reC4h+C4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4peC4tOC4h+C4hOC5jOC5g+C4meC5gOC4oeC4meC4ueC5gOC4nuC4t+C5iOC4reC4i+C4ueC4oeC4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC5g+C4meC4oeC4uOC4oeC4oeC4reC4h+C4oOC4suC4nuC4o+C4p+C4oeC4guC4reC4h+C4o+C4suC4ouC4geC4suC4o+C4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lib4Lij4Liw4Lin4Lix4LiV4Li0IGNvbmZpZyBpdGVtICjguKXguLPguJTguLHguJrguKLguYnguK3guJnguIHguKXguLHguJopIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaWRlbnRpZmllciBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0sIGUuZy4gQ29uZmlnSXRlbSMsIE15Q29uZmlnSXRlbSMuIFRoZSBkZWZhdWx0IGlzIENvbmZpZ0l0ZW0jLid9ID0KICAgICAgICAn4LiV4Lix4Lin4Lia4LmI4LiH4LiK4Li14LmJ4Liq4Liz4Lir4Lij4Lix4LiaICBDb25maWd1cmF0aW9uIEl0ZW0g4LmA4LiK4LmI4LiZIENvbmZpZ0l0ZW0jLCBNeUNvbmZpZ0l0ZW0jIOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4hOC4t+C4rSBDb25maWdJdGVtIyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncG9zdHByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJlcHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcm9kdWN0aXZlJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfnrqHnkIbphY3nva7pobknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICfkv67mlLnnsbvlrprkuYknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICfphY3nva7pobnnsbsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ+WumuS5iSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICfphY3nva7pobknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAn57G76L+H5ruk5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ+WFiOS7juWIl+ihqOS4remAieaLqeexu++8jOeEtuWQjuWIm+W7uuaWsOeahOmFjee9rumhueOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ+exuyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJ0lUU00g6YWN572u6aG5IOaJuemHj+aTjeS9nCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAn6YOo572y54q25oCBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAn5LqL5Lu254q25oCBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJ+mTvuaOpeWIsOWFtuS7lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAn5peg5pWI55qE6YWN572u6aG557yW5Y+377yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJ+WwhuimgemTvuaOpeeahOWPpuWkluS4gOS4qumFjee9rumhuee8luWPt+OAgic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJ+S9oOecn+eahOaDs+imgeWIoOmZpOi/meS4qumFjee9rumhueWQlz8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAn5Li66L+Z5Liq6YWN572u6aG55ZG95ZCNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzJ30gPQogICAgICAgICfnvJblj7fkuLoocyk6JXPnmoTphY3nva7pobnlt7Lnu4/kvb/nlKjkuobmraTlkI3lrZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSd9ID0gJ+mDqOe9sueKtuaAgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCBTdGF0ZSd9ID0gJ+aVhemanOeKtuaAgSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3Rvcnkgb2YgQ29uZmlnIEl0ZW06ICVzJ30gPSAn6YWN572u6aG577yaJXMg55qE5Y6G5Y+y5L+h5oGvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICfkuIrkuIvmloforr7nva4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW1zIHBlciBwYWdlJ30gPSAn5q+P6aG16YWN572u6aG55Liq5pWwJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBnZW5lcmljIElUU00gQ29uZmlndXJhdGlvbiBJdGVtIHRhYmxlJ30gPSAn5LiA5Liq6YCa55So55qESVRTTemFjee9rumhueihqOagvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIFR5cGUnfSA9ICfpg6jnvbLnirbmgIHnsbvlnosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ID0gJ+W9k+WJjeeahOaVhemanOeKtuaAgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlIFR5cGUnfSA9ICflvZPliY3nmoTmlYXpmpznirbmgIHnsbvlnosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBjaGFuZ2VkJ30gPSAn5pyA5ZCO5L+u5pS5JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgTmV3IFRlbXBsYXRlJ30gPSAn5Yib5bu65paw5qih5p2/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1biBTZWFyY2gnfSA9ICfmkJzntKInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAn5ZCM5pe25pCc57Si5Lul5YmN55qE54mI5pys5ZCXPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJ+mFjee9rumhuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24nfSA9ICfphY3nva7pobnkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gPSAn5b2T5YmN55qE6YOo572y54q25oCBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ+acgOWQjuS/ruaUueS6uic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ+ehruWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAn5pi+56S65LiA5Liq54mI5pysJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn5pi+56S65omA5pyJ54mI5pysJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICfniYjmnKzmlYXpmpznirbmgIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAn54mI5pys6YOo572y54q25oCBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAn54mI5pys5Y+3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICfphY3nva7pobnniYjmnKzor6bmg4UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICflsZ7mgKcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICfmsqHmnInnsbvnmoTorr/pl67mnYPpmZDvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJ0lUU03phY3nva7pobnmpoLop4gnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJ30gPSAn5rKh5pyJ5oyH5a6a6YWN572u6aG5SUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICfmgqjoh7PlsJHpnIDopoHkuIDkuKrpgInlrprnmoTphY3nva7pobnvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICfkvaDmsqHmnInmraTphY3nva7pobnnmoTlhpnmnYPpmZDvvJolc+OAgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAn5Zyo5pWw5o2u5bqT5Lit5om+5LiN5Yiw6YWN572u6aG54oCcJXPigJ3vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY29uZmlnaXRlbSBJRCAlcyEnfSA9ICfml6Dms5XliKDpmaTphY3nva7poblJRCAlc++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAn5om+5LiN5Yiw6YWN572u6aG5SUQlc+eahOeJiOacrO+8gSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCwgRHVwbGljYXRlSUQgb3IgQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICfmsqHmnInmjIflrprphY3nva7poblJROOAgUR1cGxpY2F0ZUlE5oiWQ2xhc3NJRO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAn5rKh5pyJ6K6/6Zeu5p2D6ZmQ77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJ+ayoeacieexuyAlc+eahOWumuS5ie+8gSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICfkuI3og73mmL7npLrljoblj7Lkv6Hmga/vvIzlm6DkuLrmsqHmnInmjIflrprphY3nva7poblJRO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuISd9ID0gJ+aXoOazleaYvuekuuWOhuWPsuiusOW9le+8jOWboOS4uuayoeacieiuv+mXruadg+mZkO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDSUhpc3Rvcnk6Oid9ID0gJ+mFjee9rumhueWOhuWPsjo6JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJ30gPSAn5rKh5pyJ5oyH5a6a6YWN572u6aG5SUTmiJbniYjmnKxJRO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3Qgc2hvdyBjb25maWcgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICfml6Dms5XmmL7npLrphY3nva7pobnvvIzlm6DkuLrmsqHmnInorr/pl67mnYPpmZDvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnSXRlbUlEICVzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnfSA9ICflnKjmlbDmja7lupPkuK3mib7kuI3liLDphY3nva7poblJRCAlc++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydWZXJzaW9uSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJ+WcqOaVsOaNruW6k+S4reaJvuS4jeWIsOeJiOacrElEICVz77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfphY3nva7pobknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJ+aJk+WNsOS6uu+8miVzIO+8jOaJk+WNsOaXpeacn++8miVzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENsYXNzSUQhJ30gPSAn5peg5pWI55qE57G7SUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnfSA9ICfmsqHmnInmjIflrprnsbtJRO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJ+ayoeaciei/meS4quaMh+Wumuexu+eahOiuv+mXruadg+mZkO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAn5peg57uT5p6c77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJ30gPSAn6YWN572u6aG55pCc57Si57uT5p6cJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJ30gPQogICAgICAgICfml6Dms5XmmL7npLrphY3nva7pobnvvIzlm6DkuLrmsqHmnInnu5nlrprphY3nva7pobnnmoTorr/pl67mnYPpmZDvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ+mFjee9rumhuemDqOe9sueKtuaAgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ+mFjee9rumhueaVhemanOeKtuaAgSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvT2JqZWN0QmFja2VuZC9JVFNNQ29uZmlnSXRlbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICfljZXkuKrlhYPntKDnmoTmnIDlpKfmlbDph48nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAn56m65a2X5q616KGo56S65L+d5oyB5b2T5YmN5YC8JzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kZWwnfSA9ICflnovlj7cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VyaWFsIE51bWJlcid9ID0gJ+W6j+WIl+WPtyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDUFUnfSA9ICdDUFUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmFtJ30gPSAn5YaF5a2YJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmQgRGlzayd9ID0gJ+ehrOebmCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXBhY2l0eSd9ID0gJ+WuuemHjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrIEFkYXB0ZXInfSA9ICfnvZHljaEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVAgb3ZlciBESENQJ30gPSAn5LuOREhDUOiOt+WPlklQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIEFkZHJlc3MnfSA9ICdJUOWcsOWdgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcmFwaGljIEFkYXB0ZXInfSA9ICfmmL7ljaEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXIgRXF1aXBtZW50J30gPSAn5YW25a6D6K6+5aSHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ID0gJ+S/neS/rui/h+acn+aXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0YWxsIERhdGUnfSA9ICflronoo4Xml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMSd9ID0gJ+eUteivnTEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGhvbmUgMid9ID0gJ+eUteivnTInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRS1NYWlsJ30gPSAnRS1NYWlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZHJlc3MnfSA9ICflnLDlnYAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGRyZXNzJ30gPSAn572R57uc5Zyw5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Ym5ldCBNYXNrJ30gPSAn5a2Q572R5o6p56CBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dhdGV3YXknfSA9ICfnvZHlhbMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGljZW5jZSBUeXBlJ30gPSAn6K645Y+v57G75YirJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgS2V5J30gPSAn6K645Y+v5a+G6ZKlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1F1YW50aXR5J30gPSAn5pWw6YePJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyYXRpb24gRGF0ZSd9ID0gJ+i/h+acn+aXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWRpYSd9ID0gJ+S7i+i0qCc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXB1dGVyJ30gPSAn6K6h566X5py6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hhcmR3YXJlJ30gPSAn56Gs5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsnfSA9ICfnvZHnu5wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29mdHdhcmUnfSA9ICfova/ku7YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwaXJlZCd9ID0gJ+W3sui/h+acnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYWludGVuYW5jZSd9ID0gJ+e7tOaKpCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaWxvdCd9ID0gJ+ivlemqjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkJ30gPSAn5bey6K6h5YiSJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpcid9ID0gJ+S/ruWkjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXRpcmVkJ30gPSAn5oql5bqfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jldmlldyd9ID0gJ+WkjeWuoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZXN0L1FBJ30gPSAn5rWL6K+VL+WTgei0qOS/neivgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfnrJTorrDmnKwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ+WPsOW8j+eUteiEkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAn5pyN5Yqh5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAn5YW25a6DJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfmmL7npLrlmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ+aJk+WNsOacuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICfkuqTmjaLmnLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAn6Lev55Sx5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiDml6Dnur/orr/pl67ngrknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAn5a6J5YWo6K6+5aSHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICflpIfku73orr7lpIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICfpvKDmoIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICfplK7nm5gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAn54Wn55u45py6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ+aKleW9seS7qic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ+iwg+ino+iwg+WZqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQeWNoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnVVNCIOiuvuWkhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICflnZ7nq5knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ+aJq+aPj+S7qic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ+Wkp+WOpic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ+alvOWxgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAn5oi/6Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICfmnLrmnrYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAn5bel5L2c6Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ+aPkuW6pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lU6K6+5pa9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ+WxgOWfn+e9kSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAn5peg57q/572R57ucJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAn55S16K+d5YWs5Y+4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJ0dTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICflrqLmiLfnq6/lupTnlKjnqIvluo8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ+S4remXtOS7tic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICfmnI3liqHlmajlupTnlKjnqIvluo8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAn5a6i5oi35pON5L2c57O757ufJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ+acjeWKoeWZqOaTjeS9nOezu+e7nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAn566h55CG5bel5YW3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ+eUqOaIt+W3peWFtyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ+W1jOWFpeW8jyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ+WNleS4gOiuuOWPryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ+avj+S4queUqOaItyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAn5q+P5Liq5aSE55CG5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICfmr4/kuKrmnI3liqHlmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfmr4/kuKroioLngrknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfmibnph4/mjojmnYMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn5LyB5Lia6K645Y+vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn5byA5Y+R6K645Y+vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfmvJTnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAn5pe26Ze06ZmQ5Yi2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAn5YWN6LS56L2v5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAn5byA5rqQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ+aXoOmZkOWItueahCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ+ezu+e7n+euoeeQhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAn5qOA5p+l5piv5ZCm5Li65ZSv5LiA5ZCN56ew55qE6IyD5Zu05piv5LuF5ZyoXCdjbGFzc1wn77yI6YWN572u6aG557G777yJ5YaF6L+Y5pivXCdnbG9iYWxcJyjlhajlsYAp77yM5bCx5piv5Zyo5p+l5om+6YeN5aSN6YWN572u6aG55ZCN56ew5pe255qE6IyD5Zu044CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ+mFjee9rumhuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAn5re75Yqg6YWN572u6aG544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAn57yW6L6R6YWN572u6aG544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLnlKjkuo7orrDlvZXphY3nva7pobnkuovku7bliLDljoblj7LnmoTmqKHlnZfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICfphY3nva7pobnljoblj7LjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAn5omT5Y2w6YWN572u6aG544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAn6YWN572u6aG56K+m5oOF44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICdDb25maWdJdGVtTnVtYmVy77yI6YWN572u6aG557yW5Y+377yJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBMaW1pdCd9ID0gJ+mFjee9rumhuemZkOWItic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0gbGltaXQgcGVyIHBhZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBEYXRhYmFzZS4nfSA9ICfphY3nva7nrqHnkIbmlbDmja7lupPjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgbW9kdWxlLid9ID0gJ+mFjee9rumhueaJueWkhOeQhuaooeWdl+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gc2VhcmNoIGJhY2tlbmQgcm91dGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLnmoTphY3nva7pobnmkJzntKLlkI7nq6/ot6/nlLHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGRlZmluaXRpb25zIGZvciBDb25maWd1cmF0aW9uIEl0ZW1zLid9ID0gJ+WIm+W7uuWSjOeuoeeQhumFjee9rumhueWumuS5iSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAn5a6a5LmJ6ZO+5o6l5a+56LGh5bCP6YOo5Lu2KExpbmtPYmplY3Q6OlZpZXdNb2RlID0gXCJjb21wbGV4XCIp6K6+572u5oyJ6ZKu5Lit55qE5pON5L2c44CC6K+35rOo5oSP77yM6L+Z5Lqb5pON5L2c5b+F6aG75bey57uP5Zyo5Lul5LiLSlPlkoxDU1Pmlofku7bkuK3ms6jlhozvvJpDb3JlLkFsbG9jYXRpb25MaXN0LmNzc+OAgUNvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanPjgIEgQ29yZS5VSS5UYWJsZS5Tb3J0Lmpz44CBQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanPlkoxDb3JlLkFnZW50LkxpbmtPYmplY3QuanPjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJ+WumuS5ieacieadg+mZkOeahOe7hOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5L2/55So6YCa55So5o6l5Y+j5Yib5bu6SVRTTemFjee9rumhueaJgOmcgOeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5L2/55So6YCa55So5o6l5Y+j5Yig6ZmkSVRTTemFjee9rumhueaJgOmcgOeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGdldCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5L2/55So6YCa55So5o6l5Y+j6I635Y+WSVRTTemFjee9rumhueaJgOmcgOeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5L2/55So6YCa55So5o6l5Y+j5pCc57SiSVRTTemFjee9rumhueaJgOmcgOeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5L2/55So6YCa55So5o6l5Y+j5pu05pawSVRTTemFjee9rumhueaJgOmcgOeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGxpc3QuJ30gPQogICAgICAgICflrprkuYnmmL7npLrphY3nva7pobnliJfooajnroDmtIHop4blm77nmoTmpoLop4jmqKHlnZfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyByZWd1bGFyIGV4cHJlc3Npb25zIGluZGl2aWR1YWxseSBmb3IgZWFjaCBDb25maWdJdGVtIGNsYXNzIHRvIGNoZWNrIHRoZSBDb25maWdJdGVtIG5hbWUgYW5kIHRvIHNob3cgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlcy4nfSA9CiAgICAgICAgJ+S4uuavj+S4qumFjee9rumhueexu+WumuS5ieeLrOeri+eahOato+WImeihqOi+vuW8j++8jOS7peajgOafpemFjee9rumhueWQjeensOW5tuaYvuekuuebuOW6lOeahOmUmeivr+a2iOaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgXCdJVFNNQ29uZmlnSXRlbVwnLid9ID0KICAgICAgICAn5a6a5LmJXCdJVFNNQ29uZmlnSXRlbVwn57G755qE6buY6K6k5a2Q5a+56LGh44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgQ0kgZGVmaW5pdGlvbiBlZGl0b3IgaW4gdGhlIGFkbWluIGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieWcqOezu+e7n+euoeeQhumdouadv+S4reS/ruaUuemFjee9rumhueWumuS5ieeahOe8lui+keWZqOeahOihjOaVsOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcmRlciBvZiBpbmNpZGVudCBzdGF0ZXMgZnJvbSBoaWdoIChlLmcuIGNyaWNpdGFsKSB0byBsb3cgKGUuZy4gZnVuY3Rpb25hbCkuJ30gPQogICAgICAgICflrprkuYnmlYXpmpznirbmgIHku47pq5jvvIjlpoLntKfmgKXvvInliLDkvY7vvIjlpoLmraPluLjvvInnmoTpobrluo/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgcmVsZXZhbnQgZGVwbG95bWVudCBzdGF0ZXMgd2hlcmUgbGlua2VkIHRpY2tldHMgY2FuIGFmZmVjdCB0aGUgc3RhdHVzIG9mIGEgQ0kuJ30gPQogICAgICAgICflrprkuYnlhbPogZTnmoTpg6jnvbLnirbmgIHvvIzljbPpk77mjqXnmoTlt6XljZXlj6/ku6XlvbHlk43phY3nva7pobnnirbmgIHnmoTmg4XlhrXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2VhcmNoIGxpbWl0IGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBzY3JlZW4uJ30gPQogICAgICAgICflrprkuYlBZ2VudElUU01Db25maWdJdGVt77yI5pyN5Yqh5Lq65ZGY6YWN572u6aG577yJ56qX5Y+j55qE5pCc57Si6ZmQ5Yi2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAn5a6a5LmJQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaO+8iOacjeWKoeS6uuWRmOmFjee9rumhueaQnOe0ou+8ieeql+WPo+eahOaQnOe0oumZkOWItic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gTm90ZTogQ2xhc3MgY29sdW1uIGlzIGFsd2F5cyBhdmFpbGFibGUgaWYgZmlsdGVyIFwnQWxsXCcgaXMgc2VsZWN0ZWQuJ30gPQogICAgICAgICflrprkuYnphY3nva7pobnmpoLop4jmmL7npLrnmoTlrZfmrrXjgILov5nkuKrpgInpobnkuI3kvJrlvbHlk43lrZfmrrXnmoTkvY3nva7jgILms6jmhI/vvJrlpoLmnpzpgInmi6nigJzlhajpg6jigJ3vvIzliJnigJxDbGFzc++8iOexu++8ieKAneWtl+auteaAu+aYr+S8muaYvuekuuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICflrprkuYnphY3nva7pobnmkJzntKLkuK3mmL7npLrnmoTlrZfmrrXjgILov5nkuKrpgInpobnkuI3kvJrlvbHlk43lrZfmrrXnmoTkvY3nva7jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAn5a6a5LmJ6YWN572u6aG55qaC6KeI6KeG5Zu+5Lit5oyJ6YWN572u6aG557G75YiG57G75pi+56S655qE5a2X5q6144CC5q+P5Liq5p2h55uu5Z2H6ZyA5Lul57G75ZCN5Li65YmN57yA5YaN5Yqg5LiK5Y+M5YaS5Y+377yI5aaC6K6h566X5py6OjrvvInjgILmnInkuIDkupvphY3nva7pobnlsZ7mgKfmmK/miYDmnInphY3nva7pobnpg73mnInnmoTvvIjkvovlpoLvvIzlr7nkuo7orqHnrpfmnLrnsbvvvJrorqHnrpfmnLo6OuWQjeensOOAgeiuoeeul+acujo6Q3VyRGVwbFN0YXRl5b2T5YmN6YOo572y54q25oCB44CB6K6h566X5py6OjpDcmVhdGVUaW1l5Yib5bu65pe26Ze077yJ44CC6KaB5pi+56S65Zyo6YWN572u6aG55a6a5LmJ5Lit5a6a5LmJ55qE54us54m555qE6YWN572u6aG55bGe5oCn77yM5b+F6aG75L2/55So5LiL6Z2i55qE5pa55qGI77yI5L6L5aaC77ya5a+55LqO6K6h566X5py657G777ya6K6h566X5py6Ojrnoaznm5g6OjHjgIHorqHnrpfmnLo6OuehrOebmDo65a656YePOjox44CB6K6h566X5py6Ojrnoaznm5g6OjLjgIHorqHnrpfmnLo6OuehrOebmDo6Muiuoeeul+acujo656Gs55uYOjoy77yJ44CC5aaC5p6c5LiA5Liq6YWN572u6aG557G75rKh5pyJ5p2h55uu5a2Y5Zyo77yM5YiZ5L2/55So5ZyoSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnPkuK3orr7nva7nmoTpu5jorqTlrZfmrrXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24gYXMgZGVmaW5lZCBpbiB0aGUgc2V0dGluZyBJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1ucy4nfSA9CiAgICAgICAgJ+WumuS5ieaMiemFjee9rumhueexu+WIhuexu+eahOmFjee9rumhueaQnOe0oue7k+aenOS4reaYvuekuueahOWtl+auteOAguavj+S4quadoeebruWdh+mcgOS7peexu+WQjeS4uuWJjee8gOWGjeWKoOS4iuWPjOWGkuWPt++8iOWmguiuoeeul+acujo677yJ44CC5pyJ5LiA5Lqb6YWN572u6aG55bGe5oCn5piv5omA5pyJ6YWN572u6aG56YO95pyJ55qE77yI5L6L5aaC77yM5a+55LqO6K6h566X5py657G777ya6K6h566X5py6OjrlkI3np7DjgIHorqHnrpfmnLo6OkN1ckRlcGxTdGF0ZeW9k+WJjemDqOe9sueKtuaAgeOAgeiuoeeul+acujo6Q3JlYXRlVGltZeWIm+W7uuaXtumXtO+8ieOAguimgeaYvuekuuWcqOmFjee9rumhueWumuS5ieS4reWumuS5ieeahOeLrOeJueeahOmFjee9rumhueWxnuaAp++8jOW/hemhu+S9v+eUqOS4i+mdoueahOaWueahiO+8iOS+i+Wmgu+8muWvueS6juiuoeeul+acuuexu++8muiuoeeul+acujo656Gs55uYOjox44CB6K6h566X5py6Ojrnoaznm5g6OuWuuemHjzo6MeOAgeiuoeeul+acujo656Gs55uYOjoy44CB6K6h566X5py6Ojrnoaznm5g6OjLorqHnrpfmnLo6OuehrOebmDo6Mu+8ieOAguWmguaenOS4gOS4qumFjee9rumhueexu+ayoeacieadoeebruWtmOWcqO+8jOWImeS9v+eUqOWcqElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5z5Lit6K6+572u55qE6buY6K6k5a2X5q6144CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBsaW5rIHRhYmxlIGNvbXBsZXggdmlldywgZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgY29tbW9uIHRvIGFsbCBDSXMgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcjogQ29tcHV0ZXI6Ok5hbWUsIENvbXB1dGVyOjpDdXJEZXBsU3RhdGUsIENvbXB1dGVyOjpDcmVhdGVUaW1lKS4gVG8gc2hvdyBpbmRpdmlkdWFsIENJLUF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ0ktRGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXIpOiBDb21wdXRlcjo6SGFyZERpc2s6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MTo6Q2FwYWNpdHk6OjEsIENvbXB1dGVyOjpIYXJkRGlzazo6MiwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyOjpDYXBhY2l0eTo6MS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIGEgQ0kgY2xhc3MsIHRoZW4gdGhlIGRlZmF1bHQgY29sdW1ucyBhcmUgc2hvd24uJ30gPQogICAgICAgICflrprkuYnpk77mjqXooajlpI3lkIjop4blm77kuK3mjInphY3nva7pobnnsbvliIbnsbvmmL7npLrnmoTlrZfmrrXjgILmr4/kuKrmnaHnm67lnYfpnIDku6XnsbvlkI3kuLrliY3nvIDlho3liqDkuIrlj4zlhpLlj7fvvIjlpoLorqHnrpfmnLo6Ou+8ieOAguacieS4gOS6m+mFjee9rumhueWxnuaAp+aYr+aJgOaciemFjee9rumhuemDveacieeahO+8iOS+i+Wmgu+8jOWvueS6juiuoeeul+acuuexu++8muiuoeeul+acujo65ZCN56ew44CB6K6h566X5py6OjpDdXJEZXBsU3RhdGXlvZPliY3pg6jnvbLnirbmgIHjgIHorqHnrpfmnLo6OkNyZWF0ZVRpbWXliJvlu7rml7bpl7TvvInjgILopoHmmL7npLrlnKjphY3nva7pobnlrprkuYnkuK3lrprkuYnnmoTni6znibnnmoTphY3nva7pobnlsZ7mgKfvvIzlv4Xpobvkvb/nlKjkuIvpnaLnmoTmlrnmoYjvvIjkvovlpoLvvJrlr7nkuo7orqHnrpfmnLrnsbvvvJrorqHnrpfmnLo6OuehrOebmDo6MeOAgeiuoeeul+acujo656Gs55uYOjrlrrnph486OjHjgIHorqHnrpfmnLo6OuehrOebmDo6MuOAgeiuoeeul+acujo656Gs55uYOjoy6K6h566X5py6Ojrnoaznm5g6OjLvvInjgILlpoLmnpzkuIDkuKrphY3nva7pobnnsbvmsqHmnInmnaHnm67lrZjlnKjvvIzliJnkvb/nlKjlnKhJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1uc+S4reiuvue9rueahOm7mOiupOWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICflrprkuYnlk6rkuIDnsbso5LuO5bel5Y2V6KeS5bqm5ZG95ZCN55qEKemTvuaOpeWPr+S7peW9seWTjeS4gOS4qumTvuaOpeeahOmFjee9rumhueeahOeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgdGlja2V0IGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIGxpbmtlZCBDSS4nfSA9CiAgICAgICAgJ+WumuS5ieWTquS4gOexu+W3peWNleWPr+S7peW9seWTjeS4gOS4qumTvuaOpeeahOmFjee9rumhueeahOeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQ29uZmlndXJhdGlvbiBJdGVtJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3InfSA9ICfpg6jnvbLnirbmgIHnmoTpopzoibInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBDb2xvci4nfSA9ICfpg6jnvbLnirbmgIHnmoTpopzoibLjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlLid9ID0gJ+mDqOe9sueKtuaAgeexu+Wei+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNhYmxlZCd9ID0gJ+W3suemgeeUqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlZCd9ID0gJ+W3suWQr+eUqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIGFjdGlvbiBmZWF0dXJlIGZvciB0aGUgYWdlbnQgZnJvbnRlbmQgdG8gd29yayBvbiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXRlbSBhdCBhIHRpbWUuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlkK/nlKjphY3nva7pobnmibnph4/mk43kvZzlip/og73vvIzlj6/ku6XkuIDmrKHlpITnkIblpJrkuKrphY3nva7pobnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBvbmx5IGZvciB0aGUgbGlzdGVkIGdyb3Vwcy4nfSA9CiAgICAgICAgJ+WPquacieWIl+ihqOS4reeahOe7hOaJjeacieadg+mZkOS9v+eUqOmFjee9rumhueaJuemHj+aTjeS9nOWKn+iDveOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzL2Rpc2FibGVzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIENvbmZpZ0l0ZW1zIGZvciB1bmlxdWUgbmFtZXMuIEJlZm9yZSBlbmFibGluZyB0aGlzIG9wdGlvbiB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc3lzdGVtIGZvciBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIHNjcmlwdCBiaW4vb3Rycy5JVFNNQ29uZmlnSXRlbUxpc3REdXBsaWNhdGVzLnBsLid9ID0KICAgICAgICAn5ZCv55SoL+emgeeUqOajgOafpemFjee9rumhueWUr+S4gOWQjeensOWKn+iDveOAguWcqOWQr+eUqOi/meS4qumAiemhueWJje+8jOaCqOW6lOivpeajgOafpeezu+e7n+S4reaYr+WQpuW3sue7j+WtmOWcqOmHjeWQjeeahOmFjee9rumhue+8jOaCqOWPr+S7peS9v+eUqOi/meS4quiEmuacrOadpeajgOafpemHjeWQjeaDheWGte+8mmJpbi9vdHJzLklUU01Db25maWdJdGVtTGlzdER1cGxpY2F0ZXMucGzjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlbnQgbW9kdWxlIHRvIHNldCBjb25maWdpdGVtLXN0YXR1cyBvbiB0aWNrZXQtY29uZmlnaXRlbS1saW5rLid9ID0KICAgICAgICAn5Zyo5bel5Y2VLemFjee9rumhueeahOmTvuaOpeS4reiuvue9rumFjee9rumhuS3nirbmgIHnmoTkuovku7bmqKHlnZfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICdJVFNN6YWN572u6aG55qaC6KeI44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY2xhc3MuJ30gPSAn55So5LqO5qOA5p+l6YWN572u6aG557G755qE57uE5p2D6ZmQ55qE5qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgZ3JvdXAgcmVzcG9uc2libGUgZm9yIGEgY29uZmlndXJhdGlvbiBpdGVtLid9ID0KICAgICAgICAn55So5LqO5qOA5p+l6YWN572u6aG555qE57uE5p2D6ZmQ55qE5qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBnZW5lcmF0ZSBJVFNNIGNvbmZpZyBpdGVtIHN0YXRpc3RpY3MuJ30gPSAn55So5LqO55Sf5oiQSVRTTemFjee9rumhuee7n+iuoeeahOaooeWdlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICfnlKjkuo7lr7zlhaUv5a+85Ye65qih5Z2X55qE5a+56LGh5ZCO56uv5qih5Z2X5rOo5YaM44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ+amguiniOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouWBj+Wlveiuvue9ruinhuWbvuS4reeUqOS6jumDqOe9sueKtuaAgeminOiJsueahOWPguaVsOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouWBj+Wlveiuvue9ruinhuWbvuS4reeUqOS6jumDqOe9sueKtuaAgeeahOWPguaVsOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfnm67lvZXlsZ7mgKfmoLfkvost5p2D6ZmQ57uE55qE5Y+C5pWw44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBwYWdlcyAoaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXJlIHNob3duKS4nfSA9CiAgICAgICAgJ+aYvuekuumFjee9rumhueeahOmhtemdouWPguaVsOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i5L2/55SoSVRTTemFjee9rumhueeql+WPo+mcgOimgeeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNlYXJjaCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouS9v+eUqElUU03phY3nva7pobnmkJzntKLnqpflj6PpnIDopoHnmoTmnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i5L2/55SoSVRTTemFjee9rumhueivpuaDheeql+WPo+mcgOimgeeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdouS9v+eUqOa3u+WKoElUU03phY3nva7pobnnqpflj6PpnIDopoHnmoTmnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBlZGl0IElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i5L2/55So57yW6L6RSVRTTemFjee9rumhueeql+WPo+mcgOimgeeahOadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLkvb/nlKhJVFNN6YWN572u6aG55Y6G5Y+y56qX5Y+j6ZyA6KaB55qE5p2D6ZmQ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgcHJpbnQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLkvb/nlKhJVFNN6YWN572u6aG55omT5Y2w56qX5Y+j6ZyA6KaB55qE5p2D6ZmQ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNvbmZpZyBpdGVtcy4nfSA9ICfliKDpmaTphY3nva7pobnmiYDpnIDnmoTmnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGNvbmZpZyBpdGVtcy4nfSA9ICfmkJzntKLphY3nva7pobnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRC5Db25maWdJdGVtQ2xhc3NJRC5Db3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1Lid9ID0KICAgICAgICAn6YCJ5oup6YWN572u6aG55Y+356CB55Sf5oiQ5Zmo5qih5Z2X44CC4oCcQXV0b0luY3JlbWVudOiHquWKqOWinumHj+KAneS9v+eUqOezu+e7n0lE44CB6YWN572u6aG557G7SUTlkozorqHmlbDlmajmnaXlop7liqDphY3nva7pobnlj7fvvIzmoLzlvI/kuLrvvJrns7vnu59JRC7phY3nva7pobnnsbtJRC7orqHmlbDlmajvvIzlpoIxMjA1MDAwMDA044CBMTIwNTAwMDAwNeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAn5b2T5LiA5Liq5bel5Y2V6ZO+5o6l5Yiw5LiA5Liq6YWN572u6aG55pe26Ieq5Yqo6K6+572u6L+Z5Liq6YWN572u6aG555qE5pWF6Zqc54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i6YWN572u6aG55om56YeP5pON5L2c56qX5Y+j6K6+572u6YOo572y54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueaJuemHj+aTjeS9nOeql+WPo+iuvue9ruS6i+S7tueKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueivpuaDheinhuWbvuS4re+8jOWcqOiPnOWNleS4reaYvuekuuS4gOS4quWFgeiuuOmTvuaOpemFjee9rumhueWIsOWPpuS4gOWvueixoeeahOmTvuaOpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueamguiniOinhuWbvuS4re+8jOWcqOiPnOWNleS4reaYvuekuuS4gOS4quWFgeiuuOiuv+mXrumFjee9rumhueWOhuWPsueahOmTvuaOpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLphY3nva7pobnor6bmg4Xop4blm77kuK3vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrlhYHorrjorr/pl67phY3nva7pobnljoblj7LnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLphY3nva7pobnor6bmg4Xop4blm77kuK3vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrliKDpmaTphY3nva7pobnnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLphY3nva7pobnmpoLop4jop4blm77kuK3vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrlpI3liLbphY3nva7pobnnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i6YWN572u6aG56K+m5oOF6KeG5Zu+5Lit77yM5Zyo6I+c5Y2V5Lit5pi+56S65LiA5Liq5aSN5Yi26YWN572u6aG555qE6ZO+5o6l44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLphY3nva7pobnor6bmg4Xop4blm77kuK3vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrnvJbovpHphY3nva7pobnnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueivpuaDheinhuWbvuS4re+8jOWcqOiPnOWNleS4reaYvuekuuS4gOS4qui/lOWbnumTvuaOpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueivpuaDheinhuWbvuS4re+8jOWcqOiPnOWNleS4reaYvuekuuS4gOS4quaJk+WNsOmFjee9rumhueeahOmTvuaOpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdoumFjee9rumhueamguiniOinhuWbvuS4re+8jOWcqOiPnOWNleS4reaYvuekuuS4gOS4quafpeeci+mFjee9rumhueivpuaDheeahOmTvuaOpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5pi+56S66YWN572u6aG55Y6G5Y+y77yI5YCS5bqP77yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICfphY3nva7pobnmoIfor4bnrKbvvIzlpoJDb25maWdJdGVtI+OAgU15Q29uZmlnSXRlbSPvvIzpu5jorqTmmK9Db25maWdJdGVtI+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbGFzcyd9ID0gJ+exuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydnbG9iYWwnfSA9ICflhajlsYAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncG9zdHByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJlcHJvZHVjdGl2ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydwcm9kdWN0aXZlJ30gPSAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX1RXX0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNvbmZpZ0l0ZW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfnrqHnkIbphY3nva7poIUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGNsYXNzIGRlZmluaXRpb24nfSA9ICfkv67mlLnpoZ7lrprnvqknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0gQ2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbid9ID0gJ+Wumue+qSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICfphY3nva7poIUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBDbGFzc2VzJ30gPSAn6YGO5r++6aGeJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLid9ID0gJ+WFiOW+nuWIl+ihqOS4remBuOaTh+mhnuWIpe+8jOeEtuW+jOW7uueri+aWsOeahOmFjee9rumgheOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyd9ID0gJ+mhnuWIpSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ29uZmlnSXRlbSBCdWxrIEFjdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IHN0YXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdG8gYW5vdGhlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIENvbmZpZ3VyYXRpb24gSXRlbSBudW1iZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBudW1iZXIgb2YgYW5vdGhlciBDb25maWd1cmF0aW9uIEl0ZW0gdG8gbGluayB3aXRoLid9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbURlbGV0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfngrrpgJnlgIvphY3nva7poIXlkb3lkI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIE51bWJlcihzKTogJXMnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlJ30gPSAn6YOo572y54uA5oWLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2lkZW50IFN0YXRlJ30gPSAn5pWF6Zqc54uA5oWLJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGV4dCBTZXR0aW5ncyd9ID0gJ+S4iuS4i+aWh+ioree9ric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbXMgcGVyIHBhZ2UnfSA9ICfmr4/poIHphY3nva7poIXlgIvmlbgnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwbG95bWVudCBTdGF0ZSBUeXBlJ30gPSAn6YOo572y54uA5oWL6aGe5Z6LJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSA9ICfnlbbliY3nmoTmlYXpmpzni4DmhYsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSBUeXBlJ30gPSAn55W25YmN55qE5pWF6Zqc54uA5oWL6aGe5Z6LJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ+acgOW+jOS/ruaUuSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIE5ldyBUZW1wbGF0ZSd9ID0gJ+WJteW7uuaooeadvyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdW4gU2VhcmNoJ30gPSAn5pCc57SiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ+WQjOaZguaQnOe0ouS7peWJjeeahOeJiOacrD8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIEl0ZW0nfSA9ICfphY3nva7poIUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uJ30gPSAn6YWN572u6aCF5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ID0gJ+eVtuWJjeeahOmDqOe9sueLgOaFiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICfmnIDlvozkv67mlLnmlrwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IG9uZSB2ZXJzaW9uJ30gPSAn6aGv56S65LiA5YCL54mI5pysJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgYWxsIHZlcnNpb25zJ30gPSAn6aGv56S65omA5pyJ54mI5pysJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gSW5jaWRlbnQgU3RhdGUnfSA9ICfniYjmnKzmlYXpmpzni4DmhYsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlJ30gPSAn54mI5pys6YOo5bGs54uA5oWLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb24gTnVtYmVyJ30gPSAn54mI5pys6Jmf56K8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBWZXJzaW9uIERldGFpbHMnfSA9ICfphY3nva7poIXniYjmnKzoqbPmg4UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvcGVydHknfSA9ICflsazmgKcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGsucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgYXQgbGVhc3Qgb25lIHNlbGVjdGVkIENvbmZpZ3VyYXRpb24gSXRlbSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGRvblwndCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbTogJXMuJ30gPQogICAgICAgICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1EZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB2ZXJzaW9uIGZvdW5kIGZvciBDb25maWdJdGVtSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIG5vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0lIaXN0b3J5OjonfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW0nfSA9ICfphY3nva7poIUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJpbnRlZCBieSAlcyBhdCAlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBDbGFzc0lEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDbGFzc0lEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBSZXN1bHQhJ30gPSAn5rKS5pyJ57WQ5p6cISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cyd9ID0gJ+mFjee9rumgheebruaQnOWwi+e1kOaenCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfphY3nva7poIXpg6jnvbLni4DmhYsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfphY3nva7poIXmlYXpmpzni4DmhYsnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAn5q2k5YWD57Sg55qE5pyA5aSn5pW46YePJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ+epuuWtl+auteihqOekuueVtuWJjeWAvOiiq+S/neWtmCc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGVsJ30gPSAn5Z6L6JmfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcmlhbCBOdW1iZXInfSA9ICfluo/liJfomZ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVJ30gPSAnQ1BVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhbSd9ID0gJ+WGheWtmCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkIERpc2snfSA9ICfnoaznop8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FwYWNpdHknfSA9ICflrrnph48nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV0d29yayBBZGFwdGVyJ30gPSAn57ay6Lev5Y2hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lQIG92ZXIgREhDUCd9ID0gJ+W+nkRIQ1Dlj5blvpdJUCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJUCBBZGRyZXNzJ30gPSAnSVDkvY3lnYAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JhcGhpYyBBZGFwdGVyJ30gPSAn6aGv56S65Y2hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyIEVxdWlwbWVudCd9ID0gJ+WFtuWug+ioreWCmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSA9ICfkv53ppIrlpLHmlYjml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5zdGFsbCBEYXRlJ30gPSAn5a6J6KOF5pel5pyfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDEnfSA9ICfpm7voqbExJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bob25lIDInfSA9ICfpm7voqbEyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0UtTWFpbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRyZXNzJ30gPSAn5Zyw5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldHdvcmsgQWRkcmVzcyd9ID0gJ+e2sui3r+S9jeWdgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWJuZXQgTWFzayd9ID0gJ+WtkOe2sui3r+mBrueFpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHYXRld2F5J30gPSAn6ZaY6YGTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpY2VuY2UgVHlwZSd9ID0gJ+ioseWPr+mhnuWIqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaWNlbmNlIEtleSd9ID0gJ+ioseWPr+WvhumRsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWFudGl0eSd9ID0gJ+aVuOmHjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBpcmF0aW9uIERhdGUnfSA9ICflpLHmlYjml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVkaWEnfSA9ICfku4vos6onOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21wdXRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIYXJkd2FyZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXR3b3JrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvZnR3YXJlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cGlyZWQnfSA9ICfliLDmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFpbnRlbmFuY2UnfSA9ICfntq3orbcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGlsb3QnfSA9ICfoqabpqZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCd9ID0gJ+W3suioiOWKgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXInfSA9ICfkv67lvqknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV0aXJlZCd9ID0gJ+WgseW7oic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcnfSA9ICfopIflr6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVzdC9RQSd9ID0gJ+a1i+ippi9RQSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXB0b3AnfSA9ICfnrYboqJjmnKwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVza3RvcCd9ID0gJ+ahjOS4iuWei+mbu+iFpic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQREEnfSA9ICdQREEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmVyJ30gPSAn5pyN5YuZ5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAn5YW25a6DJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbml0b3InfSA9ICfpoa/npLrlmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnRlcid9ID0gJ+aJk+WNsOapnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTd2l0Y2gnfSA9ICfkuqTmj5vlmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm91dGVyJ30gPSAn6Lev55Sx5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dMQU4gQWNjZXNzIFBvaW50J30gPSAnV0xBTiDnhKHnt5rln7rlnLDlj7AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VjdXJpdHkgRGV2aWNlJ30gPSAn5a6J5YWo6Kit5YKZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2t1cCBEZXZpY2UnfSA9ICflgpnku73oqK3lgpknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW91c2UnfSA9ICfmu5HpvKAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnS2V5Ym9hcmQnfSA9ICfpjbXnm6QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FtZXJhJ30gPSAn54Wn55u45qmfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlYW1lcid9ID0gJ+aKleW9seWEgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RlbSd9ID0gJ+iqv+ino+iqv+WZqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQQ01DSUEgQ2FyZCd9ID0gJ1BDTUNJQeWNoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVU0IgRGV2aWNlJ30gPSAnVVNCIOioreWCmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2NraW5nIFN0YXRpb24nfSA9ICfloaLnq5knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2Nhbm5lcid9ID0gJ+aOg+aPj+WEgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWlsZGluZyd9ID0gJ+Wkp+W7iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGbG9vcid9ID0gJ+aok+WxpCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSb29tJ30gPSAn5oi/6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JhY2snfSA9ICfmqZ/mnrYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya3BsYWNlJ30gPSAn5bel5L2c6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dGxldCd9ID0gJ+aPkuW6pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBGYWNpbGl0eSd9ID0gJ0lU6Kit5pa9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xBTid9ID0gJ+WNgOWfn+e2sui3ryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXTEFOJ30gPSAn54Sh57ea57ay6LevJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbGNvJ30gPSAn6Zu76Kmx5YWs5Y+4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dTTSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGllbnQgQXBwbGljYXRpb24nfSA9ICflrqLmiLfnq6/mh4nnlKjnqIvluo8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlkZGxld2FyZSd9ID0gJ+S4remWk+S7tic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSA9ICfmnI3li5nlmajmh4nnlKjnqIvluo8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IE9TJ30gPSAn5a6i5oi35pON5L2c57O757WxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZlciBPUyd9ID0gJ+acjeWLmeWZqOaTjeS9nOezu+e1sSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBUb29sJ30gPSAn566h55CG5bel5YW3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZXIgVG9vbCd9ID0gJ+eUqOaItuW3peWFtyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWJlZGRlZCd9ID0gJ+W1jOWFpeW8jyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaW5nbGUgTGljZW5jZSd9ID0gJ+WWruS4gOioseWPryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgVXNlcid9ID0gJ+avj+WAi+eUqOaItic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXIgUHJvY2Vzc29yJ30gPSAn5q+P5YCL6JmV55CG5ZmoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlciBTZXJ2ZXInfSA9ICfmr4/lgIvmnI3li5nlmagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyIE5vZGUnfSA9ICfmr4/lgIvnr4Dpu54nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVm9sdW1lIExpY2VuY2UnfSA9ICfmibnph4/mjojmrIonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gPSAn5LyB5qWt5Z+354WnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldmVsb3BlciBMaWNlbmNlJ30gPSAn6ZaL55m86Kix5Y+vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW8nfSA9ICfmvJTnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSBSZXN0cmljdGVkJ30gPSAn5pmC6ZaT6ZmQ5Yi2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZWV3YXJlJ30gPSAn5YWN6LK76Luf5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gU291cmNlJ30gPSAn6ZaL5rqQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VubGltaXRlZCd9ID0gJ+eEoemZkOWItueahCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBvbmx5IHdpdGhpbiB0aGUgc2FtZSBDb25maWdJdGVtIGNsYXNzIChcJ2NsYXNzXCcpIG9yIGdsb2JhbGx5IChcJ2dsb2JhbFwnKSwgd2hpY2ggbWVhbnMgZXZlcnkgZXhpc3RpbmcgQ29uZmlnSXRlbSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBJdGVtcyd9ID0gJ+mFjee9rumghSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgaXRlbSBhZGQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIGl0ZW0gcHJpbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBpdGVtIHpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ0l0ZW1OdW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBJdGVtIExpbWl0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gSXRlbSBsaW1pdCBwZXIgcGFnZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IERhdGFiYXNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWd1cmF0aW9uIGl0ZW0gYnVsayBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggYmFja2VuZCByb3V0ZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgZGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMuJ30gPSAn5Ym15bu65ZKM566h55CG6YWN572u6aCF5a6a576pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gZGVsZXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byBnZXQgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW1zIHVzaW5nIHRoZSBHZW5lcmljIEludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIFJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHNlYXJjaCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbXMgdXNpbmcgdGhlIEdlbmVyaWMgSW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXBkYXRlIElUU00gY29uZmlndXJhdGlvbiBpdGVtcyB1c2luZyB0aGUgR2VuZXJpYyBJbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNvbmZpZ3VyYXRpb24gaXRlbSBsaXN0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgcmVndWxhciBleHByZXNzaW9ucyBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcyB0byBjaGVjayB0aGUgQ29uZmlnSXRlbSBuYW1lIGFuZCB0byBzaG93IGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzIFwnSVRTTUNvbmZpZ0l0ZW1cJy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIENJIGRlZmluaXRpb24gZWRpdG9yIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3JkZXIgb2YgaW5jaWRlbnQgc3RhdGVzIGZyb20gaGlnaCAoZS5nLiBjcmljaXRhbCkgdG8gbG93IChlLmcuIGZ1bmN0aW9uYWwpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHJlbGV2YW50IGRlcGxveW1lbnQgc3RhdGVzIHdoZXJlIGxpbmtlZCB0aWNrZXRzIGNhbiBhZmZlY3QgdGhlIHN0YXR1cyBvZiBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNlYXJjaCBsaW1pdCBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLiBOb3RlOiBDbGFzcyBjb2x1bW4gaXMgYWx3YXlzIGF2YWlsYWJsZSBpZiBmaWx0ZXIgXCdBbGxcJyBpcyBzZWxlY3RlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IGRlcGVuZGluZyBvbiB0aGUgQ0kgY2xhc3MuIEVhY2ggZW50cnkgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBjbGFzcyBuYW1lIGFuZCBkb3VibGUgY29sb25zIChpLmUuIENvbXB1dGVyOjopLiBUaGVyZSBhcmUgYSBmZXcgQ0ktQXR0cmlidXRlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93biBhcyBkZWZpbmVkIGluIHRoZSBzZXR0aW5nIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgb2YgQ0lzIGluIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBDSSBjbGFzcy4gRWFjaCBlbnRyeSBtdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgYW5kIGRvdWJsZSBjb2xvbnMgKGkuZS4gQ29tcHV0ZXI6OikuIFRoZXJlIGFyZSBhIGZldyBDSS1BdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQ0lzIChleGFtcGxlIGZvciB0aGUgY2xhc3MgQ29tcHV0ZXI6IENvbXB1dGVyOjpOYW1lLCBDb21wdXRlcjo6Q3VyRGVwbFN0YXRlLCBDb21wdXRlcjo6Q3JlYXRlVGltZSkuIFRvIHNob3cgaW5kaXZpZHVhbCBDSS1BdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIENJLURlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgc2NoZW1lIG11c3QgYmUgdXNlZCAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyKTogQ29tcHV0ZXI6OkhhcmREaXNrOjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjE6OkNhcGFjaXR5OjoxLCBDb21wdXRlcjo6SGFyZERpc2s6OjIsIENvbXB1dGVyOjpIYXJkRGlzazo6Mjo6Q2FwYWNpdHk6OjEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciBhIENJIGNsYXNzLCB0aGVuIHRoZSBkZWZhdWx0IGNvbHVtbnMgYXJlIHNob3duIGFzIGRlZmluZWQgaW4gdGhlIHNldHRpbmcgSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBvZiBDSXMgaW4gdGhlIGxpbmsgdGFibGUgY29tcGxleCB2aWV3LCBkZXBlbmRpbmcgb24gdGhlIENJIGNsYXNzLiBFYWNoIGVudHJ5IG11c3QgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZSBhbmQgZG91YmxlIGNvbG9ucyAoaS5lLiBDb21wdXRlcjo6KS4gVGhlcmUgYXJlIGEgZmV3IENJLUF0dHJpYnV0ZXMgdGhhdCBjb21tb24gdG8gYWxsIENJcyAoZXhhbXBsZSBmb3IgdGhlIGNsYXNzIENvbXB1dGVyOiBDb21wdXRlcjo6TmFtZSwgQ29tcHV0ZXI6OkN1ckRlcGxTdGF0ZSwgQ29tcHV0ZXI6OkNyZWF0ZVRpbWUpLiBUbyBzaG93IGluZGl2aWR1YWwgQ0ktQXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBDSS1EZWZpbml0aW9uLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgKGV4YW1wbGUgZm9yIHRoZSBjbGFzcyBDb21wdXRlcik6IENvbXB1dGVyOjpIYXJkRGlzazo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoxOjpDYXBhY2l0eTo6MSwgQ29tcHV0ZXI6OkhhcmREaXNrOjoyLCBDb21wdXRlcjo6SGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgYSBDSSBjbGFzcywgdGhlbiB0aGUgZGVmYXVsdCBjb2x1bW5zIGFyZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoaWNoIHR5cGUgb2YgbGluayAobmFtZWQgZnJvbSB0aGUgdGlja2V0IHBlcnNwZWN0aXZlKSBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB3aGljaCB0eXBlIG9mIHRpY2tldCBjYW4gYWZmZWN0IHRoZSBzdGF0dXMgb2YgYSBsaW5rZWQgQ0kuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmZpZ3VyYXRpb24gSXRlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBsb3ltZW50IFN0YXRlIENvbG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgQ29sb3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGxveW1lbnQgU3RhdGUgVHlwZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzYWJsZWQnfSA9ICfnpoHnlKgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZWQnfSA9ICfllZ/nlKgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBhY3Rpb24gZmVhdHVyZSBmb3IgdGhlIGFnZW50IGZyb250ZW5kIHRvIHdvcmsgb24gbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGl0ZW0gYXQgYSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgY29uZmlndXJhdGlvbiBpdGVtIGJ1bGsgYWN0aW9uIGZlYXR1cmUgb25seSBmb3IgdGhlIGxpc3RlZCBncm91cHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcy9kaXNhYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBDb25maWdJdGVtcyBmb3IgdW5pcXVlIG5hbWVzLiBCZWZvcmUgZW5hYmxpbmcgdGhpcyBvcHRpb24geW91IHNob3VsZCBjaGVjayB5b3VyIHN5c3RlbSBmb3IgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgYmluL290cnMuSVRTTUNvbmZpZ0l0ZW1MaXN0RHVwbGljYXRlcy5wbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVudCBtb2R1bGUgdG8gc2V0IGNvbmZpZ2l0ZW0tc3RhdHVzIG9uIHRpY2tldC1jb25maWdpdGVtLWxpbmsuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBjb25maWcgaXRlbSBvdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjbGFzcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBncm91cCByZXNwb25zaWJsZSBmb3IgYSBjb25maWd1cmF0aW9uIGl0ZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGdlbmVyYXRlIElUU00gY29uZmlnIGl0ZW0gc3RhdGlzdGljcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3Lid9ID0gJ+amguazgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgY29sb3IgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZGVwbG95bWVudCBzdGF0ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyBhcmUgc2hvd24pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzZWFyY2ggc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkIElUU00gY29uZmlndXJhdGlvbiBpdGVtIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZWRpdCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGhpc3RvcnkgSVRTTSBjb25maWd1cmF0aW9uIGl0ZW0gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBwcmludCBJVFNNIGNvbmZpZ3VyYXRpb24gaXRlbSBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBjb25maWcgaXRlbXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQuQ29uZmlnSXRlbUNsYXNzSUQuQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgVGlja2V0IGlzIExpbmtlZCB0byBhIENJLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlcGxveW1lbnQgc3RhdGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBidWxrIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGluY2lkZW50IHN0YXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gYnVsayBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIGNvbmZpZ3VyYXRpb24gaXRlbSB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSBjb25maWcgaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWNjZXNzIHRoZSBoaXN0b3J5IG9mIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIG92ZXJ2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGR1cGxpY2F0ZSBhIGNvbmZpZ3VyYXRpb24gaXRlbSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBlZGl0IGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGdvIGJhY2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSBjb25maWd1cmF0aW9uIGl0ZW0gaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gem9vbSBpbnRvIGEgY29uZmlndXJhdGlvbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gb3ZlcnZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgY29uZmlnIGl0ZW0gaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIGNvbmZpZ3VyYXRpb24gaXRlbSwgZS5nLiBDb25maWdJdGVtIywgTXlDb25maWdJdGVtIy4gVGhlIGRlZmF1bHQgaXMgQ29uZmlnSXRlbSMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xhc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZ2xvYmFsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Bvc3Rwcm9kdWN0aXZlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3ByZXByb2R1Y3RpdmUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncHJvZHVjdGl2ZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjcwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKSBpZiAhJENsYXNzTGlzdDsKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpIGlmICEleyRDbGFzc0xpc3R9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CiAgICBteSAkVXNlck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWZpbml0aW9uIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uTGlzdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJENsYXNzSUQ7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25MaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbiBsaXN0CiAgICAgICAgbXkgJERlZmluaXRpb25MaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25MaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRGVmaW5pdGlvbiAoIHJldmVyc2UgQHskRGVmaW5pdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICRGdWxsTmFtZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGRlZmluaXRpb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZWZpbml0aW9uTGlzdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyREZWZpbml0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXIgPT4gJEZ1bGxOYW1lLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlZmluaXRpb24gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlZmluaXRpb25WaWV3JyApIHsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbiBpZAogICAgICAgIG15ICREZWZpbml0aW9uSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVmaW5pdGlvbklEJyApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkRGVmaW5pdGlvbklEOwoKICAgICAgICAjIGdldCBkZWZpbml0aW9uCiAgICAgICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uSUQsCiAgICAgICAgKTsKICAgICAgICAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb259LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlZmluaXRpb24tPntDbGFzc0lEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAkVXNlck5hbWUgPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByZXN1bHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvblZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyID0+ICRVc2VyTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFjdGlvbk92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWZpbml0aW9uIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlZmluaXRpb25DaGFuZ2UnICkgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbgogICAgICAgIG15ICREZWZpbml0aW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByZXN1bHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvbkNoYW5nZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgQ2xhc3MgICA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICAgICAgUm93cyA9PgogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0VkaXRvclJvd3N9CiAgICAgICAgICAgICAgICAgICAgfHwgMzAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVmaW5pdGlvblNhdmUnICkgewogICAgICAgIG15ICVEZWZpbml0aW9uOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgbXkgJEZvcm1QYXJhbSAocXcoQ2xhc3NJRCBEZWZpbml0aW9uKSkgewogICAgICAgICAgICAkRGVmaW5pdGlvbnskRm9ybVBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KENsYXNzSUQgRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgaWYgKCAhJERlZmluaXRpb257JEZvcm1QYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRGb3JtUGFyYW0hIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVmFsaWRhdGUgWUFNTCBjb2RlIGJ5IGNvbnZlcnRpbmcgaXQgdG8gUGVybC4KICAgICAgICBteSAkRGVmaW5pdGlvblJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkxvYWQoCiAgICAgICAgICAgIERhdGEgPT4gJERlZmluaXRpb257RGVmaW5pdGlvbn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKSBpZiByZWYgJERlZmluaXRpb25SZWYgbmUgJ0FSUkFZJzsKCiAgICAgICAgIyBhZGQgdG8gZGF0YWJhc2UKICAgICAgICBteSAkRGVmaW5pdGlvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25BZGQoCiAgICAgICAgICAgICVEZWZpbml0aW9uLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpIGlmICEkRGVmaW5pdGlvbklEOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBjbGFzcyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3QnLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQgeyAkQ2xhc3NMaXN0LT57JGF9IGNtcCAkQ2xhc3NMaXN0LT57JGJ9IH0ga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGNvbmZpZyBkYXRhCiAgICAkU2VsZi0+e1NlYXJjaExpbWl0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1NlYXJjaExpbWl0fSB8fCAxMDAwMDsKCiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4gb3ZlcnZpZXcKICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgZGVmYXVsdCBwYXJhbWV0ZXJzLCB0cnkgdG8gZ2V0IGZpbHRlciAoQ2xhc3NJRCkgZnJvbSBzZXNzaW9uIGlmIG5vdCBnaXZlbiBhcyBwYXJhbWV0ZXIKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkKICAgICAgICB8fCAkU2VsZi0+e0FnZW50SVRTTUNvbmZpZ0l0ZW1DbGFzc0ZpbHRlcn0KICAgICAgICB8fCAnJzsKICAgICRTZWxmLT57Vmlld30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSB8fCAnJzsKCiAgICAjIHN0b3JlIGZpbHRlciAoQ2xhc3NJRCkgaW4gc2Vzc2lvbgogICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbUNsYXNzRmlsdGVyJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgKTsKCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J1NvcnRCeTo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ051bWJlcic7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwoKICAgICMgc2V0IFNvcnQgYW5kIE9yZGVyIGJ5IGFzIEFycmF5cwogICAgbXkgQFNvcnRCeUFycmF5ICA9ICgkU29ydEJ5KTsKICAgIG15IEBPcmRlckJ5QXJyYXkgPSAoJE9yZGVyQnkpOwoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IHBvc3NpYmxlIGRlcGxveW1lbnQgc3RhdGUgbGlzdCBmb3IgY29uZmlnIGl0ZW1zIHRvIGJlIHNob3duCiAgICBteSAkU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc2V0IHRoZSBkZXBsb3ltZW50IHN0YXRlIElEcyBwYXJhbWV0ZXIgZm9yIHRoZSBzZWFyY2gKICAgIG15ICREZXBsU3RhdGVJRHM7CiAgICBmb3IgbXkgJERlcGxTdGF0ZUtleSAoIHNvcnQga2V5cyAleyRTdGF0ZUxpc3R9ICkgewogICAgICAgIHB1c2ggQHskRGVwbFN0YXRlSURzfSwgJERlcGxTdGF0ZUtleTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBkZWZhdWx0IGNsYXNzCiAgICBteSAkQ2xhc3NJREF1dG8gPSAnJzsKCiAgICAjIHRvIHN0b3JlIHRoZSBOYXZCYXIgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBkZWZpbmUgcG9zaXRpb24gb2YgdGhlIGZpbHRlciBpbiB0aGUgZnJvbnRlbmQKICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgIyB0byBzdG9yZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbmZpZyBpdGVtcyBpbiBhbGwgY2xhc3NlcyB0aGF0IHRoZSB1c2VyIGhhcyBhY2Nlc3MKICAgIG15ICRUb3RhbENvdW50OwoKICAgICMgdG8gc3RvcmUgYWxsIHRoZSBjbGFzZXMgdGhhdCB0aGUgdXNlciBoYXMgYWNjZXNzLCB1c2VkIGluIHNlYXJjaCBmb3IgZmlsdGVyICdBbGwnCiAgICBteSAkQWNjZXNzQ2xhc3NMaXN0OwoKICAgICMgbXkgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgIENMQVNTSUQ6CiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgJHskQ2xhc3NMaXN0fXskYX0gY21wICR7JENsYXNzTGlzdH17JGJ9IH0ga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIHNob3cgbWVudSBsaW5rIG9ubHkgaWYgdXNlciBoYXMgYWNjZXNzIHJpZ2h0cwogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENMQVNTSUQgaWYgISRIYXNBY2Nlc3M7CgogICAgICAgICMgaW5zZXJ0IHRoaXMgY2xhc3MgdG8gYmUgcGFzc2VkIGFzIHNlYXJjaCBwYXJhbWV0ZXIgZm9yIGZpbHRlciAnQWxsJwogICAgICAgIHB1c2ggQHskQWNjZXNzQ2xhc3NMaXN0fSwgJENsYXNzSUQ7CgogICAgICAgICMgY291bnQgYWxsIHJlY29yZHMgb2YgdGhpcyBjbGFzcwogICAgICAgIG15ICRDbGFzc0NvdW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Db3VudCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aGUgY29uZmlnIGl0ZW1zIG51bWJlciBpbiB0aGlzIGNsYXNzIHRvIHRoZSB0b3RhbAogICAgICAgICRUb3RhbENvdW50ICs9ICRDbGFzc0NvdW50OwoKICAgICAgICAjIGluY3JlYXNlIHRoZSBQcmlvQ291bnRlcgogICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAjIGFkZCBmaWx0ZXIgd2l0aCBwYXJhbXMgZm9yIHRoZSBzZWFyY2ggbWV0aG9kCiAgICAgICAgJEZpbHRlcnN7JENsYXNzSUR9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgQ291bnQgID0+ICRDbGFzc0NvdW50LAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICA9PiBbJENsYXNzSURdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgICA9PiAkRGVwbFN0YXRlSURzLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlbGYtPntTZWFyY2hMaW1pdH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgIyByZW1lbWJlciB0aGUgZmlyc3QgY2xhc3MgaWQgdG8gc2hvdyB0aGlzIGluIHRoZSBvdmVydmlldwogICAgICAgICMgaWYgbm8gY2xhc3MgaWQgd2FzIGdpdmVuCiAgICAgICAgaWYgKCAhJENsYXNzSURBdXRvICkgewogICAgICAgICAgICAkQ2xhc3NJREF1dG8gPSAkQ2xhc3NJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIsIHdoaWNoIHNob3dzIGFsbCBpdGVtcwogICAgICAgICRGaWx0ZXJze0FsbH0gPSB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIENvdW50ICA9PiAkVG90YWxDb3VudCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgPT4gJEFjY2Vzc0NsYXNzTGlzdCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEcyAgICAgPT4gJERlcGxTdGF0ZUlEcywKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+ICRTZWxmLT57U2VhcmNoTGltaXR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgICAgICMgaWYgbm8gZmlsdGVyIHdhcyBzZWxlY3RlZCBhY3RpdmF0ZSB0aGUgZmlsdGVyIGZvciB0aGUgZGVmYXVsdCBjbGFzcwogICAgICAgIGlmICggISRTZWxmLT57RmlsdGVyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJENsYXNzSURBdXRvOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gYWNjZXNzIHRvIENsYXNzIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgICA9PiBUcmFuc2xhdGFibGUoJ092ZXJ2aWV3JyksCiAgICAgICAgUmVmcmVzaCA9PiAkUmVmcmVzaCwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNlYXJjaCBjb25maWcgaXRlbXMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgc2hvdyBjb2x1bW4gIkNsYXNzIiBpZiBmaWx0ZXIgJ0FsbCcgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICRTZWxmLT57RmlsdGVyfSBlcSAnQWxsJyApIHsKICAgICAgICAgICAgJFBvc3NpYmxlQ29sdW1ue0NsYXNzfSA9ICcxJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgY29uZmlndXJlZCBjb2x1bW5zIGFuZCByZW9yZ2FuaXplIHRoZW0gYnkgY2xhc3MgbmFtZQogICAgaWYgKAogICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnNCeUNsYXNzfSApCiAgICAgICAgJiYgJFNlbGYtPntGaWx0ZXJ9CiAgICAgICAgJiYgJFNlbGYtPntGaWx0ZXJ9IG5lICdBbGwnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlQ29sdW1uQnlDbGFzczsKICAgICAgICBOQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zQnlDbGFzc30gfSApIHsKICAgICAgICAgICAgbXkgKCAkQ2xhc3MsICRDb2x1bW4gKSA9IHNwbGl0IC86Oi8sICROYW1lLCAyOwoKICAgICAgICAgICAgbmV4dCBOQU1FIGlmICEkQ29sdW1uOwoKICAgICAgICAgICAgcHVzaCBAeyAkQ29sdW1uQnlDbGFzc3skQ2xhc3N9IH0sICRDb2x1bW47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3BlY2lmaWMgY29sdW1uIGNvbmZpZyBmb3IgdGhlIHNlbGVjdGVkIGNsYXNzCiAgICAgICAgbXkgJFNlbGVjdGVkQ2xhc3MgPSAkQ2xhc3NMaXN0LT57ICRTZWxmLT57RmlsdGVyfSB9OwogICAgICAgIGlmICggJENvbHVtbkJ5Q2xhc3N7JFNlbGVjdGVkQ2xhc3N9ICkgewogICAgICAgICAgICBAU2hvd0NvbHVtbnMgPSBAeyAkQ29sdW1uQnlDbGFzc3skU2VsZWN0ZWRDbGFzc30gfTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBsaXN0CiAgICBteSAkTGlua1BhZ2UgPQogICAgICAgICdGaWx0ZXI9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7U29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rU29ydCA9CiAgICAgICAgJ0ZpbHRlcj0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtGaWx0ZXIgPQogICAgICAgICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwoKICAgICMgc2hvdyBjb25maWcgaXRlbSBsaXN0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtTGlzdFNob3coCiAgICAgICAgQ29uZmlnSXRlbUlEcyA9PiAkQ29uZmlnSXRlbUlEcywKICAgICAgICBUb3RhbCAgICAgICAgID0+IHNjYWxhciBAeyRDb25maWdJdGVtSURzfSwKICAgICAgICBWaWV3ICAgICAgICAgID0+ICRTZWxmLT57Vmlld30sCiAgICAgICAgRmlsdGVyICAgICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rICAgID0+ICRMaW5rRmlsdGVyLAogICAgICAgIFRpdGxlTmFtZSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPdmVydmlldzogSVRTTSBDb25maWdJdGVtJyksCiAgICAgICAgVGl0bGVWYWx1ZSAgICA9PiAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntOYW1lfSwKICAgICAgICBFbnYgICAgICAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlICAgICAgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ICAgICAgPT4gJExpbmtTb3J0LAogICAgICAgIFNob3dDb2x1bW5zICAgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBTb3J0QnkgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApLAogICAgICAgIE9yZGVyQnkgICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApLAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUFkZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7Cm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgZm9yIG15ICRDbGFzc0lEICggc29ydCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259IiktPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gaWYgISRIYXNBY2Nlc3M7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHNob3cgdGhlIGxpc3Qgb2YgQ0kgY2xhc3NlcyBzb3J0ZWQgYnkgbmFtZQogICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IHsgJHskQ2xhc3NMaXN0fXskYX0gY21wICR7JENsYXNzTGlzdH17JGJ9IH0ga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICBteSAkSXRlbURhdGEgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGl0ZW0gbGlzdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW1MaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRDbGFzc0xpc3QtPnskSXRlbUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0FkZCcpLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtQnVsazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdCdWxrIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQhJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBpbnZvbHZlZCBjb25maWcgaXRlbXMsIGZpbHRlcmluZyBlbXB0eSBDb25maWdJdGVtSURzCiAgICBteSBAQ29uZmlnSXRlbUlEcyA9IGdyZXAgeyRffQogICAgICAgICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggIUBDb25maWdJdGVtSURzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBDb25maWd1cmF0aW9uIEl0ZW0hJyksCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICk7CgogICAgIyBkZWNsYXJlIHRoZSB2YXJpYWJsZXMgZm9yIGFsbCB0aGUgcGFyYW1ldGVycwogICAgbXkgJUVycm9yOwoKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIGdldCBjb25maWcgaXRlbSBvYmplY3QKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgogICAgIyBnZXQgYWxsIHBhcmFtZXRlcnMgYW5kIGNoZWNrIGZvciBlcnJvcnMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEbycgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IGFsbCBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRLZXkgKAogICAgICAgICAgICBxdyggTGlua1RvZ2V0aGVyIExpbmtUb2dldGhlckFub3RoZXIgTGlua1R5cGUgTGlua1RvZ2V0aGVyTGlua1R5cGUgRGVwbFN0YXRlSUQKICAgICAgICAgICAgSW5jaVN0YXRlSUQgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXsnTGlua1RvZ2V0aGVyQW5vdGhlcid9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyktPlN0cmluZ0NsZWFuKAogICAgICAgICAgICAgICAgU3RyaW5nUmVmID0+IFwkR2V0UGFyYW17J0xpbmtUb2dldGhlckFub3RoZXInfSwKICAgICAgICAgICAgICAgIFRyaW1MZWZ0ICA9PiAxLAogICAgICAgICAgICAgICAgVHJpbVJpZ2h0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJEdldFBhcmFteydMaW5rVG9nZXRoZXJBbm90aGVyJ30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRDb25maWdJdGVtSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0xpbmtUb2dldGhlckFub3RoZXJJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcHJvY2VzcyBjb25maWcgaXRlbQogICAgbXkgQENvbmZpZ0l0ZW1JRFNlbGVjdGVkOwogICAgbXkgJEFjdGlvbkZsYWcgPSAwOwogICAgbXkgJENvdW50ZXIgICAgPSAxOwoKICAgICMgZ2V0IGxpbmsgb2JqZWN0CiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgQ09ORklHSVRFTV9JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlEcykgewogICAgICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQiKTsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKCiAgICAgICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IGNvbmZpZyBpdGVtCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1lvdSBkb25cJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBjb25maWd1cmF0aW9uIGl0ZW06ICVzLicsCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNX0lEOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBzZWxlY3RlZCBjb25maWcgaXRlbSBpZHMKICAgICAgICBwdXNoIEBDb25maWdJdGVtSURTZWxlY3RlZCwgJENvbmZpZ0l0ZW1JRDsKCiAgICAgICAgIyBkbyBzb21lIGFjdGlvbnMgb24gQ0lzCiAgICAgICAgaWYgKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG8nICkgJiYgKCAhJUVycm9yICkgKSB7CgogICAgICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgICAgICMgYnVsayBhY3Rpb24gdmVyc2lvbiBkZGQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVwbFN0YXRlSUR9IHx8ICRHZXRQYXJhbXtJbmNpU3RhdGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBjb25maWcgaXRlbQogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRWZXJzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICROZXdEZXBsU3RhdGVJRCA9ICRDdXJyZW50VmVyc2lvbi0+e0RlcGxTdGF0ZUlEfTsKICAgICAgICAgICAgICAgIG15ICROZXdJbmNpU3RhdGVJRCA9ICRDdXJyZW50VmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKCiAgICAgICAgICAgICAgICBpZiAoIElzTnVtYmVyKCAkR2V0UGFyYW17RGVwbFN0YXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJE5ld0RlcGxTdGF0ZUlEID0gJEdldFBhcmFte0RlcGxTdGF0ZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggSXNOdW1iZXIoICRHZXRQYXJhbXtJbmNpU3RhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkTmV3SW5jaVN0YXRlSUQgPSAkR2V0UGFyYW17SW5jaVN0YXRlSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEN1cnJlbnRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDdXJyZW50VmVyc2lvbi0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICROZXdEZXBsU3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJE5ld0luY2lTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiAkQ3VycmVudFZlcnNpb24tPntYTUxEYXRhfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWxrIGFjdGlvbiBsaW5rcwogICAgICAgICAgICAjIGxpbmsgYWxsIGNvbmZpZyBpdGVtcyB0byBhbm90aGVyIGNvbmZpZyBpdGVtCiAgICAgICAgICAgIGlmICggJEdldFBhcmFteydMaW5rVG9nZXRoZXJBbm90aGVyJ30gKSB7CiAgICAgICAgICAgICAgICBteSAkTWFpbkNvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJEdldFBhcmFteydMaW5rVG9nZXRoZXJBbm90aGVyJ30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc3BsaXQgdGhlIHR5cGUgaWRlbnRpZmllcgogICAgICAgICAgICAgICAgbXkgQFR5cGUgPSBzcGxpdCBxezo6fSwgJEdldFBhcmFte0xpbmtUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRUeXBlWzBdICYmICRUeXBlWzFdICYmICggJFR5cGVbMV0gZXEgJ1NvdXJjZScgfHwgJFR5cGVbMV0gZXEgJ1RhcmdldCcgKSApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFNvdXJjZUtleSA9ICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSA9ICRNYWluQ29uZmlnSXRlbUlEOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRUeXBlWzFdIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlS2V5ID0gJE1haW5Db25maWdJdGVtSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkQ29uZmlnSXRlbUlEOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSURQYXJ0bmVyIChAQ29uZmlnSXRlbUlEcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRNYWluQ29uZmlnSXRlbUlEIG5lICRDb25maWdJdGVtSURQYXJ0bmVyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxpbmsgdG9nZXRoZXIKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17J0xpbmtUb2dldGhlcid9ICkgewoKICAgICAgICAgICAgICAgICMgc3BsaXQgdGhlIHR5cGUgaWRlbnRpZmllcgogICAgICAgICAgICAgICAgbXkgQFR5cGUgPSBzcGxpdCBxezo6fSwgJEdldFBhcmFte0xpbmtUb2dldGhlckxpbmtUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRUeXBlWzBdICYmICRUeXBlWzFdICYmICggJFR5cGVbMV0gZXEgJ1NvdXJjZScgfHwgJFR5cGVbMV0gZXEgJ1RhcmdldCcgKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRFBhcnRuZXIgKEBDb25maWdJdGVtSURzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ID0gJENvbmZpZ0l0ZW1JRDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSA9ICRDb25maWdJdGVtSURQYXJ0bmVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVHlwZVsxXSBlcSAnVGFyZ2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgPSAkQ29uZmlnSXRlbUlEUGFydG5lcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkQ29uZmlnSXRlbUlEOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWdJdGVtSUQgbmUgJENvbmZpZ0l0ZW1JRFBhcnRuZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFjdGlvbkZsYWcgPSAxOwogICAgICAgIH0KICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgcmVkaXJlY3QKICAgIGlmICgkQWN0aW9uRmxhZykgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICVQYXJhbSwKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgQ29uZmlnSXRlbUlEcyA9PiBcQENvbmZpZ0l0ZW1JRFNlbGVjdGVkLAogICAgICAgIEVycm9ycyAgICAgICAgPT4gXCVFcnJvciwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICApOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0J1bGtBY3Rpb24nLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyByZW1lbWJlciBjb25maWcgaXRlbSBpZHMKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1JRHN9ICkgewogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHsgJFBhcmFte0NvbmZpZ0l0ZW1JRHN9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlZENvbmZpZ0l0ZW1JRCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZGVwbG95bWVudCBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntEZXBsU3RhdGV9ICkgewogICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBEZXBsU3RhdGVTdHJnCiAgICAgICAgJFBhcmFte0RlcGxTdGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGVwbFN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXBsU3RhdGVJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0RlcGxTdGF0ZUlEfSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5jaWRlbnQgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5jaVN0YXRlfSApIHsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+IFsgJ29wZXJhdGlvbmFsJywgJ2luY2lkZW50JyBdLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgSW5jaVN0YXRlU3RyZwogICAgICAgICRQYXJhbXtJbmNpU3RhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtJbmNpU3RhdGVJRH0sCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaW5rIG9iamVjdAogICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKICAgICMgbGluayB0eXBlcyBsaXN0CiAgICAjIGdldCBwb3NzaWJsZSB0eXBlcyBsaXN0CiAgICBteSAlUG9zc2libGVUeXBlc0xpc3QgPSAkTGlua09iamVjdC0+UG9zc2libGVUeXBlc0xpc3QoCiAgICAgICAgT2JqZWN0MSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIE9iamVjdDIgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBkZWZpbmUgYmxhbmsgbGluZSBlbnRyeQogICAgbXkgJUJsYW5rTGluZSA9ICgKICAgICAgICBLZXkgICAgICA9PiAnLScsCiAgICAgICAgVmFsdWUgICAgPT4gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nLAogICAgICAgIERpc2FibGVkID0+IDEsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBzZWxlY3RhYmxlIHR5cGUgbGlzdAogICAgbXkgJENvdW50ZXIgPSAwOwogICAgbXkgQFNlbGVjdGFibGVUeXBlc0xpc3Q7CiAgICBteSBATGlua1RvZ2V0aGVyVHlwZUxpc3Q7CiAgICBQT1NTSUJMRVRZUEU6CiAgICBmb3IgbXkgJFBvc3NpYmxlVHlwZSAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVQb3NzaWJsZVR5cGVzTGlzdCApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkTGlua09iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSAgID0+ICRQb3NzaWJsZVR5cGUsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdHlwZQogICAgICAgIG15ICVUeXBlID0gJExpbmtPYmplY3QtPlR5cGVHZXQoCiAgICAgICAgICAgIFR5cGVJRCA9PiAkVHlwZUlELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdHlwZSBsaXN0IGZvciBsaW5rIHRvZ2V0aGVyIGNhbiBjb250YWluIG9ubHkKICAgICAgICAjIGxpbmsgdHlwZXMgd2hpY2ggYXJlIG5vdCBkaXJlY3RlZCAobm90IHBvaW50ZWQpCiAgICAgICAgaWYgKCAhJFR5cGV7UG9pbnRlZH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSB0aGUgc291cmNlIG5hbWUKICAgICAgICAgICAgbXkgJVNvdXJjZU5hbWU7CiAgICAgICAgICAgICRTb3VyY2VOYW1le0tleX0gICA9ICRQb3NzaWJsZVR5cGUgLiAnOjpTb3VyY2UnOwogICAgICAgICAgICAkU291cmNlTmFtZXtWYWx1ZX0gPSAkVHlwZXtTb3VyY2VOYW1lfTsKCiAgICAgICAgICAgIHB1c2ggQExpbmtUb2dldGhlclR5cGVMaXN0LCBcJVNvdXJjZU5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSB0aGUgc291cmNlIG5hbWUKICAgICAgICBteSAlU291cmNlTmFtZTsKICAgICAgICAkU291cmNlTmFtZXtLZXl9ICAgPSAkUG9zc2libGVUeXBlIC4gJzo6U291cmNlJzsKICAgICAgICAkU291cmNlTmFtZXtWYWx1ZX0gPSAkVHlwZXtTb3VyY2VOYW1lfTsKCiAgICAgICAgcHVzaCBAU2VsZWN0YWJsZVR5cGVzTGlzdCwgXCVTb3VyY2VOYW1lOwoKICAgICAgICBuZXh0IFBPU1NJQkxFVFlQRSBpZiAhJFR5cGV7UG9pbnRlZH07CgogICAgICAgICMgY3JlYXRlIHRoZSB0YXJnZXQgbmFtZQogICAgICAgIG15ICVUYXJnZXROYW1lOwogICAgICAgICRUYXJnZXROYW1le0tleX0gICA9ICRQb3NzaWJsZVR5cGUgLiAnOjpUYXJnZXQnOwogICAgICAgICRUYXJnZXROYW1le1ZhbHVlfSA9ICRUeXBle1RhcmdldE5hbWV9OwoKICAgICAgICBwdXNoIEBTZWxlY3RhYmxlVHlwZXNMaXN0LCBcJVRhcmdldE5hbWU7CiAgICB9CiAgICBjb250aW51ZSB7CgogICAgICAgICMgYWRkIGJsYW5rIGxpbmUKICAgICAgICBwdXNoIEBTZWxlY3RhYmxlVHlwZXNMaXN0LCBcJUJsYW5rTGluZTsKCiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICAjIHJlbW92ZWQgbGFzdCAoZW1wdHkpIGVudHJ5CiAgICBwb3AgQFNlbGVjdGFibGVUeXBlc0xpc3Q7CgogICAgIyBhZGQgYmxhbmsgbGluZXMgb24gdG9wIGFuZCBib3R0b20gb2YgdGhlIGxpc3QgaWYgbW9yZSB0aGVuIHR3byBsaW5rdHlwZXMKICAgIGlmICggJENvdW50ZXIgPiAyICkgewogICAgICAgIHVuc2hpZnQgQFNlbGVjdGFibGVUeXBlc0xpc3QsIFwlQmxhbmtMaW5lOwogICAgICAgIHB1c2ggQFNlbGVjdGFibGVUeXBlc0xpc3QsIFwlQmxhbmtMaW5lOwogICAgfQoKICAgICMgZ2VuZXJhdGUgTGlua1R5cGVTdHJnCiAgICAkUGFyYW17TGlua1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcQFNlbGVjdGFibGVUeXBlc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdMaW5rVHlwZScsCiAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSWRlbnRpZmllcn0gfHwgJ0FsdGVybmF0aXZlVG86OlNvdXJjZScsCiAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICApOwogICAgJFBhcmFte0xpbmtUb2dldGhlckxpbmtUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXEBMaW5rVG9nZXRoZXJUeXBlTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xpbmtUb2dldGhlckxpbmtUeXBlJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJZGVudGlmaWVyfSB8fCAnQWx0ZXJuYXRpdmVUbzo6U291cmNlJywKICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICk7CgogICAgJFBhcmFte0xpbmtUb2dldGhlclllc05vT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdZZXNOb09wdGlvbnMnKSwKICAgICAgICBOYW1lICAgICAgID0+ICdMaW5rVG9nZXRoZXInLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0xpbmtUb2dldGhlcn0gfHwgMCwKICAgICk7CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtQnVsaycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIENvbmZpZ0l0ZW1JRAogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjb25maWcgaXRlbSBpcyBmb3VuZAogICAgaWYgKCAhJENvbmZpZ0l0ZW0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb25maWcgaXRlbSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkQ29uZmlnSXRlbUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHRoZSBjb25maWcgaXRlbQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NvbmZpZ0l0ZW1EZWxldGUnICkgewoKICAgICAgICAjIGRlbGV0ZSB0aGUgY29uZmlnIGl0ZW0KICAgICAgICBteSAkQ291bGREZWxldGVDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ291bGREZWxldGVDb25maWdJdGVtKSB7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGNvbmZpZyBpdGVtIG92ZXJ2aWV3LCB3aGVuIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGRlbGV0ZSBmYWlsZWQKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSBjb25maWdpdGVtIElEICVzIScsICRDb25maWdJdGVtSUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF0ZXN0IHZlcnNpb24gZGF0YQogICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgaWYgKCAhJFZlcnNpb24tPntWZXJzaW9uSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzIScsICRDb25maWdJdGVtSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdGhlIGRpYWxvZyB0eXBlLiBBcyBkZWZhdWx0LCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSAyIGJ1dHRvbnM6IFllcyBhbmQgTm8KICAgIG15ICREaWFsb2dUeXBlID0gJ0NvbmZpcm1hdGlvbic7CgogICAgIyBvdXRwdXQgY29udGVudAogICAgbXkgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRGVsZXRlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRoZSByZXR1cm5lZCBkYXRhIHN0cnVjdHVyZQogICAgbXkgJURhdGEgPSAoCiAgICAgICAgSFRNTCAgICAgICA9PiAkT3V0cHV0LAogICAgICAgIERpYWxvZ1R5cGUgPT4gJERpYWxvZ1R5cGUsCiAgICApOwoKICAgICMgcmV0dXJuIEpTT04tU3RyaW5nIGJlY2F1c2Ugb2YgQUpBWC1Nb2RlCiAgICBteSAkT3V0cHV0SlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gXCVEYXRhICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0SlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbXkgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgY29uZmlnaXRlbSBpZCBhbmQgY2xhc3MgaWQKICAgIG15ICRDb25maWdJdGVtID0ge307CiAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApIHx8IDA7CiAgICAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKSAgICAgIHx8IDA7CiAgICBteSAkRHVwbGljYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRHVwbGljYXRlSUQnICkgfHwgMDsKCiAgICBteSAkSGFzQWNjZXNzOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgbmVlZGVkIGRhdGEKICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICYmICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApIHsKCiAgICAgICAgIyBjaGVjayBhY2Nlc3MgZm9yIGNvbmZpZyBpdGVtCiAgICAgICAgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0KICAgICAgICAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJER1cGxpY2F0ZUlEKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIHRvIGR1cGxpY2F0ZQogICAgICAgICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhY2Nlc3MgZm9yIGNvbmZpZyBpdGVtCiAgICAgICAgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9IFRyYW5zbGF0YWJsZSgnTmV3Jyk7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdJdGVtLT57Q2xhc3NJRH0gKSB7CgogICAgICAgICMgc2V0IGNvbmZpZyBpdGVtIGlkIGFuZCBudW1iZXIKICAgICAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAnTkVXJzsKICAgICAgICAkQ29uZmlnSXRlbS0+e051bWJlcn0gICAgICAgPSBUcmFuc2xhdGFibGUoJ05ldycpOwoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKICAgICAgICAkQ29uZmlnSXRlbS0+e0NsYXNzfSA9ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHVzZXIgaGFzIG5vIGFjY2VzcyByaWdodHMgc2hvdyBlcnJvciBwYWdlCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGFjY2VzcyBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzIScsICRDb25maWdJdGVtLT57Q2xhc3N9ICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIHdoZW4gdGhlcmUncyBubyBDbGFzc0lEIGl0IG1lYW5zLCBhbiBleGlzdGluZyBjb25maWcgaXRlbSBpcyBlZGl0ZWQgYXMgdGhlIENsYXNzSUQgaXMgb25seQogICAgIyBwcm92aWRlZCBhcyBHRVQgcGFyYW0gd2hlbiBjcmVhdGluZyBhIG5ldyBjb25maWcgaXRlbQogICAgaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICkgKSB7CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjb3B5IGFsbCBleGlzdGluZyBhdHRhY2htZW50cyB0byB1cGxvYWQgY2FjaGUKICAgICAgICBGSUxFTkFNRToKICAgICAgICBmb3IgbXkgJEZpbGVuYW1lIChARXhpc3RpbmdBdHRhY2htZW50cykgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50IHRvIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN1Ym1pdCBzYXZlCiAgICBteSAkU3VibWl0U2F2ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXRTYXZlJyApOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBnZXQgeG1sIGRhdGEKICAgIG15ICRWZXJzaW9uID0ge307CiAgICBteSAkTmFtZUR1cGxpY2F0ZXM7CiAgICBteSAkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2U7CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewoKICAgICAgICAjIGNoZWNrIGlmIGFuIGF0dGFjaG1lbnQgbXVzdCBiZSBkZWxldGVkCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gMzIgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSBkZWxldGUgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGlzIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJERlbGV0ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJE51bWJlciIgKTsKCiAgICAgICAgICAgICMgY2hlY2sgbmV4dCBhdHRhY2htZW50IGlmIGl0IHdhcyBub3QgcHJlc3NlZAogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISREZWxldGU7CgogICAgICAgICAgICAjIHJlbW92ZSB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkTnVtYmVyLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSB3YXMgYW4gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBdHRhY2htZW50VXBsb2FkJyApICkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIHVwbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudCB0byB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQWxsUmVxdWlyZWQgPSAxOwoKICAgICAgICAjIGdldCBnZW5lcmFsIGZvcm0gZGF0YQogICAgICAgIGZvciBteSAkRm9ybVBhcmFtIChxdyhOYW1lIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEKSkgewogICAgICAgICAgICAkVmVyc2lvbi0+eyRGb3JtUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZvcm1QYXJhbSApOwogICAgICAgICAgICBpZiAoICEkVmVyc2lvbi0+eyRGb3JtUGFyYW19ICkgewogICAgICAgICAgICAgICAgJEFsbFJlcXVpcmVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgeG1sIGZvcm0gZGF0YQogICAgICAgICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0gPSAkU2VsZi0+X1hNTEZvcm1HZXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgQWxsUmVxdWlyZWQgICA9PiBcJEFsbFJlcXVpcmVkLAogICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrLCB3aGV0aGVyIHRoZSBmZWF0dXJlIHRvIGNoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIGlzIGVuYWJsZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzU3RyaW5nV2l0aERhdGEoICRWZXJzaW9uLT57TmFtZX0gKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1VuaXF1ZUNJTmFtZTo6RW5hYmxlVW5pcXVlbmVzc0NoZWNrJykKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2hlY2tpbmcgZm9yIGR1cGxpY2F0ZSBuYW1lcyAoQ2xhc3NJRDogJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJOYW1lOiAkVmVyc2lvbi0+e05hbWV9LCBDb25maWdJdGVtSUQ6ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVEdXBsaWNhdGVzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlVuaXF1ZU5hbWVDaGVjaygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdG9wIHByb2Nlc3NpbmcgaWYgdGhlIG5hbWUgaXMgbm90IHVuaXF1ZQogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewoKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CgogICAgICAgICAgICAgICAgIyBidWlsZCBhIHN0cmluZyBvZiBhbGwgZHVwbGljYXRlIElEcwogICAgICAgICAgICAgICAgbXkgJE5hbWVEdXBsaWNhdGVzU3RyaW5nID0gam9pbiAnLCAnLCBAeyROYW1lRHVwbGljYXRlc307CgogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJFZlcnNpb24tPntOYW1lfSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbUlEKHMpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5hbWVEdXBsaWNhdGVzU3RyaW5nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGNvbmZpZyBvcHRpb24gZm9yIHRoZSBuYW1lIHJlZ2V4IGNoZWNrcwogICAgICAgIG15ICRDSU5hbWVSZWdleENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkNJTmFtZVJlZ2V4Iik7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIENJIG5hbWUgaXMgZ2l2ZW4gYW5kIHNob3VsZCBiZSBjaGVja2VkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRWZXJzaW9uLT57TmFtZX0gKSAmJiAkQ0lOYW1lUmVnZXhDb25maWcgKSB7CgogICAgICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjbGFzcyBuYW1lCiAgICAgICAgICAgIG15ICRDbGFzc05hbWUgPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHRoZSByZWdleCBmb3IgdGhpcyBjbGFzcwogICAgICAgICAgICBteSAkQ0lOYW1lUmVnZXggPSAkQ0lOYW1lUmVnZXhDb25maWctPnsgJENsYXNzTmFtZSAuICc6OicgLiAnQ0lOYW1lUmVnZXgnIH0gfHwgJyc7CgogICAgICAgICAgICAjIGlmIGEgcmVnZXggaXMgZGVmaW5lZCBhbmQgdGhlIENJIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICBpZiAoICRDSU5hbWVSZWdleCAmJiAkVmVyc2lvbi0+e05hbWV9ICF+IG17ICRDSU5hbWVSZWdleCB9eG1zICkgewoKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgY2xhc3MKICAgICAgICAgICAgICAgICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSA9ICRDSU5hbWVSZWdleENvbmZpZy0+eyAkQ2xhc3NOYW1lIC4gJzo6JyAuICdDSU5hbWVSZWdleEVycm9yTWVzc2FnZScgfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHZlcnNpb24gdG8gZGF0YWJhc2UKICAgICAgICBpZiAoICRTdWJtaXRTYXZlICYmICRBbGxSZXF1aXJlZCApIHsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIGZyb20gdXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgYSBsb29rdXAgbG9va3VwIGhhc2ggb2YgdGhlIG5ldyBhdHRhY2htZW50cwogICAgICAgICAgICBteSAlTmV3QXR0YWNobWVudDsKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudC0+e0ZpbGVuYW1lfQogICAgICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgYWxsIG9mIHRoZSBuZXcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAkTmV3QXR0YWNobWVudHskS2V5fSA9ICRBdHRhY2htZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBleGlzdGluZyBhdHRhY2htZW50cwogICAgICAgICAgICBGSUxFTkFNRToKICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgdGhlIGtleSBpcyB0aGUgZmlsZW5hbWUgKyBmaWxlc2l6ZSArIGNvbnRlbnQgdHlwZQogICAgICAgICAgICAgICAgIyAobm8gY29udGVudCBpZCwgYXMgZXhpc3RpbmcgYXR0YWNobWVudHMgZG9uJ3QgaGF2ZSBpdCkKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50RGF0YS0+e0ZpbGVzaXplfQogICAgICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgICAgICMgYXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2gKICAgICAgICAgICAgICAgIGlmICggJE5ld0F0dGFjaG1lbnR7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICROZXdBdHRhY2htZW50eyRLZXl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZXhpc3RpbmcgYXR0YWNobWVudCBpcyBubyBsb25nZXIgaW4gbmV3IGF0dGFjaG1lbnRzIGhhc2gKICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzZnVsID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2Vzc2Z1bCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgdGhlIG5ldyBhdHRhY2htZW50cwogICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCB2YWx1ZXMgJU5ld0F0dGFjaG1lbnQgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB2ZXJzaW9uCiAgICAgICAgICAgICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICBteSAkU2NyZWVuVHlwZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTY3JlZW5UeXBlJyApIHx8IDA7CiAgICAgICAgICAgIGlmICgkU2NyZWVuVHlwZSkgewoKICAgICAgICAgICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0iOwoKICAgICAgICAgICAgICAgICMgcmV0dXJuIHRvIG92ZXJ2aWV3IG9yIHNlYXJjaCByZXN1bHRzIGluc3RlYWQgaWYgY2FsbGVkIER1cGxpY2F0ZSBmcm9tIHJvdyBhY3Rpb24KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xhc3RTY3JlZW5WaWV3fSBlcSAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW0nCiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntMYXN0U2NyZWVuVmlld30gPX4gbXtcQSBBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbSg/OiBTZWFyY2gpPzt9bXN4CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRVUkwgPSAkU2VsZi0+e0xhc3RTY3JlZW5WaWV3fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAkVVJMLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkRHVwbGljYXRlSUQpIHsKICAgICAgICBteSAkVmVyc2lvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKICAgICAgICBpZiAoJFZlcnNpb25JRCkgewoKICAgICAgICAgICAgIyBnZXQgdmVyc2lvbiBkYXRhIHRvIGR1cGxpY2F0ZSBjb25maWcgaXRlbQogICAgICAgICAgICAkVmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEgdG8gZHVwbGljYXRlIGNvbmZpZyBpdGVtCiAgICAgICAgICAgICRWZXJzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24gZGF0YQogICAgICAgICRWZXJzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlWE1MRm9ybU91dHB1dFBhcmFtOwogICAgaWYgKCAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdICkgewogICAgICAgICRYTUxGb3JtT3V0cHV0UGFyYW17WE1MRGF0YX0gPSAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdOwogICAgfQoKICAgICMgb3V0cHV0IG5hbWUgaW52YWxpZCBibG9jawogICAgbXkgJFJvd05hbWVJbnZhbGlkID0gJyc7CiAgICBpZiAoICEkVmVyc2lvbi0+e05hbWV9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICYmICRTdWJtaXRTYXZlICkgewogICAgICAgICRSb3dOYW1lSW52YWxpZCA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBmb3IgbmFtZSBkdXBsaWNhdGVzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewogICAgICAgICRSb3dOYW1lSW52YWxpZCA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBmb3Igbm90IG1hdGNoZWQgbmFtZSByZWdleAogICAgaWYgKCRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSkgewogICAgICAgICRSb3dOYW1lSW52YWxpZCA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBvdXRwdXQgbmFtZSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93TmFtZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICBSb3dOYW1lSW52YWxpZCA9PiAkUm93TmFtZUludmFsaWQsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKAogICAgICAgIElzU3RyaW5nV2l0aERhdGEoJFJvd05hbWVJbnZhbGlkKQogICAgICAgICYmICFJc0FycmF5UmVmV2l0aERhdGEoJE5hbWVEdXBsaWNhdGVzKQogICAgICAgICYmICEkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2UKICAgICAgICApCiAgICB7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVuZGVyaW5nIGRlZmF1bHQgZXJyb3IgYmxvY2siLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd05hbWVFcnJvckRlZmF1bHQnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewoKICAgICAgICAjIGJ1aWxkIGFycmF5IHdpdGggQ0ktTnVtYmVycwogICAgICAgIG15IEBOYW1lRHVwbGljYXRlc0J5Q0lOdW1iZXI7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyROYW1lRHVwbGljYXRlc30gKSB7CgogICAgICAgICAgICAjIGxvb2t1cCB0aGUgQ0kgbnVtYmVyCiAgICAgICAgICAgIG15ICRDSU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBOYW1lRHVwbGljYXRlc0J5Q0lOdW1iZXIsICRDSU51bWJlcjsKICAgICAgICB9CgogICAgICAgIG15ICREdXBsaWNhdGVTdHJpbmcgPSBqb2luICcsICcsIEBOYW1lRHVwbGljYXRlc0J5Q0lOdW1iZXI7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIlJlbmRlcmluZyBibG9jayBmb3IgZHVwbGljYXRlcyAoQ0ktTnVtYmVyczogJER1cGxpY2F0ZVN0cmluZykgZXJyb3IgbWVzc2FnZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93TmFtZUVycm9yRHVwbGljYXRlcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRHVwbGljYXRlcyA9PiAkRHVwbGljYXRlU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgZWxzaWYgKCRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93TmFtZUVycm9yUmVnRXgnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlZ0V4RXJyb3JNZXNzYWdlID0+ICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIG15ICRSb3dEZXBsU3RhdGVJbnZhbGlkID0gJyc7CiAgICBpZiAoICEkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZlcnNpb25TYXZlJyAmJiAkU3VibWl0U2F2ZSApIHsKICAgICAgICAkUm93RGVwbFN0YXRlSW52YWxpZCA9ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2VuZXJhdGUgRGVwbFN0YXRlT3B0aW9uU3RyZwogICAgbXkgJERlcGxTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXBsU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnIC4gJFJvd0RlcGxTdGF0ZUludmFsaWQsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3dEZXBsU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBEZXBsU3RhdGVPcHRpb25TdHJnID0+ICREZXBsU3RhdGVPcHRpb25TdHJnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+IFsgJ29wZXJhdGlvbmFsJywgJ2luY2lkZW50JyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGluY2lkZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIG15ICRSb3dJbmNpU3RhdGVJbnZhbGlkID0gJyc7CiAgICBpZiAoICEkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZlcnNpb25TYXZlJyAmJiAkU3VibWl0U2F2ZSApIHsKICAgICAgICAkUm93SW5jaVN0YXRlSW52YWxpZCA9ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2VuZXJhdGUgSW5jaVN0YXRlT3B0aW9uU3RyZwogICAgbXkgJEluY2lTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdJbmNpU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnIC4gJFJvd0luY2lTdGF0ZUludmFsaWQsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgKTsKCiAgICAjIG91dHB1dCBpbmNpZGVudCBzdGF0ZSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93SW5jaVN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkSW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCB4bWwgZm9ybQogICAgaWYgKCAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb259ICkgewogICAgICAgICRTZWxmLT5fWE1MRm9ybU91dHB1dCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICAlWE1MRm9ybU91dHB1dFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRoZSBhdHRhY2htZW50IHVwbG9hZCBidXR0b24KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRVcGxvYWQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSAmJiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB8fCAkRHVwbGljYXRlSUQgKSB7CgogICAgICAgICMgb3V0cHV0IGJsb2NrCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXJ0U21hbGwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0VuZFNtYWxsJyApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0JyksCiAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgIER1cGxpY2F0ZUlEID0+ICREdXBsaWNhdGVJRCwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIE5lY2Vzc2FyeSBzdHVmZiBmb3IgQWRkIE5ldwogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICAgICAgZm9yIG15ICRDbGFzc0lEICggc29ydCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1cxMDBwYycsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICk7CgogICAgICAgICMgRW5kIE5lY2Vzc2FyeSBzdHVmZiBmb3IgQWRkIE5ldwoKICAgICAgICAjIG91dHB1dCBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFydE5vcm1hbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRW5kTm9ybWFsJyApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0JyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgIER1cGxpY2F0ZUlEID0+ICREdXBsaWNhdGVJRCwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfWE1MRm9ybUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte0FsbFJlcXVpcmVkfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtBbGxSZXF1aXJlZH0gbmUgJ1NDQUxBUic7CiAgICByZXR1cm4gaWYgISRQYXJhbXtDb25maWdJdGVtSUR9OwoKICAgIG15ICRGb3JtRGF0YSA9IHt9OwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBteSAkQ291bnRlckluc2VydCA9IDE7CgogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGlucHV0a2V5IGFuZCBhZGRrZXkKICAgICAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudGVyOwogICAgICAgICAgICBteSAkQWRkS2V5ICAgPSAkSXRlbS0+e0tleX0gLiAnOjpBZGQnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgICAgICAgICAgJEFkZEtleSAgID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJEFkZEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcGFyYW0KICAgICAgICAgICAgbXkgJEZvcm1WYWx1ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPklUU01Db25maWdJdGVtRm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICAgICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRm9ybVZhbHVlcy0+e1ZhbHVlfSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoICRGb3JtVmFsdWVzLT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJHsgJFBhcmFte0FsbFJlcXVpcmVkfSB9ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRlbGV0ZSBidXR0b24KICAgICAgICAgICAgICAgIG5leHQgQ09VTlRFUiBpZiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkSW5wdXRLZXkgLiAnOjpEZWxldGUnICk7CgogICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1YkZvcm1EYXRhID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gJFBhcmFte0FsbFJlcXVpcmVkfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTdWJGb3JtRGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XS0+e0NvbnRlbnR9ID0gJEZvcm1WYWx1ZXMtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAkQ291bnRlckluc2VydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgYWRkIGJ1dHRvbgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkQWRkS2V5ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTZWxmLT5fWE1MRGVmYXVsdFNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCnN1YiBfWE1MRGVmYXVsdFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgbXkgJERlZmF1bHREYXRhID0ge307CgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50RGVmYXVsdH0gKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJERlZmF1bHREYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdID0gJFNlbGYtPl9YTUxEZWZhdWx0U2V0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERlZmF1bHREYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREZWZhdWx0RGF0YTsKfQoKc3ViIF9YTUxGb3JtT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9ICB8fD0gMDsKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBzdWJtaXQgc2F2ZQogICAgbXkgJFN1Ym1pdFNhdmUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0U2F2ZScgKTsKCiAgICAjIHNldCBkYXRhIHByZXNlbnQgbW9kZQogICAgbXkgJERhdGFQcmVzZW50TW9kZSA9IDA7CiAgICBpZiAoICRQYXJhbXtYTUxEYXRhfSAmJiByZWYgJFBhcmFte1hNTERhdGF9IGVxICdIQVNIJyApIHsKICAgICAgICAkRGF0YVByZXNlbnRNb2RlID0gMTsKICAgIH0KCiAgICBteSAkSXRlbUNvdW50ZXIgPSAxOwogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIHNldCBsb29wCiAgICAgICAgbXkgJExvb3AgPSAkSXRlbS0+e0NvdW50RGVmYXVsdH07CiAgICAgICAgaWYgKCREYXRhUHJlc2VudE1vZGUpIHsKICAgICAgICAgICAgJExvb3AgPSAwOwoKICAgICAgICAgICAgIyBzZWFyY2ggdGhlIGxhc3QgY29udGVudAogICAgICAgICAgICBDT1VOVEVSOgogICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgJExvb3AgPSAkQ291bnRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYWJzb2x1dCBtaW5pbXVtCiAgICAgICAgICAgIGlmICggJExvb3AgPCAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgICAgICRMb29wID0gJEl0ZW0tPntDb3VudE1pbn07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGRlbGV0ZQogICAgICAgIG15ICREZWxldGUgPSAwOwogICAgICAgIGlmICggJExvb3AgPiAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgJERlbGV0ZSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgIyBvdXRwdXQgY29udGVudCByb3dzCiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkTG9vcCApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBibG9jawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnWE1MUm93JyApOwoKICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dGaWVsZHNldFN0YXJ0JyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgYmx1ZSByZXF1aXJlZCBzdGFyCiAgICAgICAgICAgIG15ICRYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIG15ICRMYWJlbENsYXNzICAgICAgICAgICAgICAgICA9ICcnOwogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgJFhNTFJvd1ZhbHVlQ29udGVudFJlcXVpcmVkID0gMTsKICAgICAgICAgICAgICAgICRMYWJlbENsYXNzICAgICAgICAgICAgICAgICA9ICdNYW5kYXRvcnknOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByZWQgaW52YWxpZCBzdGFyCiAgICAgICAgICAgIG15ICRYTUxSb3dWYWx1ZUNvbnRlbnRJbnZhbGlkID0gMDsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57JElucHV0S2V5fS0+e0ludmFsaWR9ICYmICRTdWJtaXRTYXZlICkgewogICAgICAgICAgICAgICAgJFhNTFJvd1ZhbHVlQ29udGVudEludmFsaWQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSXRlbUlEID0gJ0l0ZW0nIC4gJEl0ZW1Db3VudGVyKysgLiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtMZXZlbH07CgogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ0N1c3RvbWVyJyApIHsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEluaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgICAgIEl0ZW1JZCAgICAgICAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICAgICAgPT4gJFhNTFJvd1ZhbHVlQ29udGVudFJlcXVpcmVkLAogICAgICAgICAgICAgICAgSW52YWxpZCAgICAgICAgICA9PiAkWE1MUm93VmFsdWVDb250ZW50SW52YWxpZCwKICAgICAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSUQ/CiAgICAgICAgICAgIG15ICRMYWJlbEZvciA9ICRJdGVtSUQ7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZScgfHwgJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgJExhYmVsRm9yID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWQgbmVlZGVkPwogICAgICAgICAgICBpZiAoJExhYmVsRm9yKSB7CiAgICAgICAgICAgICAgICAkTGFiZWxGb3IgPSAnZm9yPSInIC4gJExhYmVsRm9yIC4gJyInOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlzIHRoaXMgYSBzdWIgZmllbGQ/CiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnU3ViRWxlbWVudCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2xhc3MgbmVlZGVkPwogICAgICAgICAgICBpZiAoJExhYmVsQ2xhc3MpIHsKICAgICAgICAgICAgICAgICRMYWJlbENsYXNzID0gJ2NsYXNzPSInIC4gIiRDbGFzcyAgJExhYmVsQ2xhc3MiIC4gJyInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExhYmVsQ2xhc3MgPSAnY2xhc3M9IicgLiAkQ2xhc3MgLiAnIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyB2YWx1ZSBjb250ZW50IGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93VmFsdWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgICAgIExhYmVsRm9yICAgID0+ICRMYWJlbEZvciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSB8fCAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIElucHV0U3RyaW5nID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICBMYWJlbENsYXNzICA9PiAkTGFiZWxDbGFzcyB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCcgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgZGVsZXRlIGJ1dHRvbgogICAgICAgICAgICBpZiAoJERlbGV0ZSkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93VmFsdWVDb250ZW50RGVsZXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRLZXkgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRoZSBjb250ZW50IGlzIGludmFsaWQKICAgICAgICAgICAgaWYgKCRYTUxSb3dWYWx1ZUNvbnRlbnRJbnZhbGlkKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IHJlZ2V4IGVycm9yIG1lc3NhZ2UgYmxvY2sKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+eyRJbnB1dEtleX0tPntSZWdFeEVycm9yTWVzc2FnZX0gKSB7CgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dWYWx1ZVJlZ0V4RXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdFeEVycm9yTWVzc2FnZSA9PiAkSXRlbS0+e0Zvcm19LT57JElucHV0S2V5fS0+e1JlZ0V4RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNob3cgbm9ybWFsIHNlcnZlciBlcnJvciBibG9jawogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlU2VydmVyRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICBteSAlWE1MRm9ybU91dHB1dFBhcmFtOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRhUHJlc2VudE1vZGUKICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRYTUxGb3JtT3V0cHV0UGFyYW17WE1MRGF0YX0gPSAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPl9YTUxGb3JtT3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICVYTUxGb3JtT3V0cHV0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTGV2ZWwgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd0ZpZWxkc2V0RW5kJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgdG8gc29ydCByb3dzIGNvcnJlY3RseQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnWE1MUm93JyApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYWRkIGJ1dHRvbgogICAgICAgIGlmICggJExvb3AgPCAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgaWYgbm8gaXRlbSBzaG91bGQgYmUgc2hvd24gd2UgbmVlZCB0byBzaG93IHRoZSBhZGQgYnV0dG9uCiAgICAgICAgICAgICMgYW5kIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIHNob3cgdGhlIFhNTFJvdyBibG9jawogICAgICAgICAgICBpZiAoICEkTG9vcCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdYTUxSb3cnICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnY2xhc3M9IlN1YkVsZW1lbnQiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dGaWVsZHNldEVuZCcgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dGaWVsZHNldFN0YXJ0JyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgYWRkIGNvbnRlbnQgYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dBZGRDb250ZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgID0+ICRJbnB1dEtleSAuICdBZGQnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBJbnB1dEtleSAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFNlbGYtPntDb25maWdJdGVtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbmZpZ0l0ZW1JRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntDb25maWdJdGVtSUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICBJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e1Blcm1pc3Npb259LAogICAgKTsKCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIERlZmluZSB0cmFuc2xhdGFibGUgaGlzdG9yeSBzdHJpbmdzLgogICAgbXkgJUhpc3RvcnlTdHJpbmdzID0gKAogICAgICAgICdDSUhpc3Rvcnk6OkNvbmZpZ0l0ZW1DcmVhdGUnICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOZXcgQ29uZmlnSXRlbSAoSUQ9JXMpJyksCiAgICAgICAgJ0NJSGlzdG9yeTo6VmVyc2lvbkNyZWF0ZScgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05ldyB2ZXJzaW9uIChJRD0lcyknKSwKICAgICAgICAnQ0lIaXN0b3J5OjpEZXBsb3ltZW50U3RhdGVVcGRhdGUnID0+IFRyYW5zbGF0YWJsZSgnRGVwbG95bWVudCBzdGF0ZSB1cGRhdGVkIChuZXc9JXMsIG9sZD0lcyknKSwKICAgICAgICAnQ0lIaXN0b3J5OjpJbmNpZGVudFN0YXRlVXBkYXRlJyAgID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzLCBvbGQ9JXMpJyksCiAgICAgICAgJ0NJSGlzdG9yeTo6Q29uZmlnSXRlbURlbGV0ZScgICAgICA9PiBUcmFuc2xhdGFibGUoJ0NvbmZpZ0l0ZW0gKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NJSGlzdG9yeTo6TGlua0FkZCcgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0xpbmsgdG8gJXMgKHR5cGU9JXMpIGFkZGVkJyksCiAgICAgICAgJ0NJSGlzdG9yeTo6TGlua0RlbGV0ZScgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0xpbmsgdG8gJXMgKHR5cGU9JXMpIGRlbGV0ZWQnKSwKICAgICAgICAnQ0lIaXN0b3J5OjpEZWZpbml0aW9uVXBkYXRlJyAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ29uZmlnSXRlbSBkZWZpbml0aW9uIHVwZGF0ZWQgKElEPSVzKScpLAogICAgICAgICdDSUhpc3Rvcnk6Ok5hbWVVcGRhdGUnICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOYW1lIHVwZGF0ZWQgKG5ldz0lcywgb2xkPSVzKScpLAogICAgICAgICdDSUhpc3Rvcnk6OlZhbHVlVXBkYXRlJyAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBdHRyaWJ1dGUgJXMgdXBkYXRlZCBmcm9tICIlcyIgdG8gIiVzIicpLAogICAgICAgICdDSUhpc3Rvcnk6OlZlcnNpb25EZWxldGUnICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdWZXJzaW9uICVzIGRlbGV0ZWQnKSwKICAgICk7CgogICAgIyBnZXQgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtTmFtZSA9ICRDb25maWdJdGVtLT57TnVtYmVyfTsKCiAgICAjIGdldCBhbGwgZW50cmllcyBpbiB0aGUgaGlzdG9yeSBmb3IgdGhpcyBjb25maWcgaXRlbQogICAgbXkgJExpbmVzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBnZXQgc2hvd24gdXNlciBpbmZvCiAgICBteSBATmV3TGluZXMgPSBAeyRMaW5lc307CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpIaXN0b3J5T3JkZXInKSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgQE5ld0xpbmVzID0gcmV2ZXJzZSBAeyRMaW5lc307CiAgICB9CgogICAgIyBnZXQgZGVmaW5pdGlvbiBmb3IgQ0kncyBjbGFzcwogICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIG15ICRUYWJsZSAgID0gJyc7CiAgICBteSAkQ291bnRlciA9IDE7CiAgICBteSAkVmVyc2lvbiA9IDA7CiAgICBmb3IgbXkgJERhdGFUbXAgKEBOZXdMaW5lcykgewogICAgICAgICRDb3VudGVyKys7CiAgICAgICAgbXkgJURhdGEgPSAoCiAgICAgICAgICAgICV7JERhdGFUbXB9LAogICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb24sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIHRyaW0gdGhlIGNvbW1lbnQgdG8gb25seSBzaG93IHZlcnNpb24gbnVtYmVyCiAgICAgICAgaWYgKCAkRGF0YXtIaXN0b3J5VHlwZX0gZXEgJ1ZlcnNpb25DcmVhdGUnICkgewogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9fiBzL1xELy9nOwogICAgICAgICAgICAkRGF0YXtWZXJzaW9uSUR9ID0gJERhdGF7Q29tbWVudH07CiAgICAgICAgICAgICRWZXJzaW9uID0gJERhdGF7Q29tbWVudH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERhdGF7SGlzdG9yeVR5cGV9IGVxICdWYWx1ZVVwZGF0ZScgKSB7CgogICAgICAgICAgICAjIGJlYXV0aWZ5IGNvbW1lbnQKICAgICAgICAgICAgbXkgQFBhcnRzID0gc3BsaXQgLyUlLywgJERhdGF7Q29tbWVudH07CiAgICAgICAgICAgICRQYXJ0c1swXSA9fiBzeyBcQSBcWy4qP1xdIFx7J1ZlcnNpb24nXH0gXFsuKj9cXSBceycgfXt9eG1zOwogICAgICAgICAgICAkUGFydHNbMF0gPX4gc3sgJ1x9IFxbLio/XF0gXHsnIH17Ojp9eG1zZzsKICAgICAgICAgICAgJFBhcnRzWzBdID1+IHN7ICdcfSBcWy4qP1xdIFx6IH17fXhtczsKCiAgICAgICAgICAgICMgZ2V0IGluZm8gYWJvdXQgYXR0cmlidXRlCiAgICAgICAgICAgIG15ICRBdHRyaWJ1dGVJbmZvID0gJFNlbGYtPl9HZXRBdHRyaWJ1dGVJbmZvKAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICAgICAgUGF0aCAgICAgICA9PiAkUGFydHNbMF0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRBdHRyaWJ1dGVJbmZvICYmICRBdHRyaWJ1dGVJbmZvLT57SW5wdXR9LT57VHlwZX0gZXEgJ0dlbmVyYWxDYXRhbG9nJyApIHsKICAgICAgICAgICAgICAgIG15ICRJdGVtTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEF0dHJpYnV0ZUluZm8tPntJbnB1dH0tPntDbGFzc30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJ0c1sxXSA9ICRJdGVtTGlzdC0+eyAkUGFydHNbMV0gfHwgJycgfSB8fCAnJzsKICAgICAgICAgICAgICAgICRQYXJ0c1syXSA9ICRJdGVtTGlzdC0+eyAkUGFydHNbMl0gfHwgJycgfSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NlbWJsZSBwYXJ0cwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9IGpvaW4gJyUlJywgQFBhcnRzOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXRhe0hpc3RvcnlUeXBlfSBlcSAnRGVwbG95bWVudFN0YXRlVXBkYXRlJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBuYW1lcwogICAgICAgICAgICBteSBAUGFydHMgPSBzcGxpdCAvJSUvLCAkRGF0YXtDb21tZW50fTsKICAgICAgICAgICAgZm9yIG15ICRQYXJ0IChAUGFydHMpIHsKICAgICAgICAgICAgICAgICRQYXJ0ID0gJERlcGxTdGF0ZUxpc3QtPnskUGFydH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYXNzZW1ibGUgcGFydHMKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSBqb2luICclJScsIEBQYXJ0czsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF0YXtIaXN0b3J5VHlwZX0gZXEgJ0luY2lkZW50U3RhdGVVcGRhdGUnICkgewoKICAgICAgICAgICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBuYW1lcwogICAgICAgICAgICBteSBAUGFydHMgPSBzcGxpdCAvJSUvLCAkRGF0YXtDb21tZW50fTsKICAgICAgICAgICAgZm9yIG15ICRQYXJ0IChAUGFydHMpIHsKICAgICAgICAgICAgICAgICRQYXJ0ID0gJERlcGxTdGF0ZUxpc3QtPnskUGFydH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYXNzZW1ibGUgcGFydHMKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSBqb2luICclJScsIEBQYXJ0czsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSB0ZXh0CiAgICAgICAgaWYgKCAkRGF0YXtDb21tZW50fSApIHsKCiAgICAgICAgICAgIG15ICVJbmZvOwoKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPX4gc3sgXEEgJSUgfXt9eG1zZzsKICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0IC8lJS8sICREYXRhe0NvbW1lbnR9OwoKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAkSGlzdG9yeVN0cmluZ3N7ICdDSUhpc3Rvcnk6OicgLiAkRGF0YXtIaXN0b3J5VHlwZX0gfSwKICAgICAgICAgICAgICAgIEBWYWx1ZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9fiBzL1wlcy8vZzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVmFsdWUgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9HZXRBdHRyaWJ1dGVJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERlZmluaXRpb24gUGF0aCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN1YnRyZWUgPSAkUGFyYW17RGVmaW5pdGlvbn07CiAgICBteSAkSW5mbzsKCiAgICBQQVJUOgogICAgZm9yIG15ICRQYXJ0ICggc3BsaXQgLzo6LywgJFBhcmFte1BhdGh9ICkgewogICAgICAgIG15ICgkRm91bmQpID0gZ3JlcCB7ICRfLT57S2V5fSBlcSAkUGFydCB9IEB7JFN1YnRyZWV9OwoKICAgICAgICBsYXN0IFBBUlQgaWYgISRGb3VuZDsKCiAgICAgICAgJFN1YnRyZWUgPSAkRm91bmQtPntTdWJ9OwogICAgICAgICRJbmZvICAgID0gJEZvdW5kOwogICAgfQoKICAgIHJldHVybiAkSW5mbzsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbmZpZ0l0ZW1JRCcgKTsKICAgIG15ICRWZXJzaW9uSUQgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmVyc2lvbklEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDb25maWdJdGVtSUQgfHwgISRWZXJzaW9uSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgbXkgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpLT57UGVybWlzc2lvbn0sCiAgICApOwoKICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBzaG93IGNvbmZpZyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CiAgICBpZiAoICEkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb25maWdJdGVtSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRDb25maWdJdGVtSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICk7CiAgICBpZiAoICEkVmVyc2lvbi0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1ZlcnNpb25JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFZlcnNpb25JRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgIG15ICRMYXN0VmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgICRDb25maWdJdGVtLT57Q3VycmVudE5hbWV9ID0gJExhc3RWZXJzaW9uLT57TmFtZX07CgogICAgIyBnZXQgdmVyc2lvbiBsaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgIG15ICRWZXJzaW9uTnVtYmVyID0gMTsKICAgIExJU1RWRVJTSU9OSUQ6CiAgICBmb3IgbXkgJExpc3RWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CgogICAgICAgIGxhc3QgTElTVFZFUlNJT05JRCBpZiAkVmVyc2lvbklEIGVxICRMaXN0VmVyc2lvbklEOwogICAgICAgICRWZXJzaW9uTnVtYmVyKys7CiAgICB9CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIGdldCBjcmVhdGUgJiBjaGFuZ2UgdXNlciBkYXRhCiAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlIENoYW5nZSkpIHsKICAgICAgICAkQ29uZmlnSXRlbS0+eyAkS2V5IC4gJ0J5TmFtZScgfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57ICRLZXkgLiAnQnknIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB1c2VyIGRhdGEgb2YgdmVyc2lvbiAoY3JlYXRlIGJ5KQogICAgJFZlcnNpb24tPntDcmVhdGVCeU5hbWV9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgIFVzZXJJRCA9PiAkVmVyc2lvbi0+e0NyZWF0ZUJ5fSwKICAgICk7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdHlwZSBsaXN0CiAgICBteSAlTGlua1R5cGVMaXN0ID0gJExpbmtPYmplY3QtPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaW5rIGRhdGEKICAgIG15ICVMaW5rRGF0YTsKICAgIGlmICggJExpbmtMaXN0V2l0aERhdGEgJiYgcmVmICRMaW5rTGlzdFdpdGhEYXRhIGVxICdIQVNIJyAmJiAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICAlTGlua0RhdGEgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJ1NpbXBsZVJhdycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50cwogICAgbXkgQEF0dGFjaG1lbnRzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBnZXQgcGRmIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIG15ICVQYWdlOwoKICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAkUGFnZXtNYXhQYWdlc30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgfQoKICAgIG15ICRUaXRsZSA9ICRDb25maWdJdGVtLT57Q3VycmVudE5hbWV9OwoKICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvbmZpZ0l0ZW0nKSAuICcjJwogICAgICAgIC4gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSA9ICRWZXJzaW9uLT57TmFtZX07CiAgICAkUGFnZXtQYWdlVGV4dH0gICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQYWdlJyk7CiAgICAkUGFnZXtQYWdlQ291bnR9ICAgID0gMTsKCiAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAkUERGT2JqZWN0LT5Eb2N1bWVudE5ldygKICAgICAgICBUaXRsZSAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9kdWN0JykgLiAnOicgLiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgIEVuY29kZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAlUGFnZSwKICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgKTsKICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC02LAogICAgKTsKCiAgICAjIG91dHB1dCB0aXRsZQogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkVGl0bGUsCiAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0ICJwcmludGVkIGJ5IgogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJ3ByaW50ZWQgYnkgJXMgYXQgJXMnLAogICAgICAgICAgICAkU2VsZi0+e1VzZXJGdWxsbmFtZX0sCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntUaW1lfSwKICAgICAgICApLAogICAgICAgIEZvbnRTaXplID0+IDksCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE0LAogICAgKTsKCiAgICAjIG91dHB1dCBnZW5lcmFsIGluZm9ybWF0aW9uCiAgICAkU2VsZi0+X1BERk91dHB1dEdlbmVyYWxJbmZvcygKICAgICAgICBQYWdlICAgICAgID0+IFwlUGFnZSwKICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgKTsKCiAgICAjIG91dHB1dCBsaW5rZWQgb2JqZWN0cwogICAgaWYgKCVMaW5rRGF0YSkgewogICAgICAgICRTZWxmLT5fUERGT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgUGFnZURhdGEgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgTGlua0RhdGEgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgIExpbmtUeXBlTGlzdCA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGF0dGFjaG1lbnRzCiAgICBpZiAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRBdHRhY2htZW50cygKICAgICAgICAgICAgUGFnZURhdGEgICAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBDb25maWdJdGVtSUQgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBBdHRhY2htZW50RGF0YSA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdmVyc2lvbiBpbmZvcwogICAgJFNlbGYtPl9QREZPdXRwdXRWZXJzaW9uSW5mb3MoCiAgICAgICAgUGFnZSAgICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgVmVyc2lvbiAgICAgICA9PiAkVmVyc2lvbiwKICAgICAgICBWZXJzaW9uTnVtYmVyID0+ICRWZXJzaW9uTnVtYmVyLAogICAgKTsKCiAgICAjIGNyZWF0ZSBmaWxlIG5hbWUKICAgIG15ICRGaWxlbmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkZpbGVuYW1lQ2xlYW5VcCgKICAgICAgICBGaWxlbmFtZSA9PiAkQ29uZmlnSXRlbS0+e051bWJlcn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICAjIGdldCB0aW1lIG9iamVjdAogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2NvbmZpZ2l0ZW1fJyAuICRGaWxlbmFtZSAuICJfJFktJE0tJERcXyRoLSRtLnBkZiIsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJFBERk9iamVjdC0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICk7Cn0KCnN1YiBfUERGT3V0cHV0R2VuZXJhbEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgQ29uZmlnSXRlbSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NsYXNzJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDb25maWdJdGVtfS0+e0NsYXNzfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDb25maWdJdGVtJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDb25maWdJdGVtfS0+e0N1cnJlbnROYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJFBhcmFte0NvbmZpZ0l0ZW19LT57Q3VyRGVwbFN0YXRlfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXJyZW50IEluY2lkZW50IFN0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtfS0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICdbJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q29uZmlnSXRlbX0tPntDcmVhdGVCeU5hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xhc3QgY2hhbmdlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnWyUgRGF0YS5DaGFuZ2VUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q29uZmlnSXRlbX0tPntDaGFuZ2VCeU5hbWV9LAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIGdldCBwZGYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRMaW5rZWRPYmplY3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVQYWdlICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUeXBlTGlzdCA9ICV7ICRQYXJhbXtMaW5rVHlwZUxpc3R9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgbXkgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7ICRQYXJhbXtMaW5rRGF0YX0gfSApIHsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgIG15IEBMaW5rRGF0YSAgICAgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRMaW5rVHlwZU5hbWUpOwoKICAgICAgICAjIGRlZmluZSBoZWFkbGluZQogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMaW5rVHlwZU5hbWUgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICcnOwoKICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRQYXJhbXtMaW5rRGF0YX0tPnskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gfHw9ICcnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgewogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgZ2V0IHBkZiBvYmplY3QKICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMaW5rZWQgT2JqZWN0cycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgdGFibGUgcGFyYW1zCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciBteSAkQ291bnQgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEF0dGFjaG1lbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2VEYXRhIENvbmZpZ0l0ZW1JRCBBdHRhY2htZW50RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JEFyZ3VtZW50fSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlUGFnZSA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBhdHRhY2htZW50cyBhcmUgcmVuZGVyZWQgaW50byBhIHNlcGFyYXRlIHJvdwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50RGF0YX0gfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG1ldGFkYXRhIG9mIHRoZSBjdXJyZW50IGF0dGFjaG1lbnQKICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CgogICAgICAgICMgZGVmaW5lIGF0dGFjaG1lbnQgbGluZQogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVuYW1lfSAuICcgICgnIC4gJEF0dGFjaG1lbnREYXRhLT57RmlsZXNpemV9IC4gJyknOwoKICAgICAgICAkUm93Kys7CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBnZXQgcGRmIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXR0YWNobWVudHMnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIHRhYmxlIHBhcmFtcwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgbXkgJENvdW50ICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRWZXJzaW9uSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBWZXJzaW9uIFZlcnNpb25OdW1iZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwZGYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ZlcnNpb24nKSAuICcgJwogICAgICAgICAgICAuICRQYXJhbXtWZXJzaW9uTnVtYmVyfSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0YWJsZQogICAgbXkgJFRhYmxlID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICdbJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte1ZlcnNpb259IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VmVyc2lvbn0tPntDcmVhdGVCeU5hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnICcsCiAgICAgICAgICAgIFZhbHVlID0+ICcgJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdOYW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtWZXJzaW9ufS0+e05hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RlcGxveW1lbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17VmVyc2lvbn0tPntEZXBsU3RhdGV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW5jaWRlbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17VmVyc2lvbn0tPntJbmNpU3RhdGV9ICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgeG1sIGRhdGEgdG8gdGFibGUKICAgIGlmICgKICAgICAgICByZWYgJFBhcmFte1ZlcnNpb259IGVxICdIQVNIJwogICAgICAgICYmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERlZmluaXRpb259CiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0KICAgICAgICAmJiByZWYgJFBhcmFte1ZlcnNpb259LT57WE1MRGVmaW5pdGlvbn0gZXEgJ0FSUkFZJwogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfSBlcSAnQVJSQVknCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0tPlsxXQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdIGVxICdIQVNIJwogICAgICAgICYmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFhNTE91dHB1dCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkUGFyYW17VmVyc2lvbn0tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICAgICAgVGFibGVEYXRhICAgICA9PiAkVGFibGUsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3dzID0gQHskVGFibGV9OwoKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSAxMDA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MTE7CiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSAgICAgID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yIG15ICRDb3VudCAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRQREZPYmplY3QtPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0WE1MT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1RhYmxlRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17VGFibGVEYXRhfSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIHN0b3AgbG9vcCwgaWYgbm8gY29udGVudCB3YXMgZ2l2ZW4KICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwoKICAgICAgICAgICAgIyBsb29rdXAgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFByaW50ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgbmV3bGluZXMgd2l0aCA8YnIvPiAoZml4IGZvciBidWcjIDU5MjgpCiAgICAgICAgICAgICRWYWx1ZSA9fiBzeyBcbiB9ezxici8+fWd4bXM7CgogICAgICAgICAgICAjIGNvbnZlcnQgdmFsdWUgdG8gYXNjaWkKICAgICAgICAgICAgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKCBTdHJpbmcgPT4gJFZhbHVlICk7CgogICAgICAgICAgICAjIG5ldyByb3cKICAgICAgICAgICAgbXkgJE5ld1JvdyA9IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApIC4gJzonLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgIyBvdXRwdXQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE5ld1Jvdy0+e0tleX0gICA9ICcgICAgJyAuICROZXdSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgICAgICROZXdSb3ctPntWYWx1ZX0gPSAnICAgICcgLiAkTmV3Um93LT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByb3cgZGF0YQogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtUYWJsZURhdGF9IH0sICROZXdSb3c7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRYTUxPdXRwdXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgVGFibGVEYXRhICAgICA9PiAkUGFyYW17VGFibGVEYXRhfSwKICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjb25maWcgZGF0YQogICAgJFNlbGYtPntTdGFydEhpdH0gICAgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxICk7CiAgICAkU2VsZi0+e1NlYXJjaExpbWl0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1NlYXJjaExpbWl0fSB8fCAxMDAwMDsKICAgICRTZWxmLT57U29ydEJ5fSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdOdW1iZXInOwogICAgJFNlbGYtPntPcmRlckJ5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnRG93bic7CiAgICAkU2VsZi0+e1Byb2ZpbGV9ICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcm9maWxlJyApICAgICB8fCAnJzsKICAgICRTZWxmLT57U2F2ZVByb2ZpbGV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVQcm9maWxlJyApIHx8ICcnOwogICAgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGFrZUxhc3RTZWFyY2gnICk7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gdGhlIGNsYXNzZXMKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBpZAogICAgbXkgJENsYXNzSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgY2xhc3MgaWQgaXMgdmFsaWQKICAgIGlmICggJENsYXNzSUQgJiYgISRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBDbGFzc0lEIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzaW5nbGUgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CgogICAgIyBnZXQgc2VhcmNoIHByb2ZpbGUgb2JqZWN0CiAgICBteSAkU2VhcmNoUHJvZmlsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZWFyY2hQcm9maWxlJyk7CgogICAgIyBsb2FkIHByb2ZpbGVzIHN0cmluZyBwYXJhbXMKICAgIGlmICggKCAkQ2xhc3NJRCAmJiAkU2VsZi0+e1Byb2ZpbGV9ICkgJiYgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gKSB7CiAgICAgICAgJUdldFBhcmFtID0gJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVHZXQoCiAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBzZWFyY2ggcHJvZmlsZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYUHJvZmlsZURlbGV0ZScgKSB7CgogICAgICAgICMgcmVtb3ZlIG9sZCBwcm9maWxlIHN0dWZmCiAgICAgICAgJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVEZWxldGUoCiAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAxLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW5pdCBzZWFyY2ggZGlhbG9nIChzZWxlY3QgY2xhc3MpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWCcgKSB7CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgY2xhc3MKICAgICAgICAjIGF1dG9tYXRpY2FsbHkgc2hvdyBzZWFyY2ggbWFzayBhZnRlciBzZWxlY3RpbmcgYSBjbGFzcyB2aWEgQUpBWAogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VhcmNoQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQgfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBodG1sIHNlYXJjaCBtYXNrIG91dHB1dAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hBSkFYJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIFByb2ZpbGUgICAgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNsYXNzIGZpZWxkcyBpZiBjbGFzcyBzcGVjaWZpZWQKICAgICAgICBpZiAoJENsYXNzSUQpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hBSkFYU2V0Q2xhc3MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHRlbXBsYXRlCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXQgc2VhcmNoIGZpZWxkcyBmb3Igc2VsZWN0ZWQgY2xhc3MKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgIyBDbGFzc0lEIGlzIHJlcXVpcmVkIGZvciB0aGUgc2VhcmNoIG1hc2sgYW5kIGZvciBhY3R1YWwgc2VhcmNoaW5nCiAgICAgICAgaWYgKCAhJENsYXNzSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDbGFzc0lEIGlzIGdpdmVuIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB1c2VyIGlzIGFsbG93ZWQgdG8gc2VhcmNoIGNsYXNzCiAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4KICAgICAgICBpZiAoICEkSGFzQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBjbGFzcyBnaXZlbiEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZGVmaW5pdGlvbgogICAgICAgIG15ICRYTUxEZWZpbml0aW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhYm9ydCwgaWYgbm8gZGVmaW5pdGlvbiBpcyBkZWZpbmVkCiAgICAgICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gZGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJXMhJywgJENsYXNzSUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBYTUxBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTnVtYmVyJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmFtZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRGVwbG95bWVudCBTdGF0ZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlR2V0UGFyYW0gPSAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUdldCgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gYXR0cmlidXRlcyBzdHJpbmcKICAgICAgICBpZiAoICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbn0gKSB7CiAgICAgICAgICAgICRTZWxmLT5fWE1MU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgICAgIFhNTEF0dHJpYnV0ZXMgPT4gXEBYTUxBdHRyaWJ1dGVzLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBhdHRyaWJ1dGVzIHN0cmluZyBmb3IgYXR0cmlidXRlcyBsaXN0CiAgICAgICAgJFBhcmFte0F0dHJpYnV0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICA9PiBcQFhNTEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdBdHRyaWJ1dGUnLAogICAgICAgICAgICBNdWx0aXBsZSA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGF0dHJpYnV0ZXMgc3RyaW5nIGZvciByZWNvdmVyeSBvbiBhZGQgb3Igc3VidHJhY3Qgc2VhcmNoIGZpZWxkcwogICAgICAgICRQYXJhbXtBdHRyaWJ1dGVzT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+IFxAWE1MQXR0cmlidXRlcywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ0F0dHJpYnV0ZU9yaWcnLAogICAgICAgICAgICBNdWx0aXBsZSA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICBteSAlUHJvZmlsZXMgPSAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUxpc3QoCiAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJFByb2ZpbGVzeycnfTsKICAgICAgICAkUHJvZmlsZXN7J2xhc3Qtc2VhcmNoJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Byb2ZpbGVzU3RyZ30gICAgID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVByb2ZpbGVzLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Byb2ZpbGUnLAogICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJ1NlYXJjaFByb2ZpbGUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGRlcGxveW1lbnQgc3RhdGVzCiAgICAgICAgbXkgJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkRGVwbFN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17RGVwbFN0YXRlSURzfSB8fCBbXSwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGluY2lkZW50IHN0YXRlcwogICAgICAgIG15ICRDdXJJbmNpU3RhdGVPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0luY2lTdGF0ZUlEc30gfHwgW10sCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZwogICAgICAgIG15ICRQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByZXZpb3VzVmVyc2lvblNlYXJjaCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ05vJyksCiAgICAgICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gfHwgJzAnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0IGZvcm1hdCBzdHJpbmcKICAgICAgICAkUGFyYW17UmVzdWx0Rm9ybVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTm9ybWFsID0+IFRyYW5zbGF0YWJsZSgnTm9ybWFsJyksCiAgICAgICAgICAgICAgICBQcmludCAgPT4gVHJhbnNsYXRhYmxlKCdQcmludCcpLAogICAgICAgICAgICAgICAgQ1NWICAgID0+IFRyYW5zbGF0YWJsZSgnQ1NWJyksCiAgICAgICAgICAgICAgICBFeGNlbCAgPT4gVHJhbnNsYXRhYmxlKCdFeGNlbCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZXN1bHRGb3JtJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gfHwgJ05vcm1hbCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FKQVhDb250ZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyAgICA9PiAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZU9wdGlvblN0cmcgICAgPT4gJEN1ckluY2lTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnID0+ICRQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnLAogICAgICAgICAgICAgICAgQXR0cmlidXRlc1N0cmcgICAgICAgICAgICA9PiAkUGFyYW17QXR0cmlidXRlc1N0cmd9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlc09yaWdTdHJnICAgICAgICA9PiAkUGFyYW17QXR0cmlidXRlc09yaWdTdHJnfSwKICAgICAgICAgICAgICAgIFJlc3VsdEZvcm1TdHJnICAgICAgICAgICAgPT4gJFBhcmFte1Jlc3VsdEZvcm1TdHJnfSwKICAgICAgICAgICAgICAgIFByb2ZpbGVzU3RyZyAgICAgICAgICAgICAgPT4gJFBhcmFte1Byb2ZpbGVzU3RyZ30sCiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOdW1iZXJ9IHx8ICcnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmFtZX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgeG1sIHNlYXJjaCBmb3JtCiAgICAgICAgaWYgKCAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb259ICkgewogICAgICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1PdXRwdXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgICAgICBYTUxBdHRyaWJ1dGVzID0+IFxAWE1MQXR0cmlidXRlcywKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJEF0dHJpYnV0ZUlzVXNlZCA9IDA7CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRLZXk7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRHZXRQYXJhbXskS2V5fTsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEdldFBhcmFteyRLZXl9IGVxICcnOwoKICAgICAgICAgICAgJEF0dHJpYnV0ZUlzVXNlZCA9IDE7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEFKQVhTaG93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAkS2V5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gYXR0cmlidXRlIGlzIHNob3duLCBzaG93IGNvbmZpZ2l0ZW0gbnVtYmVyCiAgICAgICAgaWYgKCAhJFNlbGYtPntQcm9maWxlfSApIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQUpBWFNob3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHRlbXBsYXRlCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBwZXJmb3JtIHNlYXJjaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcgKSB7CgogICAgICAgIG15ICRTZWFyY2hEaWFsb2cgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VhcmNoRGlhbG9nJyApOwoKICAgICAgICAjIGZpbGwgdXAgcHJvZmlsZSBuYW1lIChlLmcuIHdpdGggbGFzdC1zZWFyY2gpCiAgICAgICAgaWYgKCAhJFNlbGYtPntQcm9maWxlfSB8fCAhJFNlbGYtPntTYXZlUHJvZmlsZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57UHJvZmlsZX0gPSAnbGFzdC1zZWFyY2gnOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IG92ZXJ2aWV3IHNjcmVlbgogICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2g7UHJvZmlsZT0kU2VsZi0+e1Byb2ZpbGV9OyIKICAgICAgICAgICAgLiAiVGFrZUxhc3RTZWFyY2g9MTtTdGFydEhpdD0kU2VsZi0+e1N0YXJ0SGl0fTtTdWJhY3Rpb249U2VhcmNoOyIKICAgICAgICAgICAgLiAiT3JkZXJCeT0kU2VsZi0+e09yZGVyQnl9O1NvcnRCeT0kU2VsZi0+e1NvcnRCeX0iOwoKICAgICAgICBpZiAoJENsYXNzSUQpIHsKICAgICAgICAgICAgJFVSTCAuPSAiO0NsYXNzSUQ9JENsYXNzSUQiOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2Vzc2lvbiBvYmplY3QKICAgICAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwoKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVVJMLAogICAgICAgICk7CiAgICAgICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVVJMLAogICAgICAgICk7CgogICAgICAgICMgQ2xhc3NJRCBpcyByZXF1aXJlZCBmb3IgdGhlIHNlYXJjaCBtYXNrIGFuZCBmb3IgYWN0dWFsIHNlYXJjaGluZwogICAgICAgIGlmICggISRDbGFzc0lEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdXNlciBpcyBhbGxvd2VkIHRvIHNlYXJjaCBjbGFzcwogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuCiAgICAgICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgICAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgICAgIGlmICggISRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzIScsICRDbGFzc0lEICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzY2FsYXIgc2VhcmNoIGF0dHJpYnV0ZXMgKHNwZWNpYWwgaGFuZGxpbmcgZm9yIE51bWJlciBhbmQgTmFtZSkKICAgICAgICBGT1JNVkFMVUU6CiAgICAgICAgZm9yIG15ICRGb3JtVmFsdWUgKHF3KE51bWJlciBOYW1lKSkgewoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZvcm1WYWx1ZSApOwoKICAgICAgICAgICAgIyBtdXN0IGJlIGRlZmluZWQgYW5kIG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgIyBCVVQgdGhlIG51bWJlciAwIGlzIGFuIGFsbG93ZWQgdmFsdWUKICAgICAgICAgICAgbmV4dCBGT1JNVkFMVUUgaWYgIWRlZmluZWQgJFZhbHVlOwogICAgICAgICAgICBuZXh0IEZPUk1WQUxVRSBpZiAkVmFsdWUgZXEgJyc7CgogICAgICAgICAgICAkR2V0UGFyYW17JEZvcm1WYWx1ZX0gPSAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGVyIHNjYWxhciBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIEZPUk1WQUxVRToKICAgICAgICBmb3IgbXkgJEZvcm1WYWx1ZSAocXcoUHJldmlvdXNWZXJzaW9uU2VhcmNoIFJlc3VsdEZvcm0pKSB7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRm9ybVZhbHVlICk7CgogICAgICAgICAgICBuZXh0IEZPUk1WQUxVRSBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgJEdldFBhcmFteyRGb3JtVmFsdWV9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJyYXkgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBGT1JNQVJSQVk6CiAgICAgICAgZm9yIG15ICRGb3JtQXJyYXkgKHF3KERlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMpKSB7CgogICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkRm9ybUFycmF5ICk7CgogICAgICAgICAgICBuZXh0IEZPUk1BUlJBWSBpZiAhQEFycmF5OwoKICAgICAgICAgICAgJEdldFBhcmFteyRGb3JtQXJyYXl9ID0gXEBBcnJheTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHhtbCBzZWFyY2ggZm9ybQogICAgICAgIG15ICRYTUxGb3JtRGF0YSA9IFtdOwogICAgICAgIG15ICRYTUxHZXRQYXJhbSA9IFtdOwogICAgICAgICRTZWxmLT5fWE1MU2VhcmNoRm9ybUdldCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBYTUxGb3JtRGF0YSAgID0+ICRYTUxGb3JtRGF0YSwKICAgICAgICAgICAgWE1MR2V0UGFyYW0gICA9PiAkWE1MR2V0UGFyYW0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoIEB7JFhNTEZvcm1EYXRhfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1doYXR9ID0gJFhNTEZvcm1EYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHNlYXJjaCBwcm9maWxlICh1bmRlciBsYXN0LXNlYXJjaCBvciByZWFsIHByb2ZpbGUgbmFtZSkKICAgICAgICAkU2VsZi0+e1NhdmVQcm9maWxlfSA9IDE7CgogICAgICAgICMgcmVtZW1iZXIgbGFzdCBzZWFyY2ggdmFsdWVzIG9ubHkgaWYgc2VhcmNoIGlzIGNhbGxlZCBmcm9tIGEgc2VhcmNoIGRpYWxvZwogICAgICAgICMgbm90IGZyb20gcmVzdWx0cyBwYWdlCiAgICAgICAgaWYgKCAkU2VsZi0+e1NhdmVQcm9maWxlfSAmJiAkU2VsZi0+e1Byb2ZpbGV9ICYmICRTZWFyY2hEaWFsb2cgKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBvbGQgcHJvZmlsZSBzdHVmZgogICAgICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW5zZXJ0IG5ldyBwcm9maWxlIHBhcmFtcwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskS2V5fSAmJiAkS2V5IG5lICdXaGF0JyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbnNlcnQgbmV3IHByb2ZpbGUgcGFyYW1zIGFsc28gZnJvbSBYTUxmb3JtCiAgICAgICAgICAgIGlmICggQHskWE1MR2V0UGFyYW19ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCBAeyRYTUxHZXRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW1ldGVyLT57JEtleX0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkUGFyYW1ldGVyLT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU2VhcmNoUmVzdWx0TGlzdCA9IFtdOwoKICAgICAgICAjIHN0YXJ0IHNlYXJjaCBpZiBjYWxsZWQgZnJvbSBhIHNlYXJjaCBkaWFsb2cgb3IgZnJvbSBhIHJlc3V0bHMgcGFnZQogICAgICAgIGlmICggJFNlYXJjaERpYWxvZyB8fCAkU2VsZi0+e1Rha2VMYXN0U2VhcmNofSApIHsKCiAgICAgICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgICAgICRTZWFyY2hSZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyAkU2VsZi0+e1NvcnRCeX0gXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAkU2VsZi0+e09yZGVyQnl9IF0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+ICRTZWxmLT57U2VhcmNoTGltaXR9LAogICAgICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICA9PiBbJENsYXNzSURdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW0gb25seSBpZiBjYWxsZWQgZnJvbSBhIHNlYXJjaCBkaWFsb2csIG90aGVyd2lzZSBpdCBtdXN0IGJlIGFscmVhZHkgaW4gJUdldFBhcmFtCiAgICAgICAgIyBmcm9tIGEgbG9hZGVkIHByb2ZpbGUKICAgICAgICBpZiAoJFNlYXJjaERpYWxvZykgewogICAgICAgICAgICAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzdWx0Rm9ybScgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpbWUgb2JqZWN0CiAgICAgICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICAgICAjIENTViBvdXRwdXQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnQ1NWJwogICAgICAgICAgICB8fAogICAgICAgICAgICAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gZXEgJ0V4Y2VsJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSBAQ1NWRGF0YTsKICAgICAgICAgICAgbXkgQENTVkhlYWQ7CgogICAgICAgICAgICAjIG1hcHBpbmcgYmV0d2VlbiBoZWFkZXIgbmFtZSBhbmQgZGF0YSBmaWVsZAogICAgICAgICAgICBteSAlSGVhZGVyMkRhdGEgPSAoCiAgICAgICAgICAgICAgICAnQ2xhc3MnICAgICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgICAgICdJbmNpZGVudCBTdGF0ZScgICA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgICdOYW1lJyAgICAgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAnQ29uZmlnSXRlbU51bWJlcicgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAnRGVwbG95bWVudCBTdGF0ZScgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICAnVmVyc2lvbicgICAgICAgICAgPT4gJ1ZlcnNpb25JRCcsCiAgICAgICAgICAgICAgICAnQ3JlYXRlIFRpbWUnICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JFNlYXJjaFJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKICAgICAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJEhhc0FjY2VzczsKCiAgICAgICAgICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjc3YgcXVvdGUKICAgICAgICAgICAgICAgIGlmICggIUBDU1ZIZWFkICkgewogICAgICAgICAgICAgICAgICAgIEBDU1ZIZWFkID0gQHsgJFNlbGYtPntDb25maWd9LT57U2VhcmNoQ1NWRGF0YX0gfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHN0b3JlIGRhdGEKICAgICAgICAgICAgICAgIG15IEBEYXRhOwogICAgICAgICAgICAgICAgZm9yIG15ICRIZWFkZXIgKEBDU1ZIZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF0YSwgJExhc3RWZXJzaW9uLT57ICRIZWFkZXIyRGF0YXskSGVhZGVyfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAQ1NWRGF0YSwgXEBEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNzdiBxdW90ZQogICAgICAgICAgICAjIHRyYW5zbGF0ZSBub24gZXhpc3RpbmcgaGVhZGVyIG1heSByZXN1bHQgaW4gYSBnYXJiYWdlIGZpbGUKICAgICAgICAgICAgaWYgKCAhQENTVkhlYWQgKSB7CiAgICAgICAgICAgICAgICBAQ1NWSGVhZCA9IEB7ICRTZWxmLT57Q29uZmlnfS0+e1NlYXJjaENTVkRhdGF9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdHJhbnNsYXRlIGhlYWRlcnMKICAgICAgICAgICAgZm9yIG15ICRIZWFkZXIgKEBDU1ZIZWFkKSB7CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIENvbmZpZ0l0ZW1OdW1iZXIgaGVhZGVyIHdpdGggdGhlIGN1cnJlbnQgQ29uZmlnSXRlbU51bWJlciBob29rIGZyb20gc3lzY29uZmlnCiAgICAgICAgICAgICAgICBpZiAoICRIZWFkZXIgZXEgJ0NvbmZpZ0l0ZW1OdW1iZXInICkgewogICAgICAgICAgICAgICAgICAgICRIZWFkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpIb29rJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkSGVhZGVyID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIZWFkZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFzc2VtYmxlIENTViBkYXRhCiAgICAgICAgICAgIG15ICRDU1ZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q1NWJyk7CiAgICAgICAgICAgIG15ICRDU1ZGaWxlICAgPSAnY2hhbmdlX3NlYXJjaCc7CiAgICAgICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnQ1NWJyApIHsKCiAgICAgICAgICAgICAgICAjIEFzc2FibGUgQ1NWIGRhdGEuCiAgICAgICAgICAgICAgICBteSAkQ1NWID0gJENTVk9iamVjdC0+QXJyYXkyQ1NWKAogICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICA9PiBcQENTVkhlYWQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgID0+IFxAQ1NWRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZXBhcmF0b3IgPT4gJFNlbGYtPntVc2VyQ1NWU2VwYXJhdG9yfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBSZXR1cm4gY3N2IHRvIGRvd25sb2FkLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJENTVkZpbGUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLmNzdiIsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gInRleHQvY3N2OyBjaGFyc2V0PSIgLiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDU1YsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdlbmVyYXRlIEV4Y2VsIG91dHB1dAogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnRXhjZWwnICkgewoKICAgICAgICAgICAgICAgICMgQXNzYWJsZSBFeGNlbCBkYXRhLgogICAgICAgICAgICAgICAgbXkgJEV4Y2VsID0gJENTVk9iamVjdC0+QXJyYXkyQ1NWKAogICAgICAgICAgICAgICAgICAgIEhlYWQgICA9PiBcQENTVkhlYWQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgID0+IFxAQ1NWRGF0YSwKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJ0V4Y2VsJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBSZXR1cm4gRXhjZWwgdG8gZG93bmxvYWQuCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkQ1NWRmlsZSAuICJfIiAuICIkWS0kTS0kRCIgLiAiXyIgLiAiJGgtJG0ueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRFeGNlbCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcHJpbnQgUERGIG91dHB1dAogICAgICAgIGVsc2lmICggJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdQcmludCcgKSB7CgogICAgICAgICAgICBteSBAUERGRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHBkZiBvYmplY3QKICAgICAgICAgICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAgICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRTZWFyY2hSZXN1bHRMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICAgICAgICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRIYXNBY2Nlc3M7CgogICAgICAgICAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHBkZiByb3dzCiAgICAgICAgICAgICAgICBteSBAUERGUm93OwogICAgICAgICAgICAgICAgZm9yIG15ICRTdG9yZURhdGEgKHF3KENsYXNzIEluY2lTdGF0ZSBOYW1lIE51bWJlciBEZXBsU3RhdGUgVmVyc2lvbklEIENyZWF0ZVRpbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAUERGUm93LCAkTGFzdFZlcnNpb24tPnskU3RvcmVEYXRhfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1c2ggQFBERkRhdGEsIFxAUERGUm93OwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBQREYgT3V0cHV0CiAgICAgICAgICAgIG15ICRUaXRsZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ29uZmlndXJhdGlvbiBJdGVtJykgLiAnICcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZWFyY2gnKTsKICAgICAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgncHJpbnRlZCBieScpOwogICAgICAgICAgICBteSAkUGFnZSAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQYWdlJyk7CiAgICAgICAgICAgIG15ICRUaW1lICAgICAgPSAkTGF5b3V0T2JqZWN0LT57VGltZX07CgogICAgICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICAgICBteSAkTWF4UGFnZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgICAgICAgICAgaWYgKCAhJE1heFBhZ2VzIHx8ICRNYXhQYWdlcyA8IDEgfHwgJE1heFBhZ2VzID4gMTAwMCApIHsKICAgICAgICAgICAgICAgICRNYXhQYWdlcyA9IDEwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgdGhlIGhlYWRlcgogICAgICAgICAgICBteSAkQ2VsbERhdGE7CgogICAgICAgICAgICAjIG91dHB1dCAnTm8gUmVzdWx0JywgaWYgbm8gY29udGVudCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKEBQREZEYXRhKSB7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzBdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NsYXNzJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzBdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzFdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0luY2lkZW50IFN0YXRlJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzFdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzJdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05hbWUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMl0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bM10tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTnVtYmVyJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzNdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzRdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RlcGxveW1lbnQgU3RhdGUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNF0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNV0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVmVyc2lvbicpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls1XS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls2XS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGUgVGltZScpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls2XS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIHRoZSBjb250ZW50IGFycmF5CiAgICAgICAgICAgICAgICBteSAkQ291bnRlclJvdyA9IDE7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJvdyAoQFBERkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ291bnRlckNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggQHskUm93fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bJENvdW50ZXJSb3ddLT5bJENvdW50ZXJDb2x1bW5dLT57Q29udGVudH0gPSAkQ29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgJENvdW50ZXJDb2x1bW4rKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJENvdW50ZXJSb3crKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMF0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTm8gUmVzdWx0IScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHBhZ2UgcGFyYW1zCiAgICAgICAgICAgIG15ICVQYWdlUGFyYW07CiAgICAgICAgICAgICRQYWdlUGFyYW17UGFnZU9yaWVudGF0aW9ufSA9ICdsYW5kc2NhcGUnOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpblRvcH0gICAgICAgPSAzMDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtNYXJnaW5SaWdodH0gICAgID0gNDA7CiAgICAgICAgICAgICRQYWdlUGFyYW17TWFyZ2luQm90dG9tfSAgICA9IDQwOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpbkxlZnR9ICAgICAgPSA0MDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtIZWFkZXJSaWdodH0gICAgID0gJFRpdGxlOwoKICAgICAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAgICAgbXkgJVRhYmxlUGFyYW07CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfSAgICAgICAgICAgID0gJENlbGxEYXRhOwogICAgICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICA9IDY7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0RERERERCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgPSAzOwogICAgICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgICAgICRQREZPYmplY3QtPkRvY3VtZW50TmV3KAogICAgICAgICAgICAgICAgVGl0bGUgID0+ICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgICAgIEVuY29kZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdGFydCB0YWJsZSBvdXRwdXQKICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlUGFyYW0sCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZSAuICcgMScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHRpdGxlCiAgICAgICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkVGl0bGUsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiAxMywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgInByaW50ZWQgYnkiCiAgICAgICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57VXNlckZ1bGxuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJFRpbWUsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiA5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTE0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgUEFHRToKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDIgLi4gJE1heFBhZ2VzICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBhbm90aGVyIHBhZ2UKICAgICAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICVQYWdlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdlIC4gJyAnIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICAgICAgbXkgJEZpbGVuYW1lID0gJ2NvbmZpZ2l0ZW1fc2VhcmNoJzsKICAgICAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGltZU9iamVjdC0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKICAgICAgICAgICAgbXkgJFBERlN0cmluZyA9ICRQREZPYmplY3QtPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG5vcm1hbCBIVE1MIG91dHB1dAogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzdGFydCBodG1sIHBhZ2UKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgICAgICAgICAkT3V0cHV0ID0gJyc7CgogICAgICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwogICAgICAgICAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICAgICAgICAgIyBzaG93IGNvbmZpZyBpdGVtcwogICAgICAgICAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgICAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgICAgICAgICAuICc7U29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U29ydEJ5fSApCiAgICAgICAgICAgICAgICAuICc7T3JkZXJCeT0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntPcmRlckJ5fSApCiAgICAgICAgICAgICAgICAuICc7UHJvZmlsZT0nIC4gJFNlbGYtPntQcm9maWxlfSAuICc7VGFrZUxhc3RTZWFyY2g9MTtTdWJhY3Rpb249U2VhcmNoJwogICAgICAgICAgICAgICAgLiAnO0NsYXNzSUQ9JyAuICRDbGFzc0lECiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAgICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgICAgICAgICAgLiAnO1Byb2ZpbGU9JyAuICRTZWxmLT57UHJvZmlsZX0gLiAnO1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaCcKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScgLiAkQ2xhc3NJRAogICAgICAgICAgICAgICAgLiAnOyc7CiAgICAgICAgICAgIG15ICRMaW5rRmlsdGVyID0gJ1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaDtQcm9maWxlPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1Byb2ZpbGV9ICkKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ2xhc3NJRCApCiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtCYWNrID0gJ1N1YmFjdGlvbj1Mb2FkUHJvZmlsZTtQcm9maWxlPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1Byb2ZpbGV9ICkKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ2xhc3NJRCApCiAgICAgICAgICAgICAgICAuICc7VGFrZUxhc3RTZWFyY2g9MTsnOwoKICAgICAgICAgICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBteSBAU2hvd0NvbHVtbnM7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgICAgICAgICAgZm9yIG15ICROYW1lICggc29ydCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgY29uZmlndXJlZCBjb2x1bW5zIGFuZCByZW9yZ2FuaXplIHRoZW0gYnkgY2xhc3MgbmFtZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zQnlDbGFzc30gKQogICAgICAgICAgICAgICAgJiYgJENsYXNzSUQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICVDb2x1bW5CeUNsYXNzOwoKICAgICAgICAgICAgICAgIE5BTUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJE5hbWUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc0J5Q2xhc3N9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgKCAkQ2xhc3MsICRDb2x1bW4gKSA9IHNwbGl0IC86Oi8sICROYW1lLCAyOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IE5BTUUgaWYgISRDb2x1bW47CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJENvbHVtbkJ5Q2xhc3N7JENsYXNzfSB9LCAkQ29sdW1uOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBzcGVjaWZpYyBjb2x1bW4gY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgY2xhc3MKICAgICAgICAgICAgICAgIG15ICRTZWxlY3RlZENsYXNzID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfTsKICAgICAgICAgICAgICAgIGlmICggJENvbHVtbkJ5Q2xhc3N7JFNlbGVjdGVkQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgICAgIEBTaG93Q29sdW1ucyA9IEB7ICRDb2x1bW5CeUNsYXNzeyRTZWxlY3RlZENsYXNzfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2xhc3NOYW1lID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfTsKICAgICAgICAgICAgbXkgJFRpdGxlICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ29uZmlnIEl0ZW0gU2VhcmNoIFJlc3VsdHMnKQogICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDbGFzcycpCiAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJENsYXNzTmFtZSk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtTGlzdFNob3coCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSURzID0+ICRTZWFyY2hSZXN1bHRMaXN0LAogICAgICAgICAgICAgICAgVG90YWwgICAgICAgICA9PiBzY2FsYXIgQHskU2VhcmNoUmVzdWx0TGlzdH0sCiAgICAgICAgICAgICAgICBWaWV3ICAgICAgICAgID0+ICRTZWxmLT57Vmlld30sCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgRW52ICAgICAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIExpbmtQYWdlICAgICAgPT4gJExpbmtQYWdlLAogICAgICAgICAgICAgICAgTGlua1NvcnQgICAgICA9PiAkTGlua1NvcnQsCiAgICAgICAgICAgICAgICBMaW5rRmlsdGVyICAgID0+ICRMaW5rRmlsdGVyLAogICAgICAgICAgICAgICAgTGlua0JhY2sgICAgICA9PiAkTGlua0JhY2ssCiAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICBUaXRsZU5hbWUgICAgID0+ICRUaXRsZSwKICAgICAgICAgICAgICAgIFNob3dDb2x1bW5zICAgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1NvcnRCeX0gKSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e09yZGVyQnl9ICksCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBmb290ZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhbGwgc2VhcmNoIGRpYWxvZyBmcm9tIHNlYXJjaCBlbXB0eSBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgZGVmYXVsdCBzZWFyY2ggc2NyZWVuCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQcm9maWxlID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRlbXBsYXRlCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfWE1MU2VhcmNoRm9ybU91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtHZXRQYXJhbX0gfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MQXR0cmlidXRlc30gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgICAgID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgICROYW1lICAgICA9ICRQYXJhbXtQcmVmaXhOYW1lfSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSwgaWYgbWFya2VkIGFzIHNlYXJjaGFibGUKICAgICAgICBpZiAoICRJdGVtLT57U2VhcmNoYWJsZX0gKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgZGF0ZSB0eXBlIGZpZWxkcyBtdXN0IHRvIGdldCBhbGwgZGF0ZSBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZScgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgICAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFteyRJbnB1dEtleX0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknID0+ICRHZXRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJzo6VGltZVN0YXJ0OjpNb250aCcgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6Ok1vbnRoJyB9LAogICAgICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6WWVhcicgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OlllYXInIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OkRheScgICA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpEYXknIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6Ok1vbnRoJyA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpNb250aCcgfSwKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6WWVhcicgID0+ICRHZXRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OlllYXInIH0sCiAgICAgICAgICAgICAgICAgICAgfSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkYXRlLXRpbWUgdHlwZSBmaWVsZHMgbXVzdCBnZXQgYWxsIGRhdGUgYW5kIHRpbWUgcGFyYW1ldGVycwogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ0RhdGVUaW1lJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRJbnB1dEtleSA9PiAkR2V0UGFyYW17JElucHV0S2V5fSwKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgfSwKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OkhvdXInID0+ICRHZXRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpIb3VyJyB9LAogICAgICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6RGF5JyAgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OkRheScgfSwKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnOjpUaW1lU3RhcnQ6Ok1vbnRoJyA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6TW9udGgnIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpZZWFyJyA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6WWVhcicgfSwKICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnOjpUaW1lU3RvcDo6TWludXRlJyA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpNaW51dGUnIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OkhvdXInICA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpIb3VyJyB9LAogICAgICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpEYXknICAgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6RGF5JyB9LAogICAgICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpNb250aCcgPT4gJEdldFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6TW9udGgnIH0sCiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OlllYXInICA9PiAkR2V0UGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpZZWFyJyB9LAogICAgICAgICAgICAgICAgICAgIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3RoZXIga2luZHMgb2YgZmllbGRzIGNhbiBnZXQgaXRzIHZhbHVlIGRpcmVjdGx5CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJEdldFBhcmFteyRJbnB1dEtleX0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRyaWJ1dGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEF0dHJpYnV0ZXN9IH0sIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICROYW1lLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBYTUxBdHRyaWJ1dGVzID0+ICRQYXJhbXtYTUxBdHRyaWJ1dGVzfSwKICAgICAgICAgICAgTGV2ZWwgICAgICAgICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgIFByZWZpeE5hbWUgICAgPT4gJE5hbWUsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1hNTFNlYXJjaEZvcm1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxGb3JtRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxHZXRQYXJhbX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRm9ybURhdGF9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxHZXRQYXJhbX0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgIH0KCiAgICAgICAgIyBEYXRlIHR5cGUgZmllbGRzIG11c3QgdG8gZ2V0IGFsbCBkYXRlIHBhcmFtZXRlcnMuCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdEYXRlJyAmJiAkUGFyYW17JElucHV0S2V5fSApIHsKICAgICAgICAgICAgJFBhcmFteyRJbnB1dEtleX0gPQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJElucHV0S2V5ICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXskSW5wdXRLZXl9LAogICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAuICc6OlRpbWVTdGFydDo6TW9udGgnID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6WWVhcicgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OlllYXInIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6RGF5JyAgID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OkRheScgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpNb250aCcgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6TW9udGgnIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6WWVhcicgID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OlllYXInIH0sCiAgICAgICAgICAgICAgICB9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBEYXRlLXRpbWUgdHlwZSBmaWVsZHMgbXVzdCBnZXQgYWxsIGRhdGUgYW5kIHRpbWUgcGFyYW1ldGVycy4KICAgICAgICBlbHNpZiAoICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ0RhdGVUaW1lJyAmJiAkUGFyYW17JElucHV0S2V5fSApIHsKICAgICAgICAgICAgJFBhcmFteyRJbnB1dEtleX0gPQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJElucHV0S2V5ID0+ICRQYXJhbXskSW5wdXRLZXl9LAogICAgICAgICAgICAgICAgJElucHV0S2V5CiAgICAgICAgICAgICAgICAgICAgLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6SG91cicgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OkhvdXInIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OkRheScgID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAuICc6OlRpbWVTdGFydDo6TW9udGgnID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdGFydDo6WWVhcicgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OlllYXInIH0sCiAgICAgICAgICAgICAgICAkSW5wdXRLZXkKICAgICAgICAgICAgICAgICAgICAuICc6OlRpbWVTdG9wOjpNaW51dGUnID0+ICRQYXJhbXsgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6Ok1pbnV0ZScgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpIb3VyJyAgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6SG91cicgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpEYXknICAgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6RGF5JyB9LAogICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6Ok1vbnRoJyA9PiAkUGFyYW17ICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpNb250aCcgfSwKICAgICAgICAgICAgICAgICRJbnB1dEtleSAuICc6OlRpbWVTdG9wOjpZZWFyJyAgPT4gJFBhcmFteyAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6WWVhcicgfSwKICAgICAgICAgICAgICAgIH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWFyY2ggZm9ybSBkYXRhCiAgICAgICAgbXkgJFZhbHVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+SVRTTUNvbmZpZ0l0ZW1TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICAgICAgS2V5ICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFteyRJbnB1dEtleX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGtleQogICAgICAgIG15ICRTZWFyY2hLZXkgPSAkSW5wdXRLZXk7CiAgICAgICAgJFNlYXJjaEtleSA9fiBzeyA6OiB9e1wnXH1bJV1ce1wnfXhtc2c7CiAgICAgICAgJFNlYXJjaEtleSA9ICJbMV17J1ZlcnNpb24nfVsxXXsnJFNlYXJjaEtleSd9WyVdeydDb250ZW50J30iOwoKICAgICAgICAjIElUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoKSBjYW4gcmV0dXJuIHN0cmluZywgYXJyYXlyZWYgb3IgaGFzaHJlZgogICAgICAgIGlmICggcmVmICRWYWx1ZXMgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgZmlsdGVyIGVtcHR5IGVsZW1lbnRzCiAgICAgICAgICAgIG15IEBTZWFyY2hWYWx1ZXMgPSBncmVwIHskX30gQHskVmFsdWVzfTsKCiAgICAgICAgICAgIGlmIChAU2VhcmNoVmFsdWVzKSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtYTUxGb3JtRGF0YX0gfSwgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hLZXkgPT4gXEBTZWFyY2hWYWx1ZXMsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEdldFBhcmFtfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5ID0+IFxAU2VhcmNoVmFsdWVzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRWYWx1ZXMpIHsKCiAgICAgICAgICAgICMgZS5nLiBmb3IgRGF0ZSBiZXR3ZWVuIHNlYXJjaGVzCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEZvcm1EYXRhfSB9LCB7CiAgICAgICAgICAgICAgICAkU2VhcmNoS2V5ID0+ICRWYWx1ZXMsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIHJlZiAkVmFsdWVzIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVmFsdWVzLT57Jy1iZXR3ZWVuJ30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aW1lIGVsZW1ldCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkU3RhcnREYXRlLCAkU3RvcERhdGUgKSA9IEB7ICRWYWx1ZXMtPnsnLWJldHdlZW4nfSB9OwogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRTdGFydFllYXIsICRTdGFydE1vbnRoLCAkU3RhcnREYXkgKSA9IHNwbGl0KCAvLS8sICRTdGFydERhdGUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkU3RvcFllYXIsICAkU3RvcE1vbnRoLCAgJFN0b3BEYXkgKSAgPSBzcGxpdCggLy0vLCAkU3RvcERhdGUgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc3RvcmUgdGltZSBlbG1lbnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEdldFBhcmFtfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpEYXknICAgPT4gJFN0YXJ0RGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgPT4gJFN0YXJ0TW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OlllYXInICA9PiAkU3RhcnRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OkRheScgICAgPT4gJFN0b3BEYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6TW9udGgnICA9PiAkU3RvcE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OlllYXInICAgPT4gJFN0b3BZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnRGF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFZhbHVlcy0+eyctYmV0d2Vlbid9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGltZSBlbGVtZXQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJFN0YXJ0RGF0ZVRpbWUsICRTdG9wRGF0ZVRpbWUgKSA9IEB7ICRWYWx1ZXMtPnsnLWJldHdlZW4nfSB9OwogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRTdGFydERhdGUsICRTdGFydFRpbWUgKSA9IHNwbGl0KCAvXHMvLCAkU3RhcnREYXRlVGltZSApOwogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRTdGFydFllYXIsICRTdGFydE1vbnRoLCAgJFN0YXJ0RGF5ICkgICAgPSBzcGxpdCggLy0vLCAgJFN0YXJ0RGF0ZSApOwogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRTdGFydEhvdXIsICRTdGFydE1pbnV0ZSwgJFN0YXJ0U2Vjb25kICkgPSBzcGxpdCggL1w6LywgJFN0YXJ0VGltZSApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkU3RvcERhdGUsICRTdG9wVGltZSApID0gc3BsaXQoIC9ccy8sICRTdG9wRGF0ZVRpbWUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkU3RvcFllYXIsICRTdG9wTW9udGgsICAkU3RvcERheSApICAgID0gc3BsaXQoIC8tLywgICRTdG9wRGF0ZSApOwogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRTdG9wSG91ciwgJFN0b3BNaW51dGUsICRTdG9wU2Vjb25kICkgPSBzcGxpdCggL1w6LywgJFN0b3BUaW1lICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIHRpbWUgZWxtZW50IHZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtYTUxHZXRQYXJhbX0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5ICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgPT4gJFN0YXJ0TWludXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpIb3VyJyAgID0+ICRTdGFydEhvdXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RhcnQ6OkRheScgICAgPT4gJFN0YXJ0RGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgID0+ICRTdGFydE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0YXJ0OjpZZWFyJyAgID0+ICRTdGFydFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6TWludXRlJyAgPT4gJFN0b3BNaW51dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6SG91cicgICAgPT4gJFN0b3BIb3VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6OkRheScgICAgID0+ICRTdG9wRGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5IC4gJzo6VGltZVN0b3A6Ok1vbnRoJyAgID0+ICRTdG9wTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRLZXkgLiAnOjpUaW1lU3RvcDo6WWVhcicgICAgPT4gJFN0b3BZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEdldFBhcmFtfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgJElucHV0S2V5ID0+ICRWYWx1ZXMsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1HZXQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIFhNTEZvcm1EYXRhICAgPT4gJFBhcmFte1hNTEZvcm1EYXRhfSwKICAgICAgICAgICAgWE1MR2V0UGFyYW0gICA9PiAkUGFyYW17WE1MR2V0UGFyYW19LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1hNTFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MQXR0cmlidXRlc30gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgICAgID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgICROYW1lICAgICA9ICRQYXJhbXtQcmVmaXhOYW1lfSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgYXR0cmlidXRlLCBpZiBtYXJrZWQgYXMgc2VhcmNoYWJsZQogICAgICAgIGlmICggJEl0ZW0tPntTZWFyY2hhYmxlfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17WE1MQXR0cmlidXRlc30gfSwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJE5hbWUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fWE1MU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIFhNTEF0dHJpYnV0ZXMgPT4gJFBhcmFte1hNTEF0dHJpYnV0ZXN9LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDb25maWdJdGVtSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApIHx8IDA7CiAgICBteSAkVmVyc2lvbklEICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKSAgICB8fCAwOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDb25maWdJdGVtSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e1Blcm1pc3Npb259LAogICAgKTsKCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc2hvdyB2ZXJzaW9ucwogICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAwOwogICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2hvd1ZlcnNpb25zJyApICkgewogICAgICAgICRQYXJhbXtTaG93VmVyc2lvbnN9ID0gMTsKICAgIH0KCiAgICAjIGdldCBjb250ZW50CiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgIGlmICggISRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvbmZpZ0l0ZW1JRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJENvbmZpZ0l0ZW1JRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uWm9vbUxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgaWYgKCAhJFZlcnNpb25MaXN0LT5bMF0tPntWZXJzaW9uSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gdmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICVzIScsICRDb25maWdJdGVtSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdmVyc2lvbiBpZAogICAgaWYgKCAhJFZlcnNpb25JRCApIHsKICAgICAgICAkVmVyc2lvbklEID0gJFZlcnNpb25MaXN0LT5bLTFdLT57VmVyc2lvbklEfTsKICAgIH0KICAgIGlmICggJFZlcnNpb25JRCBuZSAkVmVyc2lvbkxpc3QtPlstMV0tPntWZXJzaW9uSUR9ICkgewogICAgICAgICRQYXJhbXtTaG93VmVyc2lvbnN9ID0gMTsKICAgIH0KCiAgICAjIHNldCB2ZXJzaW9uIGlkIGluIHBhcmFtIGhhc2ggKG9ubHkgZm9yIG1lbnUgbW9kdWxlKQogICAgaWYgKCRWZXJzaW9uSUQpIHsKICAgICAgICAkUGFyYW17VmVyc2lvbklEfSA9ICRWZXJzaW9uSUQ7CiAgICB9CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGNsYXNzZXMKICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ1BvcFVwJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnQXNQb3B1cCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0JhY2snICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57TWVudUNsYXNzfSA9ICdIaXN0b3J5QmFjayc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgICAgIE1lbnVJRCAgICAgPT4gJE1lbnUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHZlcnNpb24gdHJlZQogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1RyZWUnICk7CiAgICBteSAkQ291bnRlciA9IDE7CiAgICBpZiAoICEkUGFyYW17U2hvd1ZlcnNpb25zfSAmJiAkVmVyc2lvbklEIGVxICRWZXJzaW9uTGlzdC0+Wy0xXS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgJENvdW50ZXIgICAgID0gQHskVmVyc2lvbkxpc3R9OwogICAgICAgICRWZXJzaW9uTGlzdCA9IFsgJFZlcnNpb25MaXN0LT5bLTFdIF07CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICBteSAkTGFzdFZlcnNpb24gPSAkVmVyc2lvbkxpc3QtPlstMV07CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyB0byBzdG9yZSB0aGUgY29sb3IgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcwogICAgbXkgJURlcGxTaWduYWxzOwoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGxpc3Qgb2YgZGVwbG95bWVudCBzdGF0ZXMKICAgIG15ICREZXBsb3ltZW50U3RhdGVzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgc2V0IGRlcGxveW1lbnQgc3R5bGUgY29sb3JzCiAgICBteSAkU3R5bGVDbGFzc2VzID0gJyc7CgogICAgSVRFTUlEOgogICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IGtleXMgJXskRGVwbG95bWVudFN0YXRlc0xpc3R9ICkgewoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGEgY29sb3IgaXMgZGVmaW5lZCBpbiBwcmVmZXJlbmNlcwogICAgICAgIG5leHQgSVRFTUlEIGlmICEkUHJlZmVyZW5jZXN7Q29sb3J9OwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlCiAgICAgICAgbXkgJERlcGxTdGF0ZSA9ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9OwoKICAgICAgICAjIHJlbW92ZSBhbnkgbm9uIGFzY2lpIHdvcmQgY2hhcmFjdGVycwogICAgICAgICREZXBsU3RhdGUgPX4gc3sgW15hLXpBLVowLTldIH17X31tc3hnOwoKICAgICAgICAjIHN0b3JlIHRoZSBvcmlnaW5hbCBkZXBsb3ltZW50IHN0YXRlIGFzIGtleQogICAgICAgICMgYW5kIHRoZSBzcyBzYWZlIGNvdmVydGVkIGRlcGxveW1lbnQgc3RhdGUgYXMgdmFsdWUKICAgICAgICAkRGVwbFNpZ25hbHN7ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9IH0gPSAkRGVwbFN0YXRlOwoKICAgICAgICAjIGNvdmVydCB0byBsb3dlciBjYXNlCiAgICAgICAgbXkgJERlcGxTdGF0ZUNvbG9yID0gbGMgJFByZWZlcmVuY2Vze0NvbG9yfTsKCiAgICAgICAgIyBhZGQgdG8gc3R5bGUgY2xhc3NlcyBzdHJpbmcKICAgICAgICAkU3R5bGVDbGFzc2VzIC49ICIKICAgICAgICAgICAgLkZsYWcgc3Bhbi4kRGVwbFN0YXRlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMkRGVwbFN0YXRlQ29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAiOwogICAgfQoKICAgICMgd3JhcCBpbnRvIHN0eWxlIHRhZ3MKICAgIGlmICgkU3R5bGVDbGFzc2VzKSB7CiAgICAgICAgJFN0eWxlQ2xhc3NlcyA9ICI8c3R5bGU+JFN0eWxlQ2xhc3Nlczwvc3R5bGU+IjsKICAgIH0KCiAgICAjIG91dHB1dCB2ZXJzaW9uIHRyZWUgaGVhZGVyCiAgICBpZiAoICRQYXJhbXtTaG93VmVyc2lvbnN9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb2xsYXBzZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBhbmQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIG91dHB1dCB2ZXJzaW9uIHRyZWUKICAgIGZvciBteSAkVmVyc2lvbkhhc2ggKCBAeyRWZXJzaW9uTGlzdH0gKSB7CgogICAgICAgICRQYXJhbXtDcmVhdGVCeVVzZXJGdWxsTmFtZX0gPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVmVyc2lvbkhhc2gtPntDcmVhdGVCeX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgICV7JFZlcnNpb25IYXNofSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICBJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFZlcnNpb25IYXNoLT57SW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIERlcGxTaWduYWwgPT4gJERlcGxTaWduYWxzeyAkVmVyc2lvbkhhc2gtPntEZXBsU3RhdGV9IH0sCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgID0+ICRWZXJzaW9uSGFzaC0+e1ZlcnNpb25JRH0gZXEgJFZlcnNpb25JRCA/ICdBY3RpdmUnIDogJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFZhbHVlID0+ICRDb25maWdJdGVtLT57TnVtYmVyfSApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICk7CgogICAgaWYgKAogICAgICAgICRWZXJzaW9uCiAgICAgICAgJiYgcmVmICRWZXJzaW9uIGVxICdIQVNIJwogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGVmaW5pdGlvbn0KICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9CiAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGVmaW5pdGlvbn0gZXEgJ0FSUkFZJwogICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9IGVxICdBUlJBWScKICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0KICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdIGVxICdIQVNIJwogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259CiAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259IGVxICdBUlJBWScKICAgICAgICApCiAgICB7CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmVyc2lvbi0+e05hbWV9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFZlcnNpb24tPntOYW1lfSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBuYW1lCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTmFtZScpLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gVHJhbnNsYXRhYmxlKCdUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJyksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiAgPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RlcGxveW1lbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbScpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBJZGVudGF0aW9uID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGluY2lkZW50IHN0YXRlCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nKSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkVmVyc2lvbi0+e0luY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHN0YXJ0IHhtbCBvdXRwdXQKICAgICAgICAkU2VsZi0+X1hNTE91dHB1dCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259LAogICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjcmVhdGUgJiBjaGFuZ2UgdXNlciBkYXRhCiAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlIENoYW5nZSkpIHsKICAgICAgICAkQ29uZmlnSXRlbS0+eyAkS2V5IC4gJ0J5VXNlckZ1bGxOYW1lJyB9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJENvbmZpZ0l0ZW0tPnsgJEtleSAuICdCeScgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IG1ldGEgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRMYXN0VmVyc2lvbn0sCiAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJExhc3RWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgQ3VyRGVwbFNpZ25hbCA9PiAkRGVwbFNpZ25hbHN7ICRMYXN0VmVyc2lvbi0+e0RlcGxTdGF0ZX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJExheW91dE9iamVjdC0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBpZiAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICMgZ2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgMXN0IGF0dGFjaG1lbnQKICAgICAgICBteSAkRmlyc3RBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50c1swXSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudHMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaXJzdEF0dGFjaG1lbnQtPntGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICBGaWxlc2l6ZSAgICAgPT4gJEZpcnN0QXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHRoZSAxc3QgYXR0YWNobWVudCB3YXMgZGlyZWN0bHkgcmVuZGVyZWQgaW50byB0aGUgMXN0IHJvdydzIHJpZ2h0IGNlbGwsIGFsbCBmdXJ0aGVyCiAgICAgICAgIyBhdHRhY2htZW50cyBhcmUgcmVuZGVyZWQgaW50byBhIHNlcGFyYXRlIHJvdwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgc2tpcCB0aGUgMXN0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICRBdHRhY2htZW50IGVxICRBdHRhY2htZW50c1swXTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgY3VycmVudCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRmlsZXNpemUgICAgID0+ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlIERvd25sb2FkQXR0YWNobWVudAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZm9yIGF0dGFjaG1lbnQKICAgICAgICBteSAkRmlsZW5hbWUgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsZW5hbWUnICk7CiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRGaWxlbmFtZSkhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICV7JExhc3RWZXJzaW9ufSwKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkTGFzdFZlcnNpb24tPntDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICBDdXJEZXBsU2lnbmFsID0+ICREZXBsU2lnbmFsc3sgJExhc3RWZXJzaW9uLT57RGVwbFN0YXRlfSB9LAogICAgICAgICAgICBTdHlsZUNsYXNzZXMgID0+ICRTdHlsZUNsYXNzZXMsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1hNTE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIHN0b3AgbG9vcCwgaWYgbm8gY29udGVudCB3YXMgZ2l2ZW4KICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwoKICAgICAgICAgICAgIyBsb29rdXAgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIGluZGVudGF0aW9uIGZvciBsZWZ0LXBhZGRpbmcgY3NzIGJhc2VkIG9uIDE1cHggcGVyIGxldmVsIGFuZCAxMHB4IGFzIGRlZmF1bHQKICAgICAgICAgICAgbXkgJEluZGVudGF0aW9uID0gMTA7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkSW5kZW50YXRpb24gKz0gMTUgKiAkUGFyYW17TGV2ZWx9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBkYXRhIGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0YScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uID0+ICRJbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPl9YTUxPdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0Q3VzdG9tZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dEN1c3RvbWVyIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGN1c3RvbWVyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dEN1c3RvbWVyLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgJFBhcmFte1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBzZWxlY3RlZCBjdXN0b21lciB1c2VyCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIGNoZWNrIHNlYXJjaCBidXR0b24KICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlYXJjaCcgKTsKICAgIH0KCiAgICAjIGNoZWNrIHNlbGVjdCBidXR0b24KICAgIGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWxlY3QnICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uQ2xlYXInICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmVzZXQgdmFsdWUgaWYgc2VhcmNoIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ICAgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICcnOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgfQogICAgbXkgJENsYXNzICAgID0gJ1c1MHBjIElUU01DdXN0b21lclNlYXJjaCc7CiAgICBteSAkU2VhcmNoICAgPSAnJzsKICAgIG15ICRSZXF1aXJlZCA9ICRQYXJhbXtSZXF1aXJlZH0gfHwgJyc7CiAgICBteSAkSW52YWxpZCAgPSAkUGFyYW17SW52YWxpZH0gfHwgJyc7CiAgICBteSAkSXRlbUlkICAgPSAkUGFyYW17SXRlbUlkfSB8fCAnJzsKCiAgICBpZiAoJFJlcXVpcmVkKSB7CiAgICAgICAgJENsYXNzIC49ICcgVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgfQoKICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICRDbGFzcyAuPSAnIFNlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjdXN0b21lciBzdHJpbmcKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgICAgIG15ICVDdXN0b21lclNlYXJjaExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFZhbHVlLAogICAgICAgICk7CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkU2VhcmNoID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkQ3VzdG9tZXJTZWFyY2hMaXN0eyRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgLiAkVmFsdWUKICAgICAgICAuICciIGlkPSInCiAgICAgICAgLiAkSXRlbUlkIC4gJ1NlbGVjdGVkJwogICAgICAgIC4gJyIvPicKICAgICAgICAuICc8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICc6OlNlYXJjaCIgY2xhc3M9IicKICAgICAgICAuICRDbGFzcwogICAgICAgIC4gJyIgaWQ9IicKICAgICAgICAuICRJdGVtSWQKICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgLiAkU2VhcmNoIC4gJyIvPic7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwogICAgfQogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEtleSA9ICRQYXJhbXtLZXl9OwoKICAgICMgaGFzaCB3aXRoIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZpZWxkCiAgICBteSAlRm9ybURhdGE7CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkUGFyYW17VmFsdWV9OwogICAgfQoKICAgICMgY3JlYXRlIGlucHV0IGZpZWxkCiAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+SW5wdXRDcmVhdGUoCiAgICAgICAgJUZvcm1EYXRhLAogICAgICAgIEtleSAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBJdGVtICAgPT4gJFBhcmFte0l0ZW19LAogICAgICAgIEl0ZW1JZCA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgcmV0dXJuICRJbnB1dFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXRDdXN0b21lckNvbXBhbnkgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY3VzdG9tZXIgY29tcGFueSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXRDdXN0b21lckNvbXBhbnktPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgID0+ICRQYXJhbXtWYWx1ZX0gfHwgJycsCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ICAgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZWxlY3RlZElEID0gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnOwoKICAgIG15ICRDU1NDbGFzcyA9ICdNb2Rlcm5pemUnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfTsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfTsKICAgIG15ICRJdGVtSWQgICA9ICRQYXJhbXtJdGVtSWR9OwoKICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAkQ1NTQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICB9CgogICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgJENTU0NsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICVDb21wYW55TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55TGlzdCgKICAgICAgICBMaW1pdCA9PiAwLCAgICAjIERpc3BsYXkgYWxsIEN1c3RvbWVyIENvbXBhbmllcwogICAgKTsKCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQ29tcGFueUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIElEICAgICAgICAgICA9PiAkSXRlbUlkLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJENTU0NsYXNzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgIEBWYWx1ZXMgPSBAeyAkUGFyYW17VmFsdWV9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVmFsdWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIH0KCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZXMgPSAkU2VsZi0+U2VhcmNoRm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICAjIGdldCBjb21wYW55IGRhdGEKICAgIG15ICVDb21wYW55TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55TGlzdCgKICAgICAgICBMaW1pdCA9PiAwLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXCVDb21wYW55TGlzdCwKICAgICAgICBOYW1lICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBTaXplICAgICAgICA9PiA1LAogICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICBTZWxlY3RlZElEICA9PiAkVmFsdWVzLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0RGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dERhdGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzLgoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0RGF0ZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMS0wMScsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICRQYXJhbXtWYWx1ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnWyUgRGF0YS5EYXRlIHwgTG9jYWxpemUoIkRhdGUiKSAlXScsCiAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICBEYXRlID0+ICRQYXJhbXtWYWx1ZX0gLiAnIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtWYWx1ZX0gPX4gcy8wMDowMDowMC8vOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICREYXkgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6RGF5JyApOwogICAgbXkgJE1vbnRoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNb250aCcgKTsKICAgIG15ICRZZWFyICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgKTsKCiAgICBpZiAoICREYXkgJiYgJE1vbnRoICYmICRZZWFyICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSBzcHJpbnRmICclMDJkLSUwMmQtJTAyZCcsICRZZWFyLCAkTW9udGgsICREYXk7CiAgICB9CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgICMgU2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICBpZiAoICRGb3JtRGF0YXtWYWx1ZX0gKSB7CgogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRm9ybURhdGF7VmFsdWV9IC4gJyAwMDowMDowMCcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRJbnZhbGlkID0gJFBhcmFte0ludmFsaWR9OwoKICAgIG15ICVWYWx1ZXM7CiAgICBteSAkQ2xhc3M7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgICAgIGlmICggJFZhbHVlID1+IC9eKFxkXGRcZFxkKS0oXGRcZHxcZCktKFxkXGR8XGQpJC9pICkgewogICAgICAgICAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6OlllYXInIH0gID0gJDE7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnIH0gPSAkMjsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpEYXknIH0gICA9ICQzOwoKICAgICAgICAgICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQYXJhbXtLZXl9IC4gJzo6JywKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57WWVhclBlcmlvZFBhc3R9IHx8IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57WWVhclBlcmlvZEZ1dHVyZX0gfHwgMTAsCiAgICAgICAgJVZhbHVlcywKICAgICAgICAkUGFyYW17S2V5fSAuICc6OicgLiAnQ2xhc3MnID0+ICRDbGFzcywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgICAgICA9PiAkUGFyYW17T3ZlcnJpZGVUaW1lWm9uZX0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRVc2VkOwogICAgbXkgJFN0YXJ0RGF5OwogICAgbXkgJFN0YXJ0TW9udGg7CiAgICBteSAkU3RhcnRZZWFyOwogICAgbXkgJFN0b3BEYXk7CiAgICBteSAkU3RvcE1vbnRoOwogICAgbXkgJFN0b3BZZWFyOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiByZWYgJFBhcmFte1ZhbHVlfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJFVzZWQgICAgICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IH07CiAgICAgICAgJFN0YXJ0RGF5ICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpEYXknIH07CiAgICAgICAgJFN0YXJ0TW9udGggPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgfTsKICAgICAgICAkU3RhcnRZZWFyICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6OlllYXInIH07CiAgICAgICAgJFN0b3BEYXkgICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6OkRheScgfTsKICAgICAgICAkU3RvcE1vbnRoICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6TW9udGgnIH07CiAgICAgICAgJFN0b3BZZWFyICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6OlllYXInIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVXNlZCAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICAgICAgJFN0YXJ0RGF5ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6RGF5JyApOwogICAgICAgICRTdGFydE1vbnRoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6Ok1vbnRoJyApOwogICAgICAgICRTdGFydFllYXIgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6OlllYXInICk7CiAgICAgICAgJFN0b3BEYXkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpEYXknICk7CiAgICAgICAgJFN0b3BNb250aCAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpNb250aCcgKTsKICAgICAgICAkU3RvcFllYXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6OlllYXInICk7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFVzZWQKICAgICAgICAmJiAkU3RhcnREYXkgJiYgJFN0YXJ0TW9udGggJiYgJFN0YXJ0WWVhcgogICAgICAgICYmICRTdG9wRGF5ICAmJiAkU3RvcE1vbnRoICAmJiAkU3RvcFllYXIKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFN0YXJ0RGF0ZSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkJywgJFN0YXJ0WWVhciwgJFN0YXJ0TW9udGgsICRTdGFydERheTsKICAgICAgICBteSAkU3RvcERhdGUgID0gc3ByaW50ZiAnJTAyZC0lMDJkLSUwMmQnLCAkU3RvcFllYXIsICAkU3RvcE1vbnRoLCAgJFN0b3BEYXk7CgogICAgICAgIHJldHVybiB7ICctYmV0d2VlbicgPT4gWyAkU3RhcnREYXRlLCAkU3RvcERhdGUgXSB9OwogICAgfQoKICAgIHJldHVybiBbXTsgICAgIyBubyBjb25kaXRpb25zIGJ5IGRlZmF1bHQKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgICAgICA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSAgICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgT3B0aW9uYWwgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgbXkgJEtleSAgICAgICAgID0gJFBhcmFte0tleX07CiAgICBteSAkUHJlZml4U3RhcnQgPSAkS2V5IC4gJzo6VGltZVN0YXJ0OjonOwogICAgbXkgJFByZWZpeFN0b3AgID0gJEtleSAuICc6OlRpbWVTdG9wOjonOwoKICAgICMgZ2V0IHRpbWUgcmVsYXRlZCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJUdldFBhcmFtID0gJXsgJFBhcmFte1ZhbHVlfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgIGZvciBteSAkVGltZVR5cGUgKCAkUHJlZml4U3RhcnQsICRQcmVmaXhTdG9wICkgewogICAgICAgICAgICBmb3IgbXkgJFBhcnQgKHF3KCBZZWFyIE1vbnRoIERheSApKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyYW1LZXkgPSAkVGltZVR5cGUgLiAkUGFydDsKICAgICAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbUtleSApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIG9uIHRoZSBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFtVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxBIFxzKyB9e314bXM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzdG9yZSBpbiAlR2V0UGFyYW0KICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1LZXl9ID0gJFBhcmFtVmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBCdWlsZCBzZWxlY3Rpb24gZm9yIHRoZSBzdGFydCBhbmQgc3RvcCB0aW1lLgogICAgIyBOb3RlIHRoYXQgc2VhcmNoaW5nIGlzIGJ5IGRhdGUsIHdoaWxlIGlucHV0IGlzIGJ5IHRpbWUgYXMgd2VsbAogICAgbXkgJFRpbWVTdGFydFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQcmVmaXhTdGFydCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlR2V0UGFyYW0sCiAgICApOwogICAgbXkgJFRpbWVTdG9wU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIE9wdGlvbmFsICAgICAgICAgPT4gMCwKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQcmVmaXhTdG9wLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAxMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDEwLAogICAgICAgICVHZXRQYXJhbSwKICAgICk7CgogICAgbXkgJENoZWNrYm94ID0gcXF7PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJEtleSIgdmFsdWU9IjEiLz59OwogICAgaWYgKCAkUGFyYW17T3B0aW9uYWx9ICkgewogICAgICAgICRDaGVja2JveCA9IHFxezxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJEtleSIgdmFsdWU9IjEiLz59OwogICAgfQoKICAgIG15ICRCZXR3ZWVuID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdCZXR3ZWVuJyk7CiAgICBteSAkQW5kICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYW5kJyk7CgogICAgcmV0dXJuICI8ZGl2PiAkQ2hlY2tib3ggJEJldHdlZW4gJFRpbWVTdGFydFNlbGVjdGlvblN0cmluZyA8L2Rpdj4iCiAgICAgICAgLiAiPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMjdweDtcIj4kQW5kPC9zcGFuPiAkVGltZVN0b3BTZWxlY3Rpb25TdHJpbmciOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0RGF0ZVRpbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXREYXRlVGltZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBkYXRldGltZSBvYmplY3RzLgoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0RGF0ZVRpbWUtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDEtMDEgMTI6MDAnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAkUGFyYW17VmFsdWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJ1slIERhdGEuRGF0ZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdJywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte1ZhbHVlfSAuICc6MDAnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICREYXkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1vbnRoJyApOwogICAgbXkgJFllYXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgKTsKICAgIG15ICRIb3VyICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkhvdXInICkgfHwgMDsKICAgIG15ICRNaW51dGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1pbnV0ZScgKSB8fCAwOwoKICAgIGlmICggJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkICUwMmQ6JTAyZCcsICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlOwogICAgfQoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIFNhbml0eSBjaGVjayBvZiB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgaWYgKCAkRm9ybURhdGF7VmFsdWV9ICkgewoKICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZvcm1EYXRhe1ZhbHVlfSAuICc6MDAnLAogICAgICAgICk7CgogICAgICAgIGlmICggISRTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYgMTI6MDAnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRJbnZhbGlkID0gJFBhcmFte0ludmFsaWR9OwoKICAgIG15ICVWYWx1ZXM7CiAgICBteSAkQ2xhc3M7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgICAgIGlmICggJFZhbHVlID1+IC9eKFxkXGRcZFxkKS0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCkkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgfSAgID0gJDE7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnIH0gID0gJDI7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6RGF5JyB9ICAgID0gJDM7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6SG91cicgfSAgID0gJDQ7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TWludXRlJyB9ID0gJDU7CgogICAgICAgICAgICBpZiAoJEludmFsaWQpIHsKICAgICAgICAgICAgICAgICRDbGFzcyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFBhcmFte0tleX0gLiAnOjonLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57WWVhclBlcmlvZFBhc3R9IHx8IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57WWVhclBlcmlvZEZ1dHVyZX0gfHwgMTAsCiAgICAgICAgJVZhbHVlcywKICAgICAgICAkUGFyYW17S2V5fSAuICc6OicgLiAnQ2xhc3MnID0+ICRDbGFzcywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVXNlZDsKICAgIG15ICRTdGFydE1pbnV0ZTsKICAgIG15ICRTdGFydEhvdXI7CiAgICBteSAkU3RhcnREYXk7CiAgICBteSAkU3RhcnRNb250aDsKICAgIG15ICRTdGFydFllYXI7CiAgICBteSAkU3RvcE1pbnV0ZTsKICAgIG15ICRTdG9wSG91cjsKICAgIG15ICRTdG9wRGF5OwogICAgbXkgJFN0b3BNb250aDsKICAgIG15ICRTdG9wWWVhcjsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiByZWYgJFBhcmFte1ZhbHVlfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJFVzZWQgICAgICAgID0gJFBhcmFte1ZhbHVlfS0+eyAkUGFyYW17S2V5fSB9OwogICAgICAgICRTdGFydE1pbnV0ZSA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgfTsKICAgICAgICAkU3RhcnRIb3VyICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpIb3VyJyB9OwogICAgICAgICRTdGFydERheSAgICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6OkRheScgfTsKICAgICAgICAkU3RhcnRNb250aCAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgfTsKICAgICAgICAkU3RhcnRZZWFyICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpZZWFyJyB9OwogICAgICAgICRTdG9wTWludXRlICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6TWludXRlJyB9OwogICAgICAgICRTdG9wSG91ciAgICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6SG91cicgfTsKICAgICAgICAkU3RvcERheSAgICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6OkRheScgfTsKICAgICAgICAkU3RvcE1vbnRoICAgPSAkUGFyYW17VmFsdWV9LT57ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6Ok1vbnRoJyB9OwogICAgICAgICRTdG9wWWVhciAgICA9ICRQYXJhbXtWYWx1ZX0tPnsgJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6WWVhcicgfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRVc2VkICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICAgICAgJFN0YXJ0TWludXRlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6Ok1pbnV0ZScgKSB8fCAwMDsKICAgICAgICAkU3RhcnRIb3VyICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6SG91cicgKQogICAgICAgICAgICB8fCAwMDsKICAgICAgICAkU3RhcnREYXkgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpEYXknICk7CiAgICAgICAgJFN0YXJ0TW9udGggPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6TW9udGgnICk7CiAgICAgICAgJFN0YXJ0WWVhciAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6WWVhcicgKTsKICAgICAgICAkU3RvcE1pbnV0ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6Ok1pbnV0ZScgKQogICAgICAgICAgICB8fCA1OTsKICAgICAgICAkU3RvcEhvdXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpIb3VyJyApCiAgICAgICAgICAgIHx8IDIzOwogICAgICAgICRTdG9wRGF5ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpEYXknICk7CiAgICAgICAgJFN0b3BNb250aCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6Ok1vbnRoJyApOwogICAgICAgICRTdG9wWWVhciAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpZZWFyJyApOwogICAgfQoKICAgIGlmICgKICAgICAgICAkVXNlZAogICAgICAgICYmICRTdGFydE1pbnV0ZSAmJiAkU3RhcnRIb3VyICYmICRTdGFydERheSAmJiAkU3RhcnRNb250aCAmJiAkU3RhcnRZZWFyCiAgICAgICAgJiYgJFN0b3BNaW51dGUgICYmICRTdG9wSG91ciAgJiYgJFN0b3BEYXkgICYmICRTdG9wTW9udGggICYmICRTdG9wWWVhcgogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBhZGQgaG91ciwgbWludXRlcyBhbmQgc2Vjb25kcywKICAgICAgICAjIHNvIHRoYXQgdGhhdCB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGRheSBpcyBzZWxlY3RlZCBhcyB3ZWxsCiAgICAgICAgbXkgJFN0YXJ0RGF0ZSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcKICAgICAgICAgICAgLCAkU3RhcnRZZWFyLCAkU3RhcnRNb250aCwgJFN0YXJ0RGF5LCAkU3RhcnRIb3VyLCAkU3RhcnRNaW51dGU7CiAgICAgICAgbXkgJFN0b3BEYXRlID0gc3ByaW50ZiAnJTAyZC0lMDJkLSUwMmQgJTAyZDolMDJkOjU5JwogICAgICAgICAgICAsICRTdG9wWWVhciwgJFN0b3BNb250aCwgJFN0b3BEYXksICRTdG9wSG91ciwgJFN0b3BNaW51dGU7CgogICAgICAgIHJldHVybiB7ICctYmV0d2VlbicgPT4gWyAkU3RhcnREYXRlLCAkU3RvcERhdGUgXSB9OwogICAgfQoKICAgIHJldHVybiBbXTsgICAgIyBubyBjb25kaXRpb25zIGJ5IGRlZmF1bHQKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgICAgICA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSAgICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgT3B0aW9uYWwgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgbXkgJEtleSAgICAgICAgID0gJFBhcmFte0tleX07CiAgICBteSAkUHJlZml4U3RhcnQgPSAkS2V5IC4gJzo6VGltZVN0YXJ0OjonOwogICAgbXkgJFByZWZpeFN0b3AgID0gJEtleSAuICc6OlRpbWVTdG9wOjonOwoKICAgICMgZ2V0IHRpbWUgcmVsYXRlZCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJUdldFBhcmFtID0gJXsgJFBhcmFte1ZhbHVlfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgIGZvciBteSAkVGltZVR5cGUgKCAkUHJlZml4U3RhcnQsICRQcmVmaXhTdG9wICkgewogICAgICAgICAgICBmb3IgbXkgJFBhcnQgKHF3KCBZZWFyIE1vbnRoIERheSApKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyYW1LZXkgPSAkVGltZVR5cGUgLiAkUGFydDsKICAgICAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbUtleSApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIG9uIHRoZSBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFtVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxBIFxzKyB9e314bXM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzdG9yZSBpbiAlR2V0UGFyYW0KICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1LZXl9ID0gJFBhcmFtVmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBCdWlsZCBzZWxlY3Rpb24gZm9yIHRoZSBzdGFydCBhbmQgc3RvcCB0aW1lLgogICAgbXkgJFRpbWVTdGFydFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQcmVmaXhTdGFydCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJUdldFBhcmFtLAogICAgKTsKICAgIG15ICRUaW1lU3RvcFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBPcHRpb25hbCAgICAgICAgID0+IDAsCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUHJlZml4U3RvcCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJUdldFBhcmFtLAogICAgKTsKCiAgICBteSAkQ2hlY2tib3ggPSBxcXs8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIkS2V5IiB2YWx1ZT0iMSIvPn07CiAgICBpZiAoICRQYXJhbXtPcHRpb25hbH0gKSB7CiAgICAgICAgJENoZWNrYm94ID0gcXF7PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSIkS2V5IiB2YWx1ZT0iMSIvPn07CiAgICB9CgogICAgbXkgJEJldHdlZW4gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0JldHdlZW4nKTsKICAgIG15ICRBbmQgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhbmQnKTsKCiAgICByZXR1cm4gIjxkaXY+ICRDaGVja2JveCAkQmV0d2VlbiAkVGltZVN0YXJ0U2VsZWN0aW9uU3RyaW5nIDwvZGl2PiIKICAgICAgICAuICI8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAyN3B4O1wiPiAkQW5kIDwvc3Bhbj4gJFRpbWVTdG9wU2VsZWN0aW9uU3RyaW5nIjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0RHVtbXk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OkNvbmZpZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXREdW1teSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBkdW1teSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXREdW1teS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgpOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICcnOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICBteSAkTGlua0ZlYXR1cmUgPSAxOwoKICAgICMgZG8gbm90IHRyYW5zZm9ybSBsaW5rcyBpbiBwcmludCB2aWV3CiAgICBpZiAoICRQYXJhbXtQcmludH0gKSB7CiAgICAgICAgJExpbmtGZWF0dXJlID0gMDsKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gJExpbmtGZWF0dXJlLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CiAgICB9CgogICAgbXkgJENsYXNzICAgID0gJyc7CiAgICBteSAkU2l6ZSAgICAgPSAnVzUwcGMnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfTsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfTsKICAgIG15ICRJdGVtSWQgICA9ICRQYXJhbXtJdGVtSWR9OwoKICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAkQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICB9CgogICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgJENsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgfQogICAgJENsYXNzIC49ICcgJyAuICRTaXplOwogICAgbXkgJFN0cmluZyA9ICI8c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxLjNlbTtcIj4iOwogICAgJFN0cmluZwogICAgICAgIC49ICI8aW5wdXQgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRJdGVtSWQpIHsKICAgICAgICAkU3RyaW5nIC49ICJpZD1cIiRJdGVtSWRcIiAiOwogICAgfQoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gJy8+IDwvc3Bhbj4nOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIHJldHVybiBbXTsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0R2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXRHZW5lcmFsQ2F0YWxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBnZW5lcmFsIGNhdGFsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17VmFsdWV9IC8vPSAnJzsKCiAgICAjIHRyYW5zbGF0ZQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDU1NDbGFzcyA9ICdNb2Rlcm5pemUnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfTsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfTsKICAgIG15ICRJdGVtSWQgICA9ICRQYXJhbXtJdGVtSWR9OwoKICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAkQ1NTQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICB9CgogICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgJENTU0NsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgdHJhbnNsYXRpb24gb24gb3Igb2ZmCiAgICBteSAkVHJhbnNsYXRpb24gPSAwOwogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFRyYW5zbGF0aW9uID0gMTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyByZXZlcnNlIHRoZSBjbGFzcyBsaXN0CiAgICBteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKCiAgICBteSAkU2VsZWN0ZWRJRDsKCiAgICAjIGdldCB0aGUgY3VycmVudCB2YWx1ZQogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFNlbGVjdGVkSUQgPSAkUGFyYW17VmFsdWV9OwogICAgfQoKICAgICMgZ2V0IHRoZSBkZWZhdWx0IGlkIGJ5IGRlZmF1bHQgdmFsdWUKICAgIGVsc2UgewogICAgICAgICRTZWxlY3RlZElEID0gJFJldmVyc2VDbGFzc0xpc3R7ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJycgfSB8fCAnJzsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIElEICAgICAgICAgICA9PiAkSXRlbUlkLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJhbnNsYXRpb24sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZElELAogICAgICAgIENsYXNzICAgICAgICA9PiAkQ1NTQ2xhc3MsCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgIEBWYWx1ZXMgPSBAeyAkUGFyYW17VmFsdWV9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVmFsdWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIH0KCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlcyA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwoKICAgICMgdHJhbnNsYXRpb24gb24gb3Igb2ZmCiAgICBteSAkVHJhbnNsYXRpb24gPSAwOwogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFRyYW5zbGF0aW9uID0gMTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uID0+ICRUcmFuc2xhdGlvbiwKICAgICAgICBTZWxlY3RlZElEICA9PiAkVmFsdWVzLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0SW50ZWdlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXRJbnRlZ2VyIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGludGVnZXIgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0SW50ZWdlci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJyc7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IG1pbiwgbWF4IGFuZCBkZWZhdWx0CiAgICBteSAkVmFsdWVNaW4gPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1pbn0gfHwgMTsKICAgIG15ICRWYWx1ZU1heCA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWF4fSB8fCAxOwogICAgaWYgKCAkVmFsdWVNaW4gPiAkVmFsdWVNYXggKSB7CiAgICAgICAgJFZhbHVlTWluID0gJFZhbHVlTWF4OwogICAgfQogICAgaWYgKAogICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0KICAgICAgICAmJiAoCiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPCAkVmFsdWVNaW4KICAgICAgICAgICAgfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA+ICRWYWx1ZU1heAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA9ICcnOwogICAgfQoKICAgICMgY3JlYXRlIGRhdGEgYXJyYXkKICAgIG15ICRJbnRlZ2VyTGlzdCA9IFtdOwogICAgZm9yIG15ICRDb3VudGVyICggJFZhbHVlTWluIC4uICRWYWx1ZU1heCApIHsKICAgICAgICBwdXNoIEB7JEludGVnZXJMaXN0fSwgJENvdW50ZXI7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkSW50ZWdlckxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJycsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgIEBWYWx1ZXMgPSBAeyAkUGFyYW17VmFsdWV9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVmFsdWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIH0KCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbWluLCBtYXgKICAgIG15ICRWYWx1ZU1pbiA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWlufSB8fCAxOwogICAgbXkgJFZhbHVlTWF4ID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNYXh9IHx8IDE7CiAgICBpZiAoICRWYWx1ZU1pbiA+ICRWYWx1ZU1heCApIHsKICAgICAgICAkVmFsdWVNaW4gPSAkVmFsdWVNYXg7CiAgICB9CgogICAgIyBzZXQgcHJlc2VsZWN0ZWQgdmFsdWUsIGVpdGhlciBmcm9tIHByZXZpb3VzIHNlbGVjdGlvbiBvciB0aGUgZGVmYXVsdAogICAgbXkgJFZhbHVlcyA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgcHJlc2VsZWN0ZWQgdmFsdWUgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZQogICAgbXkgQEZpbHRlcmVkVmFsdWVzOwogICAgVkFMVUU6CiAgICBmb3IgbXkgJFZhbHVlICggQHskVmFsdWVzfSApIHsKICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRWYWx1ZTsKICAgICAgICBuZXh0IFZBTFVFIGlmICEkVmFsdWU7CiAgICAgICAgbmV4dCBWQUxVRSBpZiAkVmFsdWUgPCAkVmFsdWVNaW47CiAgICAgICAgbmV4dCBWQUxVRSBpZiAkVmFsdWUgPiAkVmFsdWVNYXg7CgogICAgICAgIHB1c2ggQEZpbHRlcmVkVmFsdWVzLCAkVmFsdWU7CiAgICB9CgogICAgIyBjcmVhdGUgZGF0YSBhcnJheQogICAgbXkgQEludGVnZXJMaXN0ID0gKCAkVmFsdWVNaW4gLi4gJFZhbHVlTWF4ICk7CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+IFxASW50ZWdlckxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgID0+IFxARmlsdGVyZWRWYWx1ZXMsCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JwopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0VGV4dCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dFRleHQtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICcnOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICBteSAkTGlua0ZlYXR1cmUgPSAxOwoKICAgICMgZG8gbm90IHRyYW5zZm9ybSBsaW5rcyBpbiBwcmludCB2aWV3CiAgICBpZiAoICRQYXJhbXtQcmludH0gKSB7CiAgICAgICAgJExpbmtGZWF0dXJlID0gMDsKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gJExpbmtGZWF0dXJlLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIHZhbHVlIHdhcyBlbnRlcmVkIGluIHRoZSBmb3JtLCBhIHJlZ2V4IGlzIGRlZmluZWQgYW5kIHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXgKICAgIGlmICgKICAgICAgICAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgJiYgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnRXh9CiAgICAgICAgJiYgJEZvcm1EYXRhe1ZhbHVlfSAhfiBteyAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdFeH0gfXhtcwogICAgICAgICkKICAgIHsKCiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ICAgICAgICAgICA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1JlZ0V4RXJyb3JNZXNzYWdlfSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ0V4RXJyb3JNZXNzYWdlfTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CiAgICB9CgogICAgbXkgJENsYXNzICAgID0gJyc7CiAgICBteSAkU2l6ZSAgICAgPSAnVzUwcGMnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfTsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfTsKICAgIG15ICRJdGVtSWQgICA9ICRQYXJhbXtJdGVtSWR9OwoKICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAkQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICB9CgogICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgJENsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgfQogICAgJENsYXNzIC49ICcgJyAuICRTaXplOwogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRJdGVtSWQpIHsKICAgICAgICAkU3RyaW5nIC49ICJpZD1cIiRJdGVtSWRcIiAiOwogICAgfQoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gJy8+ICc7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwogICAgfQogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAkU2VsZi0+U2VhcmNoRm9ybURhdGFHZXQoJVBhcmFtKTsKICAgIGlmICggIWRlZmluZWQgJFZhbHVlICkgewogICAgICAgICRWYWx1ZSA9ICcnOwogICAgfQoKICAgIG15ICRTdHJpbmcgPSBxcXs8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFBhcmFte0tleX0iIHZhbHVlPSIkVmFsdWUiIGNsYXNzPSJXNTBwYyIgPn07CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TGF5b3V0VGV4dEFyZWE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dFRleHRBcmVhIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRleHRhcmVhIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW06OkxheW91dFRleHRBcmVhLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAnJzsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgbXkgJExpbmtGZWF0dXJlID0gMTsKCiAgICAjIGRvIG5vdCB0cmFuc2Zvcm0gbGlua3MgaW4gcHJpbnQgdmlldwogICAgaWYgKCAkUGFyYW17UHJpbnR9ICkgewogICAgICAgICRMaW5rRmVhdHVyZSA9IDA7CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgJFBhcmFte1ZhbHVlfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgIExpbmtGZWF0dXJlICAgID0+ICRMaW5rRmVhdHVyZSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgIWRlZmluZWQgJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgIyB2YWx1ZSB3YXMgZW50ZXJlZCBpbiB0aGUgZm9ybSwgYSByZWdleCBpcyBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ2V4CiAgICBpZiAoCiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfQogICAgICAgICYmICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ0V4fQogICAgICAgICYmICRGb3JtRGF0YXtWYWx1ZX0gIX4gbXsgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnRXh9IH14bXMKICAgICAgICApCiAgICB7CgogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSAgICAgICAgICAgPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntSZWdFeEVycm9yTWVzc2FnZX0gPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdFeEVycm9yTWVzc2FnZX07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbHMgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDb2xzfSB8fCA1ODsKICAgIG15ICRSb3dzID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Um93c30gfHwgMTA7CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnOwogICAgfQoKICAgIG15ICRDbGFzcyAgICA9ICdXNTBwYyc7CiAgICBteSAkUmVxdWlyZWQgPSAkUGFyYW17UmVxdWlyZWR9OwogICAgbXkgJEludmFsaWQgID0gJFBhcmFte0ludmFsaWR9OwogICAgbXkgJEl0ZW1JZCAgID0gJFBhcmFte0l0ZW1JZH07CgogICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICRDbGFzcyAuPSAnIFZhbGlkYXRlX1JlcXVpcmVkJzsKICAgIH0KCiAgICBpZiAoJEludmFsaWQpIHsKICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRWYWx1ZSk7CiAgICB9CiAgICBteSAkU3RyaW5nCiAgICAgICAgPSAiPHRleHRhcmVhIG5hbWU9XCIkUGFyYW17S2V5fVwiIGlkPVwiJEl0ZW1JZFwiIGNvbHM9XCIkQ29sc1wiIHJvd3M9XCIkUm93c1wiIGNsYXNzPVwiJENsYXNzXCI+JFZhbHVlPC90ZXh0YXJlYT4iOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVmFsdWU7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICB9CiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwogICAgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKSB7CiAgICAgICAgJFZhbHVlID0gJyc7CiAgICB9CgogICAgbXkgJFN0cmluZyA9IHFxezxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUGFyYW17S2V5fSIgdmFsdWU9IiRWYWx1ZSIgY2xhc3M9Ilc1MHBjIj59OwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6TWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdyYW50IGFjY2VzcyBieSBkZWZhdWx0CiAgICBteSAkQWNjZXNzID0gMTsKCiAgICAjIGdldCBhY3Rpb24KICAgIG15ICRBY3Rpb24gPSAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn07CiAgICBpZiAoICRBY3Rpb24gZXEgJ0FnZW50TGlua09iamVjdCcgKSB7CgogICAgICAgICMgVGhlIExpbmstbGluayBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgaXQgaXMgbm90IHNwZWNpZmljIHRvIElUU01Db25maWdJdGVtLgogICAgICAgICMgQXMgYSB3b3JrYXJvdW5kIHdlIGhhcmRjb2RlIHRoYXQgQWdlbnRMaW5rT2JqZWN0IGlzIHRyZWF0ZWQgbGlrZSBBZ2VudElUU01Db25maWdJdGVtRWRpdAogICAgICAgICRBY3Rpb24gPSAnQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQnOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGdyb3VwcwogICAgbXkgJEdyb3Vwc1JvID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufS0+e0dyb3VwUm99IHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufS0+e0dyb3VwfSAgIHx8IFtdOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRBY3Rpb24gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgZGVueSBhY2Nlc3MgYnkgZGVmYXVsdCwgd2hlbiB0aGVyZSBhcmUgZ3JvdXBzIHRvIGNoZWNrCiAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICMgY2hlY2sgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn07CiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIGxhc3QgUk9HUk9VUDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJFJ3R3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIGxhc3QgUldHUk9VUDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIG91dHB1dCBtZW51IGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBtZW51IGl0ZW0KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGEgZGlhbG9nIGhhcyB0byBiZSBzaG93bgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0RpYWxvZ1RpdGxlfSApIHsKCiAgICAgICAgIyBvdXRwdXQgY29uZmlybWF0aW9uIGRpYWxvZwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93Q29uZmlybURpYWxvZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6T3ZlcnZpZXdTbWFsbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZVNob3duIFN0YXJ0SGl0KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWQgQ29uZmlnSXRlbUlEcwogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRHN9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdGhlIENvbmZpZ0l0ZW1JRHMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlZmluZSBpbmNpZGVudCBzaWduYWxzLCBuZWVkZWQgZm9yIHNlcnZpY2VzCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyB0byBzdG9yZSB0aGUgY29sb3IgZm9yIHRoZSBkZXBsb3ltZW50IHN0YXRlcwogICAgbXkgJURlcGxTaWduYWxzOwoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGxpc3Qgb2YgZGVwbG95bWVudCBzdGF0ZXMKICAgIG15ICREZXBsb3ltZW50U3RhdGVzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgc2V0IGRlcGxveW1lbnQgc3R5bGUgY29sb3JzCiAgICBteSAkU3R5bGVDbGFzc2VzID0gJyc7CgogICAgSVRFTUlEOgogICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IGtleXMgJXskRGVwbG95bWVudFN0YXRlc0xpc3R9ICkgewoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGEgY29sb3IgaXMgZGVmaW5lZCBpbiBwcmVmZXJlbmNlcwogICAgICAgIG5leHQgSVRFTUlEIGlmICEkUHJlZmVyZW5jZXN7Q29sb3J9OwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlCiAgICAgICAgbXkgJERlcGxTdGF0ZSA9ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9OwoKICAgICAgICAjIHJlbW92ZSBhbnkgbm9uIGFzY2lpIHdvcmQgY2hhcmFjdGVycwogICAgICAgICREZXBsU3RhdGUgPX4gc3sgW15hLXpBLVowLTldIH17X31tc3hnOwoKICAgICAgICAjIHN0b3JlIHRoZSBvcmlnaW5hbCBkZXBsb3ltZW50IHN0YXRlIGFzIGtleQogICAgICAgICMgYW5kIHRoZSBzcyBzYWZlIGNvdmVydGVkIGRlcGxveW1lbnQgc3RhdGUgYXMgdmFsdWUKICAgICAgICAkRGVwbFNpZ25hbHN7ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9IH0gPSAkRGVwbFN0YXRlOwoKICAgICAgICAjIGNvdmVydCB0byBsb3dlciBjYXNlCiAgICAgICAgbXkgJERlcGxTdGF0ZUNvbG9yID0gbGMgJFByZWZlcmVuY2Vze0NvbG9yfTsKCiAgICAgICAgIyBhZGQgdG8gc3R5bGUgY2xhc3NlcyBzdHJpbmcKICAgICAgICAkU3R5bGVDbGFzc2VzIC49ICIKICAgICAgICAgICAgLkZsYWcgc3Bhbi4kRGVwbFN0YXRlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMkRGVwbFN0YXRlQ29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAiOwogICAgfQoKICAgICMgd3JhcCBpbnRvIHN0eWxlIHRhZ3MKICAgIGlmICgkU3R5bGVDbGFzc2VzKSB7CiAgICAgICAgJFN0eWxlQ2xhc3NlcyA9ICI8c3R5bGU+JFN0eWxlQ2xhc3Nlczwvc3R5bGU+IjsKICAgIH0KCiAgICAjIHN0b3JlIGVpdGhlciBDb25maWdJdGVtIElEcyBMb2NhbGx5CiAgICBteSBAQ29uZmlnSXRlbUlEcyA9IEB7ICRQYXJhbXtDb25maWdJdGVtSURzfSB9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlJykgKSB7CiAgICAgICAgbXkgQEdyb3VwczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgKSB7CiAgICAgICAgICAgIEBHcm91cHMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpIH07CiAgICAgICAgfQogICAgICAgIGlmICggIUBHcm91cHMgKSB7CiAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbSBwcmUgbWVudSBtb2R1bGVzCiAgICBteSBAQWN0aW9uSXRlbXM7CiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CgogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51S2V5ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnVLZXl9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudUtleX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIG1lbnUgaXMgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICBuZXh0IE1FTlUgaWYgcmVmICRNZW51c3skTWVudUtleX0gbmUgJ0hBU0gnOwoKICAgICAgICAgICAgICAgICMgc2V0IGNsYXNzZXMKICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51S2V5fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51S2V5fS0+e1RhcmdldH0gZXEgJ1BvcFVwJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51S2V5fS0+e01lbnVDbGFzc30gPSAnQXNQb3B1cCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudUtleX0tPntQb3B1cFR5cGV9ID0gJ0lUU01Db25maWdJdGVtQWN0aW9uJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudUtleX0tPntNZW51Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudUtleX0tPntQb3B1cFR5cGV9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ3JhbnQgYWNjZXNzIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICAgICAgICAgICAgIG15ICRBY3Rpb24gPSAkTWVudXN7JE1lbnVLZXl9LT57QWN0aW9ufTsKCiAgICAgICAgICAgICAgICAjIGNhbiBub3QgZXhlY3V0ZSB0aGUgbW9kdWxlIGR1ZSB0byBhIENvbmZpZ0l0ZW0gaXMgcmVxdWlyZWQsIHRoZW4ganVzdCBjaGVjayB0aGUKICAgICAgICAgICAgICAgICMgcGVybWlzc2lvbnMgYXMgaW4gdGhlIE1lbnVNb2R1bGVHZW5lcmljCiAgICAgICAgICAgICAgICBteSAkR3JvdXBzUm8gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259LT57R3JvdXBSb30gfHwgW107CiAgICAgICAgICAgICAgICBteSAkR3JvdXBzUncgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259LT57R3JvdXB9ICAgfHwgW107CgogICAgICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICBpZiAoICRBY3Rpb24gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZGVueSBhY2Nlc3MgYnkgZGVmYXVsdCwgd2hlbiB0aGVyZSBhcmUgZ3JvdXBzIHRvIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgICAgICAgICAgICAgIFJPR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn07CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUk9HUk9VUDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICAgICAgICAgICAgICBSV0dST1VQOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJFJ3R3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUldHUk9VUDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm8gYWNjZXNzIHRvIHRoZSBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEFjY2VzczsKCiAgICAgICAgICAgICAgICAjIHRyYW5zbGF0ZSBOYW1lIGFuZCBEZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkTWVudXN7JE1lbnVLZXl9LT57RGVzY3JpcHRpb259ICk7CiAgICAgICAgICAgICAgICBteSAkTmFtZSAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRNZW51c3skTWVudUtleX0tPntEZXNjcmlwdGlvbn0gKTsKCiAgICAgICAgICAgICAgICAjIGdlbmVyYXJ0ZSBhIHdlYiBzYWZlIGxpbmsKICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfSAuICRNZW51c3skTWVudUtleX0tPntMaW5rfTsKCiAgICAgICAgICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkTWVudXN7JE1lbnVLZXl9LT57TWVudUNsYXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnVLZXl9LT57TWVudUNsYXNzfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgSFRNTCBmb3IgdGhlIG1lbnUgaXRlbQogICAgICAgICAgICAgICAgbXkgJE1lbnVIVE1MID0gPDwgIkVORCI7CjxsaT4KICAgIDxhIGhyZWY9IiRMaW5rIiBjbGFzcz0iJE1lbnVzeyRNZW51S2V5fS0+e01lbnVDbGFzc30iIHRpdGxlPSIkRGVzY3JpcHRpb24iPiROYW1lPC9hPgo8L2xpPgpFTkQKCiAgICAgICAgICAgICAgICAkTWVudUhUTUwgPX4gcy9cbisvL2c7CiAgICAgICAgICAgICAgICAkTWVudUhUTUwgPX4gcy9ccysvIC9nOwogICAgICAgICAgICAgICAgJE1lbnVIVE1MID1+IHMvPFwhLS0uKz8tLT4vL2c7CgogICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51S2V5fS0+e0lEfSA9ICRNZW51c3skTWVudUtleX0tPntOYW1lfTsKICAgICAgICAgICAgICAgICRNZW51c3skTWVudUtleX0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgICAgICBIVE1MICAgICAgICA9PiAkTWVudUhUTUwsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJE1lbnVzeyRNZW51S2V5fS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICAgICAgICAgICAgICBUYXJnZXQgICAgICA9PiAkTWVudXN7JE1lbnVLZXl9LT57VGFyZ2V0fSwKICAgICAgICAgICAgICAgICAgICBQb3B1cFR5cGUgICA9PiAkTWVudXN7JE1lbnVLZXl9LT57UG9wdXBUeXBlfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgU2hvd0NvbHVtbnMgcGFyYW1ldGVyCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBteSBAWE1MU2hvd0NvbHVtbnM7CiAgICBpZiAoICRQYXJhbXtTaG93Q29sdW1uc30gJiYgcmVmICRQYXJhbXtTaG93Q29sdW1uc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICBAU2hvd0NvbHVtbnMgPSBAeyAkUGFyYW17U2hvd0NvbHVtbnN9IH07CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgYnVpbGQgY29sdW1uIGhlYWRlciBibG9ja3MKICAgIGlmIChAU2hvd0NvbHVtbnMpIHsKCiAgICAgICAgIyBzaG93IHRoZSBidWxrIGFjdGlvbiBidXR0b24gY2hlY2tib3hlcyBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgICAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAnQnVsa0FjdGlvbic7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZWVkZWQgdmVyaWFibGVzCiAgICAgICAgICAgIG15ICRDU1MgPSAnT3ZlcnZpZXdIZWFkZXInOwogICAgICAgICAgICBteSAkT3JkZXJCeTsKCiAgICAgICAgICAgICMgcmVtb3ZlIElEIGlmIG5lY2VzYXJ5CiAgICAgICAgICAgIGlmICggJFBhcmFte1NvcnRCeX0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U29ydEJ5fSA9ICggJFBhcmFte1NvcnRCeX0gZXEgJ0luY2lTdGF0ZUlEJyApCiAgICAgICAgICAgICAgICAgICAgPyAnQ3VySW5jaVN0YXRlJwogICAgICAgICAgICAgICAgICAgIDogKCAkUGFyYW17U29ydEJ5fSBlcSAnRGVwbFN0YXRlSUQnICkgPyAnQ3VyRGVwbFN0YXRlJwogICAgICAgICAgICAgICAgICAgIDogKCAkUGFyYW17U29ydEJ5fSBlcSAnQ2xhc3NJRCcgKSAgICAgPyAnQ2xhc3MnCiAgICAgICAgICAgICAgICAgICAgOiAoICRQYXJhbXtTb3J0Qnl9IGVxICdDaGFuZ2VUaW1lJyApICA/ICdMYXN0Q2hhbmdlZCcKICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1NvcnRCeX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHRoZSBjb3JyZWN0IFNldCBDU1MgY2xhc3MgYW5kIG9yZGVyIGJ5IGxpbmsKICAgICAgICAgICAgaWYgKCAkUGFyYW17U29ydEJ5fSAmJiAoICRQYXJhbXtTb3J0Qnl9IGVxICRDb2x1bW4gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnl9ICYmICggJFBhcmFte09yZGVyQnl9IGVxICdVcCcgKSApIHsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJCeSA9ICdEb3duJzsKICAgICAgICAgICAgICAgICAgICAkQ1NTIC49ICcgU29ydERlc2NlbmRpbmdMYXJnZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJCeSA9ICdVcCc7CiAgICAgICAgICAgICAgICAgICAgJENTUyAuPSAnIFNvcnRBc2NlbmRpbmdMYXJnZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3JkZXJCeSA9ICdVcCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJyAuICRDb2x1bW4gLiAnSGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDU1MgICAgID0+ICRDU1MsCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgWE1MIGNvbHVtbiBoZWFkZXJzIG9ubHkgaWYgdGhlIGZpbHRlciBpcyBub3Qgc2V0IHRvICdhbGwnCiAgICAgICAgIyBhbmQgaWYgdGhlcmUgYXJlIENJcyB0byBzaG93CiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSAmJiAkUGFyYW17RmlsdGVyfSBuZSAnQWxsJyAmJiBAQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB2ZXJzaW9uIGRhdGEgb2YgdGhlIGZpcnN0IGNvbmZpZyBpdGVtLCBpbmNsdWRpbmcgYWxsIHRoZSBYTUwgZGF0YQogICAgICAgICAgICAjIHRvIGdldCB0aGUgY29sdW1uIGhlYWRlciBuYW1lcwogICAgICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSURzWzBdLAogICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgdGhlIFhNTCBkYXRhIGludG8gYSBoYXNoCiAgICAgICAgICAgIG15ICRFeHRlbmRlZFZlcnNpb25EYXRhID0gJFNlbGYtPl9YTUxEYXRhMkhhc2goCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRDb25maWdJdGVtLT57WE1MRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRDb25maWdJdGVtLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgeG1sIGNvbHVtbnMgKHRoZXkgY29udGFpbiA6OikKICAgICAgICAgICAgQFhNTFNob3dDb2x1bW5zID0gZ3JlcCAvOjovLCBAU2hvd0NvbHVtbnM7CgogICAgICAgICAgICBDT0xVTU46CiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uIChAWE1MU2hvd0NvbHVtbnMpIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGNvbHVtbiBleGlzdHMgaW4gQ0ktRGF0YQogICAgICAgICAgICAgICAgbmV4dCBDT0xVTU4gaWYgISRFeHRlbmRlZFZlcnNpb25EYXRhLT57JENvbHVtbn0tPntOYW1lfTsKCiAgICAgICAgICAgICAgICAjIHNob3cgdGhlIHhtbCBhdHRyaWJ1dGUgaGVhZGVyCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmRYTUxBdHRyaWJ1dGVIZWFkZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFhNTEF0dHJpYnV0ZUhlYWRlciA9PiAkRXh0ZW5kZWRWZXJzaW9uRGF0YS0+eyRDb2x1bW59LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJE91dHB1dCAgPSAnJzsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIHNob3cgY29uZmlnIGl0ZW1zIGlmIHRoZXJlIGFyZSBzb21lCiAgICBpZiAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyB0byBzdG9yZSBhbGwgZGF0YQogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgICAgICAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkSGFzQWNjZXNzOwoKICAgICAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICAgICAgICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkQ29uZmlnSXRlbTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgdGhlIFhNTCBkYXRhIGludG8gYSBoYXNoCiAgICAgICAgICAgICAgICBteSAkRXh0ZW5kZWRWZXJzaW9uRGF0YSA9ICRTZWxmLT5fWE1MRGF0YTJIYXNoKAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJENvbmZpZ0l0ZW0tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRDb25maWdJdGVtLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc3RvcmUgY29uZmlnIGl0ZW0gZGF0YSwKICAgICAgICAgICAgICAgICVEYXRhID0gJXskQ29uZmlnSXRlbX07CgogICAgICAgICAgICAgICAgIyBHZXQgY29uZmlnIGl0ZW0gZGF0YSBmb3IgJ0NyZWF0ZVRpbWUnIGFuZCAnQ2hhbmdlVGltZScuCiAgICAgICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRDb25maWdJdGVtRGF0YS0+e0NyZWF0ZVRpbWV9OwogICAgICAgICAgICAgICAgJERhdGF7Q2hhbmdlVGltZX0gPSAkQ29uZmlnSXRlbURhdGEtPntDaGFuZ2VUaW1lfTsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHJlY29yZCBibG9jawogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGNvbHVtbiByZWNvcmQgYmxvY2tzCiAgICAgICAgICAgICAgICBpZiAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgICAgICAgICAgICAgIENPTFVNTjoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJyAuICRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICREYXRhe0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFNpZ25hbCA9PiAkRGVwbFNpZ25hbHN7ICREYXRhe0N1ckRlcGxTdGF0ZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBDT0xVTU46CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKEBYTUxTaG93Q29sdW1ucykgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBjb2x1bW4gZXhpc3RzIGluIENJLURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT0xVTU4gaWYgISRFeHRlbmRlZFZlcnNpb25EYXRhLT57JENvbHVtbn0tPntOYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCB0byBhc2NpaSB0ZXh0IGluIGNhc2UgdGhlIHZhbHVlIGNvbnRhaW5zIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRvQXNjaWkoIFN0cmluZyA9PiAkRXh0ZW5kZWRWZXJzaW9uRGF0YS0+eyRDb2x1bW59LT57VmFsdWV9IC8vICcnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IGFsbCB3aGl0ZXNwYWNlIGFuZCBuZXdsaW5lcyB0byBzaW5nbGUgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzeyBccysgfXsgfWd4bXM7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIHhtbCBhdHRyaWJ1dGUgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZFhNTEF0dHJpYnV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MQXR0cmlidXRlRGF0YSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG1ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIGFjdGlvbiBpdGVtcyB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgICAgICAgICAgICAgbXkgJENsb25lZEFjdGlvbkl0ZW1zID0gU3RvcmFibGU6OmRjbG9uZSggXEBBY3Rpb25JdGVtcyApOwoKICAgICAgICAgICAgICAgICMgc3Vic3RpdHV0ZSBUVCB2YXJpYWJsZXMKICAgICAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSXRlbSAoIEB7JENsb25lZEFjdGlvbkl0ZW1zfSApIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uSXRlbS0+e0hUTUx9ID1+IHN7IFxRWyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdXEUgfXskQ29uZmlnSXRlbUlEfXhtc2c7CiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbkl0ZW0tPntIVE1MfSA9fiBzeyBcUVslIERhdGEuVmVyc2lvbklEIHwgaHRtbCAlXVxFIH17JENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9fXhtc2c7CiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbkl0ZW0tPntMaW5rfSA9fiBzeyBcUVslIERhdGEuQ29uZmlnSXRlbUlEIHwgaHRtbCAlXVxFIH17JENvbmZpZ0l0ZW1JRH14bXNnOwogICAgICAgICAgICAgICAgICAgICRBY3Rpb25JdGVtLT57TGlua30gPX4gc3sgXFFbJSBEYXRhLlZlcnNpb25JRCB8IGh0bWwgJV1cRSB9eyRDb25maWdJdGVtLT57VmVyc2lvbklEfX14bXNnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRDbG9uZWRBY3Rpb25JdGVtcywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiB0aGVyZSBhcmUgbm8gY29uZmlnIGl0ZW1zIHRvIHNob3csIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0aGUgdGFibGUKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVG90YWxDb2x1bW5zID0+IHNjYWxhciBAU2hvd0NvbHVtbnMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVzZSB0ZW1wbGF0ZQogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFNlbGYtPntWaWV3VHlwZX0sCiAgICAgICAgICAgIENvbHVtbkNvdW50ICA9PiBzY2FsYXIgQFNob3dDb2x1bW5zLAogICAgICAgICAgICBTdHlsZUNsYXNzZXMgPT4gJFN0eWxlQ2xhc3NlcywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPW92ZXIKCj1pdGVtIF9YTUxEYXRhMkhhc2goKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggYWxsIHhtbCBkYXRhIG9mIGEgY29uZmlnIGl0ZW0KClJldHVybgoKICAgICREYXRhID0gewogICAgICAgICdIYXJkRGlzazo6MicgPT4gewogICAgICAgICAgICBWYWx1ZSA9PiAnSEQyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0hhcmQgRGlzaycsCiAgICAgICAgIH0sCiAgICAgICAgJ0NQVTo6MScgPT4gewogICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NQVScsCiAgICAgICAgfSwKICAgICAgICAnSGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxJyA9PiB7CiAgICAgICAgICAgIFZhbHVlID0+ICc3ODAgR0InLAogICAgICAgICAgICBOYW1lICA9PiAnQ2FwYWNpdHknLAogICAgICAgIH0sCiAgICB9OwoKICAgIG15ICREYXRhID0gX1hNTERhdGEySGFzaCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRWZXJzaW9uLT57WE1MRGVmaW5pdGlvbn0sCiAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVEYXRhSGFzaFJlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgUHJlZml4ICAgICAgICA9PiAnSGFyZERpc2s6OjEnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTERhdGEySGFzaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAjIHRvIHN0b3JlIHRoZSByZXR1cm4gZGF0YQogICAgbXkgJERhdGEgPSAkUGFyYW17RGF0YX0gfHwge307CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gLy8gJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG9ubHkgaWYgdmFsdWUgaXMgZGVmaW5lZAogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcHJlZml4CiAgICAgICAgICAgIG15ICRQcmVmaXggPSAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZml4ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJFByZWZpeDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgaXRlbSBpbiBoYXNoCiAgICAgICAgICAgICREYXRhLT57JFByZWZpeH0gPSB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlIC8vICcnLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICREYXRhID0gJFNlbGYtPl9YTUxEYXRhMkhhc2goCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkUHJlZml4LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKMTsKCj1iYWNrCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OklUU01Db25maWdJdGVtIC0gYWxsIENvbmZpZ0l0ZW0tcmVsYXRlZCBIVE1MIGZ1bmN0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgSVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQtcmVsYXRlZCBIVE1MIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1pdGVtIElUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCnJldHVybnMgYW4gb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJpbnQgPT4gMSwgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDApCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KCkKCnJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBodG1sIGZvcm0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KAogICAgICAgIEtleSAgICAgICAgICA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSAgICAgICAgID0+ICRJdGVtUmVmLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0gQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiB7fSBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoKQoKcmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIHNlYXJjaCBodG1sIGZvcm0KCiAgICBteSAkQXJyYXlSZWYgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1TZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gW10gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkVmFsdWVzOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbVNlYXJjaElucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBzZWFyY2ggaW5wdXQgZmllbGQgaHRtbCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIF9JVFNNTG9hZExheW91dEJhY2tlbmQoKQoKbG9hZCBhIGlucHV0IHR5cGUgYmFja2VuZCBtb2R1bGUKCiAgICAkQmFja2VuZE9iamVjdCA9ICRMYXlvdXRPYmplY3QtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgKTsKCj1jdXQKCnN1YiBfSVRTTUxvYWRMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpMYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbUxpc3RTaG93KCkKClJldHVybnMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gaXRlbXMgYXMgc29ydGFibGUgbGlzdCB3aXRoIHBhZ2luYXRpb24uCgpUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gTDxLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0VGlja2V0OjpUaWNrZXRMaXN0U2hvdygpPgppbiBGPEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRUaWNrZXQucG0+LgoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUxpc3RTaG93KAogICAgICAgIENvbmZpZ0l0ZW1JRHMgPT4gJENvbmZpZ0l0ZW1JRHNSZWYsICAgICAgICAgICAgICAgICAgIyB0b3RhbCBsaXN0IG9mIGNvbmZpZyBpdGVtIGlkcywgdGhhdCBjYW4gYmUgbGlzdGVkCiAgICAgICAgVG90YWwgICAgICAgICA9PiBzY2FsYXIgQHsgJENvbmZpZ0l0ZW1JRHNSZWYgfSwgICAgICAjIHRvdGFsIG51bWJlciBvZiBsaXN0IGl0ZW1zLCBjb25maWcgaXRlbXMgaW4gdGhpcyBjYXNlCiAgICAgICAgVmlldyAgICAgICAgICA9PiAkU2VsZi0+e1ZpZXd9LCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAnU21hbGwnCiAgICAgICAgRmlsdGVyICAgICAgICA9PiAnQWxsJywKICAgICAgICBGaWx0ZXJzICAgICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgICAgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgVGl0bGVOYW1lICAgICA9PiAnT3ZlcnZpZXc6IENvbmZpZyBJdGVtOiBDb21wdXRlcicsCiAgICAgICAgVGl0bGVWYWx1ZSAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRW52ICAgICAgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCAgICAgID0+ICRMaW5rU29ydCwKICAgICAgICBGcm9udGVuZCAgICAgID0+ICdBZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoQWdlbnR8Q3VzdG9tZXIpLCBkZWZhdWx0OiBBZ2VudCwgaW5kaWNhdGVzIGZyb20gd2hpY2ggZnJvbnRlbmQgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtTGlzdFNob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2Ugb2JqZWN0IHJlZiB0byBsb2NhbCwgcmVtb3ZlIGl0IGZyb20gJVBhcmFtIChwcmV2ZW50IG1lbW9yeSBsZWFrKQogICAgbXkgJEVudiA9IGRlbGV0ZSAkUGFyYW17RW52fTsKCiAgICAjIGxvb2t1cCBsYXRlc3QgdXNlZCB2aWV3IG1vZGUKICAgIGlmICggISRQYXJhbXtWaWV3fSAmJiAkU2VsZi0+eyAnVXNlcklUU01Db25maWdJdGVtT3ZlcnZpZXcnIC4gJEVudi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkUGFyYW17Vmlld30gPSAkU2VsZi0+eyAnVXNlcklUU01Db25maWdJdGVtT3ZlcnZpZXcnIC4gJEVudi0+e0FjdGlvbn0gfTsKICAgIH0KCiAgICAjIHNldCBmcm9udGVuZAogICAgbXkgJEZyb250ZW5kID0gJFBhcmFte0Zyb250ZW5kfSB8fCAnQWdlbnQnOwoKICAgICMgc2V0IGRlZmF1dCB2aWV3IG1vZGUgdG8gJ3NtYWxsJwogICAgbXkgJFZpZXcgPSAkUGFyYW17Vmlld30gfHwgJ1NtYWxsJzsKCiAgICAjIHN0b3JlIGxhdGVzdCB2aWV3IG1vZGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259LAogICAgICAgIFZhbHVlICAgICA9PiAkVmlldywKICAgICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBiYWNrZW5kIGZyb20gY29uZmlnCiAgICBteSAkQmFja2VuZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6T3ZlcnZpZXcnKTsKICAgIGlmICggISRCYWNrZW5kcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTmVlZCBjb25maWcgb3B0aW9uIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6T3ZlcnZpZXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgaGFzaC1yZWYKICAgIGlmICggcmVmICRCYWNrZW5kcyBuZSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NvbmZpZyBvcHRpb24gSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpPdmVydmlldyBuZWVkcyB0byBiZSBhIEhBU0ggcmVmIScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjb25maWcga2V5CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIGNvbmZpZyBvcHRpb24gZm91bmQgZm9yIHRoZSB2aWV3ICckVmlldychIiwKICAgICAgICApOwogICAgfQoKICAgICMgbmF2IGJhcgogICAgbXkgJFN0YXJ0SGl0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAnU3RhcnRIaXQnLAogICAgKSB8fCAxOwoKICAgICMgZ2V0IHBlcnNvbmFsIHBhZ2Ugc2hvd24gY291bnQKICAgIG15ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleSA9ICdVc2VyQ29uZmlnSXRlbU92ZXJ2aWV3JyAuICRWaWV3IC4gJ1BhZ2VTaG93bic7CiAgICBteSAkUGFnZVNob3duICAgICAgICAgICAgICAgPSAkU2VsZi0+eyRQYWdlU2hvd25QcmVmZXJlbmNlc0tleX0gfHwgMTA7CiAgICBteSAkR3JvdXAgICAgICAgICAgICAgICAgICAgPSAnQ29uZmlnSXRlbU92ZXJ2aWV3JyAuICRWaWV3IC4gJ1BhZ2VTaG93bic7CgogICAgIyBjaGVjayBzdGFydCBvcHRpb24sIGlmIGhpZ2hlciB0aGVuIGVsZW1lbnRzIGF2YWlsYWJsZSwgc2V0CiAgICAjIGl0IHRvIHRoZSBsYXN0IG92ZXJ2aWV3IHBhZ2UgKFRoYW5rcyB0byBTdGVmYW4gU2NobWlkdCEpCiAgICBpZiAoICRTdGFydEhpdCA+ICRQYXJhbXtUb3RhbH0gKSB7CiAgICAgICAgbXkgJFBhZ2VzID0gaW50KCAoICRQYXJhbXtUb3RhbH0gLyAkUGFnZVNob3duICkgKyAwLjk5OTk5ICk7CiAgICAgICAgJFN0YXJ0SGl0ID0gKCAoICRQYWdlcyAtIDEgKSAqICRQYWdlU2hvd24gKSArIDE7CiAgICB9CgogICAgIyBnZXQgZGF0YSBzZWxlY3Rpb24KICAgIG15ICVEYXRhOwogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnUHJlZmVyZW5jZXNHcm91cHMnKTsKICAgIGlmICggJENvbmZpZyAmJiAkQ29uZmlnLT57JEdyb3VwfSAmJiAkQ29uZmlnLT57JEdyb3VwfS0+e0RhdGF9ICkgewogICAgICAgICVEYXRhID0gJXsgJENvbmZpZy0+eyRHcm91cH0tPntEYXRhfSB9OwogICAgfQoKICAgICMgc2V0IHBhZ2UgbGltaXQgYW5kIGJ1aWxkIHBhZ2UgbmF2CiAgICBteSAkTGltaXQgICA9ICRQYXJhbXtMaW1pdH0gfHwgMjBfMDAwOwogICAgbXkgJVBhZ2VOYXYgPSAkTGF5b3V0T2JqZWN0LT5QYWdlTmF2QmFyKAogICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICBBbGxIaXRzICAgPT4gJFBhcmFte1RvdGFsfSB8fCAwLAogICAgICAgIEFjdGlvbiAgICA9PiAnQWN0aW9uPScgLiAkRW52LT57QWN0aW9ufSwKICAgICAgICBMaW5rICAgICAgPT4gJFBhcmFte0xpbmtQYWdlfSwKICAgICk7CgogICAgIyBidWlsZCBzaG93biB0aWNrZXQgYSBwYWdlCiAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSAgICA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IjsKICAgICRQYXJhbXtHcm91cH0gICAgICAgICAgID0gJEdyb3VwOwogICAgJFBhcmFte1ByZWZlcmVuY2VzS2V5fSAgPSAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXk7CiAgICAkUGFyYW17UGFnZVNob3duU3RyaW5nfSA9ICRTZWxmLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXksCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhZ2VTaG93biwKICAgICAgICBEYXRhICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICk7CgogICAgIyBidWlsZCBuYXZiYXIgY29udGVudAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBiYWNrIGxpbmsKICAgIGlmICggJFBhcmFte0xpbmtCYWNrfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGZpbHRlcnMKICAgIGlmICggJFBhcmFte0ZpbHRlcnN9ICkgewoKICAgICAgICAjIGdldCBnaXZlbiBmaWx0ZXJzCiAgICAgICAgbXkgQE5hdkJhckZpbHRlcnM7CiAgICAgICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICV7ICRQYXJhbXtGaWx0ZXJzfSB9ICkgewogICAgICAgICAgICBwdXNoIEBOYXZCYXJGaWx0ZXJzLCAkUGFyYW17RmlsdGVyc30tPnskUHJpb307CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIGZpbHRlciBjb250ZW50CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIG92ZXIgZmlsdGVycwogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBOYXZCYXJGaWx0ZXJzKSB7CgogICAgICAgICAgICAjIGluY3JlbWVudCBmaWx0ZXIgY291bnQgYW5kIGJ1aWxkIGZpbHRlciBpdGVtCiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbHRlciBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbG9vcCBvdmVyIGNvbmZpZ3VyZWQgYmFja2VuZHMKICAgIGZvciBteSAkQmFja2VuZCAoIHNvcnQga2V5cyAleyRCYWNrZW5kc30gKSB7CgogICAgICAgICMgYnVpbGQgbmF2YmFyIHZpZXcgbW9kZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyAkQmFja2VuZHMtPnskQmFja2VuZH0gfSwKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGN1cnJlbnQgdmlldyBpcyBjb25maWd1cmVkIGluIGJhY2tlbmQKICAgICAgICBpZiAoICRWaWV3IGVxICRCYWNrZW5kICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRQYXJhbXtGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRQYXJhbXtGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGFnZSBuYXYgaXMgYXZhaWxhYmxlCiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhZ2VOYXYsCiAgICAgICAgKTsKCiAgICAgICAgIyBkb24ndCBzaG93IGNvbnRleHQgc2V0dGluZ3MgaW4gQUpBWCBjYXNlIChlLiBnLiBpbiBjdXN0b21lciB0aWNrZXQgaGlzdG9yeSksCiAgICAgICAgIyAgIGJlY2F1c2UgdGhlIHN1Ym1pdCB3aXRoIHBhZ2UgcmVsb2FkIHdpbGwgbm90IHdvcmsgdGhlcmUKICAgICAgICBpZiAoICEkUGFyYW17QUpBWH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29udGV4dFNldHRpbmdzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBidWxrIGFjdGlvbiBidXR0b24gaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGtBY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBodG1sIGNvbnRlbnQKICAgIG15ICRPdXRwdXROYXZCYXIgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0UmF3ID0gJyc7CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5QcmludCgKICAgICAgICAgICAgT3V0cHV0ID0+IFwkT3V0cHV0TmF2QmFyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXROYXZCYXI7CiAgICB9CgogICAgIyBsb2FkIG1vZHVsZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfSApICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgYmFja2VuZCBvYmplY3QKICAgIG15ICRPYmplY3QgPSAkQmFja2VuZHMtPnskVmlld30tPntNb2R1bGV9LT5uZXcoICV7JEVudn0gKTsKICAgIHJldHVybiBpZiAhJE9iamVjdDsKCiAgICAjIHJ1biBtb2R1bGUKICAgIG15ICRPdXRwdXQgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgJVBhcmFtLAogICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICBBbGxIaXRzICAgPT4gJFBhcmFte1RvdGFsfSB8fCAwLAogICAgICAgIEZyb250ZW5kICA9PiAkRnJvbnRlbmQsCiAgICApOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0OwogICAgfQoKICAgICMgY3JlYXRlIG92ZXJ2aWV3IG5hdiBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyJywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIHJldHVybiBjb250ZW50IGlmIGF2YWlsYWJsZQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTUNvbmZpZ0l0ZW0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgbGluayBvYmplY3QgKGNvbmZpZyBpdGVtKQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJMYW5ndWFnZSBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBXZSBuZWVkIG91ciBvd24gTGF5b3V0T2JqZWN0IGluc3RhbmNlIHRvIGF2b2lkIGJsb2NrZGF0YSBjb2xsaXNpb25zCiAgICAjICAgd2l0aCB0aGUgbWFpbiBwYWdlLgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFJlYWxuYW1lICAgPT4gJ0NvbmZpZ0l0ZW0nLAogICAgICAgIE9iamVjdE5hbWUgPT4gJ1NvdXJjZU9iamVjdElEJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZUNvbXBsZXgoKQoKcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGJsb2NrIGRhdGEKClJldHVybgoKICAgIEBCbG9ja0RhdGEgPSAoCiAgICAgICAgewoKICAgICAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ0NvbmZpZ0l0ZW1JRCcsCiAgICAgICAgICAgIE9iamVjdElEICAgID0+ICcxMjMnLAoKICAgICAgICAgICAgT2JqZWN0ICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEJsb2NrbmFtZSA9PiAnQ29uZmlnSXRlbSBDb21wdXRlcicsCiAgICAgICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdDdXJJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAnMTIzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcxMjMnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPTEyMycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnVGhlIE5hbWUgb2YgdGhlIENvbmZpZyBJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0luIFJlcGFpcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnQ3VySW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJzIzNCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjM0JywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0yMzQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1RoZSBOYW1lIG9mIHRoZSBDb25maWcgSXRlbSAyMzQnLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnUHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDctMTEtMTEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGdldCBhbmQgcmVtZW1iZXIgdGhlIERlcGxveW1lbnQgc3RhdGUgY29sb3JzCiAgICBteSAkRGVwbG95bWVudFN0YXRlc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICBJVEVNSUQ6CiAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQga2V5cyAleyREZXBsb3ltZW50U3RhdGVzTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgYSBjb2xvciBpcyBkZWZpbmVkIGluIHByZWZlcmVuY2VzCiAgICAgICAgbmV4dCBJVEVNSUQgaWYgISRQcmVmZXJlbmNlc3tDb2xvcn07CgogICAgICAgICMgYWRkIGNvbG9yIHN0eWxlIGRlZmluaXRpb24KICAgICAgICBteSAkRGVwbFN0YXRlID0gJERlcGxveW1lbnRTdGF0ZXNMaXN0LT57JEl0ZW1JRH07CgogICAgICAgICMgcmVtb3ZlIGFueSBub24gYXNjaWkgd29yZCBjaGFyYWN0ZXJzCiAgICAgICAgJERlcGxTdGF0ZSA9fiBzeyBbXmEtekEtWjAtOV0gfXtffW1zeGc7CgogICAgICAgICMgY292ZXJ0IHRvIGxvd2VyIGNhc2UKICAgICAgICAkU2VsZi0+e0RlcGxTdGF0ZUNvbG9yc30tPnskRGVwbFN0YXRlfSA9IGxjICRQcmVmZXJlbmNlc3tDb2xvcn07CiAgICB9CgogICAgIyBnZXQgdGhlIGNvbHVtbiBjb25maWcKICAgIG15ICRDb2x1bW5Db25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0xpbmtPYmplY3Q6OklUU01Db25maWdJdGVtOjpTaG93Q29sdW1uc0J5Q2xhc3MnKTsKCiAgICAjIGdldCB0aGUgY29uZmlnZXJlZCBjb2x1bW5zIGFuZCByZW9yZ2FuaXplIHRoZW0gYnkgY2xhc3MgbmFtZQogICAgbXkgJUNvbHVtbkJ5Q2xhc3M7CiAgICBpZiAoICRDb2x1bW5Db25maWcgJiYgcmVmICRDb2x1bW5Db25maWcgZXEgJ0FSUkFZJyAmJiBAeyRDb2x1bW5Db25maWd9ICkgewoKICAgICAgICBOQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIEB7JENvbHVtbkNvbmZpZ30gKSB7CiAgICAgICAgICAgIG15ICggJENsYXNzLCAkQ29sdW1uICkgPSBzcGxpdCAvOjovLCAkTmFtZSwgMjsKCiAgICAgICAgICAgIG5leHQgTkFNRSBpZiAhJENvbHVtbjsKCiAgICAgICAgICAgIHB1c2ggQHsgJENvbHVtbkJ5Q2xhc3N7JENsYXNzfSB9LCAkQ29sdW1uOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIGxpc3QKICAgIG15ICVMaW5rTGlzdDsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgY2xhc3MKICAgICAgICAgICAgICAgIG15ICRDbGFzcyA9ICREaXJlY3Rpb25MaXN0LT57JENvbmZpZ0l0ZW1JRH0tPntDbGFzc30gfHwgJyc7CgogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRDbGFzczsKCiAgICAgICAgICAgICAgICAkTGlua0xpc3R7JENsYXNzfS0+eyRDb25maWdJdGVtSUR9LT57RGF0YX0gPSAkRGlyZWN0aW9uTGlzdC0+eyRDb25maWdJdGVtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15IEBCbG9ja0RhdGE7CiAgICBmb3IgbXkgJENsYXNzICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJUxpbmtMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRMaW5rTGlzdHskQ2xhc3N9OwoKICAgICAgICAjIHRvIHN0b3JlIHRoZSBjb2x1bW4gaGVhZGxpbmUKICAgICAgICBteSBAU2hvd0NvbHVtbnNIZWFkbGluZXM7CgogICAgICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QKICAgICAgICBteSBASXRlbUxpc3Q7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKAogICAgICAgICAgICBzb3J0IHsgJENvbmZpZ0l0ZW1MaXN0LT57JGF9LT57RGF0YX0tPntOYW1lfSBjbXAgJENvbmZpZ0l0ZW1MaXN0LT57JGJ9LT57RGF0YX0tPntOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJXskQ29uZmlnSXRlbUxpc3R9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGV4dHJhY3QgdmVyc2lvbiBkYXRhCiAgICAgICAgICAgIG15ICRWZXJzaW9uID0gJENvbmZpZ0l0ZW1MaXN0LT57JENvbmZpZ0l0ZW1JRH0tPntEYXRhfTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBjb2x1bW4gaGVhZGxpbmUgYXJyYXkgaXMgZW1wdHkgZm9yIGVhY2ggbG9vcAogICAgICAgICAgICBAU2hvd0NvbHVtbnNIZWFkbGluZXMgPSAoKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB2ZXJzaW9uIGRhdGEsIGluY2x1ZGluZyBhbGwgdGhlIFhNTCBkYXRhCiAgICAgICAgICAgIG15ICRWZXJzaW9uWE1MRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCB0aGUgWE1MIGRhdGEgaW50byBhIGhhc2gKICAgICAgICAgICAgbXkgJEV4dGVuZGVkVmVyc2lvbkRhdGEgPSAkU2VsZi0+X1hNTERhdGEySGFzaCgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFZlcnNpb25YTUxEYXRhLT57WE1MRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uWE1MRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQEl0ZW1Db2x1bW5zID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0N1ckluY2lTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0N1ckRlcGxTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVmVyc2lvbi0+e051bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb24tPntOdW1iZXJ9ICgkVmVyc2lvbi0+e0NsYXNzfSk6ICRWZXJzaW9uLT57TmFtZX0iLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGhlc2UgY29sdW1ucyB3aWxsIGJlIGFkZGVkIGlmIG5vIGNsYXNzIGJhc2VkIGNvbHVtbiBjb25maWcgaXMgZGVmaW5lZAogICAgICAgICAgICBteSBAQWRkaXRpb25hbERlZmF1bHRJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFZlcnNpb24tPntDdXJEZXBsU3RhdGV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29uZmlnSXRlbURhdGEtPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGluZGl2aWR1YWwgY29sdW1uIGNvbmZpZyBmb3IgdGhpcyBjbGFzcyBleGlzdHMKICAgICAgICAgICAgaWYgKCAkQ29sdW1uQnlDbGFzc3skQ2xhc3N9ICkgewoKICAgICAgICAgICAgICAgIENPTFVNTjoKICAgICAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHsgJENvbHVtbkJ5Q2xhc3N7JENsYXNzfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHByb2Nlc3Mgc29tZSBub24teG1sIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoICRWZXJzaW9uLT57JENvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGhhbmRsZSB0aGUgQ0kgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ05hbWUnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBjb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1Db2x1bW5zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFZlcnNpb24tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBoZWFkbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnNIZWFkbGluZXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCB0cmFuc2xhdGlvbiBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0N1ckRlcGxTdGF0ZScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASXRlbUNvbHVtbnMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkVmVyc2lvbi0+eyRDb2x1bW59LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgaGVhZGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zSGVhZGxpbmVzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgdHJhbnNsYXRpb24gaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDdXJJbmNpU3RhdGUnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBjb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1Db2x1bW5zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFZlcnNpb24tPnskQ29sdW1ufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGhlYWRsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1uc0hlYWRsaW5lcywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCB0cmFuc2xhdGlvbiBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NsYXNzJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJdGVtQ29sdW1ucywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICRWZXJzaW9uLT57JENvbHVtbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBoZWFkbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnNIZWFkbGluZXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDbGFzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgZGF0ZS90aW1lIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ3JlYXRlVGltZScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASXRlbUNvbHVtbnMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVmVyc2lvbi0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgaGVhZGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zSGVhZGxpbmVzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IENPTFVNTjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCB0byBhc2NpaSB0ZXh0IGluIGNhc2UgdGhlIHZhbHVlIGNvbnRhaW5zIGh0bWwKICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRXh0ZW5kZWRWZXJzaW9uRGF0YS0+eyRDb2x1bW59LT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBhbGwgd2hpdGVzcGFjZSBhbmQgbmV3bGluZXMgdG8gc2luZ2xlIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzeyBccysgfXsgfWd4bXM7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBjb2x1bW4KICAgICAgICAgICAgICAgICAgICBwdXNoIEBJdGVtQ29sdW1ucywgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGhlYWRsaW5lCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnNIZWFkbGluZXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRXh0ZW5kZWRWZXJzaW9uRGF0YS0+eyRDb2x1bW59LT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbmRpdmlkdWFsIGNvbHVtbiBjb25maWcgZm9yIHRoaXMgY2xhc3MgZG9lcyBub3QgZXhpc3QsCiAgICAgICAgICAgICMgc28gdGhlIGRlZmF1bHQgY29sdW1ucyB3aWxsIGJlIHVzZWQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIGRlZmF1bHQgY29sdW1ucwogICAgICAgICAgICAgICAgcHVzaCBASXRlbUNvbHVtbnMsIEBBZGRpdGlvbmFsRGVmYXVsdEl0ZW1Db2x1bW5zOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBkZWZhdWx0IGNvbHVtbiBoZWFkbGluZXMKICAgICAgICAgICAgICAgIEBTaG93Q29sdW1uc0hlYWRsaW5lcyA9ICgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMzAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFxASXRlbUNvbHVtbnM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgIUBJdGVtTGlzdDsKCiAgICAgICAgIyBkZWZpbmUgdGhlIGJsb2NrIGRhdGEKICAgICAgICBteSAlQmxvY2sgPSAoCiAgICAgICAgICAgIE9iamVjdCAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICAgICAgQmxvY2tuYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0gLiAnICgnIC4gJENsYXNzIC4gJyknLAogICAgICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJdGVtTGlzdCA9PiBcQEl0ZW1MaXN0LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBjb2x1bW4gaGVhZGxpbmVzCiAgICAgICAgcHVzaCBAeyAkQmxvY2t7SGVhZGxpbmV9IH0sIEBTaG93Q29sdW1uc0hlYWRsaW5lczsKCiAgICAgICAgcHVzaCBAQmxvY2tEYXRhLCBcJUJsb2NrOwogICAgfQoKICAgIHJldHVybiBAQmxvY2tEYXRhOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSTo1NTU1NScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ29uZmlnSXRlbSMgNTU1NTU1OiBUaGUgY29uZmlnIGl0ZW0gbmFtZScsCiAgICAgICAgICAgICAgICAgICAgQ3NzICAgICA9PiAnc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NJOjIyMjIyJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDb25maWdJdGVtIyAyMjIyMjogVGl0bGUgb2YgY29uZmlnIG5hbWUgMjIyMjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0k6Nzc3NzcnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NvbmZpZ0l0ZW0jIDc3Nzc3OiBDb25maWdJdGVtIG5hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVmVyc2lvbiA9ICREaXJlY3Rpb25MaXN0LT57JENvbmZpZ0l0ZW1JRH07CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAlSXRlbSA9ICgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSTonIC4gJFZlcnNpb24tPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gIkNvbmZpZ0l0ZW0jICRWZXJzaW9uLT57TnVtYmVyfSAoJFZlcnNpb24tPntDbGFzc30pOiAkVmVyc2lvbi0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXCVJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBpdGVtIGxpc3QgdG8gbGluayBvdXRwdXQgZGF0YQogICAgICAgICAgICAkTGlua091dHB1dERhdGF7ICRMaW5rVHlwZSAuICc6OicgLiAkRGlyZWN0aW9uIH0tPntJVFNNQ29uZmlnSXRlbX0gPSBcQEl0ZW1MaXN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUxpbmtPdXRwdXREYXRhOwp9Cgo9aXRlbSBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybiBhIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+Q29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDb250ZW50RGF0YSA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ29udGVudFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29udGVudERhdGF9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb250ZW50RGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgaWYgKCAkQ29udGVudC0+e1R5cGV9IG5lICdDdXJJbmNpU2lnbmFsJyAmJiAkQ29udGVudC0+e1R5cGV9IG5lICdDdXJEZXBsU2lnbmFsJyApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN0cmluZzsKICAgIGlmICggJENvbnRlbnQtPntUeXBlfSBlcSAnQ3VySW5jaVNpZ25hbCcgKSB7CgogICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgIHVua25vd24gICAgID0+ICdncmF5bGVkJywKICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBjdXJyZW50IGluY2lkZW50IHNpZ25hbAogICAgICAgICRDb250ZW50LT57Q3VySW5jaVN0YXRlVHlwZX0gfHw9ICd1bmtub3duJzsKICAgICAgICBteSAkQ3VySW5jaVNpZ25hbCA9ICRJbmNpU2lnbmFsc3sgJENvbnRlbnQtPntDdXJJbmNpU3RhdGVUeXBlfSB9OwogICAgICAgICRDdXJJbmNpU2lnbmFsIHx8PSAkSW5jaVNpZ25hbHN7dW5rbm93bn07CgogICAgICAgICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJzxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkN1ckluY2lTdGF0ZSB8IGh0bWwgJV0iPiAnCiAgICAgICAgICAgICAgICAuICc8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSI+PC9zcGFuPiA8L2Rpdj4nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEN1ckluY2lTaWduYWwsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgID0+ICRDb250ZW50LT57Q29udGVudH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJENvbnRlbnQtPntUeXBlfSBlcSAnQ3VyRGVwbFNpZ25hbCcgKSB7CgogICAgICAgICMgY29udmVydCBkZXBsb3ltZW50IHN0YXRlIHRvIGEgd2ViIHNhZmUgQ1NTIGNsYXNzCiAgICAgICAgbXkgJERlcGxTdGF0ZSA9ICRDb250ZW50LT57Q29udGVudH0gfHwgJyc7CiAgICAgICAgJERlcGxTdGF0ZSA9fiBzeyBbXmEtekEtWjAtOV0gfXtffW1zeGc7CgogICAgICAgICMgZ2V0IHRoZSBjb2xvciBvZiB0aGUgZGVwbHltZW50IHN0YXRlIGlmIGRlZmluZWQKICAgICAgICBteSAkRGVwbFN0YXRlQ29sb3IgPSAkU2VsZi0+e0RlcGxTdGF0ZUNvbG9yc30tPnskRGVwbFN0YXRlfSB8fCAnJzsKCiAgICAgICAgbXkgJFRlbXBsYXRlID0gJzxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkN1ckRlcGxTdGF0ZSB8IGh0bWwgJV0iPiAnOwoKICAgICAgICAjIGNoZWNrIGlmIGNvbG9yIGlzIGRlZmluZWQgYW5kIHNldCB0aGUgc3R5bGUgY2xhc3MKICAgICAgICBpZiAoJERlcGxTdGF0ZUNvbG9yKSB7CiAgICAgICAgICAgICRUZW1wbGF0ZSAuPSA8PCAiRU5EIjsKPHN0eWxlPgogICAgLkZsYWcgc3Bhbi4kRGVwbFN0YXRlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjJERlcGxTdGF0ZUNvbG9yOwogICAgfQo8L3N0eWxlPgpFTkQKICAgICAgICB9CgogICAgICAgICRUZW1wbGF0ZSAuPSAiPHNwYW4gY2xhc3M9XCJEZXBsU3RhdGUgJERlcGxTdGF0ZVwiPjwvc3Bhbj4gPC9kaXY+IjsKCiAgICAgICAgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkVGVtcGxhdGUsCiAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSA9PiAkQ29udGVudC0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlbGVjdGFibGVPYmplY3RMaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VsZWN0YWJsZSBvYmplY3RzCgpSZXR1cm4KCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAnLScsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICdDb25maWdJdGVtJywKICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Db25maWdJdGVtOjoyNScsCiAgICAgICAgICAgIFZhbHVlID0+ICdDb25maWdJdGVtOjpDb21wdXRlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbTo6MjYnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ29uZmlnSXRlbTo6U29mdHdhcmUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSVRTTUNvbmZpZ0l0ZW06OjI3JywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NvbmZpZ0l0ZW06Ok5ldHdvcmsnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICRMaW5rT2JqZWN0LT5TZWxlY3RhYmxlT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZCA9PiAkSWRlbnRpZmllciwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWxlY3RhYmxlT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGhlYWRsaW5lCiAgICBteSBAT2JqZWN0U2VsZWN0TGlzdDsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdDsKICAgIHJldHVybiBpZiByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBnZXQgdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0IHN1Ym9iamVjdHMKICAgIG15ICREZWZhdWx0U3Vib2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdMaW5rT2JqZWN0OjpEZWZhdWx0U3ViT2JqZWN0JykgfHwge307CgogICAgQ0xBU1NJRDoKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQgeyBsYyAkQ2xhc3NMaXN0LT57JGF9IGNtcCBsYyAkQ2xhc3NMaXN0LT57JGJ9IH0ga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIHNob3cgY2xhc3Mgb25seSBpZiB1c2VyIGhhcyBhY2Nlc3MgcmlnaHRzCiAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5QZXJtaXNzaW9uKAogICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDTEFTU0lEIGlmICEkSGFzQWNjZXNzOwoKICAgICAgICBteSAkQ2xhc3MgICAgICA9ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gfHwgJyc7CiAgICAgICAgbXkgJElkZW50aWZpZXIgPSAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSAuICc6OicgLiAkQ2xhc3NJRDsKCiAgICAgICAgIyBzZXQgc2VsZWN0ZWQgZmxhZwogICAgICAgIG15ICRTZWxlY3RlZDsKICAgICAgICBpZiAoICRQYXJhbXtTZWxlY3RlZH0gKSB7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtTZWxlY3RlZH0gZXEgJElkZW50aWZpZXIgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0KICAgICAgICAgICAgICAgICYmICREZWZhdWx0U3Vib2JqZWN0LT57ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkZWZhdWx0IGNsYXNzIG5hbWUKICAgICAgICAgICAgICAgIG15ICREZWZhdWx0Q2xhc3MgPSAkRGVmYXVsdFN1Ym9iamVjdC0+eyAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSB9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgY2xhc3MKICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDbGFzcyBlcSAkQ2xhc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgcm93CiAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgS2V5ICAgICAgPT4gJElkZW50aWZpZXIsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0gLiAnOjonIC4gJENsYXNzLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0U2VsZWN0TGlzdCwgXCVSb3c7CiAgICB9CgogICAgIyBvbmx5IGFkZCBoZWFkbGluZSBpZiB0aGVyZSBhcmUgY29uZmlnaXRlbSBjbGFzc2VzCiAgICAjIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiB0byB1c2UgdGhlbQogICAgaWYgKEBPYmplY3RTZWxlY3RMaXN0KSB7CgogICAgICAgICMgYWRkIGhlYWRsaW5lIGFzIGZpcnN0IGFycmF5IGVsZW1lbnQKICAgICAgICB1bnNoaWZ0IEBPYmplY3RTZWxlY3RMaXN0LCB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICctJywKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBAT2JqZWN0U2VsZWN0TGlzdDsKfQoKPWl0ZW0gU2VhcmNoT3B0aW9uTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlYXJjaCBvcHRpb25zCgpSZXR1cm4KCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICcxMjM0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ0JsYUJsYScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAkTGlua09iamVjdC0+U2VhcmNoT3B0aW9uTGlzdCgKICAgICAgICBTdWJPYmplY3QgPT4gJzI1JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hPcHRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZWFyY2ggb3B0aW9uIGxpc3QKICAgIG15IEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlnSXRlbSMnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnTmFtZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgTmFtZSA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ0xpc3QnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdJbmNpU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lID0+ICdJbmNpZGVudCBTdGF0ZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ0xpc3QnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIG9iamVjdCBkZXBlbmRlbmNlIGF0dHJpYnV0ZXMKICAgICNpZiAoICRQYXJhbXtTdWJPYmplY3R9ICkgewogICAgIwogICAgIyAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAjICAgIG15ICRDbGFzc0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAjICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgIyAgICApOwogICAgIwogICAgIyAgICBpZiAoICRDbGFzc0xpc3QgJiYgJENsYXNzTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAjCiAgICAjICAgICAgICAjIGFkZCBoZXJlIHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiB0aGUgc3Vib2JqZWN0IQogICAgIyAgICB9CiAgICAjfQoKICAgICMgYWRkIGZvcm1rZXkKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewogICAgICAgICRSb3ctPntGb3JtS2V5fSA9ICdTRUFSQ0g6OicgLiAkUm93LT57S2V5fTsKICAgIH0KCiAgICAjIGFkZCBmb3JtIGRhdGEgYW5kIGlucHV0IHN0cmluZwogICAgUk9XOgogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CgogICAgICAgICMgcHJlcGFyZSB0ZXh0IGlucHV0IGZpZWxkcwogICAgICAgIGlmICggJFJvdy0+e1R5cGV9IGVxICdUZXh0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CgogICAgICAgICAgICAjIHBhcnNlIHRoZSBpbnB1dCB0ZXh0IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnB1dFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgUk9XOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIGxpc3QgYm94ZXMKICAgICAgICBpZiAoICRSb3ctPntUeXBlfSBlcSAnTGlzdCcgKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgbXkgQEZvcm1EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CiAgICAgICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSBcQEZvcm1EYXRhOwoKICAgICAgICAgICAgIyBwcmVwYXJlIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBteSAlTGlzdERhdGE7CiAgICAgICAgICAgIGlmICggJFJvdy0+e0tleX0gZXEgJ0RlcGxTdGF0ZUlEcycgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICAgICAgICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbGlzdAogICAgICAgICAgICAgICAgaWYgKCAkRGVwbFN0YXRlTGlzdCAmJiByZWYgJERlcGxTdGF0ZUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgICAgICVMaXN0RGF0YSA9ICV7JERlcGxTdGF0ZUxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByZXBhcmUgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBlbHNpZiAoICRSb3ctPntLZXl9IGVxICdJbmNpU3RhdGVJRHMnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbGlzdAogICAgICAgICAgICAgICAgaWYgKCAkSW5jaVN0YXRlTGlzdCAmJiByZWYgJEluY2lTdGF0ZUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgICAgICVMaXN0RGF0YSA9ICV7JEluY2lTdGF0ZUxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVMaXN0RGF0YSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUm93LT57Rm9ybURhdGF9LAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAzLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgUk9XOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCj1pdGVtIF9YTUxEYXRhMkhhc2goKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggYWxsIHhtbCBkYXRhIG9mIGEgY29uZmlnIGl0ZW0KClJldHVybgoKICAgICREYXRhID0gewogICAgICAgICdIYXJkRGlzazo6MicgPT4gewogICAgICAgICAgICBWYWx1ZSA9PiAnSEQyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0hhcmQgRGlzaycsCiAgICAgICAgIH0sCiAgICAgICAgJ0NQVTo6MScgPT4gewogICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NQVScsCiAgICAgICAgfSwKICAgICAgICAnSGFyZERpc2s6OjI6OkNhcGFjaXR5OjoxJyA9PiB7CiAgICAgICAgICAgIFZhbHVlID0+ICc3ODAgR0InLAogICAgICAgICAgICBOYW1lICA9PiAnQ2FwYWNpdHknLAogICAgICAgIH0sCiAgICB9OwoKICAgIG15ICREYXRhID0gJExpbmtPYmplY3QtPl9YTUxEYXRhMkhhc2goCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259LAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlRGF0YUhhc2hSZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFByZWZpeCAgICAgICAgPT4gJ0hhcmREaXNrOjoxJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIF9YTUxEYXRhMkhhc2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgIyB0byBzdG9yZSB0aGUgcmV0dXJuIGRhdGEKICAgIG15ICREYXRhID0gJFBhcmFte0RhdGF9IHx8IHt9OwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIGxvb2t1cCB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+WE1MVmFsdWVMb29rdXAoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBwcmVmaXgKICAgICAgICAgICAgbXkgJFByZWZpeCA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRQcmVmaXggPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkUHJlZml4OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0b3JlIHRoZSBpdGVtIGluIGhhc2gKICAgICAgICAgICAgJERhdGEtPnskUHJlZml4fSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJERhdGEgPSAkU2VsZi0+X1hNTERhdGEySGFzaCgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uQ2hhbmdlIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBEYXRhLkNsYXNzT3B0aW9uU3RyZyAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNoYW5nZSBjbGFzcyBkZWZpbml0aW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaXN0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29uZmlnIEl0ZW0gQ2xhc3MiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1EZWZpbml0aW9uTGlzdDtDbGFzc0lEPVslIERhdGEuQ2xhc3NJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRlZmluaXRpb25MaXN0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ilc1MHBjIj5bJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtIENsYXNzIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZlcnNpb24iKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRGVmaW5pdGlvbkxpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1EZWZpbml0aW9uVmlldztEZWZpbml0aW9uSUQ9WyUgRGF0YS5EZWZpbml0aW9uSUQgfCB1cmkgJV0iPlslIERhdGEuQ2xhc3MgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLlZlcnNpb24gfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNyZWF0ZUJ5VXNlciB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRlZmluaXRpb25MaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEZWZpbml0aW9uTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRlZmluaXRpb25WaWV3IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlZpZXciKSB8IGh0bWwgJV06IDwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ29uZmlnIEl0ZW0gQ2xhc3MiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVmVyc2lvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmVyc2lvbiB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQgYnkiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZUJ5VXNlciB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRGVmaW5pdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+WyUgRGF0YS5EZWZpbml0aW9uU3RyaW5nICVdPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRGVmaW5pdGlvblZpZXciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEZWZpbml0aW9uQ2hhbmdlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNoYW5nZSIpIHwgaHRtbCAlXTogPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uU2F2ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzSUQiIHZhbHVlPSJbJSBEYXRhLkNsYXNzSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtIENsYXNzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVmaW5pdGlvbiI+WyUgVHJhbnNsYXRlKCJEZWZpbml0aW9uIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iRGVmaW5pdGlvbiIgaWQ9IkRlZmluaXRpb24iIHJvd3M9IlslIERhdGEuUm93cyB8IGh0bWwgJV0iIGNvbHM9IjgwIiB3cmFwPSJvZmYiPlslIERhdGEuRGVmaW5pdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgaWQ9IlN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEZWZpbml0aW9uQ2hhbmdlIikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKCJDb25maWcgSXRlbSIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+PGxhYmVsIGZvcj0iRmlsdGVyQ2xhc3NlcyI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIENsYXNzZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyQ2xhc3NlcyIgY2xhc3M9IkZpbHRlckJveCIgbmFtZT0iRmlsdGVyQ2xhc3NlcyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBDbGFzc2VzIikgfCBodG1sICVdIiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSGludCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlbGVjdCBhIENsYXNzIGZyb20gdGhlIGxpc3QgdG8gY3JlYXRlIGEgbmV3IENvbmZpZyBJdGVtLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIiBpZD0iQ2xhc3NlcyI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcxMDBwYyI+WyUgVHJhbnNsYXRlKCJDbGFzcyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRmlsdGVyTWVzc2FnZSBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZSgiTm8gbWF0Y2hlcyBmb3VuZC4iKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0l0ZW1MaXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdDtDbGFzc0lEPVslIERhdGEuQ2xhc3NJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3SXRlbUxpc3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjRmlsdGVyQ2xhc3NlcycpLCAkKCcjQ2xhc3NlcycpKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCdWxrQWN0aW9uIikgJV0KPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEbyIvPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiSVRTTSBDb25maWdJdGVtIEJ1bGsgQWN0aW9uIikgfCBodG1sICVdPC9oMT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlVzZWRDb25maWdJdGVtSUQiKSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZmlnSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiVXNlZENvbmZpZ0l0ZW1JRCIpICVdCgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEZXBsU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlcGxTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIkRlcGxveW1lbnQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRGVwbFN0YXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRlcGxTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkluY2lTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW5jaVN0YXRlSUQiPlslIFRyYW5zbGF0ZSgiSW5jaWRlbnQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5jaVN0YXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkluY2lTdGF0ZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxpbmtUb2dldGhlciI+WyUgVHJhbnNsYXRlKCJMaW5rIHRvZ2V0aGVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUb2dldGhlclllc05vT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RvZ2V0aGVyTGlua1R5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMaW5rVG9nZXRoZXJBbm90aGVyIj5bJSBUcmFuc2xhdGUoIkxpbmsgdG8gYW5vdGhlciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJbJSBEYXRhLkxpbmtUb2dldGhlckFub3RoZXJJbnZhbGlkIHwgaHRtbCAlXSBXMjVwYyIgaWQ9IkxpbmtUb2dldGhlckFub3RoZXIiIG5hbWU9IkxpbmtUb2dldGhlckFub3RoZXIiIHZhbHVlPSJbJSBEYXRhLkxpbmtUb2dldGhlckFub3RoZXIgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkxpbmtUb2dldGhlckFub3RoZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBDb25maWd1cmF0aW9uIEl0ZW0gbnVtYmVyISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MaW5rVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiVGhlIG51bWJlciBvZiBhbm90aGVyIENvbmZpZ3VyYXRpb24gSXRlbSB0byBsaW5rIHdpdGguIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJCdWxrQWN0aW9uIikgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCjxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFczMDBweCI+CgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICA8L3A+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTnVtYmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk51bWJlcikgfCBodG1sICVdCiAgICA8L3A+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgoKPC9maWVsZHNldD4KPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmZpZyBpdGVtPyIpIHwgaHRtbCAlXQo8L3A+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFydE5vcm1hbCIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICA8aDE+WyUgVHJhbnNsYXRlKCJFZGl0IikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtIikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5OdW1iZXIpIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZShEYXRhLkNsYXNzKSB8IGh0bWwgJV08L2gxPgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+ClslIFJlbmRlckJsb2NrRW5kKCJTdGFydE5vcm1hbCIpICVdClslIEluc2VydFRlbXBsYXRlKCJBZ2VudElUU01DdXN0b21lclNlYXJjaC50dCIpICVdCiAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9IkNsYXNzSXRlbSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiIGlkPSJDbGFzc0l0ZW0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFydFNtYWxsIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKCJDb25maWcgSXRlbSIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKERhdGEuTnVtYmVyKSB8IGh0bWwgJV0gLSBbJSBUcmFuc2xhdGUoIkNsYXNzIikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5DbGFzcykgfCBodG1sICVdPC9oMT4KICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTY3JlZW5UeXBlIiB2YWx1ZT0iUG9wdXAiLz4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXJ0U21hbGwiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZlcnNpb25TYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IlslIERhdGEuQ2xhc3NJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb25maWdJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEdXBsaWNhdGVJRCIgdmFsdWU9IlslIERhdGEuRHVwbGljYXRlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0U2F2ZSIgdmFsdWU9IlslIERhdGEuU3VibWl0U2F2ZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd05hbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuUm93TmFtZUludmFsaWQgfCBodG1sICVdIiBtYXhsZW5ndGg9IjI1MCIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0iKSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzIiwgRGF0YS5EdXBsaWNhdGVzKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEdXBsaWNhdGVzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yUmVnRXgiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKERhdGEuUmVnRXhFcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWVFcnJvclJlZ0V4IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dEZXBsU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJEZXBsU3RhdGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJEZXBsb3ltZW50IFN0YXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkRlcGxTdGF0ZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlcGxTdGF0ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlcGxTdGF0ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93RGVwbFN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93SW5jaVN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSW5jaVN0YXRlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5jaVN0YXRlT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSW5jaVN0YXRlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSW5jaVN0YXRlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dJbmNpU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3dGaWVsZHNldFN0YXJ0IikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+ClslIFJlbmRlckJsb2NrRW5kKCJYTUxSb3dGaWVsZHNldFN0YXJ0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiWE1MUm93VmFsdWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgWyUgRGF0YS5MYWJlbENsYXNzICVdIFslIERhdGEuTGFiZWxGb3IgJV0+ClslIFJlbmRlckJsb2NrU3RhcnQoIlhNTFJvd1ZhbHVlQ29udGVudFJlcXVpcmVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlslIERhdGEuQ2xhc3MgJV0gRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmluZyAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3dWYWx1ZUNvbnRlbnREZWxldGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iRGlzYWJsZVZhbGlkYXRpb24gUmVtb3ZlIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlslIERhdGEuSW5wdXRLZXkgfCBodG1sICVdOjpEZWxldGUiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlhNTFJvd1ZhbHVlQ29udGVudERlbGV0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3dWYWx1ZVNlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuSXRlbUlEIHwgaHRtbCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlhNTFJvd1ZhbHVlU2VydmVyRXJyb3IiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3dWYWx1ZVJlZ0V4RXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5JdGVtSUQgfCBodG1sICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoRGF0YS5SZWdFeEVycm9yTWVzc2FnZSkgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiWE1MUm93VmFsdWVSZWdFeEVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJYTUxSb3dWYWx1ZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJYTUxSb3dBZGRDb250ZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFslIERhdGEuQ2xhc3MgJV0gZm9yPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iRGlzYWJsZVZhbGlkYXRpb24gQWRkIiBpZD0iWyUgRGF0YS5JdGVtSUQgfCBodG1sICVdIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlslIERhdGEuSW5wdXRLZXkgfCBodG1sICVdOjpBZGQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iID48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJYTUxSb3dBZGRDb250ZW50IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlhNTFJvd0ZpZWxkc2V0RW5kIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiWE1MUm93RmllbGRzZXRFbmQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiWE1MUm93IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgaWQ9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuY2xvc2VzdCgnZm9ybScpKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBhY2Nlc3NrZXk9ImciIGlkPSJTdWJtaXRCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkVuZFNtYWxsIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFbmRTbWFsbCIpICVdCiAgICAgICAgPC9mb3JtPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbmROb3JtYWwiKSAlXQogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRW5kTm9ybWFsIikgJV0KCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgICAgICQoJyNTdWJtaXRCdXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVN1Ym1pdFNhdmVdJykudmFsKCcxJyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgnLkRpc2FibGVWYWxpZGF0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9U3VibWl0U2F2ZV0nKS52YWwoJzAnKTsKICAgICAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkKCcjQ2xhc3NJdGVtJykpOwogICAgICAgICAgICAgICAgLy8gZml4IGZvciBTYWZhcmk6IHJhY2UgY29uZGl0aW9uIHdpdGggc3VibWl0IGluIENvcmUuRm9ybS5WYWxpZGF0ZS5qcwogICAgICAgICAgICAgICAgLy8gZml4ZWQgaW4gT1RSUyAzLjAuNSwgdGhpcyBsaW5lIHJlbWFpbnMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucwogICAgICAgICAgICAgICAgJCgnI0NsYXNzSXRlbScpLnJlbW92ZUNsYXNzKCdQcmV2ZW50TXVsdGlwbGVTdWJtaXRzJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIC8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8IS0tIHN0YXJ0IGZvcm0gLS0+CjxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSGlzdG9yeSBvZiBDb25maWcgSXRlbTogJXMiLCBEYXRhLk5hbWUpIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgIDwvcD4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJIaXN0b3J5IENvbnRlbnQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJDb25maWd1cmF0aW9uIEl0ZW0gSGlzdG9yeSIgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBY3Rpb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiWm9vbSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlVzZXIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDcmVhdGV0aW1lIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5IaXN0b3J5VHlwZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICBjbGFzcz0iTGlua1pvb21WaWV3IEFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgJV07VmVyc2lvbklEPVslIERhdGEuVmVyc2lvbklEICVdIj5bJSBUcmFuc2xhdGUoIlpvb20gdmlldyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCdhLkxpbmtab29tVmlldycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHdpbmRvdy5vcGVuZXIuQ29yZS5VSS5Qb3B1cC5GaXJlUG9wdXBFdmVudCgnVVJMJywgeyBVUkw6ICQodGhpcykuYXR0cignaHJlZicpfSk7CiAgICAgICAgd2luZG93LmNsb3NlKCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZW5kIGZvcm0gLS0+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyIikgJV0KPGRpdiBjbGFzcz0iT3ZlcnZpZXdCb3ggQVJJQVJvbGVNYWluIFslIERhdGEuVmlldyB8IGh0bWwgJV0iPgogICAgPGgxPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlTmFtZSkgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5UaXRsZVZhbHVlKSB8IGh0bWwgJV08L2gxPgoKICAgIFslIERhdGEuRGF0YUluVGhlTWlkZGxlICVdCgogICAgPGRpdiBjbGFzcz0iT3ZlcnZpZXdDb250cm9sIiBpZD0iT3ZlcnZpZXdDb250cm9sIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXIiKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuRmlsdGVyTGluayAlXUZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPHNwYW4+WyUgRGF0YS5Db3VudCB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuRmlsdGVyTGluayAlXUZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPHNwYW4+WyUgRGF0YS5Db3VudCB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNwbGl0IikgJV0KICAgICAgICAgICAgICAgICAgICAtClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TcGxpdCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJQYWdlQmFjayIpICVdCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IlRhYnMiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IklUU01Db25maWdJdGVtU2VhcmNoIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtCYWNrICVdIj5bJSBUcmFuc2xhdGUoIkNoYW5nZSBzZWFyY2ggb3B0aW9ucyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNJVFNNQ29uZmlnSXRlbVNlYXJjaCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgSVRTTS5BZ2VudC5Db25maWdJdGVtLlNlYXJjaC5PcGVuU2VhcmNoRGlhbG9nKCAnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCcsICdbJSBEYXRhLlByb2ZpbGUgfCBodG1sICVdJywgJ1slIERhdGEuQ2xhc3NJRCB8IGh0bWwgJV0nICk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJQYWdlQmFjayIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZXh0U2V0dGluZ3MiKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJDb250ZXh0RnVuY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNvbnRleHRTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJTaG93Q29udGV4dFNldHRpbmdzRGlhbG9nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb250ZXh0IFNldHRpbmdzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQ29udGV4dCBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNvbnRleHRTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJDb250ZXh0U2V0dGluZ3NEaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFByZWZlcmVuY2VzIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwZGF0ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJHcm91cCIgdmFsdWU9IlslIERhdGEuR3JvdXAgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlZGlyZWN0VVJMIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0ZWRVUkwgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuUHJlZmVyZW5jZXNLZXkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtcyBwZXIgcGFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGFnZVNob3duU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBiaW5kIHRoZSBDb250ZXh0U2V0dGluZ3NEaWFsb2dDb250YWluZXIKICAgICQoJyNTaG93Q29udGV4dFNldHRpbmdzRGlhbG9nJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkKCcjQ29udGV4dFNldHRpbmdzRGlhbG9nQ29udGFpbmVyJyksIFslIFRyYW5zbGF0ZSgiU2V0dGluZ3MiKSB8IEpTT04gJV0sICcyMCUnLCAnQ2VudGVyJywgdHJ1ZSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgICAgICBUeXBlOiAnU3VibWl0JywKICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICApOwogICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGV4dFNldHRpbmdzIikgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iT3ZlcnZpZXdBY3Rpb25zIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkJ1bGtBY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD0iQ29uZmlnSXRlbUJ1bGtBY3Rpb24iIGNsYXNzPSJCdWxrIEluYWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQnVsayIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiQnVsa0FjdGlvbiIpICVdCgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQWN0aW9uUm93ICVdCiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJPdmVydmlld1pvb20iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtWaWV3PVslIERhdGEuVmlldyB8IHVyaSAlXTtbJSBEYXRhLkxpbmtGaWx0ZXIgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk5hbWVTaG9ydCkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07Vmlldz1bJSBEYXRhLlZpZXcgfCB1cmkgJV07WyUgRGF0YS5MaW5rRmlsdGVyICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5OYW1lU2hvcnQpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlBhZ2luYXRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhclBhZ2VOYXZCYXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc3VsdExvbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TaXRlTmF2QmFyTG9uZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgojIHNvcnQgb3JkZXIgYmFyIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgWyUgRGF0YS5Tb3J0T3JkZXJCYXIgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhciIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGlkPSJPdmVydmlld0JvZHkiIGNsYXNzPSJPdmVydmlldyBUaWNrZXRMaXN0Ij4KICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCIgc3VtbWFyeT0iWyUgVHJhbnNsYXRlKCJBIGdlbmVyaWMgSVRTTSBDb25maWd1cmF0aW9uIEl0ZW0gdGFibGUiKSB8IGh0bWwgJV0iPgogICAgICAgIFslIERhdGEuU3R5bGVDbGFzc2VzICVdCiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEJ1bGtBY3Rpb25IZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDaGVja2JveCBGaXhlZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iQ2hlY2tib3giIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV0iIGlkPSJTZWxlY3RBbGxDb25maWdJdGVtcyIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQnVsa0FjdGlvbkhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1ckluY2lTaWduYWxIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3VySW5jaVNpZ25hbEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1ckRlcGxTaWduYWxIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJEZXBsU2lnbmFsSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkTnVtYmVySGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iTnVtYmVyIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9TnVtYmVyO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBDb25maWcoIklUU01Db25maWdJdGVtOjpIb29rIikgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTnVtYmVySGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkTmFtZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik5hbWUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1OYW1lO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTmFtZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENsYXNzSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2xhc3MgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DbGFzc0lEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNsYXNzIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENsYXNzSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3VyRGVwbFN0YXRlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ3VyRGVwbFN0YXRlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9RGVwbFN0YXRlSUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJEZXBsU3RhdGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDdXJEZXBsU3RhdGVUeXBlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkRlcGxveW1lbnQgU3RhdGUgVHlwZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJEZXBsU3RhdGVUeXBlSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3VySW5jaVN0YXRlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ3VySW5jaVN0YXRlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9SW5jaVN0YXRlSUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ3VycmVudCBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJJbmNpU3RhdGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDdXJJbmNpU3RhdGVUeXBlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUgVHlwZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJJbmNpU3RhdGVUeXBlSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkWE1MQXR0cmlidXRlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoRGF0YS5YTUxBdHRyaWJ1dGVIZWFkZXIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRYTUxBdHRyaWJ1dGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRMYXN0Q2hhbmdlZEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ikxhc3RDaGFuZ2VkIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9Q2hhbmdlVGltZTtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTGFzdENoYW5nZWRIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDcmVhdGVUaW1lSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DcmVhdGVUaW1lO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNyZWF0ZSBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENyZWF0ZVRpbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3RoZWFkPgogICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Ub3RhbENvbHVtbnMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmQiKSAlXQogICAgICAgICAgICA8dHIgaWQ9IkNvbmZpZ0l0ZW1JRF9bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRCdWxrQWN0aW9uIikgJV0KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2hlY2tib3ggRml4ZWQgTm9uVGV4dENvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJDb25maWdJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IGh0bWwgJV0iICBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRCdWxrQWN0aW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3VySW5jaVNpZ25hbCIpICVdCiAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPiJbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXSI8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3VySW5jaVNpZ25hbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1ckRlcGxTaWduYWwiKSAlXQogICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJEZXBsU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckRlcGxTaWduYWwgfCBodG1sICVdIj4iWyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV0iPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEN1ckRlcGxTaWduYWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmROdW1iZXIiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuTnVtYmVyIHwgaHRtbCAlXSI+WyUgRGF0YS5OdW1iZXIgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTnVtYmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkTmFtZSIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoNDApIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZE5hbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDbGFzcyIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ2xhc3MpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ2xhc3MpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENsYXNzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3VyRGVwbFN0YXRlIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJEZXBsU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXJEZXBsU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDdXJEZXBsU3RhdGVUeXBlIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJEZXBsU3RhdGVUeXBlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkN1ckRlcGxTdGF0ZVR5cGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEN1ckRlcGxTdGF0ZVR5cGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDdXJJbmNpU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEN1ckluY2lTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1ckluY2lTdGF0ZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZVR5cGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlVHlwZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3VySW5jaVN0YXRlVHlwZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFhNTEF0dHJpYnV0ZSIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5YTUxBdHRyaWJ1dGVEYXRhIHwgaHRtbCAlXSI+WyUgRGF0YS5YTUxBdHRyaWJ1dGVEYXRhIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFhNTEF0dHJpYnV0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZExhc3RDaGFuZ2VkIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXSI+WyUgRGF0YS5DaGFuZ2VUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRMYXN0Q2hhbmdlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENyZWF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdIj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENyZWF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIElUU00uVUkuQ29uZmlnSXRlbUFjdGlvblJvdy5BZGRBY3Rpb25zKCQoJyNDb25maWdJdGVtSURfWyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdJyksIFslIERhdGEuRGF0YSAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkIikgJV0KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgogICAgLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgSVRTTS5VSS5Db25maWdJdGVtQWN0aW9uUm93LkluaXQoKTsKCiAgICBDb3JlLlVJLkluaXRDaGVja2JveFNlbGVjdGlvbigkKCd0YWJsZSB0ZC5DaGVja2JveCcpKTsKCiAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyk7CiAgICAgICAgLy8gb25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5CiAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZWFyY2hBSkFYIikgJV0KPGRpdiBjbGFzcz0iSW5uZXJDb250ZW50Ij4KICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iQ2xhc3MiPlslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0nRGl2Q2xhc3NJRCc+CiAgICAgICAgICAgIFslIERhdGEuQ2xhc3NPcHRpb25TdHJnICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2ZpZWxkc2V0Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCIgaWQ9IkFKQVhVcGRhdGUiPgoKICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBpZD0iU2VhcmNoRm9ybSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzSUQiIHZhbHVlPSJbJSBEYXRhLkNsYXNzSUQgfCBodG1sICVdIiBpZD0iU2VhcmNoQ2xhc3NJRCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgoKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBIaWRkZW4iIGlkPSdJVFNNU2VhcmNoUHJvZmlsZSc+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VhcmNoUHJvZmlsZSI+WyUgVHJhbnNsYXRlKCJTZWFyY2ggdGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlNlYXJjaFByb2ZpbGUiIG5hbWU9IlNlYXJjaFByb2ZpbGUiIHZhbHVlPSJbJSBEYXRhLlByb2ZpbGUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZWFyY2hQcm9maWxlQWRkQmxvY2siPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJQcm9maWxlTmFtZSIgaWQ9IlNlYXJjaFByb2ZpbGVBZGROYW1lIi8+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUgVGVtcGxhdGUiKSB8IGh0bWwgJV0iIGlkPSJTZWFyY2hQcm9maWxlQWRkQWN0aW9uIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTYXZlUHJvZmlsZSIgdmFsdWU9IjEiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iU2VhcmNoUHJvZmlsZU5ldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSBOZXciKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIE5ldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlYXJjaFByb2ZpbGVEZWxldGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEhpZGRlbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlYXJjaFByb2ZpbGVBc0xpbmsiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEhpZGRlbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiUHJvZmlsZSBsaW5rIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlByb2ZpbGUgbGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KCiAgICA8L2Zvcm0+CjwvZGl2PgoKPGRpdiBjbGFzcz0iQ29udGVudEZvb3RlciBDZW50ZXIiPgogICAgPGJ1dHRvbiBpZD0iU2VhcmNoRm9ybVN1Ym1pdCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBIaWRkZW4iIHZhbHVlPSJSdW4gU2VhcmNoIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+WyUgVHJhbnNsYXRlKCJSdW4gU2VhcmNoIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgo8L2Rpdj4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpewogICAgICAgICQoJyNTZWFyY2hDbGFzc0lEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYgKCAkKCcjU2VhcmNoQ2xhc3NJRCcpLnZhbCgpICE9PSAiIiApewogICAgICAgICAgICAgICAgSVRTTS5BZ2VudC5Db25maWdJdGVtLlNlYXJjaC5Mb2FkUHJvZmlsZSggJCgnI1NlYXJjaFByb2ZpbGUnKS52YWwoKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGUnKS5hdHRyKCJpZCIsICJTZWFyY2hQcm9maWxlT2xkIik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sIDE1MCk7Ci8vXV0+PC9zY3JpcHQ+ClslIFJlbmRlckJsb2NrRW5kKCJTZWFyY2hBSkFYIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlYXJjaEFKQVhTZXRDbGFzcyIpICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKXsKICAgICAgICAgICAgSVRTTS5BZ2VudC5Db25maWdJdGVtLlNlYXJjaC5Mb2FkUHJvZmlsZSggIlslIERhdGEuUHJvZmlsZSB8IGh0bWwgJV0iICk7CiAgICB9LCAxNTApOwovL11dPjwvc2NyaXB0PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VhcmNoQUpBWFNldENsYXNzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlYXJjaCIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgIElUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2guT3BlblNlYXJjaERpYWxvZyggJ1slIEVudigiQWN0aW9uIikgJV0nLCAiWyUgRGF0YS5Qcm9maWxlIHwgaHRtbCAlXSIsICJbJSBEYXRhLkNsYXNzSUQgfCBodG1sICVdIiApOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlNlYXJjaCIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQUpBWENvbnRlbnQiKSAlXQo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IlNlYXJjaEZvcm0iPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VhcmNoIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzc0lEIiB2YWx1ZT0iWyUgRGF0YS5DbGFzc0lEIHwgaHRtbCAlXSIgaWQ9IlNlYXJjaENsYXNzSUQiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VhcmNoRGlhbG9nIiB2YWx1ZT0nMSc+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFbXB0eVNlYXJjaCIgdmFsdWU9IlslIERhdGEuRW1wdHlTZWFyY2ggfCBodG1sICVdIiBpZD0iRW1wdHlTZWFyY2giLz4KICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEhpZGRlbiIgaWQ9J0lUU01TZWFyY2hQcm9maWxlJz4KICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGVzIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFByb2ZpbGUiPlslIFRyYW5zbGF0ZSgiU2VhcmNoIHRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICBbJSBEYXRhLlByb2ZpbGVzU3RyZyAlXQogICAgICAgICAgICA8ZGl2IGlkPSJTZWFyY2hQcm9maWxlQWRkQmxvY2siPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2ZpbGVOYW1lIiBpZD0iU2VhcmNoUHJvZmlsZUFkZE5hbWUiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIFRlbXBsYXRlIikgfCBodG1sICVdIiBpZD0iU2VhcmNoUHJvZmlsZUFkZEFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iU2VhcmNoUHJvZmlsZU5ldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSBOZXciKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIE5ldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iU2VhcmNoUHJvZmlsZURlbGV0ZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSGlkZGVuIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJTZWFyY2hQcm9maWxlQXNMaW5rIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBIaWRkZW4iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlByb2ZpbGUgbGluayIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJQcm9maWxlIGxpbmsiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNhdmUgY2hhbmdlcyBpbiB0ZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJTYXZlUHJvZmlsZSIgaWQ9IlNhdmVQcm9maWxlIiB2YWx1ZT0iMSIvPgogICAgICAgIDwvZGl2PgogICAgPC9maWVsZHNldD4KCiAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBIaWRkZW4iIGlkPSdJVFNNU2VhcmNoRmllbGRzJz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSIgaWQ9IlNlYXJjaEluc2VydCI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJGaWx0ZXJzIGluIHVzZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZGl0aW9uYWwgZmlsdGVycyIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWRkIGFub3RoZXIgYXR0cmlidXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuQXR0cmlidXRlc1N0cmcgJV0KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBZGRCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJldmlvdXNWZXJzaW9uU2VhcmNoIj5bJSBUcmFuc2xhdGUoIkFsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3V0cHV0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUmVzdWx0Rm9ybVN0cmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgIDwvZmllbGRzZXQ+CjwvZm9ybT4KPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgSGlkZGVuIiBpZD0iU2VhcmNoQXR0cmlidXRlc0hpZGRlbiI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICA8bGFiZWwgZm9yPSJOdW1iZXIiIGlkPSJMYWJlbE51bWJlciI+WyUgVHJhbnNsYXRlKCJOdW1iZXIiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCIoZS4gZy4gMTAqNTE1NSBvciAxMDU2NTgqKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOdW1iZXIiIHZhbHVlPSJbJSBEYXRhLk51bWJlciB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxsYWJlbCBmb3I9Ik5hbWUiIGlkPSJMYWJlbE5hbWUiPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPGxhYmVsIGZvcj0iRGVwbFN0YXRlSURzIiBpZD0iTGFiZWxEZXBsU3RhdGVJRHMiPlslIFRyYW5zbGF0ZSgiRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgIFslIERhdGEuQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyAlXQogICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPGxhYmVsIGZvcj0iSW5jaVN0YXRlSURzIiBpZD0iTGFiZWxJbmNpU3RhdGVJRHMiPlslIFRyYW5zbGF0ZSgiSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICBbJSBEYXRhLkN1ckluY2lTdGF0ZU9wdGlvblN0cmcgJV0KICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0cmlidXRlUm93IikgJV0KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxsYWJlbCBmb3I9IlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdIiBpZD0iTGFiZWxbJSBEYXRhLktleSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgIFslIERhdGEuSW5wdXRTdHJpbmcgJV0KICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0cmlidXRlUm93IikgJV0KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIFslIERhdGEuQXR0cmlidXRlc09yaWdTdHJnICVdCjwvZmllbGRzZXQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCl7ClslIFJlbmRlckJsb2NrU3RhcnQoIlNlYXJjaEFKQVhTaG93IikgJV0KICAgICAgICBJVFNNLkFnZW50LkNvbmZpZ0l0ZW0uU2VhcmNoLlNlYXJjaEF0dHJpYnV0ZUFkZCgnWyUgRGF0YS5BdHRyaWJ1dGUgfCBodG1sICVdJyk7CiAgICAgICAgSVRTTS5BZ2VudC5Db25maWdJdGVtLlNlYXJjaC5BZGRpdGlvbmFsQXR0cmlidXRlU2VsZWN0aW9uUmVidWlsZCgpOwpbJSBSZW5kZXJCbG9ja0VuZCgiU2VhcmNoQUpBWFNob3ciKSAlXQogICAgfSwgMCk7Ci8vXV0+PC9zY3JpcHQ+ClslIFJlbmRlckJsb2NrRW5kKCJBSkFYQ29udGVudCIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckluY2lTaWduYWwgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGgxIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvbmZpZ3VyYXRpb24gSXRlbSIpIHwgaHRtbCAlXTogWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoNDApIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ29uZmlndXJhdGlvbiBJdGVtIikgfCBodG1sICVdOiBbJSBEYXRhLk51bWJlciB8IGh0bWwgJV0gPHNwYW4+Jm1kYXNoOzwvc3Bhbj4gWyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoNjApIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CgogICAgICAgIFslIERhdGEuU3R5bGVDbGFzc2VzICVdCgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ29uZmlndXJhdGlvbiBJdGVtIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIFRpZ2h0Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNsYXNzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgVHJhbnNsYXRlKERhdGEuQ2xhc3MpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuTmFtZSB8IHRydW5jYXRlKDI1KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckRlcGxTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckRlcGxTaWduYWwgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLkN1ckRlcGxTdGF0ZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXJyZW50IEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVCeVVzZXJGdWxsTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBjaGFuZ2VkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZUJ5VXNlckZ1bGxOYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udHJvbFJvdyI+CiAgICAgICAgICAgICAgICA8aDI+PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGlkPSJNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5NZW51Q2xhc3MgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dDb25maXJtRGlhbG9nIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgSVRTTS5BZ2VudC5Db25maXJtRGlhbG9nLkJpbmRDb25maXJtRGlhbG9nKHsKICAgICAgICBFbGVtZW50SUQ6ICAgICAgICAgICAgICAgICAgJ01lbnVbJSBEYXRhLk1lbnVJRCAlXScsCiAgICAgICAgRWxlbWVudFNlbGVjdG9yOiAgICAgICAgICAgICdbJSBEYXRhLkVsZW1lbnRTZWxlY3RvciB8IEludGVycG9sYXRlICVdJywKICAgICAgICBEaWFsb2dDb250ZW50UXVlcnlTdHJpbmc6ICAgJ1slIERhdGEuRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nIHwgSW50ZXJwb2xhdGUgJV0nLAogICAgICAgIENvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nOiAnWyUgRGF0YS5Db25maXJtZWRBY3Rpb25RdWVyeVN0cmluZyB8IEludGVycG9sYXRlICVdJywKICAgICAgICBEaWFsb2dUaXRsZTogICAgICAgICAgICAgICAgJ1slIERhdGEuRGlhbG9nVGl0bGUgfCBJbnRlcnBvbGF0ZSAlXScsCiAgICAgICAgVHJhbnNsYXRlZFRleHQ6ICAgICAgICAgICAgIHsKICAgICAgICAgICAgWWVzOiBbJSBUcmFuc2xhdGUoIlllcyIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgTm86ICBbJSBUcmFuc2xhdGUoIk5vIikgfCBKU09OICVdLAogICAgICAgICAgICBPazogIFslIFRyYW5zbGF0ZSgiT2siKSB8IEpTT04gJV0KICAgICAgICB9CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTaG93Q29uZmlybURpYWxvZyIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZW51IikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJJVFNNVHJlZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iSVRTTVRhYmxlIiAgY2xhc3M9IlRpY2tldExpc3QiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRyb2xSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJJVFNNSXRlbVZpZXcgSWNvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFeHBhbmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUlUU01JdGVtIEFjdGl2ZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IHVyaSAlXTtTaG93VmVyc2lvbnM9MCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgdmVyc2lvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IG9uZSB2ZXJzaW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFsbElUU01JdGVtcyIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IHVyaSAlXTtTaG93VmVyc2lvbnM9MSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgdmVyc2lvbnMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1yZW9yZGVyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCB2ZXJzaW9ucyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkV4cGFuZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbGxhcHNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJPbmVJVFNNSXRlbSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IHVyaSAlXTtTaG93VmVyc2lvbnM9MCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgdmVyc2lvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IG9uZSB2ZXJzaW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFsbElUU01JdGVtcyBBY3RpdmUiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV07U2hvd1ZlcnNpb25zPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgYWxsIHZlcnNpb25zIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVvcmRlciI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgdmVyc2lvbnMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJDb2xsYXBzZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IklUU01UYWJsZUJvZHkiIGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY3JvbGxlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IlRhYmxlU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiVmVyc2lvbiBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiVmVyc2lvbiBEZXBsb3ltZW50IFN0YXRlIikgfCBodG1sICVdPC9zcGFuPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PHNwYW4+WyUgVHJhbnNsYXRlKCJWZXJzaW9uIE51bWJlciIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2hhbmdlZCIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iWyUgRGF0YS5BY3RpdmUgfCBodG1sICVdIE1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkluY2lTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuSW5jaVNpZ25hbCB8IGh0bWwgJV0iPlslIERhdGEuSW5jaVN0YXRlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlcGxTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuRGVwbFNpZ25hbCB8IGh0bWwgJV0iPlslIERhdGEuRGVwbFN0YXRlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIE1hc3RlckFjdGlvbkxpbmsiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV07VmVyc2lvbklEPVslIERhdGEuVmVyc2lvbklEIHwgdXJpICVdO1Nob3dWZXJzaW9ucz1bJSBEYXRhLlNob3dWZXJzaW9ucyB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZShEYXRhLkRlcGxTdGF0ZSkgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVCeVVzZXJGdWxsTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIYW5kbGUgdWktcmVzaXphYmxlLWhhbmRsZSB1aS1yZXNpemFibGUtcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIlJlc2l6ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWUiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iSVRTTUl0ZW1zIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEJveCBTcGFjaW5nVG9wIEV4cGFuZGVkIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMaWdodFJvdyBIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQuIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ29uZmlndXJhdGlvbiBJdGVtIFZlcnNpb24gRGV0YWlscyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2l0aFBhZGRpbmcgQ29udGVudCBOb0RvdWJsZUJvcmRlcnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJQcm9wZXJ0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbHVlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRGF0YSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IlcyNXBjIiBzdHlsZT0icGFkZGluZy1sZWZ0OiBbJSBUcmFuc2xhdGUoRGF0YS5JbmRlbnRhdGlvbikgfCBodG1sICVdcHg7IiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OiBbJSBUcmFuc2xhdGUoRGF0YS5JbmRlbnRhdGlvbikgfCBodG1sICVdcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRGF0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iVzI1cGMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtGaWxlbmFtZT1bJSBEYXRhLkZpbGVuYW1lIHwgdXJpICVdO0NvbmZpZ0l0ZW1JRD1bJSBEYXRhLkNvbmZpZ0l0ZW1JRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudHMiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iVzI1cGMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0ZpbGVuYW1lPVslIERhdGEuRmlsZW5hbWUgfCB1cmkgJV07Q29uZmlnSXRlbUlEPVslIERhdGEuQ29uZmlnSXRlbUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZUNvbXBsZXgiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpbmtUYWJsZUNvbXBsZXgiKSAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgIElUU00uQWdlbnQuWm9vbS5Jbml0KFslIEVudigiVXNlckNvbmZpZ0l0ZW1ab29tVGFibGVIZWlnaHQiKSAlXSk7CgogICAgJCgndWwuQWN0aW9ucyBhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnQWN0aW9uJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyICRNYXN0ZXJBY3Rpb25MaW5rID0gJCh0aGlzKS5maW5kKCcuTWFzdGVyQWN0aW9uTGluaycpOwogICAgICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBJbml0aWFsaXplIGFsbG9jYXRpb24gbGlzdCBmb3IgbGluayBvYmplY3QgdGFibGUuCiAgICBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5TZXRBbGxvY2F0aW9uTGlzdCgpOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5Owp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIFN0b3JhYmxlOwoKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpYTUwnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbSAtIGNvbmZpZyBpdGVtIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgY29uZmlnIGl0ZW0gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50JzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgIEBJU0EgPSBxdygKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkRlZmluaXRpb24KICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Okhpc3RvcnkKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcgogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbgogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbgogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MCiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgogICAgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0JywKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb25maWdJdGVtQ291bnQoKQoKY291bnQgYWxsIHJlY29yZHMgb2YgYSBjb25maWcgaXRlbSBjbGFzcwoKICAgIG15ICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Db3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdwcmVwcm9kdWN0aXZlJywgJ3Byb2R1Y3RpdmUnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgISV7JFN0YXRlTGlzdH07CgogICAgIyBjcmVhdGUgc3RhdGUgc3RyaW5nCiAgICBteSAkRGVwbFN0YXRlU3RyaW5nID0gam9pbiBxeywgfSwga2V5cyAleyRTdGF0ZUxpc3R9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNsYXNzX2lkID0gPyBBTkQgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSIsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQ291bnQ7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1SZXN1bHRMaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVJlc3VsdExpc3QoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgU3RhcnQgICA9PiAxMDAsCiAgICAgICAgTGltaXQgICA9PiA1MCwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc3VsdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIHN0YXRlIHN0cmluZwogICAgbXkgJERlcGxTdGF0ZVN0cmluZyA9IGpvaW4gcXssIH0sIGtleXMgJXskU3RhdGVMaXN0fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtICIKICAgICAgICAgICAgLiAiV0hFUkUgY2xhc3NfaWQgPSA/IEFORCBjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gIk9SREVSIEJZIGNoYW5nZV90aW1lIERFU0MiLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgICAgIFN0YXJ0ID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlETGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlETGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb25zIGRhdGEKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlETGlzdCkgewoKICAgICAgICAjIGdldCB2ZXJzaW9uIGRhdGEKICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1MaXN0LCAkTGFzdFZlcnNpb247CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1HZXQoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICk7CgpBIGhhc2hyZWYgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgaXMgcmV0dXJuZWQ6CgogICAgJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfQogICAgJENvbmZpZ0l0ZW17TnVtYmVyfQogICAgJENvbmZpZ0l0ZW17Q2xhc3NJRH0KICAgICRDb25maWdJdGVte0NsYXNzfQogICAgJENvbmZpZ0l0ZW17TGFzdFZlcnNpb25JRH0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfQogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlfQogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlVHlwZX0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfQogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlfQogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlVHlwZX0KICAgICRDb25maWdJdGVte0NyZWF0ZVRpbWV9CiAgICAkQ29uZmlnSXRlbXtDcmVhdGVCeX0KICAgICRDb25maWdJdGVte0NoYW5nZVRpbWV9CiAgICAkQ29uZmlnSXRlbXtDaGFuZ2VCeX0KCj1jdXQKCnN1YiBDb25maWdJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGVuYWJsZSBjYWNoZSBwZXIgZGVmYXVsdAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q2FjaGV9ICkgewogICAgICAgICRQYXJhbXtDYWNoZX0gPSAxOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICBteSAkQ2FjaGVLZXkgICAgPSAnQ29uZmlnSXRlbUdldDo6Q29uZmlnSXRlbUlEOjonIC4gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICRDYWNoZSAgICAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiBTdG9yYWJsZTo6ZGNsb25lKCRDYWNoZSkgaWYgJENhY2hlOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9udW1iZXIsIGNsYXNzX2lkLCBsYXN0X3ZlcnNpb25faWQsICcKICAgICAgICAgICAgLiAnY3VyX2RlcGxfc3RhdGVfaWQsIGN1cl9pbmNpX3N0YXRlX2lkLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwogICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUNvbmZpZ0l0ZW07CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0gICA9ICRSb3dbMF07CiAgICAgICAgJENvbmZpZ0l0ZW17TnVtYmVyfSAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkQ29uZmlnSXRlbXtDbGFzc0lEfSAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRDb25maWdJdGVte0xhc3RWZXJzaW9uSUR9ICA9ICRSb3dbM107CiAgICAgICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlSUR9ID0gJFJvd1s0XTsKICAgICAgICAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH0gPSAkUm93WzVdOwogICAgICAgICRDb25maWdJdGVte0NyZWF0ZVRpbWV9ICAgICA9ICRSb3dbNl07CiAgICAgICAgJENvbmZpZ0l0ZW17Q3JlYXRlQnl9ICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkQ29uZmlnSXRlbXtDaGFuZ2VUaW1lfSAgICAgPSAkUm93WzhdOwogICAgICAgICRDb25maWdJdGVte0NoYW5nZUJ5fSAgICAgICA9ICRSb3dbOV07CiAgICB9CgogICAgIyBjaGVjayBjb25maWcgaXRlbQogICAgaWYgKCAhJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggQ29uZmlnSXRlbUlEICgkUGFyYW17Q29uZmlnSXRlbUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICRDb25maWdJdGVte0NsYXNzfSA9ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW17Q2xhc3NJRH0gfTsKCiAgICByZXR1cm4gXCVDb25maWdJdGVtIGlmICEkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0gfHwgISRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfTsKCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGZ1bmN0aW9uYWxpdHkKICAgIG15ICREZXBsU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlSUR9LAogICAgKTsKCiAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGV9ICAgICA9ICREZXBsU3RhdGUtPntOYW1lfTsKICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZVR5cGV9ID0gJERlcGxTdGF0ZS0+e0Z1bmN0aW9uYWxpdHl9OwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGZ1bmN0aW9uYWxpdHkKICAgIG15ICRJbmNpU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9LAogICAgKTsKCiAgICAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGV9ICAgICA9ICRJbmNpU3RhdGUtPntOYW1lfTsKICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZVR5cGV9ID0gJEluY2lTdGF0ZS0+e0Z1bmN0aW9uYWxpdHl9OwoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBTdG9yYWJsZTo6ZGNsb25lKCBcJUNvbmZpZ0l0ZW0gKSwKICAgICk7CgogICAgcmV0dXJuIFwlQ29uZmlnSXRlbTsKfQoKPWl0ZW0gQ29uZmlnSXRlbUFkZCgpCgphZGQgYSBuZXcgY29uZmlnIGl0ZW0KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgTnVtYmVyICA9PiAnMTExJywgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDbGFzc0xpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRDbGFzc0xpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHZhbGlkIGNsYXNzIGlkIGdpdmVuIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICBpZiAoICRQYXJhbXtOdW1iZXJ9ICkgewoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgbXkgJEV4aXN0cyA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRQYXJhbXtOdW1iZXJ9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb25maWcgaXRlbSBudW1iZXIgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNyZWF0ZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyBjb25maWcgaXRlbQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtICcKICAgICAgICAgICAgLiAnKGNvbmZpZ2l0ZW1fbnVtYmVyLCBjbGFzc19pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBpdGVtCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgJwogICAgICAgICAgICAuICdjb25maWdpdGVtX251bWJlciA9ID8gQU5EIGNsYXNzX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TnVtYmVyfSwgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyB0cmlnZ2VyIENvbmZpZ0l0ZW1DcmVhdGUKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkQ29uZmlnSXRlbUlEIC4gJyUlJyAuICRQYXJhbXtOdW1iZXJ9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbURlbGV0ZSgpCgpkZWxldGUgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZW1lbWJlciBjb25maWcgaXRlbSBkYXRhIGJlZm9yZSBkZWxldGUKICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGxpbmtzIHRvIHRoaXMgY29uZmlnIGl0ZW0gZmlyc3QsIGJlZm9yZSBkZWxldGluZyB0aGUgdmVyc2lvbnMKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyB2ZXJzaW9ucwogICAgJFNlbGYtPlZlcnNpb25EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBhdHRhY2htZW50cwogICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkU2VsZi0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgIEZJTEVOQU1FOgogICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIGF0dGFjaG1lbnQKICAgICAgICBteSAkRGVsZXRpb25TdWNjZXNzID0gJFNlbGYtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRGVsZXRpb25TdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5rbm93biBwcm9ibGVtIHdoZW4gZGVsZXRpbmcgYXR0YWNobWVudCAkRmlsZW5hbWUgb2YgQ29uZmlnSXRlbSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFBhcmFte0NvbmZpZ0l0ZW1JRH0uIFBsZWFzZSBjaGVjayB0aGUgVmlydHVhbEZTIGJhY2tlbmQgZm9yIHN0YWxlICIKICAgICAgICAgICAgICAgICAgICAuICJmaWxlcyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZmlnSXRlbURlbGV0ZSBldmVudAogICAgIyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZGVsZXRpbmcgdGhlIGNvbmZpZyBpdGVtIGZyb20gdGhlIGRhdGFiYXNlLAogICAgIyBiZWNhdXNlIG9mIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludCBpbiB0aGUgY29uZmlnaXRlbV9oaXN0b3J5IHRhYmxlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25maWdJdGVtRGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBOdW1iZXIgICAgICAgPT4gJENvbmZpZ0l0ZW1EYXRhLT57TnVtYmVyfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICRDb25maWdJdGVtRGF0YS0+e0NsYXNzfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY29uZmlnIGl0ZW0KICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0NvbmZpZ0l0ZW1HZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRQYXJhbXtDb25maWdJdGVtSUR9OwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBDb25maWdJdGVtQXR0YWNobWVudEFkZCgpCgphZGRzIGFuIGF0dGFjaG1lbnQgdG8gYSBjb25maWcgaXRlbQoKICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50QWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICA9PiAxLAogICAgICAgIEZpbGVuYW1lICAgICAgICA9PiAnZmlsZW5hbWUnLAogICAgICAgIENvbnRlbnQgICAgICAgICA9PiAnY29udGVudCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUF0dGFjaG1lbnRBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCBGaWxlbmFtZSBDb250ZW50IENvbnRlbnRUeXBlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB3cml0ZSB0byB2aXJ0dWFsIGZzCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+V3JpdGUoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gIkNvbmZpZ0l0ZW0vJFBhcmFte0NvbmZpZ0l0ZW1JRH0vJFBhcmFte0ZpbGVuYW1lfSIsCiAgICAgICAgTW9kZSAgICAgICAgPT4gJ2JpbmFyeScsCiAgICAgICAgQ29udGVudCAgICAgPT4gXCRQYXJhbXtDb250ZW50fSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbnRlbnRJRCAgICA9PiAkUGFyYW17Q29udGVudElEfSwKICAgICAgICAgICAgQ29udGVudFR5cGUgID0+ICRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnRBZGQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnQXR0YWNobWVudEFkZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgYWRkIGF0dGFjaG1lbnQgZm9yIGNvbmZpZyBpdGVtICRQYXJhbXtDb25maWdJdGVtSUR9IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKCkKCkRlbGV0ZSB0aGUgZ2l2ZW4gZmlsZSBmcm9tIHRoZSB2aXJ0dWFsIGZpbGVzeXN0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywgICAgICAgICAgICAgICAjIHVzZWQgaW4gZXZlbnQgaGFuZGxpbmcsIGUuZy4gZm9yIGxvZ2dpbmcgdGhlIGhpc3RvcnkKICAgICAgICBGaWxlbmFtZSAgICAgPT4gJ1Byb2plY3RwbGFuLnBkZicsICMgaWRlbnRpZmllcyB0aGUgYXR0YWNobWVudCAodG9nZXRoZXIgd2l0aCB0aGUgQ29uZmlnSXRlbUlEKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtQXR0YWNobWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEIEZpbGVuYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcHJlZml4CiAgICBteSAkRmlsZW5hbWUgPSAnQ29uZmlnSXRlbS8nIC4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gLiAnLycgLiAkUGFyYW17RmlsZW5hbWV9OwoKICAgICMgZGVsZXRlIGZpbGUKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5EZWxldGUoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgICMgdHJpZ2dlciBBdHRhY2htZW50RGVsZXRlUG9zdC1FdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdBdHRhY2htZW50RGVsZXRlUG9zdCcsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkUGFyYW17RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdBdHRhY2htZW50RGVsZXRlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCBkZWxldGUgYXR0YWNobWVudCAkRmlsZW5hbWUhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBDb25maWdJdGVtQXR0YWNobWVudEdldCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IG9uZSBzcGVjaWZpYyBhdHRhY2htZW50LgoKICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiA0LAogICAgICAgIEZpbGVuYW1lICAgICA9PiAndGVzdC50eHQnLAogICAgKTsKCnJldHVybnMKCiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBBbGxQcmVmZXJlbmNlcyA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBGaWxlbmFtZSAgICA9PiAndGVzdC50eHQnLAogICAgICAgIENvbnRlbnQgICAgID0+ICdjb250ZW50JywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgRmlsZXNpemUgICAgPT4gJzEyMyBLQnl0ZXMnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgIH0KCj1jdXQKCnN1YiBDb25maWdJdGVtQXR0YWNobWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25maWdJdGVtSUQgRmlsZW5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gJ0NvbmZpZ0l0ZW0vJyAuICRQYXJhbXtDb25maWdJdGVtSUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfTsKCiAgICAjIGZpbmQgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RmluZCgKICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhQEF0dGFjaG1lbnRzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISIsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YSBmb3IgYXR0YWNobWVudAogICAgbXkgJUF0dGFjaG1lbnREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5SZWFkKAogICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICBNb2RlICAgICA9PiAnYmluYXJ5JywKICAgICk7CgogICAgbXkgJEF0dGFjaG1lbnRJbmZvID0gewogICAgICAgICVBdHRhY2htZW50RGF0YSwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkUGFyYW17RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR7ICRBdHRhY2htZW50RGF0YXtDb250ZW50fSB9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICRBdHRhY2htZW50RGF0YXtQcmVmZXJlbmNlc30tPntDb250ZW50VHlwZX0sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgIEZpbGVzaXplICAgID0+ICRBdHRhY2htZW50RGF0YXtQcmVmZXJlbmNlc30tPntGaWxlc2l6ZX0sCiAgICB9OwoKICAgIHJldHVybiAkQXR0YWNobWVudEluZm87Cn0KCj1pdGVtIENvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgpCgpSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIGF0dGFjaG1lbnRzIG9mIHRoZSBnaXZlbiBjb25maWcgaXRlbS4KCiAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIEBBdHRhY2htZW50cyA9ICgKICAgICAgICAnZmlsZW5hbWUudHh0JywKICAgICAgICAnb3RoZXJfZmlsZS5wZGYnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtQXR0YWNobWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RmluZCgKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICBmb3IgbXkgJEZpbGVuYW1lIChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyByZW1vdmUgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSBmaWxlbmFtZQogICAgICAgICRGaWxlbmFtZSA9fiBzeyBcQSBDb25maWdJdGVtIC8gXGQrIC8gfXt9eG1zOwogICAgfQoKICAgIHJldHVybiBAQXR0YWNobWVudHM7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1BdHRhY2htZW50RXhpc3RzKCkKCkNoZWNrcyBpZiBhIGZpbGUgd2l0aCBhIGdpdmVuIGZpbGVuYW1lIGV4aXN0cy4KCiAgICBteSAkRXhpc3RzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RXhpc3RzKAogICAgICAgIEZpbGVuYW1lID0+ICd0ZXN0LnR4dCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtQXR0YWNobWVudEV4aXN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmlsZW5hbWUgQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgRmlsZW5hbWUgPT4gJ0NvbmZpZ0l0ZW0vJyAuICRQYXJhbXtDb25maWdJdGVtSUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBsaXN0IGFzIGFuIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICBOdW1iZXIgICAgICAgPT4gJ1RoZSBDb25maWdJdGVtIE51bWJlcicsICAjIChvcHRpb25hbCkKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWzksIDgsIDcsIDZdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAjIChvcHRpb25hbCkKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgIyAob3B0aW9uYWwpCgogICAgICAgIFdoYXQgPT4gWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICAgICAjIGVhY2ggYXJyYXkgZWxlbWVudCBpcyBhIGFuZCBjb25kaXRpb24KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBvciBjb25kaXRpb24gaW4gaGFzaAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEInfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEElJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEInfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEIlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgYXJyYXkgcmVmZXJlbmNlIGlmIGRpZmZlcmVudCBjb250ZW50IHdpdGggc2FtZSBrZXkgd2FzIHNlYXJjaGVkCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+IFsnJWNvbnRlbnRDJScsICclY29udGVudEQlJywgJyVjb250ZW50RSUnXSwKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRDJ31bJV17J0NvbnRlbnQnfSIgPT4gWyclY29udGVudEMlJywgJyVjb250ZW50RCUnLCAnJWNvbnRlbnRFJSddLAogICAgICAgICAgICB9LAogICAgICAgIF0sCgogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NvbmZpZ0l0ZW1JRCcsICdOdW1iZXInIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdDb25maWdJdGVtSUQnIF0KICAgICAgICAjIChDb25maWdJdGVtSUQsIE51bWJlciwgTmFtZSwgQ2xhc3NJRCwgRGVwbFN0YXRlSUQsIEluY2lTdGF0ZUlELAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdEb3duJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAjIChvcHRpb25hbCkKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGxpbWl0CiAgICBteSAkTGltaXQgPSAkUGFyYW17TGltaXR9OwogICAgJFBhcmFte0xpbWl0fSA9IHVuZGVmOwoKICAgICMgY29uZmlnIGl0ZW0gc2VhcmNoIGlzIHJlcXVpcmVkIGlmIG9uZSBvZiB0aGVzZSBwYXJhbXMgaXMgZ2l2ZW4KICAgIG15IEBDb25maWdJdGVtU2VhcmNoUGFyYW1zID0gKAogICAgICAgICdDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAnQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUnLAogICAgICAgICdDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZScsCiAgICApOwoKICAgICMgY2hlY2ssIGlmIGNvbmZpZyBpdGVtIHNlYXJjaCBpcyByZXF1aXJlZAogICAgbXkgJVJlcXVpcmVkU2VhcmNoOwogICAgQ09ORklHSVRFTVBBUkFNOgogICAgZm9yIG15ICRDb25maWdJdGVtUGFyYW0gKEBDb25maWdJdGVtU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgbmV4dCBDT05GSUdJVEVNUEFSQU0gaWYgISRQYXJhbXskQ29uZmlnSXRlbVBhcmFtfTsKCiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ID0gMTsKICAgICAgICBsYXN0IENPTkZJR0lURU1QQVJBTTsKICAgIH0KCiAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmZpZyBpdGVtIG51bWJlcgogICAgIyBudW1iZXIgMCBpcyBhbGxvd2VkIGJ1dCBub3QgdGhlIGVtcHR5IHN0cmluZwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtOdW1iZXJ9ICYmICRQYXJhbXtOdW1iZXJ9IG5lICcnICkgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSA9IDE7CiAgICB9CgogICAgIyB2ZXJzaW9uIHNlYXJjaCBpcyByZXF1aXJlZCBpZiBOYW1lLCBXaGF0IG9yIFByZXZpb3VzVmVyc2lvblNlYXJjaCBpcyBnaXZlbgogICAgaWYgKAogICAgICAgIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtOYW1lfSApCiAgICAgICAgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17V2hhdH0gKQogICAgICAgIHx8ICRQYXJhbXtQcmV2aW91c1ZlcnNpb25TZWFyY2h9CiAgICAgICAgKQogICAgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSA9IDE7CiAgICB9CgogICAgIyB2ZXJzaW9uIHNlYXJjaCBpcyBhbHNvIHJlcXVpcmVkIGlmIHNvcnRpbmcgYnkgbmFtZSAoZml4IGZvciBidWcgIzcwNzIpCiAgICBPUkRFUkJZOgogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CiAgICAgICAgaWYgKCAkT3JkZXJCeSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSA9IDE7CiAgICAgICAgICAgIGxhc3QgT1JERVJCWTsKICAgICAgICB9CiAgICB9CgogICAgIyB4bWwgdmVyc2lvbiBzZWFyY2ggaXMgcmVxdWlyZWQgaWYgV2hhdCBpcyBnaXZlbgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtXaGF0fSApICkgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtYTUxWZXJzaW9ufSA9IDE7CiAgICB9CgogICAgIyB1c2UgY29uZmlnIGl0ZW0gc2VhcmNoIGFzIGZhbGxiYWNrCiAgICBpZiAoICElUmVxdWlyZWRTZWFyY2ggKSB7CiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ID0gMTsKICAgIH0KCiAgICAjIHN0YXJ0IGNvbmZpZyBpdGVtIHNlYXJjaAogICAgbXkgJUNvbmZpZ0l0ZW1MaXN0czsKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ICkgewoKICAgICAgICAjIHNlYXJjaCBjb25maWcgaXRlbXMKICAgICAgICAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19ID0gJFNlbGYtPkNvbmZpZ0l0ZW1TZWFyY2goJVBhcmFtKTsKCiAgICAgICAgcmV0dXJuICAgIGlmICEkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19OwogICAgICAgIHJldHVybiAgICBpZiByZWYgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSBuZSAnQVJSQVknOwogICAgICAgIHJldHVybiBbXSBpZiAhQHsgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSB9OwogICAgfQoKICAgICMgc3RhcnQgdmVyc2lvbiBzZWFyY2gKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe1ZlcnNpb259ICkgewoKICAgICAgICAjIHNlYXJjaCB2ZXJzaW9ucwogICAgICAgICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gPSAkU2VsZi0+VmVyc2lvblNlYXJjaCglUGFyYW0pOwoKICAgICAgICByZXR1cm4gICAgaWYgISRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn07CiAgICAgICAgcmV0dXJuICAgIGlmIHJlZiAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IG5lICdBUlJBWSc7CiAgICAgICAgcmV0dXJuIFtdIGlmICFAeyAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IH07CiAgICB9CgogICAgIyBzdGFydCB4bWwgdmVyc2lvbiBzZWFyY2gKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe1hNTFZlcnNpb259ICkgewoKICAgICAgICAjIHNlYXJjaCB4bWwgdmVyc2lvbnMKICAgICAgICBteSAkWE1MVmVyc2lvbkxpc3QgPSAkU2VsZi0+X1hNTFZlcnNpb25TZWFyY2goJVBhcmFtKTsKCiAgICAgICAgcmV0dXJuICAgIGlmICEkWE1MVmVyc2lvbkxpc3Q7CiAgICAgICAgcmV0dXJuICAgIGlmIHJlZiAkWE1MVmVyc2lvbkxpc3QgbmUgJ0hBU0gnOwogICAgICAgIHJldHVybiBbXSBpZiAhJXskWE1MVmVyc2lvbkxpc3R9OwoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSBpZHMKICAgICAgICBteSAlQ29uZmlnSXRlbUxpc3RUbXA7CiAgICAgICAgVkVSU0lPTklEOgogICAgICAgIGZvciBteSAkVmVyc2lvbklEICggc29ydCBrZXlzICV7JFhNTFZlcnNpb25MaXN0fSApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT5WZXJzaW9uQ29uZmlnSXRlbUlER2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFZFUlNJT05JRCBpZiAhJENvbmZpZ0l0ZW1JRDsKCiAgICAgICAgICAgICRDb25maWdJdGVtTGlzdFRtcHskQ29uZmlnSXRlbUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpZHMgdG8gY29uZmlnIGl0ZW0gbGlzdAogICAgICAgICRDb25maWdJdGVtTGlzdHN7WE1MVmVyc2lvbn0gPSBcJUNvbmZpZ0l0ZW1MaXN0VG1wOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSByZXN1bHQgbGlzdAogICAgbXkgQFJlc3VsdExpc3Q7CiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSAmJiAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gKSB7CgogICAgICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaCBvZiBhbGwgZm91bmQgY29uZmlnaXRlbSBpZHMgaW4gJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfQogICAgICAgIG15ICVDb25maWdJdGVtU2VlbiA9IG1hcCB7ICRfID0+IDEgfSBAeyAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19IH07CgogICAgICAgICMgY2hlY2sgYWxsIGNvbmZpZyBpdGVtIGlkcywgd2UgbmVlZCB0byBrZWVwIHRoZSBzb3J0aW5nCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHsgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSB9ICkgewogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJENvbmZpZ0l0ZW1TZWVueyRDb25maWdJdGVtSUR9OwogICAgICAgICAgICBwdXNoIEBSZXN1bHRMaXN0LCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ICkgewogICAgICAgIEBSZXN1bHRMaXN0ID0gQHsgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSB9OwogICAgfQogICAgZWxzaWYgKCAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gKSB7CiAgICAgICAgQFJlc3VsdExpc3QgPSBAeyAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IH07CiAgICB9CgogICAgIyBjb25zaWRlciB0aGUgWE1MIHJlc3VsdAogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7WE1MVmVyc2lvbn0gKSB7CiAgICAgICAgQFJlc3VsdExpc3QgPSBncmVwIHsgJENvbmZpZ0l0ZW1MaXN0c3tYTUxWZXJzaW9ufS0+eyRffSB9IEBSZXN1bHRMaXN0OwogICAgfQoKICAgICMgY29uc2lkZXIgbGltaXQKICAgIGlmICggJExpbWl0ICYmICRMaW1pdCA8IHNjYWxhciBAUmVzdWx0TGlzdCApIHsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBsaW1pdGVkIGlkcwogICAgICAgICRMaW1pdC0tOwogICAgICAgIEBSZXN1bHRMaXN0ID0gQFJlc3VsdExpc3RbIDAgLi4gJExpbWl0IF07CiAgICB9CgogICAgcmV0dXJuIFxAUmVzdWx0TGlzdDsKfQoKPWl0ZW0gQ29uZmlnSXRlbVNlYXJjaCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBsaXN0IGFzIGFuIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgTnVtYmVyICAgICAgID0+ICdUaGUgQ29uZmlnSXRlbSBOdW1iZXInLCAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgID0+IFs5LCA4LCA3LCA2XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVwbFN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ3JlYXRlQnkgICAgID0+IFsxLCAyLCAzXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlQnkgICAgID0+IFszLCAyLCAxXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICMgKG9wdGlvbmFsKQogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NvbmZpZ0l0ZW1JRCcsICdOdW1iZXInIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdDb25maWdJdGVtSUQnIF0KICAgICAgICAjIChDb25maWdJdGVtSUQsIE51bWJlciwgQ2xhc3NJRCwgRGVwbFN0YXRlSUQsIEluY2lTdGF0ZUlELAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdEb3duJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAjIChvcHRpb25hbCkKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHZlcmlmeSB0aGF0IGFsbCBwYXNzZWQgYXJyYXkgcGFyYW1ldGVycyBjb250YWluIGFuIGFycmF5cmVmCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKAogICAgICAgIHF3KAogICAgICAgIE9yZGVyQnkKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcmd1bWVudH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmaW5lIG9yZGVyIHRhYmxlCiAgICBteSAlT3JkZXJCeVRhYmxlID0gKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAnaWQnLAogICAgICAgIE51bWJlciAgICAgICA9PiAnY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIENsYXNzSUQgICAgICA9PiAnY2xhc3NfaWQnLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAnY3VyX2RlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAnY3VyX2luY2lfc3RhdGVfaWQnLAogICAgICAgIENyZWF0ZVRpbWUgICA9PiAnY3JlYXRlX3RpbWUnLAogICAgICAgIENyZWF0ZUJ5ICAgICA9PiAnY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VUaW1lICAgPT4gJ2NoYW5nZV90aW1lJywKICAgICAgICBDaGFuZ2VCeSAgICAgPT4gJ2NoYW5nZV9ieScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIE9SREVSQlk6CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdOYW1lJzsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyAiCiAgICAgICAgICAgICAgICAgICAgLiAnb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZQogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwogICAgfQoKICAgICMgY2hlY2sgaWYgT3JkZXJCeURpcmVjdGlvbiBhcnJheSBjb250YWlucyBvbmx5ICdVcCcgb3IgJ0Rvd24nCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIG9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZAogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ1VwJzsKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdEb3duJzsKCiAgICAgICAgIyBmb3VuZCBhbiBlcnJvcgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeURpcmVjdGlvbiBjYW4gb25seSBjb250YWluICdVcCcgb3IgJ0Rvd24nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKICAgICAgICAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ID0gMTsKICAgIH0KCiAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICBteSAkTGlrZUVzY2FwZVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgIyBhc3NlbWJsZSB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICBteSBAU1FMT3JkZXJCeTsKICAgIG15ICRDb3VudCA9IDA7CiAgICBPUkRFUkJZOgogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIG5leHQgT1JERVJCWSBpZiAkT3JkZXJCeSBlcSAnTmFtZSc7CgogICAgICAgICMgc2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbgogICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICMgYWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24KICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBTUUwKICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CgogICAgfQogICAgY29udGludWUgewogICAgICAgICRDb3VudCsrOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgIyB3ZSBhZGQgYW4gYXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkCiAgICBpZiAoICFncmVwIHsgJF8gZXEgJ0NvbmZpZ0l0ZW1JRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7Q29uZmlnSXRlbUlEfSBBU0MiOwogICAgfQoKICAgICMgYWRkIG51bWJlciB0byBzcWwgd2hlcmUgYXJyYXkKICAgIG15IEBTUUxXaGVyZTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17TnVtYmVyfSAmJiAkUGFyYW17TnVtYmVyfSBuZSAnJyApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtOdW1iZXJ9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17TnVtYmVyfSApOwoKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCRQYXJhbXtOdW1iZXJ9ICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUihjb25maWdpdGVtX251bWJlcikgTElLRSBMT1dFUignJFBhcmFte051bWJlcn0nKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKGNvbmZpZ2l0ZW1fbnVtYmVyKSA9IExPV0VSKCckUGFyYW17TnVtYmVyfScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2xhc3NJRHMgICAgID0+ICdjbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSURzID0+ICdjdXJfZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgSW5jaVN0YXRlSURzID0+ICdjdXJfaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgQ3JlYXRlQnkgICAgID0+ICdjcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ICAgICA9PiAnY2hhbmdlX2J5JywKICAgICk7CgogICAgQVJSQVlQQVJBTToKICAgIGZvciBteSAkQXJyYXlQYXJhbSAoIHNvcnQga2V5cyAlQXJyYXlQYXJhbXMgKSB7CgogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhJFBhcmFteyRBcnJheVBhcmFtfTsKCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcnJheVBhcmFtfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFycmF5UGFyYW0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICFAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgICMgcXVvdGUgYXMgaW50ZWdlcgogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJE9uZVBhcmFtLCAnSW50ZWdlcicgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gcXssIH0sIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkSW5TdHJpbmc7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyAkQXJyYXlQYXJhbSB9IElOICgkSW5TdHJpbmcpIjsKICAgIH0KCiAgICAjIHNldCB0aW1lIHBhcmFtcwogICAgbXkgJVRpbWVQYXJhbXMgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJ2NyZWF0ZV90aW1lID49JywKICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnY3JlYXRlX3RpbWUgPD0nLAogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICdjaGFuZ2VfdGltZSA+PScsCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJ2NoYW5nZV90aW1lIDw9JywKICAgICk7CgogICAgVElNRVBBUkFNOgogICAgZm9yIG15ICRUaW1lUGFyYW0gKCBzb3J0IGtleXMgJVRpbWVQYXJhbXMgKSB7CgogICAgICAgIG5leHQgVElNRVBBUkFNIGlmICEkUGFyYW17JFRpbWVQYXJhbX07CgogICAgICAgIGlmICggJFBhcmFteyRUaW1lUGFyYW19ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBkYXRlIGZvcm1hdCBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFteyRUaW1lUGFyYW19ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17JFRpbWVQYXJhbX0gKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3sgJFRpbWVQYXJhbSB9ICckUGFyYW17ICRUaW1lUGFyYW0gfSciOwogICAgfQoKICAgICMgY3JlYXRlIHdoZXJlIHN0cmluZwogICAgbXkgJFdoZXJlU3RyaW5nID0gQFNRTFdoZXJlID8gJyBXSEVSRSAnIC4gam9pbiBxeyBBTkQgfSwgQFNRTFdoZXJlIDogJyc7CgogICAgIyBzZXQgbGltaXQKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gJFdoZXJlU3RyaW5nICI7CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1MaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQENvbmZpZ0l0ZW1MaXN0Owp9Cgo9aXRlbSBDb25maWdJdGVtTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgY29uZmlnaXRlbS4gSWYgYSBjb25maWdpdGVtIGlkIGlzIGdpdmVuLAppdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ2l0ZW0uIElmIGEgY29uZmlnaXRlbSBudW1iZXIgaXMgZ2l2ZW4sCnRoZSBhcHByb3ByaWF0ZSBpZCBpcyByZXR1cm5lZC4KCiAgICBteSAkTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMzQsCiAgICApOwoKICAgIG15ICRJRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gMTAwMDAwMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICgkS2V5KSA9IGdyZXAgeyAkUGFyYW17JF99IH0gcXcoQ29uZmlnSXRlbUlEIENvbmZpZ0l0ZW1OdW1iZXIpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEtleSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIG9yIENvbmZpZ0l0ZW1OdW1iZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHJlc3VsdCBpcyBjYWNoZWQgcmV0dXJuIHRoYXQgcmVzdWx0CiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTG9va3VwfS0+eyRLZXl9LT57ICRQYXJhbXskS2V5fSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTG9va3VwfS0+eyRLZXl9LT57ICRQYXJhbXskS2V5fSB9OwoKICAgICMgc2V0IHRoZSBhcHByb3ByaWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gJ1NFTEVDVCBjb25maWdpdGVtX251bWJlciBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JzsKCiAgICBpZiAoICRLZXkgZXEgJ0NvbmZpZ0l0ZW1OdW1iZXInICkgewogICAgICAgICRTUUwgPSAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSBjb25maWdpdGVtX251bWJlciA9ID8nOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlcXVlc3RlZCB2YWx1ZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXskS2V5fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRWYWx1ZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1Mb29rdXB9LT57JEtleX0tPnsgJFBhcmFteyRLZXl9IH0gPSAkVmFsdWU7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gVW5pcXVlTmFtZUNoZWNrKCkKClRoaXMgbWV0aG9kIGNoZWNrcyBhbGwgYWxyZWFkeSBleGlzdGluZyBjb25maWcgaXRlbXMsIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgZG9lcyBhbHJlYWR5IGV4aXN0CndpdGhpbiB0aGUgc2FtZSBjb25maWcgaXRlbSBjbGFzcyBvciBhbW9uZ3N0IGFsbCBjbGFzc2VzLCBkZXBlbmRpbmcgb24gdGhlIFN5c0NvbmZpZyB2YWx1ZSBvZgpVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlIChDbGFzcyBvciBHbG9iYWwpLgoKVGhpcyBtZXRob2QgcmVxdWlyZXMgMyBwYXJhbWV0ZXJzOiBDb25maWdJdGVtSUQsIE5hbWUgYW5kIENsYXNzCiJDb25maWdJdGVtSUQiICBpcyB0aGUgSUQgb2YgdGhlIENvbmZpZ0l0ZW0sIHdoaWNoIGlzIHRvIGJlIGNoZWNrZWQgZm9yIHVuaXF1ZW5lc3MKIk5hbWUiICAgICAgICAgIGlzIHRoZSBjb25maWcgaXRlbSBuYW1lIHRvIGJlIGNoZWNrZWQgZm9yIHVuaXF1ZW5lc3MKIkNsYXNzSUQiICAgICAgIGlzIHRoZSBJRCBvZiB0aGUgY29uZmlnIGl0ZW0ncyBjbGFzcwoKQWxsIHBhcmFtZXRlcnMgYXJlIG1hbmRhdG9yeS4KCm15ICREdXBsaWNhdGVOYW1lcyA9ICRDb25maWdJdGVtT2JqZWN0LT5VbmlxdWVOYW1lQ2hlY2soCiAgICBDb25maWdJdGVtSUQgPT4gJzczJwogICAgTmFtZSAgICAgICAgID0+ICdQQyMwMDUnLAogICAgQ2xhc3NJRCAgICAgID0+ICczMicsCik7CgpUaGUgZ2l2ZW4gbmFtZSBpcyBub3QgdW5pcXVlCm15ICROYW1lRHVwbGljYXRlcyA9IFsgNSwgMzUsIDQ4LCBdOyAgICAjIElEcyBvZiBDb25maWdJdGVtcyB3aXRoIHRoZSBzYW1lIG5hbWUKClRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZQpteSAkTmFtZUR1cGxpY2F0ZXMgPSBbXTsKCj1jdXQKCnN1YiBVbmlxdWVOYW1lQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgTmFtZSBDbGFzc0lEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1pc3NpbmcgcGFyYW1ldGVyICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW1JRCBwYXJhbSBmb3IgdmFsaWQgZm9ybWF0CiAgICBpZiAoCiAgICAgICAgIUlzSW50ZWdlciggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKQogICAgICAgICYmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIENvbmZpZ0l0ZW1JRCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBvciAnTkVXJyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBOYW1lIHBhcmFtIGZvciB2YWxpZCBmb3JtYXQKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtOYW1lfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIE5hbWUgcGFyYW1ldGVyIG5lZWRzIHRvIGJlIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBDbGFzc0lEIHBhcmFtIGZvciB2YWxpZCBmb3JtYXQKICAgIGlmICggIUlzSW50ZWdlciggJFBhcmFte0NsYXNzSUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ2xhc3NJRCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGxpc3QgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQ2xhc3NMaXN0KSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuYWJsZSB0byByZXRyaWV2ZSBhIHZhbGlkIGNsYXNzIGxpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY2xhc3MgbmFtZSBmcm9tIHRoZSBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3MgPSAkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9OwoKICAgICMgY2hlY2sgY2xhc3MgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCRDbGFzcykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGV0ZXJtaW5lIGEgY29uZmlnIGl0ZW0gY2xhc3MgdXNpbmcgdGhlIGdpdmVuIENsYXNzSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2lmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZXNvbHZlZCBDbGFzc0lEICRQYXJhbXtDbGFzc0lEfSB0byBjbGFzcyAkQ2xhc3MiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIHVuaXF1ZW5lc3Mgc2NvcGUgZnJvbSBTeXNDb25maWcKICAgIG15ICRTY29wZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVW5pcXVlQ0lOYW1lOjpVbmlxdWVuZXNzQ2hlY2tTY29wZScpOwoKICAgICMgY2hlY2sgc2NvcGUgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCRTY29wZSkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgY29uZmlndXJhdGlvbiBvZiBVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlIGlzIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRTY29wZSBuZSAnZ2xvYmFsJyAmJiAkU2NvcGUgbmUgJ2NsYXNzJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuaXF1ZUNJTmFtZTo6VW5pcXVlbmVzc0NoZWNrU2NvcGUgaXMgJFNjb3BlLCBidXQgbXVzdCBiZSBlaXRoZXIgIgogICAgICAgICAgICAgICAgLiAiJ2dsb2JhbCcgb3IgJ2NsYXNzJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc2NvcGUgZm9yIGNoZWNraW5nIHRoZSB1bmlxdWVuZXNzIGlzICRTY29wZSIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlU2VhcmNoQ3JpdGVyaWE7CgogICAgIyBhZGQgdGhlIGNvbmZpZyBpdGVtIGNsYXNzIHRvIHRoZSBzZWFyY2ggY3JpdGVyaWEgaWYgdGhlIHVuaXF1ZW5lc3Mgc2NvcGUgaXMgbm90IGdsb2JhbAogICAgaWYgKCAkU2NvcGUgbmUgJ2dsb2JhbCcgKSB7CiAgICAgICAgJFNlYXJjaENyaXRlcmlhe0NsYXNzSURzfSA9IFsgJFBhcmFte0NsYXNzSUR9IF07CiAgICB9CgogICAgJFNlYXJjaENyaXRlcmlhe05hbWV9ID0gJFBhcmFte05hbWV9OwoKICAgICMgc2VhcmNoIGZvciBhIGNvbmZpZyBpdGVtIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoJVNlYXJjaENyaXRlcmlhKTsKCiAgICAjIHJlbW92ZSB0aGUgcHJvdmlkZWQgQ29uZmlnSXRlbUlEIGZyb20gdGhlIHJlc3VsdHMsIG90aGVyd2lzZSB0aGUgZHVwbGljYXRlIGNoZWNrIHdvdWxkIGZhaWwKICAgICMgYmVjYXVzZSB0aGUgQ29uZmlnSXRlbSBpdHNlbGYgaXMgZm91bmQgYXMgZHVwbGljYXRlCiAgICBteSBARHVwbGljYXRlcyA9IG1hcCB7JF99IGdyZXAgeyAkXyBuZSAkUGFyYW17Q29uZmlnSXRlbUlEfSB9IEB7JENvbmZpZ0l0ZW19OwoKICAgICMgaWYgYSBjb25maWcgaXRlbSB3YXMgZm91bmQsIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCB1bmlxdWUKICAgICMgaWYgbm8gY29uZmlnIGl0ZW0gd2FzIGZvdW5kLCB0aGUgZ2l2ZW4gbmFtZSBpcyB1bmlxdWUKCiAgICAjIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb25maWcgaXRlbSBzZWFyY2ggZm9yIGR1cGxpY2F0ZXMKICAgIHJldHVybiBcQER1cGxpY2F0ZXM7Cn0KCj1pdGVtIEN1ckluY2lTdGF0ZVJlY2FsYygpCgpyZWNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSBhbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMKCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VySW5jaVN0YXRlUmVjYWxjIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBsaW5rIHR5cGVzIGFuZCBkaXJlY3Rpb25zIGZyb20gY29uZmlnCiAgICBteSAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbicpOwoKICAgICMgdG8gc3RvcmUgdGhlIG5ldyBpbmNpZGVudCBzdGF0ZSBmb3IgQ0lzCiAgICAjIGNhbGN1bGF0ZWQgZnJvbSBhbGwgaW5jaWRlbnQgbGluayB0eXBlcwogICAgbXkgJU5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlOwoKICAgICMgdG8gc3RvcmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gc2VydmljZXMgYW5kIGxpbmtlZCBDSXMKICAgIG15ICVTZXJ2aWNlQ0lSZWxhdGlvbjsKCiAgICAjIHJlbWVtYmVyIHRoZSBzY2FubmVkIGNvbmZpZyBpdGVtcwogICAgbXkgJVNjYW5uZWRDb25maWdJdGVtSURzOwoKICAgICMgZmluZCBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYW4gaW5jaWRlbnQgc3RhdGUKICAgICRTZWxmLT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24gPT4gJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24sCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgICAgICA9PiBcJVNjYW5uZWRDb25maWdJdGVtSURzLAogICAgKTsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbmV3IENJIGluY2lkZW50IHN0YXRlIGZvciBlYWNoIGNvbmZpZ3VyZWQgbGlua3R5cGUKICAgIExJTktUWVBFOgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgdGhlIGRpcmVjdGlvbgogICAgICAgIG15ICRMaW5rRGlyZWN0aW9uID0gJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPnskTGlua1R5cGV9OwoKICAgICAgICAjIGludmVzdGlnYXRlIGFsbCBjb25maWcgaXRlbXMgd2l0aCBhIHdhcm5pbmcgc3RhdGUKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJVNjYW5uZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSBvbmx5IGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRTY2FubmVkQ29uZmlnSXRlbUlEc3skQ29uZmlnSXRlbUlEfS0+e1R5cGV9IG5lICdpbmNpZGVudCc7CgogICAgICAgICAgICAkU2VsZi0+X0ZpbmRXYXJuQ29uZmlnSXRlbXMoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgRGlyZWN0aW9uICAgICAgICAgICAgPT4gJExpbmtEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICBOdW1iZXJPZkxpbmtUeXBlcyAgICA9PiBzY2FsYXIga2V5cyAleyRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9ufSwKICAgICAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJVNjYW5uZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICAgICAgICAgbXkgJEluY2lTdGF0ZVR5cGUgPSAkU2Nhbm5lZENvbmZpZ0l0ZW1JRHN7JENvbmZpZ0l0ZW1JRH0tPntUeXBlfTsKCiAgICAgICAgICAgICMgZmluZCBhbGwgbGlua2VkIHNlcnZpY2VzIG9mIHRoaXMgQ0kKICAgICAgICAgICAgbXkgJUxpbmtlZFNlcnZpY2VJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rS2V5TGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdDEgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgS2V5MSAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBPYmplY3QyICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgRGlyZWN0aW9uID0+ICRMaW5rRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBTRVJWSUNFSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVMaW5rZWRTZXJ2aWNlSURzICkgewoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhlIENJcyB0aGF0IGFyZSBsaW5rZWQgd2l0aCB0aGlzIHNlcnZpY2UKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFNlcnZpY2VDSVJlbGF0aW9ueyRTZXJ2aWNlSUR9IH0sICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRJbmNpU3RhdGVUeXBlIGVxICdpbmNpZGVudCc7CgogICAgICAgICAgICAjIGlmIG5vdGhpbmcgaGFzIGJlZW4gc2V0IGFscmVhZHkgb3IgaWYgdGhlIGN1cnJlbnRseSBzZXQgaW5jaWRlbnQgc3RhdGUgaXMgJ29wZXJhdGlvbmFsJwogICAgICAgICAgICAjICgnb3BlcmF0aW9uYWwnIGNhbiBhbHdheXMgYmUgb3ZlcndyaXR0ZW4pCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV7JENvbmZpZ0l0ZW1JRH0KICAgICAgICAgICAgICAgIHx8ICROZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZXskQ29uZmlnSXRlbUlEfSBlcSAnb3BlcmF0aW9uYWwnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICROZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZXskQ29uZmlnSXRlbUlEfSA9ICRJbmNpU3RhdGVUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0IG9mIHdhcm5pbmdzCiAgICBteSAkV2FyblN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICB9LAogICAgKTsKICAgIG15ICVSZXZlcnNlV2FyblN0YXRlTGlzdCA9IHJldmVyc2UgJXskV2FyblN0YXRlTGlzdH07CiAgICBteSBAU29ydGVkV2Fybkxpc3QgICAgICAgPSBzb3J0IGtleXMgJVJldmVyc2VXYXJuU3RhdGVMaXN0OwogICAgbXkgJFdhcm5pbmdTdGF0ZUlEICAgICAgID0gJFJldmVyc2VXYXJuU3RhdGVMaXN0e1dhcm5pbmd9IHx8ICRSZXZlcnNlV2FyblN0YXRlTGlzdHsgJFNvcnRlZFdhcm5MaXN0WzBdIH07CiAgICBteSAkQ2FjaGVPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIHNldCB0aGUgbmV3IGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgZm9yIENJcwogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJU5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlICkgewoKICAgICAgICAjIGdldCBuZXcgaW5jaWRlbnQgc3RhdGUgdHlwZSAoY2FuIG9ubHkgYmUgJ29wZXJhdGlvbmFsJyBvciAnd2FybmluZycpCiAgICAgICAgbXkgJEluY2lTdGF0ZVR5cGUgPSAkTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV7JENvbmZpZ0l0ZW1JRH07CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbgogICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEN1ckluY2lTdGF0ZUlEOwogICAgICAgIGlmICggJEluY2lTdGF0ZVR5cGUgZXEgJ3dhcm5pbmcnICkgewoKICAgICAgICAgICAgIyBjaGVjayB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSB0eXBlIGlzIGluICdpbmNpZGVudCcKICAgICAgICAgICAgIyB0aGVuIHdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSBpdCB0byB3YXJuaW5nCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRMYXN0VmVyc2lvbi0+e0luY2lTdGF0ZVR5cGV9IGVxICdpbmNpZGVudCc7CgogICAgICAgICAgICAkQ3VySW5jaVN0YXRlSUQgPSAkV2FybmluZ1N0YXRlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEluY2lTdGF0ZVR5cGUgZXEgJ29wZXJhdGlvbmFsJyApIHsKICAgICAgICAgICAgJEN1ckluY2lTdGF0ZUlEID0gJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGN1cl9pbmNpX3N0YXRlX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDdXJJbmNpU3RhdGVJRCwgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ29uZmlnSXRlbUdldDo6Q29uZmlnSXRlbUlEOjonIC4gJENvbmZpZ0l0ZW1JRDsKICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFmZmVjdGVkIGNhY2hlcyBmb3IgQ29uZmlnSXRlbUlECiAgICAgICAgJENhY2hlS2V5ID0gJ1ZlcnNpb25HZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRDb25maWdJdGVtSUQgLiAnOjpYTUxEYXRhOjonOwogICAgICAgIGZvciBteSAkWE1MRGF0YSAocXcoMCAxKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAkWE1MRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdWZXJzaW9uTmFtZUdldDo6Q29uZmlnSXRlbUlEOjonIC4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhZmZlY3RlZCBjYWNoZXMgZm9yIGxhc3QgdmVyc2lvbgogICAgICAgIG15ICRWZXJzaW9uTGlzdCA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkVmVyc2lvbklEID0gJFZlcnNpb25MaXN0LT5bLTFdOwogICAgICAgICRDYWNoZUtleSA9ICdWZXJzaW9uR2V0OjpWZXJzaW9uSUQ6OicgLiAkVmVyc2lvbklEIC4gJzo6WE1MRGF0YTo6JzsKICAgICAgICBmb3IgbXkgJFhNTERhdGEgKHF3KDAgMSkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5IC4gJFhNTERhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAnVmVyc2lvbk5hbWVHZXQ6OlZlcnNpb25JRDo6JyAuICRWZXJzaW9uSUQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSB0eXBlIGZvciBlYWNoIHNlcnZpY2UgKGluZmx1ZW5jZWQgYnkgbGlua2VkIENJcykKICAgIFNFUlZJQ0VJRDoKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlQ0lSZWxhdGlvbiApIHsKCiAgICAgICAgIyBzZXQgZGVmYXVsdCBpbmNpZGVudCBzdGF0ZSB0eXBlCiAgICAgICAgbXkgJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzID0gJ29wZXJhdGlvbmFsJzsKCiAgICAgICAgIyBnZXQgdGhlIHVuaXF1ZSBjb25maWcgaXRlbSBpZHMgd2hpY2ggYXJlIGRpcmVjbHkgbGlua2VkIHRvIHRoaXMgc2VydmljZQogICAgICAgIG15ICVVbmlxdWVDb25maWdJdGVtSURzID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRTZXJ2aWNlQ0lSZWxhdGlvbnskU2VydmljZUlEfSB9OwoKICAgICAgICAjIGludmVzdGlnYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGVhY2ggY29uZmlnIGl0ZW0KICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJVVuaXF1ZUNvbmZpZ0l0ZW1JRHMgKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRDb25maWdJdGVtRGF0YS0+e0N1ckRlcGxTdGF0ZVR5cGV9IG5lICdwcm9kdWN0aXZlJzsKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ29wZXJhdGlvbmFsJzsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnd2FybmluZycKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnd2FybmluZycgKSB7CiAgICAgICAgICAgICAgICAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnd2FybmluZyc7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIG11c3QgYmUgc2V0IHRvICdpbmNpZGVudCcKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAgICAgJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzID0gJ2luY2lkZW50JzsKICAgICAgICAgICAgICAgIGxhc3QgQ09ORklHSVRFTUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSB0eXBlIGZyb20gQ0lzIG9mIHRoZSBzZXJ2aWNlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZVByZWZlcmVuY2VzU2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zKCkKCmZpbmQgYWxsIGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPl9GaW5kSW5jaUNvbmZpZ0l0ZW1zKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uID0+ICRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uLAogICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzICAgICA9PiBcJVNjYW5uZWRDb25maWdJdGVtSURzLAogICAgKTsKCj1jdXQKCnN1YiBfRmluZEluY2lDb25maWdJdGVtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtDb25maWdJdGVtSUR9OwoKICAgICMgaWdub3JlIGFscmVhZHkgc2Nhbm5lZCBpZHMgKGluZmluaXRlIGxvb3AgcHJvdGVjdGlvbikKICAgIHJldHVybiBpZiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57VHlwZX0gPSAnb3BlcmF0aW9uYWwnOwoKICAgICMgYWRkIG93biBjb25maWcgaXRlbSBpZCB0byBsaXN0IG9mIGxpbmtlZCBjb25maWcgaXRlbXMKICAgIG15ICVDb25maWdJdGVtSURzID0gKAogICAgICAgICRQYXJhbXtDb25maWdJdGVtSUR9ID0+IDEsCiAgICApOwoKICAgIExJTktUWVBFOgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17SW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zIChjaGlsZHMpCiAgICAgICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rS2V5TGlzdCgKICAgICAgICAgICAgT2JqZWN0MSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBPYmplY3QyID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAkTGlua1R5cGUsCgogICAgICAgICAgICAjIERpcmVjdGlvbiBtdXN0IEFMV0FZUyBiZSAnQm90aCcgaGVyZSBhcyB3ZSBuZWVkIHRvIGluY2x1ZGUKICAgICAgICAgICAgIyBhbGwgbGlua2VkIENJcyB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGlzIG9uZSEKICAgICAgICAgICAgRGlyZWN0aW9uID0+ICdCb3RoJywKCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVtZW1iZXIgdGhlIGNvbmZpZyBpdGVtIGlkcwogICAgICAgICVDb25maWdJdGVtSURzID0gKCAlQ29uZmlnSXRlbUlEcywgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgKTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAlQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBpbmNpZGVudCBzdGF0ZQogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfSA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAkU2VsZi0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbiA9PiAkUGFyYW17SW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbn0sCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzICAgICAgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmluZFdhcm5Db25maWdJdGVtcygpCgpmaW5kIGFsbCBjb25maWcgaXRlbXMgd2l0aCBhIHdhcm5pbmcKCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X0ZpbmRXYXJuQ29uZmlnSXRlbXMoCiAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgRGlyZWN0aW9uICAgICAgICAgICAgPT4gJExpbmtEaXJlY3Rpb24sCiAgICAgICAgTnVtYmVyT2ZMaW5rVHlwZXMgICAgPT4gMiwKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICApOwoKPWN1dAoKc3ViIF9GaW5kV2FybkNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgbXkgJEluY2lkZW50Q291bnQgPSAwOwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJXsgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0KICAgICAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gZXEgJ2luY2lkZW50JwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkSW5jaWRlbnRDb3VudCsrOwogICAgICAgIH0KICAgIH0KCiMgaWdub3JlIGFscmVhZHkgc2Nhbm5lZCBpZHMgKGluZmluaXRlIGxvb3AgcHJvdGVjdGlvbikKIyBpdCBpcyBvayB0aGF0IGEgY29uZmlnIGl0ZW0gaXMgaW52ZXN0aWdhdGVkIGFzIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGNvbmZpZ3VyZWQgbGluayB0eXBlcyAqIG51bWJlciBvZiBpbmNpZGVudCBjb25maWcgaXRlZW1zCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57RmluZFdhcm59CiAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57RmluZFdhcm59CiAgICAgICAgPj0gKCAkUGFyYW17TnVtYmVyT2ZMaW5rVHlwZXN9ICogJEluY2lkZW50Q291bnQgKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbmNyZWFzZSB0aGUgdmlzaXQgY291bnRlcgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57RmluZFdhcm59Kys7CgogICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICBteSAlTGlua2VkQ29uZmlnSXRlbUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0KAogICAgICAgIE9iamVjdDEgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleTEgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBPYmplY3QyICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSwKICAgICAgICBEaXJlY3Rpb24gPT4gJFBhcmFte0RpcmVjdGlvbn0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICRTZWxmLT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSwKICAgICAgICAgICAgRGlyZWN0aW9uICAgICAgICAgICAgPT4gJFBhcmFte0RpcmVjdGlvbn0sCiAgICAgICAgICAgIE51bWJlck9mTGlua1R5cGVzICAgID0+ICRQYXJhbXtOdW1iZXJPZkxpbmtUeXBlc30sCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQKICAgICAgICAgICAgaWYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0KICAgICAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgIyBzZXQgd2FybmluZyBzdGF0ZQogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnskQ29uZmlnSXRlbUlEfS0+e1R5cGV9ID0gJ3dhcm5pbmcnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfUHJlcGFyZUxpa2VTdHJpbmcoKQoKaW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJlcGFyZSBsaWtlIHN0cmluZ3MKCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X1ByZXBhcmVMaWtlU3RyaW5nKCAkU3RyaW5nUmVmICk7Cgo9Y3V0CgpzdWIgX1ByZXBhcmVMaWtlU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICRWYWx1ZSApID0gQF87CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CiAgICByZXR1cm4gaWYgcmVmICRWYWx1ZSBuZSAnU0NBTEFSJzsKCiAgICAjIFF1b3RlCiAgICAkeyRWYWx1ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVvdGUoICR7JFZhbHVlfSwgJ0xpa2UnICk7CgogICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAkeyRWYWx1ZX0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgIHJldHVybjsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIElUU00gQ29uZmlnIEl0ZW0gZXZlbnRzOgoKQ29uZmlnSXRlbUNyZWF0ZSwgVmVyc2lvbkNyZWF0ZSwgRGVwbG95bWVudFN0YXRlVXBkYXRlLCBJbmNpZGVudFN0YXRlVXBkYXRlLApDb25maWdJdGVtRGVsZXRlLCBMaW5rQWRkLCBMaW5rRGVsZXRlLCBEZWZpbml0aW9uVXBkYXRlLCBOYW1lVXBkYXRlLCBWYWx1ZVVwZGF0ZQpEZWZpbml0aW9uQ3JlYXRlLCBWZXJzaW9uRGVsZXRlCgo9Y3V0Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6Q29uZmlnaXRlbTo6TGlzdER1cGxpY2F0ZXM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0FycmF5UmVmV2l0aERhdGEpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdMaXN0IENvbmZpZ0l0ZW1zIHdoaWNoIGhhdmUgYSBub24tdW5pcXVlIG5hbWUuJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdjbGFzcycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIG9ubHkgY29uZmlnIGl0ZW1zIG9mIHRoaXMgY2xhc3MuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLiovc214LAogICAgKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3Njb3BlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiRGVmaW5lIHRoZSBzY29wZSBmb3IgdGhlIHVuaXF1ZW5lc3MgY2hlY2sgKGdsb2JhbHxjbGFzcykiLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8oZ2xvYmFsfGNsYXNzKS9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnYWxsLXN0YXRlcycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkFsc28gY2hlY2sgY29uZmlnIGl0ZW1zIGluIG5vbi1wcm9kdWN0aXZlIHN0YXRlcy4iLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgYXJndW1lbnQKICAgIG15ICRDbGFzcyA9ICRTZWxmLT5HZXRPcHRpb24oJ2NsYXNzJykgLy8gJyc7CgogICAgaWYgKCRDbGFzcykgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGludmVydCB0aGUgaGFzaCB0byBoYXZlIHRoZSBjbGFzc2VzJyBuYW1lcyBhcyBrZXlzCiAgICAgICAgbXkgJUNsYXNzTmFtZTJJRCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKCiAgICAgICAgIyBjaGVjaywgd2hldGhlciB0aGlzIGNsYXNzIGV4aXN0cwogICAgICAgIGlmICggJENsYXNzTmFtZTJJRHskQ2xhc3N9ICkgewogICAgICAgICAgICBteSAkSUQgPSAkQ2xhc3NOYW1lMklEeyRDbGFzc307CgogICAgICAgICAgICAjIGdldCBpZHMgb2YgdGhpcyBjbGFzcycgY29uZmlnIGl0ZW1zCiAgICAgICAgICAgICRTZWxmLT57U2VhcmNoQ3JpdGVyaWF9LT57Q2xhc3NJRHN9ID0gWyRJRF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkaWUgIkNsYXNzICRDbGFzcyBkb2VzIG5vdCBleGlzdC4uLlxuIjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPlByaW50KCI8eWVsbG93Pkxpc3RpbmcgZHVwbGljYXRlcyBvZiBjb25maWcgaXRlbXMuLi48L3llbGxvdz5cblxuIik7CgogICAgaWYgKCAhJFNlbGYtPkdldE9wdGlvbignYWxsLXN0YXRlcycpICkgewoKICAgICAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdwcmVwcm9kdWN0aXZlJywgJ3Byb2R1Y3RpdmUnIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJERlcGxveW1lbnRTdGF0ZUlEcyA9IFsga2V5cyAleyRTdGF0ZUxpc3R9IF07CgogICAgICAgICRTZWxmLT57U2VhcmNoQ3JpdGVyaWF9LT57RGVwbFN0YXRlSURzfSA9IFsga2V5cyAleyRTdGF0ZUxpc3R9IF07CgogICAgfQoKICAgICMgZ2V0IElUU01Db25maWdpdGVtIG9iamVjdAogICAgbXkgJElUU01Db25maWdpdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgogICAgIyBnZXQgYWxsIGNvbmZpZyBpdGVtcyBpZHMKICAgIG15IEBDb25maWdJdGVtSURzID0gQHsgJElUU01Db25maWdpdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKCAleyAkU2VsZi0+e1NlYXJjaENyaXRlcmlhfSB9ICkgfTsKCiAgICAjIGdldCBudW1iZXIgb2YgY29uZmlnIGl0ZW1zCiAgICBteSAkQ0lDb3VudCA9IHNjYWxhciBAQ29uZmlnSXRlbUlEczsKCiAgICAjIGdldCBjbGFzcyBhcmd1bWVudAogICAgbXkgJENsYXNzID0gJFNlbGYtPkdldE9wdGlvbignY2xhc3MnKSAvLyAnJzsKCiAgICAjIGlmIHRoZXJlIGFyZSBhbnkgQ0kgdG8gY2hlY2sKICAgIGlmICgkQ0lDb3VudCkgewoKICAgICAgICAjIGlmIHRoZSBzY29wZSB3YXMgZXhwbGljaXRlbHkgZGVmaW5lZCwgc2V0IGl0LCBvdGhlcndpc2UgdGhpcyBzY3JpcHQgd2lsbCBmYWxsIGJhY2sgdG8gdGhlCiAgICAgICAgIyB2YWx1ZSBzZXQgaW4gU3lzQ29uZmlnCiAgICAgICAgbXkgJFNjb3BlID0gJFNlbGYtPkdldE9wdGlvbignc2NvcGUnKTsKICAgICAgICBpZiAoJFNjb3BlKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPlNldCgKICAgICAgICAgICAgICAgIEtleSAgID0+ICdVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTY29wZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkQ2xhc3MpIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkNoZWNraW5nIGNvbmZpZyBpdGVtcyBvZiBjbGFzcyAkQ2xhc3MuLi48L3llbGxvdz5cbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkNoZWNraW5nIGFsbCBjb25maWcgaXRlbXMuLi5cbjwveWVsbG93PlxuIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+UHJpbnQoICI8Z3JlZW4+IiAuICggJz0nIHggNjkgKSAuICI8L2dyZWVuPlxuIiApOwoKICAgICAgICBteSAkRHVwbGljYXRlc0ZvdW5kID0gMDsKCiAgICAgICAgIyBjaGVjayBjb25maWcgaXRlbXMKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtID0gJElUU01Db25maWdpdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJENvbmZpZ0l0ZW0tPntMYXN0VmVyc2lvbklEfTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICAgICAgICAgIG15ICRWZXJzaW9uID0gJElUU01Db25maWdpdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEICA9PiAkQ29uZmlnSXRlbS0+e0xhc3RWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgWE1MRGF0YUdldCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uOwoKICAgICAgICAgICAgaWYgKCAhJFZlcnNpb24tPntOYW1lfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5Ta2lwcGluZyBDb25maWdJdGVtICRDb25maWdJdGVtSUQgYXMgaXQgZG9lc24ndCBoYXZlIGEgbmFtZS5cbjwvcmVkPlxuIik7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJER1cGxpY2F0ZXMgPSAkSVRTTUNvbmZpZ2l0ZW1PYmplY3QtPlVuaXF1ZU5hbWVDaGVjaygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFZlcnNpb24tPntOYW1lfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER1cGxpY2F0ZXMpICkgewoKICAgICAgICAgICAgICAgICREdXBsaWNhdGVzRm91bmQgPSAxOwoKICAgICAgICAgICAgICAgIG15IEBEdXBsaWNhdGVEYXRhOwoKICAgICAgICAgICAgICAgIGZvciBteSAkRHVwbGljYXRlSUQgKCBAeyREdXBsaWNhdGVzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlICMgb2YgdGhlIGR1cGxpY2F0ZQogICAgICAgICAgICAgICAgICAgIG15ICREdXBsaWNhdGVDb25maWdJdGVtID0gJElUU01Db25maWdpdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICREdXBsaWNhdGVWZXJzaW9uID0gJElUU01Db25maWdpdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJER1cGxpY2F0ZUNvbmZpZ0l0ZW0tPntMYXN0VmVyc2lvbklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEdXBsaWNhdGVEYXRhLCAkRHVwbGljYXRlVmVyc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAgICAgIjx5ZWxsb3c+Q29uZmlnSXRlbSAkVmVyc2lvbi0+e051bWJlcn0gKE5hbWU6ICRWZXJzaW9uLT57TmFtZX0sIENvbmZpZ0l0ZW1JRDogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIkVmVyc2lvbi0+e0NvbmZpZ0l0ZW1JRH0pIGhhcyB0aGUgZm9sbG93aW5nIGR1cGxpY2F0ZXM6PC95ZWxsb3c+XG4iCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgbGlzdCBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGR1cGxpY2F0ZXMKICAgICAgICAgICAgICAgIGZvciBteSAkRHVwbGljYXRlVmVyc2lvbiAoQER1cGxpY2F0ZURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4iOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICAgICAgICAgIjxncmVlbj5cdCAqICREdXBsaWNhdGVWZXJzaW9uLT57TnVtYmVyfSAoQ29uZmlnSXRlbUlEOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkRHVwbGljYXRlVmVyc2lvbi0+e0NvbmZpZ0l0ZW1JRH0pPC9ncmVlbj5cbiIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnLScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkRHVwbGljYXRlc0ZvdW5kKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkZpbmlzaGVkIGNoZWNraW5nIGZvciBkdXBsaWNhdGUgbmFtZXMuXG48L2dyZWVuPlxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gZHVwbGljYXRlIG5hbWVzIGZvdW5kLlxuPC95ZWxsb3c+XG4iKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+VGhlcmUgYXJlIE5PIGNvbmZpZyBpdGVtcyB0byBjaGVjay5cbjwveWVsbG93PlxuIik7CiAgICB9CgogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RG9uZS48L2dyZWVuPlxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKCn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6Q29uZmlnaXRlbTo6RGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdEZWxldGUgY29uZmlnIGl0ZW1zIChhbGwsIGJ5IGNsYXNzIChhbmQgZGVwbG95bWVudCBzdGF0ZSkgb3IgYnkgbnVtYmVyKS4nKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2FsbCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkRlbGV0ZSBhbGwgY29uZmlnIGl0ZW1zIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwogICAgJFNlbGYtPkFkZEFyZ3VtZW50KAogICAgICAgIE5hbWUgICAgICAgID0+ICdhY2NlcHQnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJBY2NlcHQgZGVsZXRlIGFsbCBvciBjYW5jZWwuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLyh5fG4pL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdjbGFzcycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkRlbGV0ZSBhbGwgY29uZmlnIGl0ZW1zIG9mIHRoaXMgY2xhc3MuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLiovc214LAogICAgKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2RlcGxveW1lbnQtc3RhdGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJEZWxldGUgYWxsIGNvbmZpZyBpdGVtcyB3aXRoIHRoaXMgZGVwbG95bWVudCBzdGF0ZSAoT05MWSBUT0dFVEhFUiB3aXRoIHRoZSAtLWNsYXNzIHBhcmFtZXRlcikiLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKi9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnY29uZmlnaXRlbS1udW1iZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJEZWxldGUgbGlzdGVkIGNvbmZpZyBpdGVtcyIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL1xkKy9zbXgsCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdhbGwtb2xkLXZlcnNpb25zJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiRGVsZXRlIGFsbCBjb25maWcgaXRlbSB2ZXJzaW9ucyBleGNlcHQgdGhlIG5ld2VzdCB2ZXJzaW9uIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnYWxsLWJ1dC1rZWVwLWxhc3QtdmVyc2lvbnMnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJEZWxldGUgYWxsIGNvbmZpZyBpdGVtIHZlcnNpb25zIGJ1dCBrZWVwIHRoZSBsYXN0IFhYIHZlcnNpb25zIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvXGQrL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdhbGwtb2xkZXItdGhhbi1kYXlzLXZlcnNpb25zJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiRGVsZXRlIGFsbCBjb25maWcgaXRlbSB2ZXJzaW9ucyBvbGRlciB0aGFuIFhYIGRheXMiLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci9cZCsvc214LAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQWxsICAgICAgICAgICAgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdhbGwnKTsKICAgIG15ICRDbGFzcyAgICAgICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ2NsYXNzJykgLy8gJyc7CiAgICBteSBAQ29uZmlnSXRlbU51bWJlcnMgPSBAeyAkU2VsZi0+R2V0T3B0aW9uKCdjb25maWdpdGVtLW51bWJlcicpIC8vIFtdIH07CiAgICBteSAkRGVwbG95bWVudFN0YXRlICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdkZXBsb3ltZW50LXN0YXRlJykgLy8gJyc7CiAgICBteSAkQWxsT2xkVmVyc2lvbnMgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdhbGwtb2xkLXZlcnNpb25zJykgLy8gJyc7CiAgICBteSAkQWxsQnV0S2VlcExhc3QgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdhbGwtYnV0LWtlZXAtbGFzdC12ZXJzaW9ucycpIC8vICcnOwogICAgbXkgJEFsbE9sZGVyVGhhbkRheXMgID0gJFNlbGYtPkdldE9wdGlvbignYWxsLW9sZGVyLXRoYW4tZGF5cy12ZXJzaW9ucycpIC8vICcnOwoKICAgIGlmICgKICAgICAgICAhJEFsbAogICAgICAgICYmICEkQ2xhc3MKICAgICAgICAmJiAhQENvbmZpZ0l0ZW1OdW1iZXJzCiAgICAgICAgJiYgISREZXBsb3ltZW50U3RhdGUKICAgICAgICAmJiAhJEFsbE9sZFZlcnNpb25zCiAgICAgICAgJiYgISRBbGxCdXRLZWVwTGFzdAogICAgICAgICYmICEkQWxsT2xkZXJUaGFuRGF5cwogICAgICAgICkKICAgIHsKICAgICAgICBkaWUKICAgICAgICAgICAgIlBsZWFzZSBwcm92aWRlIG9wdGlvbiAtLWFsbCwgLS1jbGFzcywgLS1jb25maWdpdGVtLW51bWJlciwgLS1hbGwtb2xkLXZlcnNpb25zLCAtLWFsbC1idXQta2VlcC1sYXN0LXZlcnNpb25zIG9yIC0tYWxsLW9sZGVyLXRoYW4tZGF5cy12ZXJzaW9ucy4iCiAgICAgICAgICAgIC4gIiBGb3IgbW9yZSBkZXRhaWxzIHVzZSAtLWhlbHBcbiI7CiAgICB9CgogICAgaWYgKCAkRGVwbG95bWVudFN0YXRlICYmICEkQ2xhc3MgKSB7CiAgICAgICAgZGllCiAgICAgICAgICAgICJEZWxldGluZyBhbGwgY29uZmlnIGl0ZW1zIHdpdGggdGhpcyBkZXBsb3ltZW50IHN0YXRlIGlzIHBvc2libGUgT05MWSBUT0dFVEhFUiB3aXRoIHRoZSAtLWNsYXNzIHBhcmFtZXRlci4gXG5Gb3IgbW9yZSBkZXRhaWxzIHVzZSAtLWhlbHBcbiI7CiAgICB9CgogICAgcmV0dXJuOwoKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5EZWxldGluZyBjb25maWcgaXRlbXMuLi48L3llbGxvdz5cblxuIik7CgogICAgbXkgJEFsbCAgICAgICAgICAgICAgID0gJFNlbGYtPkdldE9wdGlvbignYWxsJyk7CiAgICBteSAkQ2xhc3MgICAgICAgICAgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdjbGFzcycpIC8vICcnOwogICAgbXkgQENvbmZpZ0l0ZW1OdW1iZXJzID0gQHsgJFNlbGYtPkdldE9wdGlvbignY29uZmlnaXRlbS1udW1iZXInKSAvLyBbXSB9OwogICAgbXkgJERlcGxveW1lbnRTdGF0ZSAgID0gJFNlbGYtPkdldE9wdGlvbignZGVwbG95bWVudC1zdGF0ZScpIC8vICcnOwogICAgbXkgJEFsbE9sZFZlcnNpb25zICAgID0gJFNlbGYtPkdldE9wdGlvbignYWxsLW9sZC12ZXJzaW9ucycpIC8vICcnOwogICAgbXkgJEFsbEJ1dEtlZXBMYXN0ICAgID0gJFNlbGYtPkdldE9wdGlvbignYWxsLWJ1dC1rZWVwLWxhc3QtdmVyc2lvbnMnKSAvLyAnJzsKICAgIG15ICRBbGxPbGRlclRoYW5EYXlzICA9ICRTZWxmLT5HZXRPcHRpb24oJ2FsbC1vbGRlci10aGFuLWRheXMtdmVyc2lvbnMnKSAvLyAnJzsKCiAgICAjIGRlbGV0ZSBhbGwgY29uZmlnIGl0ZW1zCiAgICBpZiAoJEFsbCkgewoKICAgICAgICAjIGdldCBhbGwgY29uZmlnIGl0ZW1zIGlkcwogICAgICAgIG15IEBDb25maWdJdGVtSURzID0gQHsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1TZWFyY2goKSB9OwoKICAgICAgICAjIGdldCBudW1iZXIgb2YgY29uZmlnIGl0ZW1zCiAgICAgICAgbXkgJENJQ291bnQgPSBzY2FsYXIgQENvbmZpZ0l0ZW1JRHM7CgogICAgICAgICMgaWYgdGhlcmUgYXJlIGFueSBDSSB0byBkZWxldGUKICAgICAgICBpZiAoJENJQ291bnQpIHsKCiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5BcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgQUxMICRDSUNvdW50IGNvbmZpZyBpdGVtcz88L3llbGxvdz5cbiIpOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+VGhpcyBpcyBpcnJldm9jYWJsZS4gW3kvbl0gPC95ZWxsb3c+XG4iKTsKICAgICAgICAgICAgbXkgJENvbmZpcm1hdGlvbiA9ICRTZWxmLT5HZXRBcmd1bWVudCgnYWNjZXB0Jyk7CiAgICAgICAgICAgIGNob21wKCAkQ29uZmlybWF0aW9uID0gbGMgPFNURElOPiApIGlmICFkZWZpbmVkICRDb25maXJtYXRpb247CgogICAgICAgICAgICAjIGlmIHRoZSB1c2VyIGNvbmZpcm1zIHRoZSBkZWxldGlvbgogICAgICAgICAgICBpZiAoICRDb25maXJtYXRpb24gZXEgJ3knICkgewoKICAgICAgICAgICAgICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtcwogICAgICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RGVsZXRpbmcgYWxsIGNvbmZpZyBpdGVtcy4uLjwvZ3JlZW4+XG4iKTsKICAgICAgICAgICAgICAgICRTZWxmLT5EZWxldGVDb25maWdJdGVtcyggQ29uZmlnSXRlbUlEcyA9PiBcQENvbmZpZ0l0ZW1JRHMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5Db21tYW5kIGRlbGV0ZSB3YXMgY2FuY2VsZWQ8L3llbGxvdz5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5UaGVyZSBhcmUgTk8gY29uZmlnIGl0ZW1zIHRvIGRlbGV0ZS48L3llbGxvdz5cbiIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBsaXN0ZWQgY29uZmlnIGl0ZW1zCiAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggXEBDb25maWdJdGVtTnVtYmVycyApICkgewoKICAgICAgICBteSBAQ29uZmlnSXRlbUlEczsKCiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtTnVtYmVyIChAQ29uZmlnSXRlbU51bWJlcnMpIHsKCiAgICAgICAgICAgICMgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlnIGl0ZW0gaWQKICAgICAgICAgICAgbXkgJElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJRCkgewogICAgICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJElEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PlVuYWJsZSB0byBmaW5kIGNvbmZpZyBpdGVtICRDb25maWdJdGVtTnVtYmVyLjwveWVsbG93PlxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtcyAoaWYgYW55IHZhbGlkIG51bWJlciB3YXMgZ2l2ZW4pCiAgICAgICAgaWYgKEBDb25maWdJdGVtSURzKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5EZWxldGluZyBzcGVjaWZpZWQgY29uZmlnIGl0ZW1zLi4uPC95ZWxsb3c+XG4iKTsKICAgICAgICAgICAgJFNlbGYtPkRlbGV0ZUNvbmZpZ0l0ZW1zKCBDb25maWdJdGVtSURzID0+IFxAQ29uZmlnSXRlbUlEcyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBjb25maWcgaXRlbXMgdGhhdCBiZWxvbmcgdG8gdGhlIGNsYXNzCiAgICBlbHNpZiAoJENsYXNzKSB7CgogICAgICAgIG15IEBDb25maWdJdGVtSURzOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGludmVydCB0aGUgaGFzaCB0byBoYXZlIHRoZSBjbGFzc2VzIG5hbWVzIGFzIGtleXMKICAgICAgICBteSAlQ2xhc3NOYW1lMklEID0gcmV2ZXJzZSAleyRDbGFzc0xpc3R9OwoKICAgICAgICBpZiAoICRDbGFzc05hbWUySUR7JENsYXNzfSApIHsKICAgICAgICAgICAgbXkgJElEID0gJENsYXNzTmFtZTJJRHskQ2xhc3N9OwoKICAgICAgICAgICAgIyBkZWZpbmUgdGhlIHNlYXJjaCBwYXJhbSBmb3IgdGhlIGNsYXNzIHNlYXJjaAogICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAoCiAgICAgICAgICAgICAgICBDbGFzc0lEcyA9PiBbJElEXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWxzbyBhIGRlcGxveW1lbnQgc3RhdGUgaXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCREZXBsb3ltZW50U3RhdGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgICAgIG15ICREZXBsb3ltZW50U3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGludmVydCB0aGUgaGFzaCB0byBoYXZlIHRoZSBkZXBsb3ltZW50IHN0YXRlIG5hbWVzIGFzIGtleXMKICAgICAgICAgICAgICAgIG15ICVEZXBsb3ltZW50U3RhdGUySUQgPSByZXZlcnNlICV7JERlcGxveW1lbnRTdGF0ZUxpc3R9OwoKICAgICAgICAgICAgICAgICMgaWYgdGhlIGRlcGxveW1lbnQgc3RhdGUgaXMgdmFsaWQKICAgICAgICAgICAgICAgIGlmICggJERlcGxveW1lbnRTdGF0ZTJJRHskRGVwbG95bWVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGRlcGxveW1lbnQgc3RhdGUgaWQKICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkRGVwbG95bWVudFN0YXRlMklEeyREZXBsb3ltZW50U3RhdGV9OwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBzZWFyY2ggcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFte0RlcGxTdGF0ZUlEc30gPSBbJElEXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJVbmFibGUgdG8gZmluZCBkZXBsb3ltZW50IHN0YXRlICREZXBsb3ltZW50U3RhdGUuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGlkcyBvZiB0aGlzIGNsYXNzIChhbmQgbWF5YmUgZGVwbG95bWVudCBzdGF0ZSkgY29uZmlnIGl0ZW1zCiAgICAgICAgICAgIEBDb25maWdJdGVtSURzID0gQHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtU2VhcmNoKCVTZWFyY2hQYXJhbSkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJVbmFibGUgdG8gZmluZCBjbGFzcyBuYW1lICRDbGFzcy4iKTsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjb25maWcgaXRlbXMgKGlmIGFueSB2YWxpZCBudW1iZXIgd2FzIGdpdmVuKQogICAgICAgIGlmIChAQ29uZmlnSXRlbUlEcykgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+RGVsZXRpbmcgY29uZmlnIGl0ZW1zIHRoYXQgYmVsb25nIHRvIHRoZSBjbGFzcyAkQ2xhc3MuLi48L3llbGxvdz5cbiIpOwogICAgICAgICAgICAkU2VsZi0+RGVsZXRlQ29uZmlnSXRlbXMoIENvbmZpZ0l0ZW1JRHMgPT4gXEBDb25maWdJdGVtSURzICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+VGhlcmUgYXJlIG5vIGNvbmZpZyBpdGVtcyB0aGF0IGJlbG9uZyB0byB0aGUgY2xhc3MgJENsYXNzLi4uPC95ZWxsb3c+XG4iKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgdmVyc2lvbnMgb2xkZXIgdGhhbiB4eCBkYXlzIGZyb20gYWxsIGNvbmZpZyBpdGVtcwogICAgZWxzaWYgKCRBbGxPbGRlclRoYW5EYXlzKSB7CgogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U3lzdGVtVGltZSgpOwogICAgICAgIG15ICRPbGRlckRhdGUgID0gJFN5c3RlbVRpbWUgLSAoIDYwICogNjAgKiAyNCAqICRBbGxPbGRlclRoYW5EYXlzICk7CiAgICAgICAgJE9sZGVyRGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRPbGRlckRhdGUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFZlcnNpb25zT2xkZXJEYXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25MaXN0QWxsKAogICAgICAgICAgICBPbGRlckRhdGUgPT4gJE9sZGVyRGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIFdlIG5lZWQgdG8gZ2V0IGFsbCB2ZXJzaW9ucyB0byBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgdmVyc2lvbiByZW1haW5zCiAgICAgICAgIyAtPiBpZiBvbmUgdmVyc2lvbiBvZiBhIGNvbmZpZ2l0ZW0gaXMgeW91bmdlciB0aGFuIHRoZSBhbW91bnQgb2YgZGF5cywKICAgICAgICAjICAgIHdlIGNhbiBkZWxldGUgYWxsIFZlcnNpb25zIHJlY2VpdmVkIGJ5IHRoZSAiT2xkZXJEYXRlIiBxdWVyeQogICAgICAgICMgLT4gaWYgbm8gdmVyc2lvbiBpcyB5b3VuZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBkYXlzCiAgICAgICAgIyAgICB3ZSBoYXZlIHRvIGtlZXAgb25lIHZlcnNpb24gb2YgdGhlICJPbGRlckRhdGUiIHF1ZXJ5IHJlc3VsdAogICAgICAgIG15ICRWZXJzaW9uc0FsbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5WZXJzaW9uTGlzdEFsbCgpOwoKICAgICAgICBteSBAVmVyc2lvbnNUb0RlbGV0ZTsKCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICV7JFZlcnNpb25zT2xkZXJEYXRlfSApIHsKCiAgICAgICAgICAgICMgbnVtYmVyIG9mIGZvdW5kIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgQ0kKICAgICAgICAgICAgbXkgJE51bWJlck9mT2xkZXJWZXJzaW9ucyA9IHNjYWxhciBrZXlzICV7ICRWZXJzaW9uc09sZGVyRGF0ZS0+eyRDb25maWdJdGVtSUR9IH07CgogICAgICAgICAgICAjIG51bWJlciBvZiBhbGwgdmVyc2lvbnMgb2YgdGhpcyBDSQogICAgICAgICAgICBteSAkTnVtYmVyT2ZBbGxWZXJzaW9ucyA9IHNjYWxhciBrZXlzICV7ICRWZXJzaW9uc0FsbC0+eyRDb25maWdJdGVtSUR9IH07CgogICAgICAgICAgICAjIG5leHQgaWYgdGhlcmUgYXJlIG5vIG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkTnVtYmVyT2ZPbGRlclZlcnNpb25zOwoKICAgICAgICAgICAgIyBuZXh0IGlmIHRoZXJlIGlzIG9ubHkgb25lIG9yIHplcm8gb2YgYWxsIHZlcnNpb25zCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICROdW1iZXJPZkFsbFZlcnNpb25zIDw9IDE7CgogICAgICAgICAgICAjIGlmIHRoZSBhbW91bnQgb2YgVmVyc2lvbnMgd2UgaGF2ZSB0byBkZWxldGUKICAgICAgICAgICAgIyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBhbW91bnQgb2YgQWxsVmVyc2lvbnMKICAgICAgICAgICAgIyB3ZSBoYXZlIHRvIGtlZXAgdGhlIGxhc3Qgb25lCiAgICAgICAgICAgICMgaW4gb3JkZXIgdG8ga2VlcCB0aGUgc3lzdGVtIHdvcmtpbmcKICAgICAgICAgICAgIwogICAgICAgICAgICAjIC0+IHNvIGxldCdzIHN0YXJ0IGNvdW50aW5nIGF0ICIxIiBpbnN0ZWFkIG9mICIwIgogICAgICAgICAgICAjIGluIG9yZGVyIHRvIHN0b3AgZGVsZXRpbmcgYmVmb3JlIHdlIHJlYWNoIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICAgICBpZiAoICROdW1iZXJPZk9sZGVyVmVyc2lvbnMgPT0gJE51bWJlck9mQWxsVmVyc2lvbnMgKSB7CiAgICAgICAgICAgICAgICAkQ291bnQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IHRoZSB2ZXJzaW9ucyBhcmUgbnVtZXJpY2FsbHkgc29ydGVkCiAgICAgICAgICAgIGZvciBteSAkVmVyc2lvbiAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7ICRWZXJzaW9uc09sZGVyRGF0ZS0+eyRDb25maWdJdGVtSUR9IH0gKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkQ291bnQgPCAkTnVtYmVyT2ZPbGRlclZlcnNpb25zICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZlcnNpb25zVG9EZWxldGUsICRWZXJzaW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5EZWxldGVDb25maWdJdGVtVmVyc2lvbnMoCiAgICAgICAgICAgIFZlcnNpb25JRHMgPT4gXEBWZXJzaW9uc1RvRGVsZXRlLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBhbGwgY29uZmlnIGl0ZW0gdmVyc2lvbnMgZXhjZXB0IHRoZSBuZXdlc3QgdmVyc2lvbgogICAgZWxzaWYgKCRBbGxPbGRWZXJzaW9ucykgewoKICAgICAgICBteSAkVmVyc2lvbnNBbGwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+VmVyc2lvbkxpc3RBbGwoKTsKCiAgICAgICAgbXkgQFZlcnNpb25zVG9EZWxldGU7CiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkVmVyc2lvbnNBbGwpICkgewoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAleyRWZXJzaW9uc0FsbH0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkVmVyc2lvbnNBbGwtPnskQ29uZmlnSXRlbUlEfSApOwoKICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgdGhlIHZlcnNpb25zIGFyZSBudW1lcmljYWxseSBzb3J0ZWQKICAgICAgICAgICAgICAgIG15IEBSZWR1Y2VkVmVyc2lvbnMgPSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyAkVmVyc2lvbnNBbGwtPnskQ29uZmlnSXRlbUlEfSB9OwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBsYXN0IChuZXdlc3QpIHZlcnNpb24KICAgICAgICAgICAgICAgIHBvcCBAUmVkdWNlZFZlcnNpb25zOwoKICAgICAgICAgICAgICAgIHB1c2ggQFZlcnNpb25zVG9EZWxldGUsIEBSZWR1Y2VkVmVyc2lvbnM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5EZWxldGVDb25maWdJdGVtVmVyc2lvbnMoCiAgICAgICAgICAgIFZlcnNpb25JRHMgPT4gXEBWZXJzaW9uc1RvRGVsZXRlLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBhbGwgY29uZmlnIGl0ZW0gdmVyc2lvbnMgYnV0IGtlZXAgdGhlIGxhc3QgWFggdmVyc2lvbnMKICAgIGVsc2lmICgkQWxsQnV0S2VlcExhc3QpIHsKCiAgICAgICAgbXkgJFZlcnNpb25zQWxsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25MaXN0QWxsKCk7CgogICAgICAgIG15IEBWZXJzaW9uc1RvRGVsZXRlOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRWZXJzaW9uc0FsbCkgKSB7CgogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICV7JFZlcnNpb25zQWxsfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRWZXJzaW9uc0FsbC0+eyRDb25maWdJdGVtSUR9ICk7CgogICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCB0aGUgdmVyc2lvbnMgYXJlIG51bWVyaWNhbGx5IHJldmVyc2Ugc29ydGVkCiAgICAgICAgICAgICAgICBteSBAUmVkdWNlZFZlcnNpb25zID0gcmV2ZXJzZSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyAkVmVyc2lvbnNBbGwtPnskQ29uZmlnSXRlbUlEfSB9OwoKICAgICAgICAgICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBAUmVkdWNlZFZlcnNpb25zID0gZ3JlcCB7ICRDb3VudCsrOyAkQ291bnQgPiAkQWxsQnV0S2VlcExhc3QgfSBAUmVkdWNlZFZlcnNpb25zOwogICAgICAgICAgICAgICAgcHVzaCBAVmVyc2lvbnNUb0RlbGV0ZSwgQFJlZHVjZWRWZXJzaW9uczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkRlbGV0ZUNvbmZpZ0l0ZW1WZXJzaW9ucygKICAgICAgICAgICAgVmVyc2lvbklEcyA9PiBcQFZlcnNpb25zVG9EZWxldGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIk5vIGNvbmZpZyBpdGVtIGZvciBkZWxldGUuIik7CiAgICB9CgogICAgIyBzaG93IHN1Y2Nlc3NmdWxsIG91dHB1dAogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RG9uZS48L2dyZWVuPlxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKfQoKc3ViIERlbGV0ZUNvbmZpZ0l0ZW1zIHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREZWxldGVkQ0k7CiAgICBteSBAQ29uZmlnSXRlbU51bWJlcnMgPSBAeyAkU2VsZi0+R2V0T3B0aW9uKCdjb25maWdpdGVtLW51bWJlcicpIC8vIFtdIH07CgogICAgIyBkZWxldGUgc3BlY2lmaWVkIGNvbmZpZyBpdGVtcwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyAkUGFyYW17Q29uZmlnSXRlbUlEc30gfSApIHsKICAgICAgICBteSAkVHJ1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkVHJ1ZSApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIlVuYWJsZSB0byBkZWxldGUgY29uZmlnIGl0ZW0gd2l0aCBpZCAkQ29uZmlnSXRlbUlELiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERlbGV0ZWRDSSsrOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5EZWxldGVkICREZWxldGVkQ0kgY29uZmlnIGl0ZW0ocykuPC9ncmVlbj5cblxuIik7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBEZWxldGVDb25maWdJdGVtVmVyc2lvbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtWZXJzaW9uSURzfSApOwoKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRlbGV0aW5nIGNvbmZpZyBpdGVtIHZlcnNpb25zLjwvZ3JlZW4+XG5cbiIpOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5WZXJzaW9uRGVsZXRlKAogICAgICAgIFZlcnNpb25JRHMgPT4gJFBhcmFte1ZlcnNpb25JRHN9LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6SW5jaWRlbnRTdGF0ZTo6UmVjYWxjdWxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ1JlY2FsY3VsYXRlcyB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgY29uZmlnIGl0ZW1zLicpOwoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5SZWNhbGN1bGF0aW5nIHRoZSBpbmNpZGVudCBzdGF0ZSBvZiBjb25maWcgaXRlbXMuLi48L3llbGxvdz5cblxuIik7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGdldCB0aGUgdmFsaWQgY2xhc3MgaWRzCiAgICBteSBAVmFsaWRDbGFzc0lEcyA9IHNvcnQga2V5cyAleyRDbGFzc0xpc3R9OwoKICAgICMgZ2V0IGFsbCBjb25maWcgaXRlbXMgaWRzIGZvcm0gYWxsIHZhbGlkIGNsYXNzZXMKICAgIG15ICRDb25maWdJdGVtc0lEc1JlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFxAVmFsaWRDbGFzc0lEcywKICAgICk7CgogICAgIyBnZXQgbnVtYmVyIG9mIGNvbmZpZyBpdGVtcwogICAgbXkgJENJQ291bnQgPSBzY2FsYXIgQHskQ29uZmlnSXRlbXNJRHNSZWZ9OwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5SZWNhbGN1bGF0aW5nIGluY2lkZW50IHN0YXRlIGZvciAkQ0lDb3VudCBjb25maWcgaXRlbXMuPC95ZWxsb3c+XG4iKTsKCiAgICBteSAkQ291bnQgPSAwOwogICAgQ09ORklHSVRFTToKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbXNJRHNSZWZ9ICkgewoKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+Li4uIGNvdWxkIG5vdCByZWNhbGN1bGF0ZSBpbmNpZGVudCBzdGF0ZSBmb3IgY29uZmlnIGl0ZW0gaWQgJyRDb25maWdJdGVtSUQnITwvcmVkPlxuIik7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTTsKICAgICAgICB9CgogICAgICAgICRDb3VudCsrOwoKICAgICAgICBpZiAoICRDb3VudCAlIDEwMCA9PSAwICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj4uLi4gJENvdW50IGNvbmZpZyBpdGVtcyByZWNhbGN1bGF0ZWQuPC9ncmVlbj5cbiIpOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIlxuPGdyZWVuPlJlYWR5LiBSZWNhbGN1bGF0ZWQgJENvdW50IGNvbmZpZyBpdGVtcy48L2dyZWVuPlxuXG4iKTsKCiAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgICMgZ2V0IGxpc3Qgb2YgYWxsIHNlcnZpY2VzICh2YWxpZCBhbmQgaW52YWxpZCkKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgJE51bWJlck9mU2VydmljZXMgPSBzY2FsYXIga2V5cyAlU2VydmljZUxpc3Q7CgogICAgJFNlbGYtPlByaW50KAogICAgICAgICI8Z3JlZW4+UmVzZXR0aW5nIFNlcnZpY2VQcmVmZXJlbmNlcyAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnIGZvciAkTnVtYmVyT2ZTZXJ2aWNlcyBzZXJ2aWNlcy4uLjwvZ3JlZW4+XG4iCiAgICApOwoKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgIyB1cGRhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmcm9tIENJcyBvZiB0aGUgc2VydmljZSB3aXRoIGFuIGVtcHR5IHZhbHVlCiAgICAgICAgIyB0aGlzIGlzIG5lY2Vzc2FyeSB0byBmb3JjZSBhIHJlY2FsY3VsYXRpb24gb24gYSBTZXJ2aWNlR2V0KCkKICAgICAgICAkU2VydmljZU9iamVjdC0+U2VydmljZVByZWZlcmVuY2VzU2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAnJywKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5SZWFkeS48L2dyZWVuPlxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKCn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6SVRTTTo6Q29uZmlnaXRlbTo6RGVmaW5pdGlvblBlcmwyWUFNTDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpCYXNlQ29tbWFuZCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6WUFNTCcsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdDb252ZXJ0IGNvbmZpZyBpdGVtcyBkZWZpbml0aW9ucyBmcm9tIGxlZ2FjeSBQZXJsIGNvZGUgdG8gYSBZQU1MIHN0cnVjdHVyZS4nKTsKCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Q29udmVydGluZyBjb25maWcgaXRlbSBkZWZpbml0aW9ucy4uLjwveWVsbG93PlxuXG4iKTsKCiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgVmFsaWQgPT4gMCwKCiAgICAgICAgI1ByZWZlcmVuY2VzICAgPT4geyB9LAogICAgKTsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiCiAgICAgICAgICAgIFNFTEVDVCBpZCwgY2xhc3NfaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbgogICAgICAgICAgICBGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbgogICAgICAgICAgICBXSEVSRSBjb25maWdpdGVtX2RlZmluaXRpb24gTk9UIExJS0UgJy0tLSUnCiAgICAgICAgICAgIE9SREVSIEJZIGNsYXNzX2lkIEFTQywgdmVyc2lvbiBBU0MiLAogICAgKTsKCiAgICBteSBARGVmaW5pdGlvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVEZWZpbml0aW9uOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREZWZpbml0aW9ue0NsYXNzSUR9ICAgICAgPSAkUm93WzFdOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb259ICAgPSAkUm93WzJdOwogICAgICAgICREZWZpbml0aW9ue1ZlcnNpb259ICAgICAgPSAkUm93WzNdOwoKICAgICAgICBwdXNoIEBEZWZpbml0aW9uTGlzdCwgXCVEZWZpbml0aW9uOwogICAgfQoKICAgIGlmICggIXNjYWxhciBARGVmaW5pdGlvbkxpc3QgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCIgIE5vIGNvbmZpZyBpdGVtcyB1c2luZyBsZWdhY3kgUGVybCBjb2RlIGZvdW5kXG5cbiIpOwoKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKICAgIH0KCiAgICBteSAkU3VjY2VzcyAgICA9IDE7CiAgICBteSAkWUFNTE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyk7CgogICAgREVGSU5JVElPTjoKICAgIGZvciBteSAkRGVmaW5pdGlvbiAoQERlZmluaXRpb25MaXN0KSB7CgogICAgICAgIG15ICRDdXJyZW50UmVjb3JkCiAgICAgICAgICAgID0gIiAgIFByb2Nlc3NpbmcgZGVmaW5pdGlvbiBmb3IgY2xhc3M6IDx5ZWxsb3c+JENsYXNzTGlzdC0+eyAkRGVmaW5pdGlvbi0+e0NsYXNzSUR9IH08L3llbGxvdz4gdmVyc2lvbjogPHllbGxvdz4kRGVmaW5pdGlvbi0+e1ZlcnNpb259PC95ZWxsb3c+Li4uIjsKCiAgICAgICAgIyBUcnkgdG8gZXZhbHVhdGUgcGVybCBzdHJ1Y3R1cmUuCiAgICAgICAgbXkgJFBlcmxTdHJ1Y3R1cmUgPSBldmFsICREZWZpbml0aW9uLT57RGVmaW5pdGlvbn07ICAgICMjIG5vIGNyaXRpYwogICAgICAgIGlmICgkQCkgewogICAgICAgICAgICBteSAkRXJyb3IgPSAkQDsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCIkQ3VycmVudFJlY29yZCA8cmVkPkZhaWxlZCBldmFsdWF0ZSBwZXJsIHN0cnVjdHVyZTogJEVycm9yPC9yZWQ+XG4iKTsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAwOwogICAgICAgICAgICBuZXh0IERFRklOSVRJT047CiAgICAgICAgfQoKICAgICAgICAjIFRyeSB0byBjb252ZXJ0IGZyb20gUGVybCB0byBZQU1MLgogICAgICAgIG15ICRZQU1MU3RyID0gJFlBTUxPYmplY3QtPkR1bXAoCiAgICAgICAgICAgIERhdGEgPT4gJFBlcmxTdHJ1Y3R1cmUsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkWUFNTFN0ciApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCIkQ3VycmVudFJlY29yZCA8cmVkPkZhaWxlZCB0byBjb252ZXJ0IHRvIFlBTUw8L3JlZD5cbiIpOwogICAgICAgICAgICAkU3VjY2VzcyA9IDA7CiAgICAgICAgICAgIG5leHQgREVGSU5JVElPTjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBjb25maWdpdGVtX2RlZmluaXRpb24KICAgICAgICAgICAgICAgIFNFVCBjb25maWdpdGVtX2RlZmluaXRpb24gPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRZQU1MU3RyLCBcJERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlByaW50KCIkQ3VycmVudFJlY29yZCA8Z3JlZW4+T0s8L2dyZWVuPlxuIik7CgogICAgfQoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJcblVuYWJsZSB0byBjb252ZXJ0IGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucy4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIlxuPGdyZWVuPkRvbmUuPC9ncmVlbj5cbiIpOwogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIExpc3Q6OlV0aWwgcXcobWluKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbSAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgSVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyB0byBpbXBvcnQgYW5kIGV4cG9ydCBJVFNNIGNvbmZpZyBpdGVtcy4KCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhIHJlZiB0byBhbiBhcnJheSBvZiBoYXNoIHJlZmVyZW5jZXMKCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKSB8fCB7fTsKCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdDbGFzcycpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvdW50TWF4JywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICcxMCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlZ2V4ICAgICAgICA9PiBxcnsgXEEgXGQrIFx6IH14bXMsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDUsCiAgICAgICAgICAgICAgICBEYXRhVHlwZSAgICAgPT4gJ0ludGVnZXJCaWdnZXJUaGFuWmVybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBtYXBwaW5nIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkT2JqZWN0QmFja2VuZC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJE9iamVjdERhdGE7CiAgICByZXR1cm4gW10gaWYgcmVmICRPYmplY3REYXRhIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJE9iamVjdERhdGEtPntDbGFzc0lEfTsKCiAgICAjIGdldCBkZWZpbml0aW9uCiAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbjsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24gbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9OwogICAgcmV0dXJuIFtdIGlmIHJlZiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9IG5lICdBUlJBWSc7CgogICAgbXkgJEVsZW1lbnRMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTnVtYmVyJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdOYW1lJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0RlcGxveW1lbnQgU3RhdGUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICB9LAogICAgXTsKCiAgICAjIGFkZCB4bWwgZWxlbWVudHMKICAgICRTZWxmLT5fTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIEVsZW1lbnRMaXN0ICAgPT4gJEVsZW1lbnRMaXN0LAogICAgICAgIENvdW50TWF4TGltaXQgPT4gJE9iamVjdERhdGEtPntDb3VudE1heH0gfHwgMTAsCiAgICApOwoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0tleScsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnS2V5JyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdJZGVudGlmaWVyJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkT2JqZWN0QmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhOwogICAgcmV0dXJuIFtdIGlmIHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCc7CiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhLT57Q2xhc3NJRH07CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb247CiAgICByZXR1cm4gW10gaWYgcmVmICRYTUxEZWZpbml0aW9uIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSBuZSAnQVJSQVknOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApIHx8IHt9OwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICkgfHwge307CgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdOdW1iZXInKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyNTUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdOYW1lJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gODAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjU1LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdEZXBsb3ltZW50IFN0YXRlJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJbmNpU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0luY2lkZW50IFN0YXRlJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgeG1sIGF0dHJpYnV0ZXMKICAgICRTZWxmLT5fU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkQXR0cmlidXRlTGlzdCwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVMaXN0Owp9Cgo9aXRlbSBFeHBvcnREYXRhR2V0KCkKCmdldCBleHBvcnQgZGF0YSBhcyAyRC1hcnJheS1oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBvYmplY3QgZGF0YQogICAgaWYgKCAhJE9iamVjdERhdGEgfHwgcmVmICRPYmplY3REYXRhIG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdCB8fCByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgY2xhc3MgaWQKICAgIGlmICggISRPYmplY3REYXRhLT57Q2xhc3NJRH0gfHwgISRDbGFzc0xpc3QtPnsgJE9iamVjdERhdGEtPntDbGFzc0lEfSB9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNsYXNzIGlkIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgbWFwcGluZyBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGhlIG1hcHBpbmcgbGlzdAogICAgaWYgKCAhJE1hcHBpbmdMaXN0IHx8IHJlZiAkTWFwcGluZ0xpc3QgbmUgJ0FSUkFZJyB8fCAhQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIG1hcHBpbmcgb2JqZWN0IGxpc3QKICAgIG15IEBNYXBwaW5nT2JqZWN0TGlzdDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YTsKICAgIH0KCiAgICAjIGdldCBzZWFyY2ggZGF0YQogICAgbXkgJFNlYXJjaERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU2VhcmNoRGF0YSB8fCByZWYgJFNlYXJjaERhdGEgbmUgJ0hBU0gnOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdCB8fCByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZ2VuZXJhbCBjYXRhbG9nIGxpc3QgSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIGlmICggISRJbmNpU3RhdGVMaXN0IHx8IHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCcgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uIG9mIHRoaXMgY2xhc3MKICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoUGFyYW1zOwoKICAgICMgYWRkIG51bWJlciB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgaWYgKCAkU2VhcmNoRGF0YS0+e051bWJlcn0gKSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tOdW1iZXJ9ID0gZGVsZXRlICRTZWFyY2hEYXRhLT57TnVtYmVyfTsKICAgIH0KCiAgICAjIGFkZCBuYW1lIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tOYW1lfSA9IGRlbGV0ZSAkU2VhcmNoRGF0YS0+e05hbWV9OwogICAgfQoKICAgICMgYWRkIGRlcGxveW1lbnQgc3RhdGUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIGlmICggJFNlYXJjaERhdGEtPntEZXBsU3RhdGVJRHN9ICkgewogICAgICAgIG15IEBEZXBsU3RhdGVJRHMgPSBzcGxpdCAnIyMjIyMnLCAkU2VhcmNoRGF0YS0+e0RlcGxTdGF0ZUlEc307CiAgICAgICAgJFNlYXJjaFBhcmFtc3tEZXBsU3RhdGVJRHN9ID0gXEBEZXBsU3RhdGVJRHM7CiAgICAgICAgZGVsZXRlICRTZWFyY2hEYXRhLT57RGVwbFN0YXRlSURzfTsKICAgIH0KCiAgICAjIGFkZCBpbmNpZGVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgaWYgKCAkU2VhcmNoRGF0YS0+e0luY2lTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQEluY2lTdGF0ZUlEcyA9IHNwbGl0ICcjIyMjIycsICRTZWFyY2hEYXRhLT57SW5jaVN0YXRlSURzfTsKICAgICAgICAkU2VhcmNoUGFyYW1ze0luY2lTdGF0ZUlEc30gPSBcQEluY2lTdGF0ZUlEczsKICAgICAgICBkZWxldGUgJFNlYXJjaERhdGEtPntJbmNpU3RhdGVJRHN9OwogICAgfQoKICAgICMgYWRkIGFsbCBYTUwgZGF0YSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgbXkgQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAkU2VsZi0+X0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgV2hhdCAgICAgICAgICA9PiBcQFNlYXJjaFBhcmFtc1doYXQsCiAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkU2VhcmNoRGF0YSwKICAgICk7CgogICAgIyBhZGQgWE1MIHNlYXJjaCBwYXJhbXMgdG8gdGhlIHNlYXJjaCBoYXNoCiAgICBpZiAoQFNlYXJjaFBhcmFtc1doYXQpIHsKICAgICAgICAkU2VhcmNoUGFyYW1ze1doYXR9ID0gXEBTZWFyY2hQYXJhbXNXaGF0OwogICAgfQoKICAgICMgc2VhcmNoIHRoZSBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgJVNlYXJjaFBhcmFtcywKICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IF0sCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSBARXhwb3J0RGF0YTsKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbUxpc3R9ICkgewoKICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbkRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uRGF0YTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJzsKCiAgICAgICAgIyB0cmFuc2xhdGUgeG1sZGF0YSB0byBhIDJkIGhhc2gKICAgICAgICBteSAlWE1MRGF0YTJEOwogICAgICAgICRTZWxmLT5fRXhwb3J0WE1MRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0sCiAgICAgICAgICAgIFhNTERhdGEyRCAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZGF0YSB0byB0aGUgZXhwb3J0IGRhdGEgYXJyYXkKICAgICAgICBteSBASXRlbTsKICAgICAgICBNQVBQSU5HT0JKRUNUOgogICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdCAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgICAgICAjIGV4dHJhY3Qga2V5CiAgICAgICAgICAgIG15ICRLZXkgPSAkTWFwcGluZ09iamVjdC0+e0tleX07CgogICAgICAgICAgICAjIGhhbmRsZSBlbXB0eSBrZXkKICAgICAgICAgICAgaWYgKCAhJEtleSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICcnOwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdOdW1iZXInICkgewogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJFZlcnNpb25EYXRhLT57TnVtYmVyfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgY3VycmVudCBjb25maWcgaXRlbSBuYW1lCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkVmVyc2lvbkRhdGEtPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ0RlcGxTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbkRhdGEtPntEZXBsU3RhdGVJRH0gfHw9ICdEVU1NWSc7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkRGVwbFN0YXRlTGlzdC0+eyAkVmVyc2lvbkRhdGEtPntEZXBsU3RhdGVJRH0gfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdJbmNpU3RhdGUnICkgewogICAgICAgICAgICAgICAgJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9IHx8PSAnRFVNTVknOwogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJEluY2lTdGF0ZUxpc3QtPnsgJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9IH07CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGFsbCBYTUwgZGF0YSBlbGVtZW50cwogICAgICAgICAgICBwdXNoIEBJdGVtLCAkWE1MRGF0YTJEeyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgcHVzaCBARXhwb3J0RGF0YSwgXEBJdGVtOwogICAgfQoKICAgIHJldHVybiBcQEV4cG9ydERhdGE7Cn0KCj1pdGVtIEltcG9ydERhdGFTYXZlKCkKCmltcG9ydHMgYSBzaW5nbGUgZW50aXR5IG9mIHRoZSBpbXBvcnQgZGF0YS4gVGhlIEM8VGVtcGxhdGVJRD4gcG9pbnRzIHRvIHRoZSBkZWZpbml0aW9uCm9mIHRoZSBjdXJyZW50IGltcG9ydC4gQzxJbXBvcnREYXRhUm93PiBob2xkcyB0aGUgZGF0YS4gQzxDb3VudGVyPiBpcyBvbmx5IHVzZWQgaW4KZXJyb3IgbWVzc2FnZXMsIGZvciBpbmRpY2F0aW5nIHdoaWNoIGl0ZW0gd2FzIG5vdCBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuCgpUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBjb25maWcgaXRlbSB3aWxsIG5ldmVyIGJlIGRlbGV0ZWQuIFdoZW4gdGhlcmUgYXJlIG5vCmNoYW5nZXMgaW4gdGhlIGRhdGEsIHRoZSBpbXBvcnQgd2lsbCBiZSBza2lwcGVkLiBXaGVuIHRoZXJlIGlzIG5ldyBvciBjaGFuZ2VkIGRhdGEsCnRoZW4gYSBuZXcgY29uZmlnIGl0ZW0gb3IgYSBuZXcgdmVyc2lvbiBpcyBjcmVhdGVkLgoKSW4gdGhlIGNhc2Ugb2YgY2hhbmdlZCBkYXRhLCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGNvbmZpZyBpdGVtIHdpbGwgY29udGFpbiB0aGUKYXR0cmlidXRlcyBvZiB0aGUgQzxJbXBvcnREYXRhUm93PiBwbHVzIHRoZSBvbGQgYXR0cmlidXRlcyB0aGF0IGFyZQpub3QgcGFydCBvZiB0aGUgaW1wb3J0IGRlZmluaXRpb24uClRodXMgSW1wb3J0RGF0YVNhdmUoKSBndWFyYW50ZWVzIHRvIG5vdCBvdmVyd3JpdGUgdW5kZWNsYXJlZCBhdHRyaWJ1dGVzLgoKVGhlIGJlaGF2aW9yIHdoZW4gaW1wb3J0ZWQgYXR0cmlidXRlcyBhcmUgZW1wdHkgZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBpbiB0aGUgb2JqZWN0IGRhdGEuCldoZW4gQzxFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzPiBpcyBub3Qgc2V0LCB0aGVuIGVtcHR5IHZhbHVlcyB3aWxsIHdpcGUgb3V0CnRoZSBvbGQgZGF0YS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gV2hlbiBDPEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXM+IGlzIHNldCwKdGhlbiBlbXB0eSB2YWx1ZXMgd2lsbCBsZWF2ZSB0aGUgb2xkIHZhbHVlcy4KClRoZSBkZWNpc2lvbiB3aGF0IGNvbnN0aXR1dGUgYW4gZW1wdHkgdmFsdWUgaXMgYSBiaXQgaGFpcnkuCkhlcmUgYXJlIHRoZSBydWxlcy4KRmllbGRzIHRoYXQgYXJlIG5vdCBldmVuIG1lbnRpb25lZCBpbiB0aGUgSW1wb3J0IGRlZmluaXRpb24gYXJlIGVtcHR5LiBUaGVzZSBhcmUgdGhlICdub3QgZGVmaW5lZCcgZmllbGRzLgpFbXB0eSBzdHJpbmdzIGFuZCB1bmRlZmluZWQgdmFsdWVzIGNvbnN0aXR1dGUgZW1wdHkgZmllbGRzLgpGaWVsZHMgd2l0aCB3aXRoIG9ubHkgb25lIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBub3QgZW1wdHkuCkZpZWxkcyB3aXRoIHRoZSBkaWdpdCAnMCcgYXJlIG5vdCBlbXB0eS4KCiAgICBteSAoICRDb25maWdJdGVtSUQsICRSZXRDb2RlICkgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAkQXJyYXlSZWYsCiAgICAgICAgQ291bnRlciAgICAgICA9PiAzNjcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCkFuIGVtcHR5IEM8Q29uZmlnSXRlbUlEPiBpbmRpY2F0ZXMgZmFpbHVyZS4gT3RoZXJ3aXNlIGl0IGluZGljYXRlcyB0aGUKbG9jYXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEuCkM8UmV0Q29kZT4gaXMgZWl0aGVyICdDcmVhdGVkJywgJ1VwZGF0ZWQnIG9yICdTa2lwcGVkJy4gJ0NyZWF0ZWQnIG1lYW5zIHRoYXQgYSBuZXcKY29uZmlnIGl0ZW0gaGFzIGJlZW4gY3JlYXRlZC4gJ1VwZGF0ZWQnIG1lYW5zIHRoYXQgYSBuZXcgdmVyc2lvbiBoYXMgYmVlbiBhZGRlZCB0bwphbiBleGlzdGluZyBjb25maWcgaXRlbS4gJ1NraXBwZWQnIG1lYW5zIHRoYXQgbm8gbmV3IHZlcnNpb24gaGFzIGJlZW4gY3JlYXRlZCwKYXMgdGhlIG5ldyBkYXRhIGlzIGlkZW50aWNhbCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0uCgpObyBjb2RlcyBoYXZlIHlldCBiZWVuIGRlZmluZWQgZm9yIHRoZSBmYWlsdXJlIGNhc2UuCgo9Y3V0CgpzdWIgSW1wb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBJbXBvcnREYXRhUm93IENvdW50ZXIgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGltcG9ydCBkYXRhIHJvdwogICAgaWYgKCByZWYgJFBhcmFte0ltcG9ydERhdGFSb3d9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiSW1wb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAnJFBhcmFte1RlbXBsYXRlSUR9JyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgbXkgJEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPSAkT2JqZWN0RGF0YS0+e0VtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXN9OwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBjaGVjayBjbGFzcyBsaXN0CiAgICBpZiAoICEkQ2xhc3NMaXN0IHx8IHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAuICJDYW4ndCBnZXQgdGhlIGdlbmVyYWwgY2F0YWxvZyBsaXN0IElUU006OkNvbmZpZ0l0ZW06OkNsYXNzIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJE9iamVjdERhdGEtPntDbGFzc0lEfSB8fCAhJENsYXNzTGlzdC0+eyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIk5vIGNsYXNzIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJyRQYXJhbXtUZW1wbGF0ZUlEfSciLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICckUGFyYW17VGVtcGxhdGVJRH0nIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICggISRNYXBwaW5nT2JqZWN0RGF0YSB8fCByZWYgJE1hcHBpbmdPYmplY3REYXRhIG5lICdIQVNIJyApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAuICJObyBtYXBwaW5nIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgbWFwcGluZyBpZCAnJE1hcHBpbmdJRCciLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBNYXBwaW5nT2JqZWN0TGlzdCwgJE1hcHBpbmdPYmplY3REYXRhOwogICAgfQoKICAgICMgY2hlY2sgYW5kIHJlbWVtYmVyIHRoZSBJZGVudGlmaWVycwogICAgIyB0aGUgSWRlbnRpZmllcnMgaWRlbnRpZnkgdGhlIGNvbmZpZyBpdGVtIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15ICVJZGVudGlmaWVyOwogICAgbXkgJFJvd0luZGV4ID0gMDsKICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEEgaWYgISRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9OwoKICAgICAgICAjIGNoZWNrIGlmIGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoICRJZGVudGlmaWVyeyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgLiAiJyRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0nIGhhcyBiZWVuIHVzZWQgbXVsdGlwbGUgdGltZXMgYXMgYW4gaWRlbnRpZmllciIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGlkZW50aWZpZXIgdmFsdWUKICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJFJvd0luZGV4XTsKCiAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUREFUQSBpZiAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9ICYmICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRSb3dJbmRleF07CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIklkZW50aWZpZXIgZmllbGQgaXMgZW1wdHkiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkUm93SW5kZXgrKzsKICAgIH0KCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJERlcGxTdGF0ZUxpc3QgfHwgcmVmICREZXBsU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldmVyc2UgdGhlIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJURlcGxTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyREZXBsU3RhdGVMaXN0fTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJEluY2lTdGF0ZUxpc3QgfHwgcmVmICRJbmNpU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldmVyc2UgdGhlIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICVJbmNpU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW5jaVN0YXRlTGlzdH07CgogICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uIG9mIHRoaXMgY2xhc3MKICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24gZGF0YQogICAgaWYgKCAhJERlZmluaXRpb25EYXRhIHx8IHJlZiAkRGVmaW5pdGlvbkRhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAuICJDYW4ndCBnZXQgdGhlIGRlZmluaXRpb24gb2YgY2xhc3MgaWQgJE9iamVjdERhdGEtPntDbGFzc0lEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cnkgdG8gZ2V0IGNvbmZpZyBpdGVtIGlkcywgd2hlbiB0aGVyZSBhcmUgaWRlbnRpZmllcnMKICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICBpZiAoJUlkZW50aWZpZXIpIHsKCiAgICAgICAgbXkgJVNlYXJjaFBhcmFtczsKCiAgICAgICAgIyBhZGQgbnVtYmVyIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntOdW1iZXJ9ICkgewogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze051bWJlcn0gPSBkZWxldGUgJElkZW50aWZpZXJ7TnVtYmVyfTsKICAgICAgICB9CgogICAgICAgICMgYWRkIG5hbWUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBpZiAoICRJZGVudGlmaWVye05hbWV9ICkgewogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze05hbWV9ID0gZGVsZXRlICRJZGVudGlmaWVye05hbWV9OwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgZGVwbG95bWVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7RGVwbFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICAgICAgICAgIG15ICREZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXsgJElkZW50aWZpZXJ7RGVwbFN0YXRlfSB9IHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAhJERlcGxTdGF0ZUlEICkgewoKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiVGhlIGRlcGxveW1lbnQgc3RhdGUgJyRJZGVudGlmaWVye0RlcGxTdGF0ZX0nIGlzIGludmFsaWQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tEZXBsU3RhdGVJRHN9ID0gWyREZXBsU3RhdGVJRF07CiAgICAgICAgICAgIGRlbGV0ZSAkSWRlbnRpZmllcntEZXBsU3RhdGV9OwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaW5jaWRlbnQgc3RhdGUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBpZiAoICRJZGVudGlmaWVye0luY2lTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgaW5jaWRlbnQgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJEluY2lTdGF0ZUlEID0gJEluY2lTdGF0ZUxpc3RSZXZlcnNleyAkSWRlbnRpZmllcntJbmNpU3RhdGV9IH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkSW5jaVN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAuICJUaGUgaW5jaWRlbnQgc3RhdGUgJyRJZGVudGlmaWVye0luY2lTdGF0ZX0nIGlzIGludmFsaWQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tJbmNpU3RhdGVJRHN9ID0gWyRJbmNpU3RhdGVJRF07CiAgICAgICAgICAgIGRlbGV0ZSAkSWRlbnRpZmllcntJbmNpU3RhdGV9OwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYWxsIFhNTCBkYXRhIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgbXkgQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAgICAgJFNlbGYtPl9JbXBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgV2hhdCAgICAgICAgICA9PiBcQFNlYXJjaFBhcmFtc1doYXQsCiAgICAgICAgICAgIElkZW50aWZpZXIgICAgPT4gXCVJZGVudGlmaWVyLAogICAgICAgICk7CgogICAgICAgICMgYWRkIFhNTCBzZWFyY2ggcGFyYW1zIHRvIHRoZSBzZWFyY2ggaGFzaAogICAgICAgIGlmIChAU2VhcmNoUGFyYW1zV2hhdCkgewogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze1doYXR9ID0gXEBTZWFyY2hQYXJhbXNXaGF0OwogICAgICAgIH0KCiAgICAgICAgIyBzZWFyY2ggZXhpc3RpbmcgY29uZmlnIGl0ZW0gd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVycwogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgICAgICVTZWFyY2hQYXJhbXMsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRPYmplY3REYXRhLT57Q2xhc3NJRH0gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDAsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzICAgICAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBzY2FsYXIgQHskQ29uZmlnSXRlbUxpc3R9ID4gMSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAuICJJZGVudGlmaWVyIGZpZWxkcyBOT1QgdW5pcXVlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbUxpc3QtPlswXTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGRhdGEgb2YgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkVmVyc2lvbkRhdGEgPSB7fTsKICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CgogICAgICAgICMgZ2V0IGxhdGVzdCB2ZXJzaW9uCiAgICAgICAgJFZlcnNpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIGVtcHR5IHhtbCBkYXRhCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFZlcnNpb25EYXRhLT57WE1MRGF0YX0KICAgICAgICAgICAgfHwgcmVmICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9IG5lICdBUlJBWScKICAgICAgICAgICAgfHwgIUB7ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgZGVsZXRlICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCB1cCBmaWVsZHMgaW4gVmVyc2lvbkRhdGEgYW5kIGluIHRoZSBYTUwgYXR0cmlidXRlcwogICAgbXkgJVhNTERhdGEyRDsKICAgICRSb3dJbmRleCA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhIChATWFwcGluZ09iamVjdExpc3QpIHsKCiAgICAgICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgICAgIG15ICRLZXkgICA9ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX07CiAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bICRSb3dJbmRleCsrIF07CgogICAgICAgIGlmICggJEtleSBlcSAnTnVtYmVyJyApIHsKCiAgICAgICAgICAgICMgZG8gbm90aGluZwogICAgICAgICAgICAjIEltcG9ydCBkb2VzIG5vdCBvdmVycmlkZSB0aGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEtleSBlcSAnTmFtZScgKSB7CgogICAgICAgICAgICBpZiAoICRFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzICYmICggIWRlZmluZWQgJFZhbHVlIHx8ICRWYWx1ZSBlcSAnJyApICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZywga2VlcCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVGhlIG5hbWUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+eyRLZXl9ID0gJFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEtleSBlcSAnRGVwbFN0YXRlJyApIHsKCiAgICAgICAgICAgIGlmICggJEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgJiYgKCAhZGVmaW5lZCAkVmFsdWUgfHwgJFZhbHVlIGVxICcnICkgKSB7CgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nLCBrZWVwIHRoZSBvbGQgdmFsdWUKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGVwbG95bWVudCBzdGF0ZSBpZAogICAgICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJERlcGxTdGF0ZUxpc3RSZXZlcnNleyRWYWx1ZX0gfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVGhlIGRlcGxveW1lbnQgc3RhdGUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSA9ICREZXBsU3RhdGVJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRLZXkgZXEgJ0luY2lTdGF0ZScgKSB7CgogICAgICAgICAgICBpZiAoICRFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzICYmICggIWRlZmluZWQgJFZhbHVlIHx8ICRWYWx1ZSBlcSAnJyApICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZywga2VlcCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICAgICAgICAgICAgICBteSAkSW5jaVN0YXRlSUQgPSAkSW5jaVN0YXRlTGlzdFJldmVyc2V7JFZhbHVlfSB8fCAnJzsKICAgICAgICAgICAgICAgIGlmICggISRJbmNpU3RhdGVJRCApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJUaGUgaW5jaWRlbnQgc3RhdGUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0luY2lTdGF0ZUlEfSA9ICRJbmNpU3RhdGVJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgaGFuZGxlIHhtbCBkYXRhCiAgICAgICAgICAgICRYTUxEYXRhMkR7JEtleX0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHVwIGVtcHR5IGNvbnRhaW5lciwgaW4gY2FzZSB0aGVyZSBpcyBubyBwcmV2aW91cyBkYXRhCiAgICAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSB8fD0ge307CgogICAgIyBFZGl0IFhNTERhdGFQcmV2LCBzbyB0aGF0IHRoZSB2YWx1ZXMgaW4gWE1MRGF0YTJEIHRha2UgcHJlY2VkZW5jZS4KICAgIG15ICRNZXJnZU9rID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhTWVyZ2UoCiAgICAgICAgWE1MRGVmaW5pdGlvbiAgICAgICAgICAgICAgICA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBYTUxEYXRhUHJldiAgICAgICAgICAgICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgIFhNTERhdGEyRCAgICAgICAgICAgICAgICAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAkRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcywKICAgICk7CgogICAgIyBiYWlsIG91dCwgd2hlbiB0aGUgd2FzIGEgcHJvYmxlbSBpbiBfSW1wb3J0WE1MRGF0YU1lcmdlKCkKICAgIGlmICggISRNZXJnZU9rICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIkNvdWxkIG5vdCBwcmVwYXJlIHRoZSBpbnB1dCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRSZXRDb2RlID0gJENvbmZpZ0l0ZW1JRCA/IFRyYW5zbGF0YWJsZSgnQ2hhbmdlZCcpIDogVHJhbnNsYXRhYmxlKCdDcmVhdGVkJyk7CgogICAgIyBjaGVjayBpZiB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBpcyBlbmFibGVkCiAgICBpZiAoCiAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSggJFZlcnNpb25EYXRhLT57TmFtZX0gKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snKQogICAgICAgICkKICAgIHsKCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNoZWNraW5nIGZvciBkdXBsaWNhdGUgbmFtZXMgKENsYXNzSUQ6ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sICIKICAgICAgICAgICAgICAgICAgICAuICJOYW1lOiAkVmVyc2lvbkRhdGEtPntOYW1lfSwgQ29uZmlnSXRlbUlEOiAiIC4gJENvbmZpZ0l0ZW1JRCB8fCAnTkVXJyAuICcpJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICROYW1lRHVwbGljYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5VbmlxdWVOYW1lQ2hlY2soCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlEIHx8ICdORVcnLAogICAgICAgICAgICBDbGFzc0lEICAgICAgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgICMgc3RvcCBwcm9jZXNzaW5nIGlmIHRoZSBuYW1lIGlzIG5vdCB1bmlxdWUKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewoKICAgICAgICAgICAgIyBidWlsZCBhIHN0cmluZyBvZiBhbGwgZHVwbGljYXRlIElEcwogICAgICAgICAgICBteSAkTmFtZUR1cGxpY2F0ZXNTdHJpbmcgPSBqb2luICcsICcsIEB7JE5hbWVEdXBsaWNhdGVzfTsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJFZlcnNpb25EYXRhLT57TmFtZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1JRChzKTogIgogICAgICAgICAgICAgICAgICAgIC4gJE5hbWVEdXBsaWNhdGVzU3RyaW5nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHJldHVybiBjb2RlIHRvIGFsc28gaW5jbHVkZSB0aGUgZHVwbGljYXRlIG5hbWUKICAgICAgICAgICAgJFJldENvZGUgPSAiRHVwbGljYXRlTmFtZSAnJFZlcnNpb25EYXRhLT57TmFtZX0nIjsKCiAgICAgICAgICAgICMgcmV0dXJuIHVuZGVmIGZvciB0aGUgY29uZmlnIGl0ZW0gaWQgc28gaXQgd2lsbCBiZSBjb3VudGVkIGFzICdGYWlsZWQnCiAgICAgICAgICAgIHJldHVybiB1bmRlZiwgJFJldENvZGU7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGF0ZXN0VmVyc2lvbklEID0gMDsKICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CgogICAgICAgICMgdGhlIHNwZWNpZmllZCBjb25maWcgaXRlbSBhbHJlYWR5IGV4aXN0cwogICAgICAgICMgZ2V0IGlkIG9mIHRoZSBsYXRlc3QgdmVyc2lvbiwgZm9yIGNoZWNraW5nIGxhdGVyIHdoZXRoZXIgYSB2ZXJzaW9uIHdhcyBjcmVhdGVkCiAgICAgICAgbXkgJFZlcnNpb25MaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25MaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApIHx8IFtdOwogICAgICAgIGlmICggc2NhbGFyIEB7JFZlcnNpb25MaXN0fSApIHsKICAgICAgICAgICAgJExhdGVzdFZlcnNpb25JRCA9ICRWZXJzaW9uTGlzdC0+Wy0xXTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBjb25maWcgaXRlbSB3YXMgZm91bmQsIHNvIGFkZCBuZXcgY29uZmlnIGl0ZW0KICAgICAgICAkQ29uZmlnSXRlbUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRoZSBuZXcgY29uZmlnIGl0ZW0gaWQKICAgICAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgIC4gIkVycm9yIHdoZW4gYWRkaW5nIHRoZSBuZXcgY29uZmlnIGl0ZW0uIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBuZXcgdmVyc2lvbgogICAgbXkgJFZlcnNpb25JRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbkRhdGEtPntOYW1lfSwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvbklEfSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFZlcnNpb25EYXRhLT57RGVwbFN0YXRlSUR9LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkVmVyc2lvbkRhdGEtPntJbmNpU3RhdGVJRH0sCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB0aGUgaW1wb3J0IHdhcyBzdWNjZXNzZnVsLCB3aGVuIHdlIGdldCBhIHZlcnNpb24gaWQKICAgIGlmICgkVmVyc2lvbklEKSB7CgogICAgICAgICMgV2hlbiBWZXJzaW9uQWRkKCkgcmV0dXJucyB0aGUgcHJldmlvdXMgbGF0ZXN0IHZlcnNpb24gSUQsIHdlIGtub3cgdGhhdAogICAgICAgICMgbm8gbmV3IHZlcnNpb24gaGFzIGJlZW4gYWRkZWQuCiAgICAgICAgIyBUaGUgaW1wb3J0IG9mIHRoaXMgY29uZmlnIGl0ZW0gaGFzIGJlZW4gc2tpcHBlZC4KICAgICAgICBpZiAoICRMYXRlc3RWZXJzaW9uSUQgJiYgJFZlcnNpb25JRCA9PSAkTGF0ZXN0VmVyc2lvbklEICkgewogICAgICAgICAgICAkUmV0Q29kZSA9IFRyYW5zbGF0YWJsZSgnU2tpcHBlZCcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRDb25maWdJdGVtSUQsICRSZXRDb2RlOwogICAgfQoKICAgIGlmICggJFJldENvZGUgZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAjIGRlbGV0ZSB0aGUgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgIC4gIkVycm9yIHdoZW4gYWRkaW5nIHRoZSBuZXcgY29uZmlnIGl0ZW0gdmVyc2lvbi4iLAogICAgKTsKCiAgICByZXR1cm47Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpyZWN1cnNpb24gZnVuY3Rpb24gZm9yIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkuCkRlZmluaXRpb25zIGZvciBvYmplY3QgYXR0cmlidXRlcyBhcmUgcGFzc2VkIGluIEM8WE1MRGVmaW5pdGlvbj4uClRoZSBuZXcgb2JqZWN0IGF0dHJpYnV0ZXMgYXJlIGFwcGVuZGVkIHRvIEM8RWxlbWVudExpc3Q+LgpDPENvdW50TWF4TGltaXQ+IGxpbWl0cyB0aGUgbWF4IGxlbmd0aCBvZiBpbXBvcnRhYmxlIGFycmF5cy4KCiAgICAkT2JqZWN0QmFja2VuZC0+X01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIEVsZW1lbnRMaXN0ICAgPT4gJEFycmF5UmVmLAogICAgICAgIENvdW50TWF4TGltaXQgPT4gMTAsCiAgICApOwoKPWN1dAoKc3ViIF9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte0NvdW50TWF4TGltaXR9OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtFbGVtZW50TGlzdH07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17RWxlbWVudExpc3R9IG5lICdBUlJBWSc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIGxpbWl0IHRoZSBsZW5ndGggb2YgaW1wb3J0YWJsZSBhcnJheXMsIGV2ZW4gaWYgbW9yZSBlbGVtZW50cyBjYW4gYmUgc2V0IHZpYSB0aGUgR1VJCiAgICAgICAgbXkgJENvdW50TWF4ID0gbWluKCAkSXRlbS0+e0NvdW50TWF4fSwgJFBhcmFte0NvdW50TWF4TGltaXR9ICk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDb3VudE1heCApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGtleSBzdHJpbmcKICAgICAgICAgICAgbXkgJEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnQ7CgogICAgICAgICAgICAjIGFkZCBwcmVmaXggdG8ga2V5CiAgICAgICAgICAgIGlmICggJFBhcmFte0tleVByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkS2V5ID0gJFBhcmFte0tleVByZWZpeH0gLiAnOjonIC4gJEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgdmFsdWUgc3RyaW5nCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRJdGVtLT57S2V5fTsKCiAgICAgICAgICAgICMgYWRkIGNvdW50IGlmIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJENvdW50TWF4ID4gMSB8fCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgLj0gJzo6JyAuICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcHJlZml4IHRvIGtleQogICAgICAgICAgICBpZiAoICRQYXJhbXtWYWx1ZVByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkUGFyYW17VmFsdWVQcmVmaXh9IC4gJzo6JyAuICRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcm93CiAgICAgICAgICAgIG15ICVSb3cgPSAoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtFbGVtZW50TGlzdH0gfSwgXCVSb3c7CgogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICAgICAkU2VsZi0+X01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICBFbGVtZW50TGlzdCAgID0+ICRQYXJhbXtFbGVtZW50TGlzdH0sCiAgICAgICAgICAgICAgICBLZXlQcmVmaXggICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZVByZWZpeCAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIENvdW50TWF4TGltaXQgPT4gJFBhcmFte0NvdW50TWF4TGltaXR9IHx8ICcxMCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2VhcmNoQXR0cmlidXRlc0dldCgpCgpyZWN1cnNpb24gZnVuY3Rpb24gZm9yIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCiAgICAkT2JqZWN0QmFja2VuZC0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9TZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17QXR0cmlidXRlTGlzdH07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17QXR0cmlidXRlTGlzdH0gbmUgJ0FSUkFZJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgc2V0IHByZWZpeAogICAgICAgIG15ICRLZXkgID0gJEl0ZW0tPntLZXl9OwogICAgICAgIG15ICROYW1lID0gJEl0ZW0tPntOYW1lfTsKCiAgICAgICAgaWYgKCAkUGFyYW17S2V5UHJlZml4fSApIHsKICAgICAgICAgICAgJEtleSA9ICRQYXJhbXtLZXlQcmVmaXh9IC4gJzo6JyAuICRLZXk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtOYW1lUHJlZml4fSApIHsKICAgICAgICAgICAgJE5hbWUgPSAkUGFyYW17TmFtZVByZWZpeH0gLiAnOjonIC4gJE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhdHRyaWJ1dGUsIGlmIG1hcmtlZCBhcyBzZWFyY2hhYmxlCiAgICAgICAgaWYgKCAkSXRlbS0+e1NlYXJjaGFibGV9ICkgewoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdUZXh0JyB8fCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdUZXh0QXJlYScgKSB7CgogICAgICAgICAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICROYW1lLAogICAgICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntTaXplfSB8fCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntNYXhMZW5ndGh9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dHJpYnV0ZUxpc3R9IH0sIFwlUm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnR2VuZXJhbENhdGFsb2cnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBsaXN0CiAgICAgICAgICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtLT57SW5wdXR9LT57Q2xhc3N9LAogICAgICAgICAgICAgICAgKSB8fCB7fTsKCiAgICAgICAgICAgICAgICBteSAlUm93ID0gKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0cmlidXRlTGlzdH0gfSwgXCVSb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgJFNlbGYtPl9TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkUGFyYW17QXR0cmlidXRlTGlzdH0sCiAgICAgICAgICAgIEtleVByZWZpeCAgICAgPT4gJEtleSwKICAgICAgICAgICAgTmFtZVByZWZpeCAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoKQoKcmVjdXJzaW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGV4cG9ydCBYTUwgc2VhcmNoIHBhcmFtcwoKICAgICRPYmplY3RCYWNrZW5kLT5fRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgV2hhdCAgICAgICAgICA9PiAkQXJyYXlSZWYsCiAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17V2hhdH07CiAgICByZXR1cm4gaWYgISRQYXJhbXtTZWFyY2hEYXRhfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtXaGF0fSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBjcmVhdGUga2V5CiAgICAgICAgbXkgJEtleSA9ICRQYXJhbXtQcmVmaXh9ID8gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJEl0ZW0tPntLZXl9IDogJEl0ZW0tPntLZXl9OwoKICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICBteSAkVmFsdWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZWFyY2hEYXRhfS0+eyRLZXl9LAogICAgICAgICk7CgogICAgICAgIGlmICgkVmFsdWVzKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2gga2V5CiAgICAgICAgICAgIG15ICRTZWFyY2hLZXkgPSAkS2V5OwogICAgICAgICAgICAkU2VhcmNoS2V5ID1+IHN7IDo6IH17XCdcfVslXVx7XCd9eG1zZzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiAkVmFsdWVzLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17V2hhdH0gfSwgJFNlYXJjaEhhc2g7CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+ICRQYXJhbXtXaGF0fSwKICAgICAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkUGFyYW17U2VhcmNoRGF0YX0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRXhwb3J0WE1MRGF0YVByZXBhcmUoKQoKcmVjdXJzaW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGV4cG9ydCBYTUwgZGF0YQoKICAgICRPYmplY3RCYWNrZW5kLT5fRXhwb3J0WE1MRGF0YVByZXBhcmUoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkSGFzaFJlZiwKICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfRXhwb3J0WE1MRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGEyRH07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YTJEfSBuZSAnSEFTSCc7CgogICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAkUGFyYW17UHJlZml4fSAuPSAnOjonOwogICAgfQogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIHN0b3AgbG9vcCwgaWYgbm8gY29udGVudCB3YXMgZ2l2ZW4KICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwoKICAgICAgICAgICAgIyBjcmVhdGUga2V5CiAgICAgICAgICAgIG15ICRLZXkgPSAkUGFyYW17UHJlZml4fSAuICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKCiAgICAgICAgICAgICMgcHJlcGFyZSB2YWx1ZQogICAgICAgICAgICAkUGFyYW17WE1MRGF0YTJEfS0+eyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlhNTEV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKCkKCnJlY3Vyc2lvbiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBpbXBvcnQgWE1MIHNlYXJjaCBwYXJhbXMKCiAgICAkT2JqZWN0QmFja2VuZC0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFdoYXQgICAgICAgICAgPT4gJEFycmF5UmVmLAogICAgICAgIElkZW50aWZpZXIgICAgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9JbXBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte1doYXR9OwogICAgcmV0dXJuIGlmICEkUGFyYW17SWRlbnRpZmllcn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17V2hhdH0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0lkZW50aWZpZXJ9IG5lICdIQVNIJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgY3JlYXRlIGtleQogICAgICAgIG15ICRLZXkgPSAkUGFyYW17UHJlZml4fSA/ICRQYXJhbXtQcmVmaXh9IC4gJzo6XGQrOjonIC4gJEl0ZW0tPntLZXl9IDogJEl0ZW0tPntLZXl9OwogICAgICAgICRLZXkgLj0gJzo6XGQrJzsKCiAgICAgICAgbXkgJElkZW50aWZpZXJLZXk7CiAgICAgICAgSURFTlRJRklFUktFWToKICAgICAgICBmb3IgbXkgJElkZW50S2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtJZGVudGlmaWVyfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBJREVOVElGSUVSS0VZIGlmICRJZGVudEtleSAhfiBteyBcQSAkS2V5IFx6IH14bXM7CgogICAgICAgICAgICAkSWRlbnRpZmllcktleSA9ICRJZGVudEtleTsKICAgICAgICB9CgogICAgICAgIGlmICgkSWRlbnRpZmllcktleSkgewoKICAgICAgICAgICAgIyBwcmVwYXJlIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5YTUxJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtJZGVudGlmaWVyfS0+eyRJZGVudGlmaWVyS2V5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICAgICAjIHByZXBhcmUga2V5CiAgICAgICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoICRJZGVudGlmaWVyS2V5ID1+IG17IDo6IH14bXMgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJENvdW50ZXIgJSAyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWRlbnRpZmllcktleSA9fiBzeyA6OiB9e11ceyd9eG1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElkZW50aWZpZXJLZXkgPX4gc3sgOjogfXsnXH1bfXhtczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgICAgICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRJZGVudGlmaWVyS2V5IC4gJ117XCdDb250ZW50XCd9JyA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+ICRQYXJhbXtXaGF0fSwKICAgICAgICAgICAgSWRlbnRpZmllciAgICA9PiAkUGFyYW17SWRlbnRpZmllcn0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfSW1wb3J0WE1MRGF0YU1lcmdlKCkKCnJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBpbnBsYWNlIGVkaXQgdGhlIGltcG9ydCBYTUwgZGF0YS4KCiAgICBteSAkTWVyZ2VPayA9ICRPYmplY3RCYWNrZW5kLT5fSW1wb3J0WE1MRGF0YU1lcmdlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFhNTERhdGFQcmV2ICAgPT4gJEhhc2hSZWYsCiAgICAgICAgWE1MRGF0YTJEICAgICA9PiAkSGFzaFJlZiwKICAgICk7CgpUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0ZXIgdGhlIG1lcmdlIHdhcyBzdWNjZXNzZnVsLgpBIG1lcmdlIGZhaWxzIHdoZW4gZm9yIGV4YW1wbGUgYSBnZW5lcmFsIGNhdGFsb2cgaXRlbSBuYW1lIGNhbid0IGJlIG1hcHBlZCB0byBhbiBpZC4KCj1jdXQKCnN1YiBfSW1wb3J0WE1MRGF0YU1lcmdlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YTJEfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGFQcmV2fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7ICAgICMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbmZpZyBpdGVtIGNsYXNzCiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhMkR9IG5lICdIQVNIJzsgICAgICAgICAjIGhhc2ggd2l0aCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGFQcmV2fSBuZSAnSEFTSCc7ICAgICAgICMgaGFzaCB3aXRoIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb25maWcgaXRlbQoKICAgIG15ICRYTUxEYXRhID0gJFBhcmFte1hNTERhdGFQcmV2fTsKCiAgICAjIGRlZmF1bHQgdmFsdWUgZm9yIHByZWZpeAogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudGVyOwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRYTUxEYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdCiAgICAgICAgICAgICAgICAgICAgfHw9IHt9OyAgICAjIGVtcHR5IGNvbnRhaW5lciwgaW4gY2FzZSB0aGVyZSBpcyBubyBwcmV2aW91cyBkYXRhCiAgICAgICAgICAgICAgICBteSAkTWVyZ2VPayA9ICRTZWxmLT5fSW1wb3J0WE1MRGF0YU1lcmdlKAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gICAgICAgICAgICAgICAgPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEyRCAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1hNTERhdGEyRH0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YVByZXYgICAgICAgICAgICAgICAgICA9PiAkWE1MRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgID0+ICRLZXkgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJFBhcmFte0VtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXN9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRNZXJnZU9rOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFdoZW4gdGhlIGRhdGEgcG9pbnQgaXMgbm90IHBhcnQgb2YgdGhlIGlucHV0IGRlZmluaXRpb24sCiAgICAgICAgICAgICMgdGhlbiBkbyBub3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBzZXR0aW5nLgogICAgICAgICAgICAjIEZhbHNlIHZhbHVlcyBhcmUgT0suCiAgICAgICAgICAgIG5leHQgQ09VTlRFUiBpZiAhZXhpc3RzICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX07CgogICAgICAgICAgICBpZiAoICRQYXJhbXtFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBvdmVycmlkZSBvbGQgdmFsdWUgd2l0aCBhbiBlbXB0eSBmaWVsZCBpcyBpbXBvcnRlZAogICAgICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX07CiAgICAgICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgJFBhcmFte1hNTERhdGEyRH0tPnskS2V5fSBlcSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcmVwYXJlIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5YTUxJbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGxldCBtZXJnZSBmYWlsLCB3aGVuIGEgdmFsdWUgY2Fubm90IGJlIHByZXBhcmVkCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkVmFsdWU7CgogICAgICAgICAgICAjIHNhdmUgdGhlIHByZXBhcmVkIHZhbHVlCiAgICAgICAgICAgICRYTUxEYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGRlZmluaXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIERlZmluaXRpb25MaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGRlZmluaXRpb24gbGlzdCBhcyBhcnJheWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJERlZmluaXRpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25MaXN0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCnJldHVybnMKCiAgICBteSAkRGVmaW5pdGlvbkxpc3RSZWYgPSBbCiAgICAgICAgICB7CiAgICAgICAgICAgICdWZXJzaW9uJyAgICAgID0+ICcxJywKICAgICAgICAgICAgJ0NyZWF0ZVRpbWUnICAgPT4gJzIwMTItMDYtMTIgMTQ6MDk6NDMnLAogICAgICAgICAgICAnRGVmaW5pdGlvbklEJyA9PiAnMScsCiAgICAgICAgICAgICdDcmVhdGVCeScgICAgID0+ICcxMjMnLAogICAgICAgICAgICAnRGVmaW5pdGlvbicgICA9PiAnLS0tCi0gS2V5OiBWZW5kb3IKICBOYW1lOiBWZW5kb3IKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgLSBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAoKLSBLZXk6IERlc2NyaXB0aW9uCiAgTmFtZTogRGVzY3JpcHRpb24KICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgLSBUeXBlOiBUZXh0QXJlYQoKLSBLZXk6IFR5cGUKICBOYW1lOiBUeXBlCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogIC0gVHlwZTogVGV4dEFyZWEKICAtIFR5cGU6IEdlbmVyYWxDYXRhbG9nXAogICAgQ2xhc3M6IElUU006OkNvbmZpZ0l0ZW06OkNvbXB1dGVyOjpUeXBlCiAgICBUcmFuc2xhdGlvbjogMQojIC4uLiBldGMgLi4uCicsCiAgICAgICAgICB9LAogICAgXTsKPWN1dAoKc3ViIERlZmluaXRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3NJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24gV0hFUkUgY2xhc3NfaWQgPSA/IE9SREVSIEJZIHZlcnNpb24nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICApOwoKICAgIG15IEBEZWZpbml0aW9uTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJURlZmluaXRpb247CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvbn0gICA9ICRSb3dbMV0gfHwgIi0tLSBbXSI7CiAgICAgICAgJERlZmluaXRpb257VmVyc2lvbn0gICAgICA9ICRSb3dbMl07CiAgICAgICAgJERlZmluaXRpb257Q3JlYXRlVGltZX0gICA9ICRSb3dbM107CiAgICAgICAgJERlZmluaXRpb257Q3JlYXRlQnl9ICAgICA9ICRSb3dbNF07CgogICAgICAgICMgQ2hlY2sgaWYgZGVmaW5pdGlvbiBjb2RlIGlzIG5vdCBhIFlBTUwgc3RyaW5nLgogICAgICAgIGlmICggc3Vic3RyKCAkRGVmaW5pdGlvbntEZWZpbml0aW9ufSwgMCwgMyApIG5lICctLS0nICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEZWZpbml0aW9uSUQ6ICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0iCiAgICAgICAgICAgICAgICAgICAgLiAiIENsYXNzSUQ6ICRQYXJhbXtDbGFzc0lEfSIKICAgICAgICAgICAgICAgICAgICAuICIgZm91bmQgaW4gbGVnYWN5IFBlcmwgY29kZSBmb3JtYXQsIGNhbiBub3QgY29udGludWUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvbn0gPSAiLS0tIFtdIjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQERlZmluaXRpb25MaXN0LCBcJURlZmluaXRpb247CiAgICB9CgogICAgcmV0dXJuIFxARGVmaW5pdGlvbkxpc3Q7Cn0KCj1pdGVtIERlZmluaXRpb25HZXQoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbiBhcyBoYXNoIHJlZmVyZW5jZQoKUmV0dXJuCiAgICAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0KICAgICREZWZpbml0aW9uLT57Q2xhc3NJRH0KICAgICREZWZpbml0aW9uLT57Q2xhc3N9CiAgICAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb259CiAgICAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9CiAgICAkRGVmaW5pdGlvbi0+e1ZlcnNpb259CiAgICAkRGVmaW5pdGlvbi0+e0NyZWF0ZVRpbWV9CiAgICAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fQoKICAgIG15ICREZWZpbml0aW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgRGVmaW5pdGlvbklEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkRGVmaW5pdGlvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtEZWZpbml0aW9uSUR9ICYmICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlZmluaXRpb25JRCBvciBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVmaW5pdGlvbklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntEZWZpbml0aW9uR2V0fS0+eyAkUGFyYW17RGVmaW5pdGlvbklEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57RGVmaW5pdGlvbkdldH0tPnsgJFBhcmFte0RlZmluaXRpb25JRH0gfTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNsYXNzX2lkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgJwogICAgICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0RlZmluaXRpb25JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYXNrIGRhdGFiYXNlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjbGFzc19pZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNsYXNzX2lkID0gPyBPUkRFUiBCWSB2ZXJzaW9uIERFU0MnLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURlZmluaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uSUR9ID0gJFJvd1swXTsKICAgICAgICAkRGVmaW5pdGlvbntDbGFzc0lEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9ufSAgID0gJFJvd1syXSB8fCAiLS0tIFtdIjsKICAgICAgICAkRGVmaW5pdGlvbntWZXJzaW9ufSAgICAgID0gJFJvd1szXTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVUaW1lfSAgID0gJFJvd1s0XTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVCeX0gICAgID0gJFJvd1s1XTsKCiAgICAgICAgIyBDaGVjayBpZiBkZWZpbml0aW9uIGNvZGUgaXMgbm90IGEgWUFNTCBzdHJpbmcuCiAgICAgICAgaWYgKCBzdWJzdHIoICREZWZpbml0aW9ue0RlZmluaXRpb259LCAwLCAzICkgbmUgJy0tLScgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkRlZmluaXRpb25JRDogJERlZmluaXRpb257RGVmaW5pdGlvbklEfSIKICAgICAgICAgICAgICAgICAgICAuICIgQ2xhc3NJRDogJERlZmluaXRpb257Q2xhc3NJRH0iCiAgICAgICAgICAgICAgICAgICAgLiAiIGZvdW5kIGluIGxlZ2FjeSBQZXJsIGNvZGUgZm9ybWF0LCBjYW4gbm90IGNvbnRpbnVlIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb259ID0gIi0tLSBbXSI7CiAgICAgICAgfQoKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkxvYWQoCiAgICAgICAgICAgIERhdGEgPT4gJERlZmluaXRpb257RGVmaW5pdGlvbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4ge30gaWYgISREZWZpbml0aW9ue0RlZmluaXRpb25JRH07CgogICAgIyBwcmVwYXJlIGRlZmluaXRpb24KICAgIGlmICggJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gJiYgcmVmICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9IGVxICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICAgICAgRGVmaW5pdGlvblJlZiA9PiAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gPSAnJzsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgYWRkIGNsYXNzCiAgICAkRGVmaW5pdGlvbntDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICREZWZpbml0aW9ue0NsYXNzSUR9IH07CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0RlZmluaXRpb25HZXR9LT57ICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gfSA9IFwlRGVmaW5pdGlvbjsKCiAgICByZXR1cm4gXCVEZWZpbml0aW9uOwp9Cgo9aXRlbSBEZWZpbml0aW9uQWRkKCkKCmFkZCBhIG5ldyBkZWZpbml0aW9uCgogICAgbXkgJERlZmluaXRpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQWRkKAogICAgICAgIENsYXNzSUQgICAgPT4gMTIzLAogICAgICAgIERlZmluaXRpb24gPT4gJ3RoZSBkZWZpbml0aW9uIGNvZGUnLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVmaW5pdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIERlZmluaXRpb24gVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGRlZmluaXRpb24KICAgIG15ICRDaGVjayA9ICRTZWxmLT5EZWZpbml0aW9uQ2hlY2soCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkUGFyYW17RGVmaW5pdGlvbn0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJENoZWNrOwoKICAgICMgZ2V0IGxhc3QgZGVmaW5pdGlvbgogICAgbXkgJExhc3REZWZpbml0aW9uID0gJFNlbGYtPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICApOwoKICAgICMgc3RvcCBhZGQsIGlmIGRlZmluaXRpb24gd2FzIG5vdCBjaGFuZ2VkCiAgICBpZiAoICRMYXN0RGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gJiYgJExhc3REZWZpbml0aW9uLT57RGVmaW5pdGlvbn0gZXEgJFBhcmFte0RlZmluaXRpb259ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgYWRkIG5ldyBkZWZpbml0aW9uISBUaGUgZGVmaW5pdGlvbiB3YXMgbm90IGNoYW5nZWQuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbiA9IDE7CiAgICBpZiAoICRMYXN0RGVmaW5pdGlvbi0+e1ZlcnNpb259ICkgewogICAgICAgICRWZXJzaW9uID0gJExhc3REZWZpbml0aW9uLT57VmVyc2lvbn07CiAgICAgICAgJFZlcnNpb24rKzsKICAgIH0KCiAgICAjIGluc2VydCBuZXcgZGVmaW5pdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX2RlZmluaXRpb24gJwogICAgICAgICAgICAuICcoY2xhc3NfaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17RGVmaW5pdGlvbn0sIFwkVmVyc2lvbiwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBnZXQgaWQgb2YgbmV3IGRlZmluaXRpb24KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uIFdIRVJFICcKICAgICAgICAgICAgLiAnY2xhc3NfaWQgPSA/IEFORCB2ZXJzaW9uID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIHZlcnNpb24gREVTQycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9LCBcJFZlcnNpb24gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICREZWZpbml0aW9uSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREZWZpbml0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdHJpZ2dlciBEZWZpbml0aW9uQ3JlYXRlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdEZWZpbml0aW9uQ3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENvbW1lbnQgPT4gJERlZmluaXRpb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICREZWZpbml0aW9uSUQ7Cn0KCj1pdGVtIERlZmluaXRpb25DaGVjaygpCgpjaGVjayB0aGUgc3ludGF4IG9mIGEgbmV3IGRlZmluaXRpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQ2hlY2soCiAgICAgICAgRGVmaW5pdGlvbiAgICAgID0+ICd0aGUgZGVmaW5pdGlvbiBjb2RlJywKICAgICAgICBDaGVja1N1YkVsZW1lbnQgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDAsIHRvIGNoZWNrIHN1YiBlbGVtZW50cyByZWN1cnNpdmVseSkKICAgICk7Cgo9Y3V0CgpzdWIgRGVmaW5pdGlvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtEZWZpbml0aW9ufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRGVmaW5pdGlvbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgY2hlY2sgc3ViIGVsZW1lbnRzIGlzIGVuYWJsZWQsIHdlIG11c3Qgbm90IFlBTUwgbG9hZCBpdAogICAgIyBiZWNhdXNlIHRoaXMgaGFzIGJlZW4gZG9uZSBpbiBhbiBlYXJsaWVyIHJlY3Vyc2lvbiBzdGVwIGFscmVhZHkKICAgIG15ICREZWZpbml0aW9uOwogICAgaWYgKCAkUGFyYW17Q2hlY2tTdWJFbGVtZW50fSApIHsKICAgICAgICAkRGVmaW5pdGlvbiA9ICRQYXJhbXtEZWZpbml0aW9ufTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggc3Vic3RyKCAkUGFyYW17RGVmaW5pdGlvbn0sIDAsIDMgKSBuZSAnLS0tJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkRlZmluaXRpb24gbXVzdCBiZSBhIFlBTUwgc3RyaW5nIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5Mb2FkKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtEZWZpbml0aW9ufSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgZGVmaW5pdGlvbiBleGlzdHMgYXQgYWxsCiAgICBpZiAoICEkRGVmaW5pdGlvbiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgWW91IGhhdmUgYW4gc3ludGF4IGVycm9yIGluIHRoZSBkZWZpbml0aW9uLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbml0aW9uIG11c3QgYmUgYW4gYXJyYXkKICAgIGlmICggcmVmICREZWZpbml0aW9uIG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIERlZmluaXRpb24hIERlZmluaXRpb24gaXMgbm90IGFuIGFycmF5IHJlZmVyZW5jZS4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgZWFjaCBkZWZpbml0aW9uIGF0dHJpYnV0ZQogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBAeyREZWZpbml0aW9ufSApIHsKCiAgICAgICAgIyBlYWNoIGRlZmluaXRpb24gYXR0cmlidXRlIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIGRhdGEKICAgICAgICBpZiAoICEkQXR0cmlidXRlIHx8IHJlZiAkQXR0cmlidXRlIG5lICdIQVNIJyB8fCAhJXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgQXQgbGVhc3Qgb25lIGRlZmluaXRpb24gYXR0cmlidXRlIGlzIG5vdCBhIGhhc2ggcmVmZXJlbmNlLicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGtleSBjb250YWlucyBubyBzcGFjZXMKICAgICAgICBpZiAoICRBdHRyaWJ1dGUtPntLZXl9ICYmICRBdHRyaWJ1dGUtPntLZXl9ID1+IG17IFxzIH14bXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIERlZmluaXRpb24hIEtleSAnJEF0dHJpYnV0ZS0+e0tleX0nIG11c3Qgbm90IGNvbnRhaW4gd2hpdGVzcGFjZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBrZXkgY29udGFpbnMgbm9uLWFzY2lpIGNoYXJhY3RlcnMKICAgICAgICBpZiAoICRBdHRyaWJ1dGUtPntLZXl9ICYmICRBdHRyaWJ1dGUtPntLZXl9ID1+IG17IChbXlx4ezAwfS1ceHs3Zn1dKSB9eG1zICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRGVmaW5pdGlvbiEgS2V5ICckQXR0cmlidXRlLT57S2V5fScgbXVzdCBub3QgY29udGFpbiBub24gQVNDSUkgY2hhcmFjdGVycyAnJDEnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgcmVjdXJzaW9uIGNoZWNrIGZvciBTdWItRWxlbWVudHMKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRBdHRyaWJ1dGV9ICkgewoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEF0dHJpYnV0ZS0+eyRLZXl9OwoKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdTdWInICYmIHJlZiAkVmFsdWUgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRoZSBzdWIgYXJyYXkKICAgICAgICAgICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT5EZWZpbml0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBDaGVja1N1YkVsZW1lbnQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBTdWItRGVmaW5pdGlvbiBvZiBlbGVtZW50IHdpdGggdGhlIGtleSAnJEF0dHJpYnV0ZS0+e0tleX0nLiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9EZWZpbml0aW9uUHJlcGFyZSgpCgpQcmVwYXJlIHRoZSBzeW50YXggb2YgYSBuZXcgZGVmaW5pdGlvbgoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICBEZWZpbml0aW9uUmVmID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0RlZmluaXRpb25QcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBkZWZpbml0aW9uCiAgICBpZiAoICEkUGFyYW17RGVmaW5pdGlvblJlZn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlZmluaXRpb25SZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17RGVmaW5pdGlvblJlZn0gfSApIHsKCiAgICAgICAgIyBzZXQgQ291bnRNaW4KICAgICAgICBpZiAoICFkZWZpbmVkICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50TWlufSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBDb3VudE1heAogICAgICAgICRJdGVtLT57Q291bnRNYXh9IHx8PSAxOwoKICAgICAgICAjIHNldCBDb3VudE1pbgogICAgICAgIGlmICggJEl0ZW0tPntDb3VudE1pbn0gPiAkSXRlbS0+e0NvdW50TWF4fSApIHsKICAgICAgICAgICAgJEl0ZW0tPntDb3VudE1pbn0gPSAkSXRlbS0+e0NvdW50TWF4fTsKICAgICAgICB9CgogICAgICAgICMgc2V0IENvdW50RGVmYXVsdAogICAgICAgIGlmICggIWRlZmluZWQgJEl0ZW0tPntDb3VudERlZmF1bHR9ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoICRJdGVtLT57Q291bnREZWZhdWx0fSA8ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPSAkSXRlbS0+e0NvdW50TWlufTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPiAkSXRlbS0+e0NvdW50TWF4fSApIHsKICAgICAgICAgICAgJEl0ZW0tPntDb3VudERlZmF1bHR9ID0gJEl0ZW0tPntDb3VudE1heH07CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgaXMgZGVmaW5lZC4KICAgICAgICBpZiAoICRJdGVtLT57U3VifSAmJiByZWYgJEl0ZW0tPntTdWJ9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT5fRGVmaW5pdGlvblByZXBhcmUoCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uUmVmID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e1N1Yn07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6SGlzdG9yeTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Okhpc3RvcnkgLSBtb2R1bGUgZm9yIElUU01Db25maWdJdGVtLnBtIHdpdGggaGlzdG9yeSBmdW5jdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGhpc3RvcnkgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIEhpc3RvcnlHZXQoKQoKUmV0dXJucyBhbiBhcnJheSByZWZlcmVuY2Ugd2l0aCBhbGwgaGlzdG9yeSBlbnRyaWVzIGZvciB0aGUgZ2l2ZW4gY29uZmlnIGl0ZW0uCkVhY2ggYXJyYXkgZWxlbWVudCBpcyBhIGhhc2ggcmVmZXJlbmNlIHJlcHJlc2VudGluZyBvbmUgaGlzdG9yeSBlbnRyeS4KClRoZXNlIGhhc2ggcmVmZXJlbmNlcyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0OgoKICAgICRJbmZve0hpc3RvcnlFbnRyeUlEfQogICAgJEluZm97Q29uZmlnSXRlbUlEfQogICAgJEluZm97SGlzdG9yeVR5cGV9CiAgICAkSW5mb3tIaXN0b3J5VHlwZUlEfQogICAgJEluZm97Q29tbWVudH0KICAgICRJbmZve0NyZWF0ZWRCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQogICAgJEluZm97VXNlckZ1bGxuYW1lfQoKICAgIG15ICRJbmZvID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGNhY2hlZCByZXN1bHQgZXhpc3RzLCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBmZXRjaCBzb21lIGRhdGEgZnJvbSBoaXN0b3J5IGZvciBnaXZlbiBjb25maWcgaXRlbQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjaC5pZCwgY2guY29uZmlnaXRlbV9pZCwgY2guY29udGVudCwgY2gudHlwZV9pZCwgJwogICAgICAgICAgICAuICdjaC5jcmVhdGVfYnksIGNoLmNyZWF0ZV90aW1lLCBjaHQubmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9oaXN0b3J5IGNoLCBjb25maWdpdGVtX2hpc3RvcnlfdHlwZSBjaHQgJwogICAgICAgICAgICAuICdXSEVSRSBjaC50eXBlX2lkID0gY2h0LmlkIEFORCBjaC5jb25maWdpdGVtX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNoLmlkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgc2F2ZSBkYXRhIGZyb20gaGlzdG9yeSBpbiBhcnJheQogICAgbXkgQEVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVUbXAgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgID0+ICRSb3dbM10sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRSb3dbNl0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBARW50cmllcywgXCVUbXA7CiAgICB9CgogICAgIyBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2VyIHdobyBjcmVhdGVkIGhpc3RvcnkgZW50cmllcwogICAgZm9yIG15ICRFbnRyeSAoQEVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBpbmZvcm1hdGlvbgogICAgICAgIG15ICVVc2VySW5mbyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJEVudHJ5LT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgaGlzdG9yeSBlbnRyeQogICAgICAgICRFbnRyeS0+e1VzZXJJRH0gICAgICAgID0gJFVzZXJJbmZve1VzZXJJRH07CiAgICAgICAgJEVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlckluZm97VXNlckxvZ2lufTsKICAgICAgICAkRW50cnktPntVc2VyRmlyc3RuYW1lfSA9ICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICAgICAkRW50cnktPntVc2VyTGFzdG5hbWV9ICA9ICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgICAgICRFbnRyeS0+e1VzZXJGdWxsbmFtZX0gID0gJFVzZXJJbmZve1VzZXJGdWxsbmFtZX07CiAgICB9CgogICAgIyBzYXZlIHJlc3VsdCBpbiBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb25zfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9ID0gXEBFbnRyaWVzOwoKICAgIHJldHVybiBcQEVudHJpZXM7Cn0KCj1pdGVtIEhpc3RvcnlFbnRyeUdldCgpCgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBoaXN0b3J5IGVudHJ5LgpUaGUgaGFzaCByZWZlcmVuY2UgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dDoKCiAgICAkSW5mb3tIaXN0b3J5RW50cnlJRH0KICAgICRJbmZve0NvbmZpZ0l0ZW1JRH0KICAgICRJbmZve0hpc3RvcnlUeXBlfQogICAgJEluZm97SGlzdG9yeVR5cGVJRH0KICAgICRJbmZve0NvbW1lbnR9CiAgICAkSW5mb3tDcmVhdGVCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQogICAgJEluZm97VXNlckZ1bGxuYW1lfQoKICAgIG15ICRJbmZvID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlFbnRyeUdldCgKICAgICAgICBIaXN0b3J5RW50cnlJRCA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5RW50cnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEhpc3RvcnlFbnRyeUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgY2FjaGVkIHJlc3VsdCBleGlzdHMsIHJldHVybiB0aGF0IHJlc3VsdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfS0+eyAkUGFyYW17SGlzdG9yeUVudHJ5SUR9IH0gKSB7CiAgICAgICAgbXkgKCRDb25maWdJdGVtSUQpID0ga2V5cyAleyAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfS0+eyAkUGFyYW17SGlzdG9yeUVudHJ5SUR9IH0gfTsKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9LT57JENvbmZpZ0l0ZW1JRH07CiAgICB9CgogICAgIyBmZXRjaCBhIHNpbmdsZSBlbnRyeSBmcm9tIGhpc3RvcnkKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY2guaWQsIGNoLmNvbmZpZ2l0ZW1faWQsIGNoLmNvbnRlbnQsIGNoLnR5cGVfaWQsICcKICAgICAgICAgICAgLiAnY2guY3JlYXRlX2J5LCBjaC5jcmVhdGVfdGltZSwgY2h0Lm5hbWUgJwogICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeSBjaCwgY29uZmlnaXRlbV9oaXN0b3J5X3R5cGUgY2h0ICcKICAgICAgICAgICAgLiAnV0hFUkUgY2gudHlwZV9pZCA9IGNodC5pZCBBTkQgY2guaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SGlzdG9yeUVudHJ5SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJUVudHJ5OwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgJUVudHJ5ID0gKAogICAgICAgICAgICBIaXN0b3J5RW50cnlJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBDb25maWdJdGVtSUQgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDb21tZW50ICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBIaXN0b3J5VHlwZUlEICA9PiAkUm93WzNdLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkUm93WzZdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdXNlciBkYXRhIGZvciB0aGlzIGVudHJ5CiAgICBteSAlVXNlckluZm8gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEVudHJ5e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgJEVudHJ5e1VzZXJJRH0gICAgICAgID0gJFVzZXJJbmZve1VzZXJJRH07CiAgICAkRW50cnl7VXNlckxvZ2lufSAgICAgPSAkVXNlckluZm97VXNlckxvZ2lufTsKICAgICRFbnRyeXtVc2VyRmlyc3RuYW1lfSA9ICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICRFbnRyeXtVc2VyTGFzdG5hbWV9ICA9ICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgJEVudHJ5e1VzZXJGdWxsbmFtZX0gID0gJFVzZXJJbmZve1VzZXJGdWxsbmFtZX07CgogICAgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9LT57ICRFbnRyeXtDb25maWdJdGVtSUR9IH0gPSBcJUVudHJ5OwoKICAgIHJldHVybiBcJUVudHJ5Owp9Cgo9aXRlbSBIaXN0b3J5QWRkKCkKCkFkZHMgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeSB0byB0aGUgaGlzdG9yeS4KCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICBDb25maWdJdGVtSUQgID0+IDEyMzQsCiAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnTmV3Q29uZmlnSXRlbScsICMgZWl0aGVyIEhpc3RvcnlUeXBlIG9yIEhpc3RvcnlUeXBlSUQgaXMgbmVlZGVkCiAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdBbnkgdXNlZnVsIGluZm9ybWF0aW9uJywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCBDb21tZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISggJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAkUGFyYW17SGlzdG9yeVR5cGVJRH0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgdHlwZSBpZCBmcm9tIGhpc3RvcnkgdHlwZSBpZiBoaXN0b3J5IHR5cGUgaXMgZ2l2ZW4uCiAgICBpZiAoICRQYXJhbXtIaXN0b3J5VHlwZX0gKSB7CiAgICAgICAgbXkgJElkID0gJFNlbGYtPkhpc3RvcnlUeXBlTG9va3VwKCBIaXN0b3J5VHlwZSA9PiAkUGFyYW17SGlzdG9yeVR5cGV9ICk7CgogICAgICAgIGlmICggISRJZCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgaGlzdG9yeSB0eXBlIGdpdmVuIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtIaXN0b3J5VHlwZUlEfSA9ICRJZDsKICAgIH0KCiAgICAjIGlmIGhpc3RvcnkgdHlwZSBpcyBnaXZlbgogICAgZWxzaWYgKCAkUGFyYW17SGlzdG9yeVR5cGVJRH0gKSB7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+SGlzdG9yeVR5cGVMb29rdXAoIEhpc3RvcnlUeXBlSUQgPT4gJFBhcmFte0hpc3RvcnlUeXBlSUR9ICk7CgogICAgICAgIGlmICggISROYW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBoaXN0b3J5IHR5cGUgaWQgZ2l2ZW4hJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGdpdmVuIGNvbmZpZyBpdGVtIGlkIHBvaW50cyB0byBhbiBleGlzdGluZyBjb25maWcgaXRlbSBudW1iZXIKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CgogICAgICAgIG15ICROdW1iZXIgPSAkU2VsZi0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISROdW1iZXIgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIGNvbmZpZyBpdGVtIGlkIGdpdmVuIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGVkIHJlc3VsdHMKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBzaG9ydGVuIHRoZSBjb21tZW50IGlmIGl0IGlzIGJpZ2dlciB0aGFuIG1heCBsZW5ndGgKICAgIGlmICggbGVuZ3RoKCAkUGFyYW17Q29tbWVudH0gKSA+IDI1NSApIHsKCiAgICAgICAgbXkgKCAkRmllbGQsICRPbGQsICROZXcgKSA9IHNwbGl0ICclJScsICRQYXJhbXtDb21tZW50fSwgMzsKCiAgICAgICAgbXkgJExlbmd0aCA9IGludCggKCAyNTUgLSBsZW5ndGgoJEZpZWxkKSAtIDQgKSAvIDIgKTsKCiAgICAgICAgaWYgKCBsZW5ndGgoJE9sZCkgPiAkTGVuZ3RoICkgewogICAgICAgICAgICBteSAkSW5kZXggPSBpbnQoICRMZW5ndGggLyAyICk7CiAgICAgICAgICAgICRPbGQgPSBzdWJzdHIoICRPbGQsIDAsICRJbmRleCAtIDIgKSAuICcuLi4nIC4gc3Vic3RyKCAkT2xkLCBsZW5ndGgoJE9sZCkgLSAkSW5kZXggKyAyICk7CiAgICAgICAgfQogICAgICAgIGlmICggbGVuZ3RoKCROZXcpID4gJExlbmd0aCApIHsKICAgICAgICAgICAgbXkgJEluZGV4ID0gaW50KCAkTGVuZ3RoIC8gMiApOwogICAgICAgICAgICAkTmV3ID0gc3Vic3RyKCAkTmV3LCAwLCAkSW5kZXggLSAyICkgLiAnLi4uJyAuIHN1YnN0ciggJE5ldywgbGVuZ3RoKCROZXcpIC0gJEluZGV4ICsgMiApOwogICAgICAgIH0KICAgICAgICBteSAkTmV3Q29tbWVudCA9ICRGaWVsZCAuICclJScgLiAkT2xkIC4gJyUlJyAuICROZXc7CgogICAgICAgICRQYXJhbXtDb21tZW50fSA9ICROZXdDb21tZW50OwogICAgfQoKICAgICMgaW5zZXJ0IGhpc3RvcnkgZW50cnkKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX2hpc3RvcnkgKCBjb25maWdpdGVtX2lkLCBjb250ZW50LCBjcmVhdGVfYnksICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIHR5cGVfaWQgKSBWQUxVRVMgKCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyApJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SGlzdG9yeVR5cGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEhpc3RvcnlEZWxldGUoKQoKRGVsZXRlcyBjb21wbGV0ZSBoaXN0b3J5IGZvciBhIGdpdmVuIGNvbmZpZyBpdGVtCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlEZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlZCByZXN1bHRzCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb259LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CiAgICBmb3IgbXkgJFZlcnNpb25OciAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfSB9ICkgewogICAgICAgIG15ICgkQ2FjaGVDb25maWdJdGVtKSA9IGtleXMgJXsgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnskVmVyc2lvbk5yfSB9OwogICAgICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfS0+eyRWZXJzaW9uTnJ9IGlmICRDYWNoZUNvbmZpZ0l0ZW0gZXEgJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICB9CgogICAgIyBkZWxldGUgaGlzdG9yeSBmb3IgZ2l2ZW4gY29uZmlnIGl0ZW0KICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9oaXN0b3J5IFdIRVJFIGNvbmZpZ2l0ZW1faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwp9Cgo9aXRlbSBIaXN0b3J5RW50cnlEZWxldGUoKQoKRGVsZXRlcyBhIHNpbmdsZSBoaXN0b3J5IGVudHJ5LgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5RW50cnlEZWxldGUoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5RW50cnlEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEhpc3RvcnlFbnRyeUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIHNpbmdsZSBlbnRyeQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2hpc3RvcnkgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtIaXN0b3J5RW50cnlJRH0gXSwKICAgICk7Cn0KCj1pdGVtIEhpc3RvcnlUeXBlTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlCmlkIGlzIHJldHVybmVkLgoKICAgIG15ICROYW1lID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJElkID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeVR5cGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoJEtleSkgPSBncmVwIHsgJFBhcmFteyRffSB9IHF3KEhpc3RvcnlUeXBlSUQgSGlzdG9yeVR5cGUpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEtleSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSGlzdG9yeVR5cGVJRCBvciBIaXN0b3J5VHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgcmVzdWx0IGlzIGNhY2hlZCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0hpc3RvcnlUeXBlTG9va3VwfS0+eyAkUGFyYW17JEtleX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SGlzdG9yeVR5cGVMb29rdXB9LT57ICRQYXJhbXskS2V5fSB9OwoKICAgICMgc2V0IHRoZSBhcHByb3ByaWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gJ1NFTEVDVCBuYW1lIEZST00gY29uZmlnaXRlbV9oaXN0b3J5X3R5cGUgV0hFUkUgaWQgPSA/JzsKCiAgICBpZiAoICRLZXkgZXEgJ0hpc3RvcnlUeXBlJyApIHsKICAgICAgICAkU1FMID0gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeV90eXBlIFdIRVJFIG5hbWUgPSA/JzsKICAgIH0KCiAgICAjIGZldGNoIHRoZSByZXF1ZXN0ZWQgdmFsdWUKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17JEtleX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkVmFsdWU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWYWx1ZSA9ICRSb3dbMF07CiAgICB9CgogICAgIyBzYXZlIHZhbHVlIGluIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlfS0+e0hpc3RvcnlUeXBlTG9va3VwfS0+eyAkUGFyYW17JEtleX0gfSA9ICRWYWx1ZTsKCiAgICByZXR1cm4gJFZhbHVlOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckxvb2t1cCgpCgpyZXR1cm4gY29uZmlnIGl0ZW0gaWQgb3IgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICcxMjM0NTQzMjEnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCBvciBDb25maWdJdGVtTnVtYmVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e0lEfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntJRH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBjb25maWdpdGVtX251bWJlciBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlcjsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57SUR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0gPSAkQ29uZmlnSXRlbU51bWJlcjsKCiAgICAgICAgcmV0dXJuICRDb25maWdJdGVtTnVtYmVyOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e051bWJlcn0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1OdW1iZXJ9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgY29uZmlnaXRlbV9udW1iZXIgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb25maWdJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e051bWJlcn0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1OdW1iZXJ9IH0gPSAkQ29uZmlnSXRlbUlEOwoKICAgIHJldHVybiAkQ29uZmlnSXRlbUlEOwp9Cgo9aXRlbSBDb25maWdJdGVtTnVtYmVyQ3JlYXRlKCkKCmNyZWF0ZSBhIG5ldyBjb25maWcgaXRlbSBudW1iZXIKCiAgICBteSAkTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZSBDbGFzc0lEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJFBhcmFte1R5cGV9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGNvbmZpZyBpdGVtIG51bWJlciBnZW5lcmF0b3IgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISAkQCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZUJhc2VDbGFzcyggJFBhcmFte1R5cGV9ICk7CgogICAgIyBjcmVhdGUgbnVtYmVyCiAgICBteSAkTnVtYmVyID0gJFNlbGYtPl9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICROdW1iZXI7Cn0KCj1pdGVtIEN1cnJlbnRDb3VudGVyR2V0KCkKCnJldHVybiB0aGUgY3VycmVudCBjb3VudGVyIG9mIGEgY2xhc3MKCiAgICBteSAkQ291bnRlciA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJyZW50Q291bnRlckdldCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICAgICBUeXBlICAgID0+ICdBdXRvSW5jcmVtZW50JywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VycmVudENvdW50ZXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNvdW50ZXIgRlJPTSBjb25maWdpdGVtX2NvdW50ZXIgV0hFUkUgJwogICAgICAgICAgICAuICdjbGFzc19pZCA9ID8gQU5EIGNvdW50ZXJfdHlwZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc0lEfSwgXCRQYXJhbXtUeXBlfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE51bWJlcjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE51bWJlciA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICROdW1iZXI7Cn0KCj1pdGVtIEN1cnJlbnRDb3VudGVyU2V0KCkKCnNldCB0aGUgY3VycmVudCBjb3VudGVyIG9mIGEgY2xhc3MKCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJyZW50Q291bnRlclNldCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICAgICBUeXBlICAgID0+ICdBdXRvSW5jcmVtZW50JywKICAgICAgICBDb3VudGVyID0+ICcxMicsCiAgICApOwoKPWN1dAoKc3ViIEN1cnJlbnRDb3VudGVyU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgVHlwZSBDb3VudGVyKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBvbGQgY291bnRlcgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1fY291bnRlciBXSEVSRSBjbGFzc19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICApOwoKICAgICMgc2V0IG5ldyBjb3VudGVyCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX2NvdW50ZXIgJwogICAgICAgICAgICAuICcoY2xhc3NfaWQsIGNvdW50ZXJfdHlwZSwgY291bnRlcikgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VHlwZX0sIFwkUGFyYW17Q291bnRlcn0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb24gLSBtb2R1bGUgZm9yIElUU01Db25maWdJdGVtLnBtIHdpdGggUGVybWlzc2lvbiBmdW5jdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIFBlcm1pc3Npb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFBlcm1pc3Npb24oKQoKcmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9ucyBvciBub3QKCiAgICBteSAkQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBTY29wZSAgICA9PiAnQ2xhc3MnLCAjIENsYXNzIHx8IEl0ZW0KICAgICAgICBDbGFzc0lEICA9PiAxMjMsICAgICAjIGlmIFNjb3BlIGlzICdDbGFzcycKICAgICAgICBJdGVtSUQgICA9PiAxMjMsICAgICAjIGlmIFNjb3BlIGlzICdJdGVtJwogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICk7CgpvciB3aXRob3V0IGxvZ2dpbmcsIGZvciBleGFtcGxlIGZvciB0byBjaGVjayBpZiBhIGxpbmsvYWN0aW9uIHNob3VsZCBiZSBzaG93bgoKICAgIG15ICRBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFNjb3BlICAgID0+ICdDbGFzcycsICMgQ2xhc3MgfHwgSXRlbQogICAgICAgIENsYXNzSUQgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0NsYXNzJwogICAgICAgIEl0ZW1JRCAgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0l0ZW0nCiAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgU2NvcGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBJdGVtSUQgb3IgQ2xhc3NJRCBkZXBlbmRlbnQKICAgICMgb24gdGhlIFNjb3BlCiAgICBpZiAoCiAgICAgICAgKCAkUGFyYW17U2NvcGV9IGVxICdDbGFzcycgICAmJiAhJFBhcmFte0NsYXNzSUR9ICkKICAgICAgICB8fCAoICRQYXJhbXtTY29wZX0gZXEgJ0l0ZW0nICYmICEkUGFyYW17SXRlbUlEfSApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDbGFzc0lEIGlmIFNjb3BlIGlzICdDbGFzcycgb3IgSXRlbUlEIGlmIFNjb3BlIGlzICdJdGVtJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcnVuIGFsbCBJVFNNQ29uZmlnSXRlbSBQZXJtaXNzaW9uIG1vZHVsZXMKICAgIGlmICgKICAgICAgICByZWYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCAnSVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246OicgLiAkUGFyYW17U2NvcGV9ICkgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgIG15ICVNb2R1bGVzID0gJXsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCAnSVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246OicgLiAkUGFyYW17U2NvcGV9ICkKICAgICAgICB9OwogICAgICAgIE1PRFVMRToKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNT0RVTEUKICAgICAgICAgICAgICAgIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdAogICAgICAgICAgICBteSAkTW9kdWxlT2JqZWN0ID0gJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9LT5uZXcoKTsKCiAgICAgICAgICAgICMgZXhlY3V0ZSBSdW4oKQogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkTW9kdWxlT2JqZWN0LT5SdW4oJVBhcmFtKTsKCiAgICAgICAgICAgICMgY2hlY2sgZ3JhbnRlZCBvcHRpb24gKHNob3VsZCBJIHNheSBvaykKICAgICAgICAgICAgaWYgKCAkQWNjZXNzT2sgJiYgJE1vZHVsZXN7JE1vZHVsZX0tPntHcmFudGVkfSApIHsKCiAgICAgICAgICAgICAgICAjIGFjY2VzcyBvawogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV0dXJuIGJlY2F1c2UgYWNjZXNzIGlzIGZhbHNlIGJ1dCBpdCdzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVybWlzc2lvbiBkZW5pZWQgYmVjYXVzZSBtb2R1bGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiKCRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSkgaXMgcmVxdWlyZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiKFVzZXJJRDogJFBhcmFte1VzZXJJRH0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAib24gJFBhcmFte1Njb3BlfTogIiAuICRQYXJhbXsgJFBhcmFte1Njb3BlfSAuICdJRCcgfSAuICIpISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFjY2VzcyBub3Qgb2sKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRvbid0IGdyYW50IGFjY2VzcwogICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQZXJtaXNzaW9uIGRlbmllZCAoVXNlcklEOiAkUGFyYW17VXNlcklEfSAnJFBhcmFte1R5cGV9JyAiCiAgICAgICAgICAgICAgICAuICJvbiAkUGFyYW17U2NvcGV9OiAiIC4gJFBhcmFteyAkUGFyYW17U2NvcGV9IC4gJ0lEJyB9IC4gIikhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBTdG9yYWJsZTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb24gLSBzdWIgbW9kdWxlIG9mIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdmVyc2lvbiBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gVmVyc2lvblpvb21MaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIHZlcnNpb24gbGlzdCBhcyBhcnJheWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJFZlcnNpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25ab29tTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uWm9vbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBnZXQgdmVyc2lvbiB6b29tIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCBkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gT1JERVIgQlkgaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVmVyc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVWZXJzaW9uOwogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gICA9ICRSb3dbMF07CiAgICAgICAgJFZlcnNpb257TmFtZX0gICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0gPSAkUm93WzJdOwogICAgICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfSA9ICRSb3dbM107CiAgICAgICAgJFZlcnNpb257Q3JlYXRlVGltZX0gID0gJFJvd1s0XTsKICAgICAgICAkVmVyc2lvbntDcmVhdGVCeX0gICAgPSAkUm93WzVdOwoKICAgICAgICBwdXNoIEBWZXJzaW9uTGlzdCwgXCVWZXJzaW9uOwogICAgfQoKICAgIGZvciBteSAkVmVyc2lvbiAoQFZlcnNpb25MaXN0KSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICREZXBsU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICRJbmNpU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBhZGQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICRWZXJzaW9uLT57Q2xhc3NJRH0gICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9OwogICAgICAgICRWZXJzaW9uLT57Q2xhc3N9ICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzfTsKICAgICAgICAkVmVyc2lvbi0+e051bWJlcn0gICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZVR5cGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckluY2lTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9OwogICAgfQoKICAgIHJldHVybiBcQFZlcnNpb25MaXN0Owp9Cgo9aXRlbSBWZXJzaW9uTGlzdEFsbCgpCgpSZXR1cm5zIGEgdHdvLWRpbWVuc2lvbmFsIGhhc2ggcmVmZXJlbmNlIHdpdGggdGhlIGNvbmZpZ2l0ZW0gaWRzIGFzIGtleXMgb2YgdGhlIGZpcnN0IGxldmVsCmFuZCB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIGlkcyBhcyBrZXlzIG9mIHRoZSBzZWNvbmQgbGV2ZWwsCnRoZW4gZm9sbG93ZWQgYnkgdGhlIHZlcnNpb24gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZS4KCiAgICBteSAkVmVyc2lvbkxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkxpc3RBbGwoCiAgICAgICAgQ29uZmlnSXRlbUlEcyA9PiBbIDEsIDIsIDMsIDQsIC4uLl0sICAgICMgb3B0aW9uYWwKCiAgICAgICAgT2xkZXJEYXRlICAgICA9PiAnMjAxNC0xMi0yMiAyMzo1OTo1OScsICMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaW5kcyB2ZXJzaW9ucyBvbGRlciB0aGFuIHRoZSBnaXZlbiBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRm9ybWF0IE1VU1QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBZWVlZLU1NLUREIEhIOk1NOlNTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCBtaXNzaW5nIHZhbHVlcyB3aXRoIDAgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFeGFtcGxlOiAyMDE0LTA0LTAxIDA3OjAzOjA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGl0IHdvbid0IGJlIHRha2VuIGFzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmFsaWQgc2VhcmNoIHBhcmFtZXRlcgoKICAgICAgICBMaW1pdCAgICAgICAgID0+IDEwMDAwMDAsICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKClJldHVybnM6CgokVmVyc2lvbkxpc3RSZWYgPSB7CgogICAgIyBDb25maWdJdGVtSUQKICAgIDEgPT4gewoKICAgICAgICAjIFZlcnNpb25JRAogICAgICAgIDEwMCA9PiB7CiAgICAgICAgICAgIFZlcnNpb25JRCAgICA9PiAxMDAsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NvbmZpZ0l0ZW0xJywKICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+IDUsCiAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAzLAogICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gMiwKICAgICAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAzLTIyIDE3OjU4OjAwJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+IDEsCiAgICAgICAgfSwKCiAgICAgICAgIyBWZXJzaW9uSUQKICAgICAgICAxMDEgPT4gewogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gMTAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb25maWdJdGVtMicsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiA1LAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gMywKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDIsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICA9PiAnMjAxNi0wMy0yMiAxNzo1ODowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgQ29uZmlnSXRlbUlECiAgICAyID0+IHsKCiAgICAgICAgIyBWZXJzaW9uSUQKICAgICAgICAxNTAgPT4gewogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gMTUwLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gMiwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb25maWdJdGVtMScsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiA1LAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gMywKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDIsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICA9PiAnMjAxNi0wMy0yMiAxNzo1ODowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICA9PiAxLAogICAgICAgIH0sCgogICAgICAgICMgVmVyc2lvbklECiAgICAgICAgMTUxID0+IHsKICAgICAgICAgICAgVmVyc2lvbklEICAgID0+IDE1MSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IDIsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ29uZmlnSXRlbTEnLAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gNSwKICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+IDMsCiAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAyLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgPT4gJzIwMTYtMDMtMjIgMTc6NTg6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKfTsKCj1jdXQKCnN1YiBWZXJzaW9uTGlzdEFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYnVpbGQgc3FsCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwKICAgICAgICBkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5CiAgICAgICAgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgMT0xJzsKCiAgICAjIGlmIHdlIGdvdCBDb25maWdJdGVtSURzIG1ha2Ugc3VyZSB3ZSBqdXN0IGhhdmUgbnVtZXJpYyBpZHMsCiAgICAjIGV4dHJhY3QgdGhvc2UgYW5kIHVzZSBpdCBmb3IgdGhlIHF1ZXJ5CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0NvbmZpZ0l0ZW1JRHN9ICkgKSB7CiAgICAgICAgbXkgQENvbmZpZ0l0ZW1JRHMgPSBncmVwIHsgJF8gPX4gL15cZCskLyB9IEB7ICRQYXJhbXtDb25maWdJdGVtSURzfSB9OwogICAgICAgICRTUUwgLj0gJyBBTkQgY29uZmlnaXRlbV9pZCBJTiAoJyAuIGpvaW4gJywgJywgQENvbmZpZ0l0ZW1JRHMgLiAnKSc7CiAgICB9CgogICAgbXkgQEJpbmRQYXJhbWV0ZXI7CiAgICBpZiAoICRQYXJhbXtPbGRlckRhdGV9ICYmICRQYXJhbXtPbGRlckRhdGV9ID1+IC9eXGR7NH1cLVxkezJ9XC1cZHsyfVwgXGR7Mn1cOlxkezJ9OlxkezJ9JC8gKSB7CiAgICAgICAgJFNRTCAuPSAnIEFORCBjcmVhdGVfdGltZSA8ID8nOwogICAgICAgIHB1c2ggQEJpbmRQYXJhbWV0ZXIsIFwkUGFyYW17T2xkZXJEYXRlfTsKICAgIH0KCiAgICAjIHNldCBsaW1pdAogICAgaWYgKCAkUGFyYW17TGltaXR9ICkgewogICAgICAgICRQYXJhbXtMaW1pdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVvdGUoICRQYXJhbXtMaW1pdH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgIGlmIChAQmluZFBhcmFtZXRlcikgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kICA9PiBcQEJpbmRQYXJhbWV0ZXIsCiAgICAgICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVJlc3VsdHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZXN1bHRzeyAkUm93WzFdIH0tPnsgJFJvd1swXSB9ID0gewogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRSb3dbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUm93WzJdIHx8ICcnLAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJFJvd1szXSB8fCAnJywKICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRSb3dbNF0gfHwgJycsCiAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkUm93WzVdIHx8ICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgPT4gJFJvd1s2XSB8fCAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+ICRSb3dbN10gfHwgJycsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gXCVSZXN1bHRzOwp9Cgo9aXRlbSBWZXJzaW9uTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSB2ZXJzaW9uIGxpc3QgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJFZlcnNpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBWZXJzaW9uTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVmVyc2lvbkxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAVmVyc2lvbkxpc3Q7Cn0KCj1pdGVtIFZlcnNpb25HZXQoKQoKcmV0dXJucyBhIHZlcnNpb24gb2YgYSBjb25maWcgaXRlbSBhcyBoYXNoIHJlZmVyZW5jZS4KVGhlIHJldHVybmVkIGhhc2ggY29udGFpbnMgZm9sbG93aW5nIGF0dHJpYnV0ZXMuCgogICAgJFZlcnNpb257VmVyc2lvbklEfQogICAgJFZlcnNpb257Q29uZmlnSXRlbUlEfQogICAgJFZlcnNpb257TnVtYmVyfQogICAgJFZlcnNpb257Q2xhc3NJRH0KICAgICRWZXJzaW9ue0NsYXNzfQogICAgJFZlcnNpb257TGFzdFZlcnNpb25JRH0KICAgICRWZXJzaW9ue05hbWV9CiAgICAkVmVyc2lvbntEZWZpbml0aW9uSUR9CiAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0luY2lTdGF0ZX0KICAgICRWZXJzaW9ue0luY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntYTUxEZWZpbml0aW9ufQogICAgJFZlcnNpb257WE1MRGF0YX0KICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9CiAgICAkVmVyc2lvbntDcmVhdGVCeX0KCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCAgPT4gMTIzLAogICAgICAgIFhNTERhdGFHZXQgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgKTsKCiAgICBvcgoKICAgIG15ICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7CgpXaGVuIHRoZSBkYXRhIGZyb20gdGhlIFhNTCBzdG9yYWdlIGlzIG5vdCBuZWVkZWQgdGhlbiBmZXRjaGluZyB0aGUgWE1MIGRhdGEgY2FuIGJlCmV4cGxpY2l0bHkgdHVybmVkIG9mZiBieSBwYXNzaW5nIFhNTERhdGFHZXQgPT4gMC4KCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1ZlcnNpb25JRH0gJiYgISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQgb3IgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YUdldH0gKSB7CiAgICAgICAgJFBhcmFte1hNTERhdGFHZXR9ID0gMTsKICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIG15ICRDYWNoZUtleSA9ICdWZXJzaW9uR2V0OjpWZXJzaW9uSUQ6OicgLiAkUGFyYW17VmVyc2lvbklEfSAuICc6OlhNTERhdGE6OicgLiAkUGFyYW17WE1MRGF0YUdldH07CiAgICAgICAgbXkgJENhY2hlICAgID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBTdG9yYWJsZTo6ZGNsb25lKCRDYWNoZSkgaWYgJENhY2hlOwoKICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25maWdpdGVtX2lkLCBuYW1lLCBkZWZpbml0aW9uX2lkLCAnCiAgICAgICAgICAgICAgICAuICdkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtWZXJzaW9uSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIG15ICRDYWNoZUtleSA9ICdWZXJzaW9uR2V0OjpDb25maWdJdGVtSUQ6OicgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICc6OlhNTERhdGE6OicgLiAkUGFyYW17WE1MRGF0YUdldH07CiAgICAgICAgbXkgJENhY2hlICAgID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBTdG9yYWJsZTo6ZGNsb25lKCRDYWNoZSkgaWYgJENhY2hlOwoKICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25maWdpdGVtX2lkLCBuYW1lLCBkZWZpbml0aW9uX2lkLCAnCiAgICAgICAgICAgICAgICAuICdkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV92ZXJzaW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmZpZ2l0ZW1faWQgPSA/IE9SREVSIEJZIGlkIERFU0MnLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVmVyc2lvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZlcnNpb257VmVyc2lvbklEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJFZlcnNpb257Q29uZmlnSXRlbUlEfSA9ICRSb3dbMV07CiAgICAgICAgJFZlcnNpb257TmFtZX0gICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJFZlcnNpb257RGVmaW5pdGlvbklEfSA9ICRSb3dbM107CiAgICAgICAgJFZlcnNpb257RGVwbFN0YXRlSUR9ICA9ICRSb3dbNF07CiAgICAgICAgJFZlcnNpb257SW5jaVN0YXRlSUR9ICA9ICRSb3dbNV07CiAgICAgICAgJFZlcnNpb257Q3JlYXRlVGltZX0gICA9ICRSb3dbNl07CiAgICAgICAgJFZlcnNpb257Q3JlYXRlQnl9ICAgICA9ICRSb3dbN107CiAgICB9CgogICAgIyBjaGVjayB2ZXJzaW9uCiAgICBpZiAoICEkVmVyc2lvbntWZXJzaW9uSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gc3VjaCBjb25maWcgaXRlbSB2ZXJzaW9uIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkRGVwbFN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9ue0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgJFZlcnNpb257RGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAkVmVyc2lvbntEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkSW5jaVN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9ue0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgJFZlcnNpb257SW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAkVmVyc2lvbntJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGdldCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFZlcnNpb257Q29uZmlnSXRlbUlEfSwKICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBjaGVjayBjb25maWcgaXRlbSBkYXRhCiAgICBpZiAoICEkQ29uZmlnSXRlbSB8fCByZWYgJENvbmZpZ0l0ZW0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IGNvbmZpZyBpdGVtICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkVmVyc2lvbntDbGFzc0lEfSAgICAgICAgICA9ICRDb25maWdJdGVtLT57Q2xhc3NJRH07CiAgICAkVmVyc2lvbntDbGFzc30gICAgICAgICAgICA9ICRDb25maWdJdGVtLT57Q2xhc3N9OwogICAgJFZlcnNpb257TGFzdFZlcnNpb25JRH0gICAgPSAkQ29uZmlnSXRlbS0+e0xhc3RWZXJzaW9uSUR9OwogICAgJFZlcnNpb257TnVtYmVyfSAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e051bWJlcn07CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVJRH0gICA9ICRDb25maWdJdGVtLT57Q3VyRGVwbFN0YXRlSUR9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlfSAgICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX07CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVUeXBlfSA9ICRDb25maWdJdGVtLT57Q3VyRGVwbFN0YXRlVHlwZX07CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVJRH0gICA9ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlSUR9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlfSAgICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZX07CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVUeXBlfSA9ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX07CgogICAgIyBzZXQgY2FjaGUgZm9yIFZlcnNpb25JRCB3aXRob3V0IHhtbCBkYXRhIChhbHdheXMpCiAgICBteSAkQ2FjaGVLZXkgPSAnVmVyc2lvbkdldDo6VmVyc2lvbklEOjonIC4gJFZlcnNpb257VmVyc2lvbklEfSAuICc6OlhNTERhdGE6OjAnOwogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBTdG9yYWJsZTo6ZGNsb25lKCBcJVZlcnNpb24gKSwKICAgICk7CgogICAgIyBzZXQgY2FjaGUgZm9yIENvbmZpZ0l0ZW1JRCB3aXRob3V0IHhtbCBkYXRhIChvbmx5IGlmIGNhbGxlZCB3aXRoIENvbmZpZ0l0ZW1JRCkKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJENhY2hlS2V5ID0gJ1ZlcnNpb25HZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0gLiAnOjpYTUxEYXRhOjowJzsKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBTdG9yYWJsZTo6ZGNsb25lKCBcJVZlcnNpb24gKSwKICAgICAgICApOwogICAgfQoKICAgICMgZG9uZSBpZiB3ZSBkb24ndCBuZWVkIHhtbCBkYXRhCiAgICByZXR1cm4gXCVWZXJzaW9uIGlmICEkUGFyYW17WE1MRGF0YUdldH07CgogICAgIyBnZXQgeG1sIGRlZmluaXRpb24KICAgIG15ICREZWZpbml0aW9uID0gJFNlbGYtPkRlZmluaXRpb25HZXQoCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICRWZXJzaW9ue0RlZmluaXRpb25JRH0sCiAgICApOwogICAgJFZlcnNpb257WE1MRGVmaW5pdGlvbn0gPSAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9OwoKICAgICMgZ2V0IHhtbCBkYXRhCiAgICAkVmVyc2lvbntYTUxEYXRhfSA9ICRTZWxmLT5fWE1MVmVyc2lvbkdldCgKICAgICAgICBDbGFzc0lEICAgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb257VmVyc2lvbklEfSwKICAgICk7CgogICAgIyBzZXQgY2FjaGUgZm9yIFZlcnNpb25JRCAoYWx3YXlzKQogICAgJENhY2hlS2V5ID0gJ1ZlcnNpb25HZXQ6OlZlcnNpb25JRDo6JyAuICRWZXJzaW9ue1ZlcnNpb25JRH0gLiAnOjpYTUxEYXRhOjoxJzsKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gU3RvcmFibGU6OmRjbG9uZSggXCVWZXJzaW9uICksCiAgICApOwoKICAgICMgc2V0IGNhY2hlIGZvciBDb25maWdJdGVtSUQgKG9ubHkgaWYgY2FsbGVkIHdpdGggQ29uZmlnSXRlbUlEKQogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgPSAnVmVyc2lvbkdldDo6Q29uZmlnSXRlbUlEOjonIC4gJFZlcnNpb257Q29uZmlnSXRlbUlEfSAuICc6OlhNTERhdGE6OjEnOwogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFN0b3JhYmxlOjpkY2xvbmUoIFwlVmVyc2lvbiApLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlVmVyc2lvbjsKfQoKPWl0ZW0gVmVyc2lvbk5hbWVHZXQoKQoKcmV0dXJucyB0aGUgbmFtZSBvZiBhIHZlcnNpb24gb2YgYSBjb25maWcgaXRlbS4KCiAgICBteSAkVmVyc2lvbk5hbWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbk5hbWVHZXQoCiAgICAgICAgVmVyc2lvbklEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkVmVyc2lvbk5hbWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbk5hbWVHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbk5hbWVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1ZlcnNpb25JRH0gJiYgISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQgb3IgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnVmVyc2lvbk5hbWVHZXQ6OlZlcnNpb25JRDo6JyAuICRQYXJhbXtWZXJzaW9uSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VmVyc2lvbklEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnVmVyc2lvbk5hbWVHZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRQYXJhbXtDb25maWdJdGVtSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVZlcnNpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gPSAkUm93WzBdOwogICAgICAgICRWZXJzaW9ue05hbWV9ICAgICAgPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgdmVyc2lvbgogICAgaWYgKCAhJFZlcnNpb257VmVyc2lvbklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHN1Y2ggY29uZmlnIGl0ZW0gdmVyc2lvbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGNhY2hlIGZvciBWZXJzaW9uSUQgKGFsd2F5cykKICAgIG15ICRDYWNoZUtleSA9ICdWZXJzaW9uTmFtZUdldDo6VmVyc2lvbklEOjonIC4gJFZlcnNpb257VmVyc2lvbklEfTsKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCRWZXJzaW9ue05hbWV9LAogICAgKTsKCiAgICAjIHNldCBjYWNoZSBmb3IgQ29uZmlnSXRlbUlEIChvbmx5IGlmIGNhbGxlZCB3aXRoIENvbmZpZ0l0ZW1JRCkKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJENhY2hlS2V5ID0gJ1ZlcnNpb25OYW1lR2V0OjpDb25maWdJdGVtSUQ6OicgLiAkUGFyYW17Q29uZmlnSXRlbUlEfTsKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJFZlcnNpb257TmFtZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFZlcnNpb257TmFtZX07Cn0KCj1pdGVtIFZlcnNpb25Db25maWdJdGVtSURHZXQoKQoKcmV0dXJuIHRoZSBjb25maWcgaXRlbSBpZCBvZiBhIHZlcnNpb24KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25Db25maWdJdGVtSURHZXQoCiAgICAgICAgVmVyc2lvbklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbkNvbmZpZ0l0ZW1JREdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VmVyc2lvbklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVmVyc2lvbklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25Db25maWdJdGVtSURHZXR9LT57ICRQYXJhbXtWZXJzaW9uSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25Db25maWdJdGVtSURHZXR9LT57ICRQYXJhbXtWZXJzaW9uSUR9IH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWQKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgY29uZmlnaXRlbV9pZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtWZXJzaW9uSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfSA9ICRDb25maWdJdGVtSUQ7CgogICAgcmV0dXJuICRDb25maWdJdGVtSUQ7Cn0KCj1pdGVtIFZlcnNpb25BZGQoKQoKYWRkIGEgbmV3IHZlcnNpb24KCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gMTIxMiwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gOCwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gNCwKICAgICAgICBYTUxEYXRhICAgICAgPT4gJEFycmF5SGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDb25maWdJdGVtSUQgTmFtZSBEZWZpbml0aW9uSUQgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgIHJldHVybiBpZiAhJERlcGxTdGF0ZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICREZXBsU3RhdGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdC0+eyAkUGFyYW17RGVwbFN0YXRlSUR9IH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gdmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpZCBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW5jaVN0YXRlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGluY2lkZW50IHN0YXRlIGlkCiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdC0+eyAkUGFyYW17SW5jaVN0YXRlSUR9IH0gKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gdmFsaWQgaW5jaWRlbnQgc3RhdGUgaWQgZ2l2ZW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBWZXJzaW9uTGlzdAogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgbXkgJENvbmZpZ0l0ZW1JbmZvID0ge307CgogICAgaWYgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG9sZCB2ZXJzaW9uIGluZm8gZm9yIGNvbXBhcmlzb25zIHdpdGggY3VycmVudCB2ZXJzaW9uCiAgICAgICAgIyB0aGlzIGlzIG5lZWRlZCB0byB0cmlnZ2VyIHNvbWUgZXZlbnRzCiAgICAgICAgJENvbmZpZ0l0ZW1JbmZvID0gJFNlbGYtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtSW5mbyA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRDb25maWdJdGVtSW5mbzsKICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW1JbmZvIG5lICdIQVNIJzsKCiAgICAjIGNoZWNrLCB3aGV0aGVyIHRoZSBmZWF0dXJlIHRvIGNoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIGlzIGVuYWJsZWQKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdVbmlxdWVDSU5hbWU6OkVuYWJsZVVuaXF1ZW5lc3NDaGVjaycpICkgewoKICAgICAgICBteSAkTmFtZUR1cGxpY2F0ZXMgPSAkU2VsZi0+VW5pcXVlTmFtZUNoZWNrKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkQ29uZmlnSXRlbUluZm8tPntDbGFzc0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHN0b3AgcHJvY2Vzc2luZyBpZiB0aGUgbmFtZSBpcyBub3QgdW5pcXVlCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE5hbWVEdXBsaWNhdGVzKSApIHsKCiAgICAgICAgICAgICMgYnVpbGQgYSBzdHJpbmcgb2YgYWxsIGR1cGxpY2F0ZSBJRHMKICAgICAgICAgICAgbXkgJER1cGxpY2F0ZXMgPSBqb2luICcsICcsIEB7JE5hbWVEdXBsaWNhdGVzfTsKCiAgICAgICAgICAgICMgd3JpdGUgYW4gZXJyb3IgbG9nIG1lc3NhZ2UgY29udGFpbmluZyBhbGwgdGhlIGR1cGxpY2F0ZSBJRHMKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBuYW1lICRQYXJhbXtOYW1lfSBpcyBhbHJlYWR5IGluIHVzZSAoQ29uZmlnSXRlbUlEczogJER1cGxpY2F0ZXMpISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEV2ZW50cyA9ICRTZWxmLT5fR2V0RXZlbnRzKAogICAgICAgIFBhcmFtICAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgQ29uZmlnSXRlbUluZm8gPT4gJENvbmZpZ0l0ZW1JbmZvLAogICAgKTsKCiAgICBteSAkUmV0dXJuVmVyc2lvbklEID0gc2NhbGFyIEB7JFZlcnNpb25MaXN0fSA/ICRWZXJzaW9uTGlzdC0+Wy0xXSA6IDA7CiAgICByZXR1cm4gJFJldHVyblZlcnNpb25JRCBpZiAhKCAkRXZlbnRzICYmIGtleXMgJXskRXZlbnRzfSApOwoKICAgICMgaW5zZXJ0IG5ldyB2ZXJzaW9uCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgIC4gJyhjb25maWdpdGVtX2lkLCBuYW1lLCBkZWZpbml0aW9uX2lkLCAnCiAgICAgICAgICAgIC4gJ2RlcGxfc3RhdGVfaWQsIGluY2lfc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgXCRQYXJhbXtEZXBsU3RhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SW5jaVN0YXRlSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAjIGRlbGV0ZSBhZmZlY3RlZCBjYWNoZXMKICAgIG15ICRDYWNoZUtleSAgICA9ICdWZXJzaW9uR2V0OjpDb25maWdJdGVtSUQ6OicgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICc6OlhNTERhdGE6Oic7CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIGZvciBteSAkWE1MRGF0YSAocXcoMCAxKSkgewogICAgICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAkWE1MRGF0YSwKICAgICAgICApOwogICAgfQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnVmVyc2lvbk5hbWVHZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICAjIGdldCBpZCBvZiBuZXcgdmVyc2lvbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNyZWF0ZV90aW1lIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFICcKICAgICAgICAgICAgLiAnY29uZmlnaXRlbV9pZCA9ID8gT1JERVIgQlkgaWQgREVTQycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRWZXJzaW9uSUQ7CiAgICBteSAkQ3JlYXRlVGltZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZlcnNpb25JRCAgPSAkUm93WzBdOwogICAgICAgICRDcmVhdGVUaW1lID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIHZlcnNpb24gaWQKICAgIGlmICggISRWZXJzaW9uSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBnZXQgdGhlIG5ldyB2ZXJzaW9uIGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgeG1sIGRhdGEKICAgIGlmICggJFBhcmFte1hNTERhdGF9ICYmIHJlZiAkUGFyYW17WE1MRGF0YX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+X1hNTFZlcnNpb25BZGQoCiAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkQ29uZmlnSXRlbUluZm8tPntDbGFzc0lEfSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+ICRQYXJhbXtYTUxEYXRhfSwKICAgICAgICApOwogICAgfQoKICAgICMgdXBkYXRlIGxhc3RfdmVyc2lvbl9pZCwgY3VyX2RlcGxfc3RhdGVfaWQsIGN1cl9pbmNpX3N0YXRlX2lkLCBjaGFuZ2VfdGltZSBhbmQgY2hhbmdlX2J5CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgY29uZmlnaXRlbSBTRVQgbGFzdF92ZXJzaW9uX2lkID0gPywgJwogICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCA9ID8sIGN1cl9pbmNpX3N0YXRlX2lkID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9ID8sIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFZlcnNpb25JRCwKICAgICAgICAgICAgXCRQYXJhbXtEZXBsU3RhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SW5jaVN0YXRlSUR9LAogICAgICAgICAgICBcJENyZWF0ZVRpbWUsCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtIGNhY2hlCiAgICAkQ2FjaGVLZXkgPSAnQ29uZmlnSXRlbUdldDo6Q29uZmlnSXRlbUlEOjonIC4gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgIyB0cmlnZ2VyIFZlcnNpb25DcmVhdGUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1ZlcnNpb25DcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFZlcnNpb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjb21wYXJlIGN1cnJlbnQgYW5kIG9sZCB2YWx1ZXMKICAgIGlmICggJEV2ZW50cy0+e1ZhbHVlVXBkYXRlfSApIHsKICAgICAgICAkU2VsZi0+X0V2ZW50SGFuZGxlckZvckNoYW5nZWRYTUxWYWx1ZXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXBkYXRlVmFsdWVzID0+ICRFdmVudHMtPntWYWx1ZVVwZGF0ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBkZWZpbml0aW9uIHVwZGF0ZSBldmVudAogICAgaWYgKCAkRXZlbnRzLT57RGVmaW5pdGlvblVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0RlZmluaXRpb25VcGRhdGUnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEV2ZW50cy0+e0RlZmluaXRpb25VcGRhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIG9sZCBhbmQgbmV3IG5hbWUKICAgIGlmICggJEV2ZW50cy0+e05hbWVVcGRhdGV9ICkgewogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdOYW1lVXBkYXRlJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRFdmVudHMtPntOYW1lVXBkYXRlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIGluY2lkZW50IHN0YXRlIHVwZGF0ZSBldmVudAogICAgaWYgKCAkRXZlbnRzLT57SW5jaWRlbnRTdGF0ZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0luY2lkZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEV2ZW50cy0+e0luY2lkZW50U3RhdGVVcGRhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgZGVwbG95bWVudCBzdGF0ZSB1cGRhdGUgZXZlbnQKICAgIGlmICggJEV2ZW50cy0+e0RlcGxveW1lbnRTdGF0ZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0RlcGxveW1lbnRTdGF0ZVVwZGF0ZScsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkRXZlbnRzLT57RGVwbG95bWVudFN0YXRlVXBkYXRlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBhbGwgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPkN1ckluY2lTdGF0ZVJlY2FsYygKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAkVmVyc2lvbklEOwp9Cgo9aXRlbSBWZXJzaW9uRGVsZXRlKCkKCmRlbGV0ZSBhbiBleGlzdGluZyB2ZXJzaW9uIG9yIHZlcnNpb25zCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBWZXJzaW9uSURzID0+IFsgMSwgMiwgMywgNCBdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1ZlcnNpb25JRH0gJiYgISRQYXJhbXtDb25maWdJdGVtSUR9ICYmICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtWZXJzaW9uSURzfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQsIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSURzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZlcnNpb25MaXN0ID0gW107CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgIHB1c2ggQHskVmVyc2lvbkxpc3R9LCAkUGFyYW17VmVyc2lvbklEfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1ZlcnNpb25JRHN9ICkgewogICAgICAgIHB1c2ggQHskVmVyc2lvbkxpc3R9LCBAeyAkUGFyYW17VmVyc2lvbklEc30gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgZ2V0IHZlcnNpb24gbGlzdAogICAgICAgICRWZXJzaW9uTGlzdCA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIXNjYWxhciBAeyRWZXJzaW9uTGlzdH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWQgZm9yIHZlcnNpb24gKG5lZWRlZCBmb3IgZXZlbnQgaGFuZGxpbmcpCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyB0byBzdG9yZSB1bmlxdWUgY29uZmlnIGl0ZW0gaWRzIGlmIHRoZXJlIGFyZSB2ZXJzaW9ucyBmcm9tIGRpZmZlcmVudCBjb25maWcgaXRlbXMKICAgIG15ICVDb25maWdJdGVtSURzOwoKICAgIG15ICRTdWNjZXNzOwogICAgZm9yIG15ICRWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZ2l0ZW0gaWQgaWYgbmVjY2Vzc2FyeQogICAgICAgIGlmICggJFBhcmFte1ZlcnNpb25JRH0gfHwgJFBhcmFte1ZlcnNpb25JRHN9ICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPlZlcnNpb25Db25maWdJdGVtSURHZXQoCiAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgdGhlIHVuaXF1ZSBjb25maWcgaXRlbSBpZHMKICAgICAgICAkQ29uZmlnSXRlbUlEc3skQ29uZmlnSXRlbUlEfSA9IDE7CgogICAgICAgICMgZGVsZXRlIHRoZSB4bWwgdmVyc2lvbiBkYXRhCiAgICAgICAgJFNlbGYtPl9YTUxWZXJzaW9uRGVsZXRlKAogICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHZlcnNpb24KICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZlcnNpb25JRCBdLAogICAgICAgICk7CgogICAgICAgICMgdHJpZ2dlciBWZXJzaW9uRGVsZXRlIGV2ZW50IHdoZW4gZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwKICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgICAgICBFdmVudCA9PiAnVmVyc2lvbkRlbGV0ZScsCiAgICAgICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYWZmZWN0ZWQgY2FjaGVzCiAgICAgICAgICAgIG15ICRDYWNoZUtleSA9ICdWZXJzaW9uR2V0OjpWZXJzaW9uSUQ6OicgLiAkVmVyc2lvbklEIC4gJzo6WE1MRGF0YTo6JzsKICAgICAgICAgICAgZm9yIG15ICRYTUxEYXRhIChxdygwIDEpKSB7CiAgICAgICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSAuICRYTUxEYXRhLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAnVmVyc2lvbk5hbWVHZXQ6OlZlcnNpb25JRDo6JyAuICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uQ29uZmlnSXRlbUlER2V0fS0+eyRWZXJzaW9uSUR9OwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAlQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgIyBkZWxldGUgYWZmZWN0ZWQgY2FjaGVzIGZvciBDb25maWdJdGVtSUQgKG1vc3QgcmVjZW50IHZlcnNpb24gbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQpCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ1ZlcnNpb25HZXQ6OkNvbmZpZ0l0ZW1JRDo6JyAuICRDb25maWdJdGVtSUQgLiAnOjpYTUxEYXRhOjonOwogICAgICAgIGZvciBteSAkWE1MRGF0YSAocXcoMCAxKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAkWE1MRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdWZXJzaW9uTmFtZUdldDo6Q29uZmlnSXRlbUlEOjonIC4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gVmVyc2lvblNlYXJjaCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBsaXN0IGFzIGFuIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25TZWFyY2goCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaGUgTmFtZScsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgID0+IFsgOSwgOCwgNywgNiBdLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgMzIxLCAxMjMgXSwgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgMzIxLCAxMjMgXSwgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NvbmZpZ0l0ZW1JRCcsICdOdW1iZXInIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBbICdDb25maWdJdGVtSUQnIF0KICAgICAgICAjIChDb25maWdJdGVtSUQsIE5hbWUsIE51bWJlciwgQ2xhc3NJRCwgRGVwbFN0YXRlSUQsIEluY2lTdGF0ZUlECiAgICAgICAgIyBDcmVhdGVUaW1lLCBDcmVhdGVCeSwgQ2hhbmdlVGltZSwgQ2hhbmdlQnkpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ1VwJywgJ0Rvd24nIF0sICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGRlZmF1bHQ6IFsgJ1VwJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAjIChvcHRpb25hbCkKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgdmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoCiAgICAgICAgcXcoCiAgICAgICAgT3JkZXJCeQogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24KICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFyZ3VtZW50fSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBvcmRlciBhbmQgb3JkZXIgZGlyZWN0aW9uCiAgICBpZiAoICFAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbJ0NvbmZpZ0l0ZW1JRCddOwogICAgfQogICAgaWYgKCAhQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CiAgICAgICAgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259ID0gWydVcCddOwogICAgfQoKICAgICMgZGVmaW5lIG9yZGVyIHRhYmxlCiAgICBteSAlT3JkZXJCeVRhYmxlID0gKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAndnIuY29uZmlnaXRlbV9pZCcsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICd2ci5uYW1lJywKICAgICAgICBOdW1iZXIgICAgICAgPT4gJ2NpLmNvbmZpZ2l0ZW1fbnVtYmVyJywKICAgICAgICBDbGFzc0lEICAgICAgPT4gJ2NpLmNsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJ3ZyLmRlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAndnIuaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgQ3JlYXRlVGltZSAgID0+ICdjaS5jcmVhdGVfdGltZScsCiAgICAgICAgQ3JlYXRlQnkgICAgID0+ICdjaS5jcmVhdGVfYnknLAoKICAgICAgICAjIHRoZSBjaGFuZ2UgdGltZSBvZiB0aGUgQ0kgaXMgdGhlIHNhbWUgYXMgdGhlIGNyZWF0ZSB0aW1lIG9mIHRoZSB2ZXJzaW9uIQogICAgICAgIENoYW5nZVRpbWUgPT4gJ3ZyLmNyZWF0ZV90aW1lJywKCiAgICAgICAgQ2hhbmdlQnkgPT4gJ2NpLmNoYW5nZV9ieScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicKICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgb25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UKICAgIG15IEBTUUxPcmRlckJ5OwogICAgbXkgJENvdW50ID0gMDsKICAgIG15IEBPcmRlckJ5U2VsZWN0Q29sdW1uczsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICAjIHNldCB0aGUgZGVmYXVsdCBvcmRlciBkaXJlY3Rpb24KICAgICAgICBteSAkRGlyZWN0aW9uID0gJ0RFU0MnOwoKICAgICAgICAjIGFkZCB0aGUgZ2l2ZW4gb3JkZXIgZGlyZWN0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ0Rvd24nICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgU1FMCiAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgICAgICAgICAgICIkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAkRGlyZWN0aW9uIjsKICAgICAgICBwdXNoIEBPcmRlckJ5U2VsZWN0Q29sdW1ucywgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX07CgogICAgfQogICAgY29udGludWUgewogICAgICAgICRDb3VudCsrOwogICAgfQoKICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAjIGFkZCBuYW1lIHRvIHNxbCB3aGVyZSBhcnJheQogICAgbXkgQFNRTFdoZXJlOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtOYW1lfSAmJiAkUGFyYW17TmFtZX0gbmUgJycgKSB7CgogICAgICAgICMgZHVwbGljYXRlIHRoZSBuYW1lCiAgICAgICAgbXkgJE5hbWUgPSAkUGFyYW17TmFtZX07CgogICAgICAgICMgcXVvdGUKICAgICAgICAkTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSgkTmFtZSk7CgogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBsaWtlIHN0cmluZwogICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJE5hbWUgKTsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiTE9XRVIodnIubmFtZSkgTElLRSBMT1dFUignJE5hbWUnKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKHZyLm5hbWUpID0gTE9XRVIoJyROYW1lJykiOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBhcnJheSBwYXJhbXMKICAgIG15ICVBcnJheVBhcmFtcyA9ICgKICAgICAgICBDbGFzc0lEcyAgICAgPT4gJ2NpLmlkID0gdnIuY29uZmlnaXRlbV9pZCBBTkQgY2kuY2xhc3NfaWQnLAogICAgICAgIERlcGxTdGF0ZUlEcyA9PiAndnIuZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgSW5jaVN0YXRlSURzID0+ICd2ci5pbmNpX3N0YXRlX2lkJywKICAgICk7CgogICAgQVJSQVlQQVJBTToKICAgIGZvciBteSAkQXJyYXlQYXJhbSAoIHNvcnQga2V5cyAlQXJyYXlQYXJhbXMgKSB7CgogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhJFBhcmFteyRBcnJheVBhcmFtfTsKCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcnJheVBhcmFtfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFycmF5UGFyYW0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICFAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgICMgcXVvdGUgYXMgaW50ZWdlcgogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJE9uZVBhcmFtLCAnSW50ZWdlcicgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gcXssIH0sIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkQXJyYXlQYXJhbXN7ICRBcnJheVBhcmFtIH0gSU4gKCRJblN0cmluZykiOwogICAgfQoKICAgICMgYWRkIHByZXZpb3VzIHZlcnNpb24gcGFyYW0KICAgIGlmICggISRQYXJhbXtQcmV2aW91c1ZlcnNpb25TZWFyY2h9ICkgewogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAnY2kubGFzdF92ZXJzaW9uX2lkID0gdnIuaWQnOwogICAgfQoKICAgICMgY3JlYXRlIHdoZXJlIHN0cmluZwogICAgbXkgJFdoZXJlU3RyaW5nID0gQFNRTFdoZXJlID8gJyBXSEVSRSAnIC4gam9pbiBxeyBBTkQgfSwgQFNRTFdoZXJlIDogJyc7CgogICAgIyBzZXQgbGltaXQsIHF1b3RlIGFzIGludGVnZXIKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGFkZCB0aGUgb3JkZXIgYnkgY29sdW1ucyBhbHNvIHRvIHRoZSBzZWxlY3RlZCBjb2x1bW5zCiAgICBteSAkT3JkZXJCeVNlbGVjdFN0cmluZyA9ICcnOwogICAgaWYgKEBPcmRlckJ5U2VsZWN0Q29sdW1ucykgewogICAgICAgICRPcmRlckJ5U2VsZWN0U3RyaW5nID0gam9pbiAnLCAnLCBAT3JkZXJCeVNlbGVjdENvbHVtbnM7CiAgICAgICAgJE9yZGVyQnlTZWxlY3RTdHJpbmcgPSAnLCAnIC4gJE9yZGVyQnlTZWxlY3RTdHJpbmc7CiAgICB9CgogICAgIyBidWlsZCBTUUwKICAgIG15ICRTUUwgPSAiU0VMRUNUIERJU1RJTkNUIHZyLmNvbmZpZ2l0ZW1faWQgJE9yZGVyQnlTZWxlY3RTdHJpbmcgIgogICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbSBjaSwgY29uZmlnaXRlbV92ZXJzaW9uIHZyICcKICAgICAgICAuICRXaGVyZVN0cmluZzsKCiAgICAjIGFkZCB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICAkU1FMIC49ICcgT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBDb25maWdJdGVtTGlzdDsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0dldEV2ZW50cygpCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hhdCB2YWx1ZXMgd2VyZSBjaGFuZ2VkIGFuZCB3aGF0IGV2ZW50cyBoYXZlIHRvIGJlIHRyaWdnZXJlZC4KSXQgcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggYWxsIGV2ZW50IG5hbWVzIGFzIGtleXMgdGhhdCBzaG91bGQgYmUgdHJpZ2dlcmVkLgoKICAgIG15ICRFdmVudHMgPSAkQ0lPYmplY3QtPl9HZXRFdmVudHMoCiAgICAgICAgUGFyYW0gPT4gewogICAgICAgICAgICBEZXBsU3RhdGVJRCA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBDb25maWdJdGVtSW5mbyA9PiB7CiAgICAgICAgICAgIERlcGxTdGF0ZUlEID0+IDIzNCwKICAgICAgICB9LAogICAgKTsKCiAgICBwcmludCBrZXlzICV7JEV2ZW50c307ICMgcHJpbnRzICJEZXBsb3ltZW50U3RhdGVVcGRhdGUiCgo9Y3V0CgpzdWIgX0dldEV2ZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUluZm8gUGFyYW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEV2ZW50cyA9IHt9OwoKICAgICMgY2hlY2sgb2xkIGFuZCBuZXcgbmFtZQogICAgbXkgJE9sZE5hbWUgPSAkUGFyYW17Q29uZmlnSXRlbUluZm99LT57TmFtZX0gfHwgJyc7CiAgICBteSAkTmV3TmFtZSA9ICRQYXJhbXtQYXJhbX0tPntOYW1lfSAgICAgICAgICB8fCAnJzsKCiAgICBpZiAoICRPbGROYW1lIG5lICROZXdOYW1lICkgewogICAgICAgICRFdmVudHMtPntOYW1lVXBkYXRlfSA9ICROZXdOYW1lIC4gJyUlJyAuICRPbGROYW1lOwogICAgfQoKICAgICMgaWYgZGVwbF9zdGF0ZSBpcyB1cGRhdGVkCiAgICBteSAkTGFzdERlcGxTdGF0ZUlEID0gJFBhcmFte0NvbmZpZ0l0ZW1JbmZvfS0+e0RlcGxTdGF0ZUlEfSB8fCAnJzsKICAgIG15ICRDdXJEZXBsU3RhdGVJRCAgPSAkUGFyYW17UGFyYW19LT57RGVwbFN0YXRlSUR9ICAgICAgICAgIHx8ICcnOwoKICAgIGlmICggJExhc3REZXBsU3RhdGVJRCBuZSAkQ3VyRGVwbFN0YXRlSUQgKSB7CiAgICAgICAgJEV2ZW50cy0+e0RlcGxveW1lbnRTdGF0ZVVwZGF0ZX0gPSAkQ3VyRGVwbFN0YXRlSUQgLiAnJSUnIC4gJExhc3REZXBsU3RhdGVJRDsKICAgIH0KCiAgICAjIGlmIGluY2lzdGF0ZSBpcyB1cGRhdGVkCiAgICBteSAkTGFzdEluY2lTdGF0ZUlEID0gJFBhcmFte0NvbmZpZ0l0ZW1JbmZvfS0+e0luY2lTdGF0ZUlEfSB8fCAnJzsKICAgIG15ICRDdXJJbmNpU3RhdGVJRCAgPSAkUGFyYW17UGFyYW19LT57SW5jaVN0YXRlSUR9ICAgICAgICAgIHx8ICcnOwoKICAgIGlmICggJExhc3RJbmNpU3RhdGVJRCBuZSAkQ3VySW5jaVN0YXRlSUQgKSB7CiAgICAgICAgJEV2ZW50cy0+e0luY2lkZW50U3RhdGVVcGRhdGV9ID0gJEN1ckluY2lTdGF0ZUlEIC4gJyUlJyAuICRMYXN0SW5jaVN0YXRlSUQ7CiAgICB9CgogICAgIyBjaGVjayBvbGQgYW5kIG5ldyBkZWZpbml0aW9uX2lkCiAgICBteSAkT2xkRGVmaW5pdGlvbklEID0gJFBhcmFte0NvbmZpZ0l0ZW1JbmZvfS0+e0RlZmluaXRpb25JRH0gfHwgJyc7CiAgICBteSAkTmV3RGVmaW5pdGlvbklEID0gJFBhcmFte1BhcmFtfS0+e0RlZmluaXRpb25JRH0gICAgICAgICAgfHwgJyc7CgogICAgaWYgKCAkT2xkRGVmaW5pdGlvbklEIG5lICROZXdEZWZpbml0aW9uSUQgKSB7CiAgICAgICAgJEV2ZW50cy0+e0RlZmluaXRpb25VcGRhdGV9ID0gJE5ld0RlZmluaXRpb25JRDsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjaGFuZ2VzIGluIFhNTCBkYXRhCiAgICBpZiAoICRQYXJhbXtQYXJhbX0tPntYTUxEYXRhfSAmJiByZWYgJFBhcmFte1BhcmFtfS0+e1hNTERhdGF9IGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgJVVwZGF0ZVZhbHVlcyA9ICRTZWxmLT5fRmluZENoYW5nZWRYTUxWYWx1ZXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17UGFyYW19LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgTmV3WE1MRGF0YSAgID0+ICRQYXJhbXtQYXJhbX0tPntYTUxEYXRhfSwKICAgICAgICApOwogICAgICAgIGlmICgga2V5cyAlVXBkYXRlVmFsdWVzICkgewogICAgICAgICAgICAkRXZlbnRzLT57VmFsdWVVcGRhdGV9ID0gXCVVcGRhdGVWYWx1ZXM7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRXZlbnRzOwp9Cgo9aXRlbSBfRXZlbnRIYW5kbGVyRm9yQ2hhbmdlZFhNTFZhbHVlcygpCgpUaGlzIG1ldGhvZCBjYWxscyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgZWFjaCBjaGFuZ2VkIHZhbHVlIG9mIHRoZSBjb25maWcgaXRlbS4KVGhlIGNoYW5nZWQgdmFsdWVzIGFyZSBwYXNzZWQgaW4gQzxVcGRhdGVWYWx1ZXM+IGFzIGFuIGhhc2hyZWYgd2l0aCB0YWdrZXlzIGFzIGtleXMuClBsZWFzZSBub3RlIHRoYXQgdGhpcyBvbmx5IGhhbmRsZXMgdmFsdWVzIGluc2lkZSB0aGUgWE1MIHN0cnVjdHVyZSwgbm90IGdlbmVyYWwKYXR0cmlidXRlcyBsaWtlIEM8Q3VySW5jaVN0YXRlPi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5fRXZlbnRIYW5kbGVyRm9yQ2hhbmdlZFhNTFZhbHVlcygKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVwZGF0ZVZhbHVlcyA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnVmVuZG9yJ31bMV0iID0+ICdPbGRWZW5kb3IlJU5ld1ZlbmRvcicsCiAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnVHlwZSd9WzFdIiAgID0+ICcxMjclJTEyOCcsCiAgICAgICAgICAgIH0KICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0V2ZW50SGFuZGxlckZvckNoYW5nZWRYTUxWYWx1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVwZGF0ZVZhbHVlcyBDb25maWdJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBWYWx1ZVVwZGF0ZSBldmVudCBmb3IgZWFjaCBjaGFuZ2VkIHZhbHVlCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17VXBkYXRlVmFsdWVzfSB9ICkgewogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdWYWx1ZVVwZGF0ZScsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkS2V5IC4gJyUlJyAuICRQYXJhbXtVcGRhdGVWYWx1ZXN9LT57JEtleX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmluZENoYW5nZWRYTUxWYWx1ZXMoKQoKY29tcGFyZXMgdGhlIG5ldyB4bWwgZGF0YSBDPE5ld1hNTERhdGE+IHdpdGggdGhlIHhtbCBkYXRhIG9mIHRoZSBsYXRlc3QgdmVyc2lvbgpvZiB0aGUgY29uZmlnIGl0ZW0gQzxDb25maWdJdGVtSUQ+LiBOb3RlIHRoYXQgdGhlIG5ldyBYTUwgZGF0YSBkb2VzIG5vdCBjb250YWluIHRhZyBrZXlzLgpBbGwgdmFsdWVzIG9mIHRoZSB0d28gZGF0YSBzZXRzIGFyZSBjb21wYXJlZC4KV2hlbiBhIGNoYW5nZWQgdmFsdWUgaXMgZW5jb3VudGVyZWQsIHRoZSB0YWcga2V5IGFuZCB0aGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGFyZSBzdG9yZWQgaW4gYSBoYXNoLgpUaGUgaGFzaCB3aXRoIHRoZSB1cGRhdGEgdmFsdWVzIGlzIHJldHVybmVkLgoKICAgIG15ICVVcGRhdGVWYWx1ZXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0ZpbmRDaGFuZ2VkWE1MVmFsdWVzKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgTmV3WE1MRGF0YSAgID0+CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICdWZXJzaW9uJyA9PgogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3duZXInID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50JyA9PiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggbG9va3MgbGlrZToKCiAgICAlVXBkYXRlVmFsdWVzID0gKAogICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydWZW5kb3InfVsxXSIgPT4gJ09sZFZlbmRvciUlTmV3VmVuZG9yJywKICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnVHlwZSd9WzFdIiAgID0+ICcxMjclJTEyOCcsCiAgICApOwoKVGhlIGtleSBpcyBhIHRhZyBrZXkuIFRoZSB2YWx1ZXMgY29udGFpbnMgdGhlIG9sZCBhbmQgdGhlIG5ldyBYTUwgdmFsdWUuCgo9Y3V0CgpzdWIgX0ZpbmRDaGFuZ2VkWE1MVmFsdWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEIE5ld1hNTERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IHdpdGggYWxsIHZlcnNpb25udW1iZXJzIHRoYXQgZXhpc3QgZm9yIHRoZQogICAgIyBnaXZlbiBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBza2lwIHRoZSBjaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBpdGVtCiAgICByZXR1cm4gaWYgIUB7JFZlcnNpb25MaXN0fTsKCiAgICAjIGdldCBvbGQgdmVyc2lvbgogICAgbXkgJE9sZFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25MaXN0LT5bLTFdLAogICAgKTsKCiAgICAjIFRoZSBzaG9ydCBuYW1lcyBmb3IgbmV3IGFuZCBvbGQgeG1sIGRhdGEgYXJlIHVzZWQgaW4gdGhlICdldmFsJyBiZWxvdywKICAgICMgICAgYW5kIHdlIGRvIG5vdCB3YW50IHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGRhdGEgTmV3WE1MRGF0YQogICAgIyAgICBkdWUgdG8gc2lkZSBlZmZlY3RzIG9mIFBlcmxzIGF1dG92aXZpZmljYXRpb24gZmVhdHVyZSB1c2VkIGxhdGVyIGhlcmUKICAgICMgICAgaW4gYW5vdGhlciBldmFsIHN0YXRlbWVudC4KICAgIG15ICROZXdYTUxEYXRhID0gU3RvcmFibGU6OmRjbG9uZSggJFBhcmFte05ld1hNTERhdGF9ICk7CiAgICBteSAkT2xkWE1MRGF0YSA9ICRPbGRWZXJzaW9uLT57WE1MRGF0YX07CgogICAgIyBnZXQgYWxsIHRhZ2tleXMgaW4gbmV3IGFuZCBvbGQgWE1MIGRhdGEKICAgICMgdXNlIGEgc2lkZSBlZmZlY3Qgb2YgWE1MSGFzaDJEKCksIHdoaWNoIGFkZHMgdGhlIHRhZyBrZXlzIHRvIHRoZSBwYXNzZWQgaW4gZGF0YSBzdHJ1Y3R1cmUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpYTUwnKS0+WE1MSGFzaDJEKCBYTUxIYXNoID0+ICROZXdYTUxEYXRhICk7CiAgICBteSBAVGFnS2V5cyA9ICRTZWxmLT5fR3JhYlRhZ0tleXMoIERhdGEgPT4gWyAkT2xkWE1MRGF0YSwgJE5ld1hNTERhdGEgXSApOwoKICAgICMgZ2V0IGFuIHVuaXF1ZSBsaXN0IG9mIGFsbCB0YWcga2V5cwogICAgbXkgJVVuaXF1ZVRhZ0tleXMgPSBtYXAgeyAkXyA9PiAxIH0gQFRhZ0tleXM7CgogICAgIyBkbyB0aGUgY2hlY2sKICAgIG15ICVVcGRhdGVWYWx1ZXM7CiAgICBmb3IgbXkgJFRhZ0tleSAoIHNvcnQga2V5cyAlVW5pcXVlVGFnS2V5cyApIHsKICAgICAgICBteSAkTmV3Q29udGVudCA9IGV2YWwgJyROZXdYTUxEYXRhLT4nIC4gJFRhZ0tleSAuICctPntDb250ZW50fScgfHwgJyc7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIG15ICRPbGRDb250ZW50ID0gZXZhbCAnJE9sZFhNTERhdGEtPicgLiAkVGFnS2V5IC4gJy0+e0NvbnRlbnR9JyB8fCAnJzsgICAgIyMgbm8gY3JpdGljCgogICAgICAgIGlmICggJE5ld0NvbnRlbnQgbmUgJE9sZENvbnRlbnQgKSB7CgogICAgICAgICAgICAjIGEgY2hhbmdlIHdhcyBmb3VuZAogICAgICAgICAgICAkVXBkYXRlVmFsdWVzeyRUYWdLZXl9ID0gam9pbiAnJSUnLCAkT2xkQ29udGVudCwgJE5ld0NvbnRlbnQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlVXBkYXRlVmFsdWVzOwp9Cgo9aXRlbSBfR3JhYlRhZ0tleXMoKQoKcmVjdXJzaXZlbHkgc2NhbnMgYSBwZXJsIGRhdGFzdHJ1Y3R1cmUgZm9yIHRoZSBoYXNoIGtleSAnVGFnS2V5JyBhbmQgcmV0dXJucyBhCmxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoYXQga2V5LgoKICAgIG15IEBUYWdLZXlzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9HcmFiVGFnS2V5cygKICAgICAgICBEYXRhID0+ICRYTUxIYXNoUmVmZXJlbnosCiAgICApOwoKPWN1dAoKc3ViIF9HcmFiVGFnS2V5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAoKSBpZiAhJFBhcmFte0RhdGF9OwoKICAgIG15IEBUYWdLZXlzOwogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IGVxICdBUlJBWScgKSB7CgogICAgICAgIEVMRU06CiAgICAgICAgZm9yIG15ICRFbGVtICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICBuZXh0IEVMRU0gaWYgISRFbGVtOwogICAgICAgICAgICBuZXh0IEVMRU0gaWYgIXJlZiAkRWxlbTsKCiAgICAgICAgICAgIHB1c2ggQFRhZ0tleXMsICRTZWxmLT5fR3JhYlRhZ0tleXMoIERhdGEgPT4gJEVsZW0gKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17RGF0YX0gZXEgJ0hBU0gnICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnVGFnS2V5JyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhZ0tleXMsICRQYXJhbXtEYXRhfS0+eyRLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRQYXJhbXtEYXRhfS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGFnS2V5cywgJFNlbGYtPl9HcmFiVGFnS2V5cyggRGF0YSA9PiAkUGFyYW17RGF0YX0tPnskS2V5fSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAVGFnS2V5czsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gWE1MVmFsdWVMb29rdXAoKQoKbG9va3VwIGEgeG1sIHZhbHVlCgogICAgbXkgJFZhbHVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTFZhbHVlTG9va3VwKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCAoICRQYXJhbXtJdGVtfSAmJiByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OicgLiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfQogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCglUGFyYW0pOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBYTUxTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6JyAuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBjcmVhdGUgc3RhdHMgYXR0cmlidXRlIGFycmF5CiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIFhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBzZWFyY2ggZGF0YSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19IHx8ICggJFBhcmFte0l0ZW19ICYmIHJlZiAkUGFyYW17SXRlbX0gbmUgJ0hBU0gnICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6JyAuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkQXJyYXkgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBcnJheTsKfQoKPWl0ZW0gWE1MRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIGRhdGEgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxFeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCAoICRQYXJhbXtJdGVtfSAmJiByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OicgLiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfQogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgcHJlcGFyZSB2YWx1ZQogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSglUGFyYW0pOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFhNTEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBzZWFyY2ggZGF0YSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19IHx8ICggJFBhcmFte0l0ZW19ICYmIHJlZiAkUGFyYW17SXRlbX0gbmUgJ0hBU0gnICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6JyAuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkQXJyYXkgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBcnJheTsKfQoKPWl0ZW0gWE1MSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIGRhdGEgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxJbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjonIC4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0KICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIHByZXBhcmUgdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBfWE1MVmVyc2lvblNlYXJjaCgpCgpTZWFyY2ggeG1sIGRhdGEgb2YgYSB2ZXJzaW9uIGFuZCByZXR1cm4gYSBoYXNoIHJlZmVyZW5jZS4KVGhlIEM8V2hhdD4gcGFyYW1ldGVyIGlzIGEgYml0IGxpa2UgdGhlIHBhcmFtZXRlciB1c2VkIGluIEw8U1FMOjpBYnN0cmFjdD4uClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBoYXMgQzxWZXJzaW9uSUQ+cyBhcyBrZXlzIGFuZCBDPDE+IGFzIHZhbHVlLgoKICAgIG15ICRWZXJzaW9uSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxWZXJzaW9uU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFsxLCAyLCAzXSwgICMgKG9wdGlvbmFsKQoKICAgICAgICBXaGF0ID0+IFsKICAgICAgICAgICAgIyBlYWNoIGFycmF5IGVsZW1lbnQgaXMgYSBhbmQgY29uZGl0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgb3IgY29uZGl0aW9uIGluIGhhc2gKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgdXNlIGFycmF5IHJlZmVyZW5jZSBpZiBkaWZmZXJlbnQgY29udGVudCB3aXRoIHNhbWUga2V5IHdhcyBzZWFyY2hlZAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiBbCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50QyUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEQlJywKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRFJScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiBbCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50QyUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEQlJywKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRFJScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIHVzZSBoYXNoIHJlZmVyZW5jZSBmb3Igc3BlY2lmeWluZyBjb21wYXJpc29uIG9wcywgYXBhcnQgZnJvbSB0aGUgZGVmYXVsdCAnTElLRScKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPCcgICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sb3dlcl9vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPD0nICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sZXNzX29yX2VxdWFsJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc9JyAgICAgICAgPT4gJ2V4YWN0X21hdGNoJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc+PScgICAgICAgPT4gJ2FscGhhYmV0aWNhbGx5X2xhcmdlcl9vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPicgICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sYXJnZXInIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJy1iZXR3ZWVuJyA9PiBbICdsb3dlcl9ib3VuZCcsICd1cHBlcl9ib3VuZCcgXSB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCgogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17V2hhdH0gfHwgcmVmICRQYXJhbXtXaGF0fSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBXaGF0IGFzIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggISRQYXJhbXtDbGFzc0lEc30gfHwgcmVmICRQYXJhbXtDbGFzc0lEc30gbmUgJ0FSUkFZJyB8fCAhQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gPSBrZXlzICV7JENsYXNzTGlzdH07CiAgICB9CgogICAgIyBzZWFyY2ggaW4gYWN0aXZlIHZlcnNpb25zCiAgICBteSAlVmVyc2lvbklEczsKICAgIGZvciBteSAkQ2xhc3NJRCAoIEB7ICRQYXJhbXtDbGFzc0lEc30gfSApIHsKCiAgICAgICAgIyBzdGFydCB4bWwgc2VhcmNoCiAgICAgICAgbXkgQEtleXMgPSAkU2VsZi0+X1hNTEhhc2hTZWFyY2goCiAgICAgICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRDbGFzc0lEIiwKICAgICAgICAgICAgV2hhdCA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgYWxsIGlkcyB0byB2ZXJzaW9uIGlkIGhhc2gKICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoQEtleXMpIHsKICAgICAgICAgICAgJFZlcnNpb25JRHN7JFZlcnNpb25JRH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVWZXJzaW9uSURzIGlmICEkUGFyYW17UHJldmlvdXNWZXJzaW9uU2VhcmNofTsKCiAgICAjIHNlYXJjaCBhbHNvIGluIG9sZCB2ZXJzaW9ucyAoYXJjaGl2KQogICAgZm9yIG15ICRDbGFzc0lEICggQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIHN0YXJ0IHhtbCBzZWFyY2gKICAgICAgICBteSBAS2V5cyA9ICRTZWxmLT5fWE1MSGFzaFNlYXJjaCgKICAgICAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6QXJjaGl2OjokQ2xhc3NJRCIsCiAgICAgICAgICAgIFdoYXQgPT4gJFBhcmFte1doYXR9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGFsbCBpZHMgdG8gdmVyc2lvbiBpZCBoYXNoCiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKEBLZXlzKSB7CiAgICAgICAgICAgICRWZXJzaW9uSURzeyRWZXJzaW9uSUR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlVmVyc2lvbklEczsKfQoKPWl0ZW0gX1hNTFZlcnNpb25HZXQoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkQXJyYXlSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+X1hNTFZlcnNpb25HZXQoCiAgICAgICAgQ2xhc3NJRCAgID0+IDEsCiAgICAgICAgVmVyc2lvbklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTFZlcnNpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBWZXJzaW9uSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZlcnNpb24KICAgIG15IEBYTUwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WE1MJyktPlhNTEhhc2hHZXQoCiAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICByZXR1cm4gXEBYTUwgaWYgQFhNTDsKCiAgICAjIGdldCB2ZXJzaW9uIGZyb20gYXJjaGl2CiAgICBAWE1MID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlhNTCcpLT5YTUxIYXNoR2V0KAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICByZXR1cm4gXEBYTUw7Cn0KCj1pdGVtIF9YTUxWZXJzaW9uQWRkKCkKCmFkZCB0aGUgeG1sIGRhdGEgb2YgYSBuZXcgdmVyc2lvbiBhbmQgbW92ZSBvbGQgeG1sIHZlcnNpb25zIGluIGFyY2hpdiBjbGFzcwoKICAgIG15ICRYTUxJRCA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkFkZCgKICAgICAgICBDbGFzc0lEICAgICAgPT4gMSwKICAgICAgICBDb25maWdJdGVtSUQgPT4gMjIyLAogICAgICAgIFZlcnNpb25JRCAgICA9PiAxMjMsCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTFZlcnNpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBDb25maWdJdGVtSUQgVmVyc2lvbklEIFhNTERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHhtbCB2ZXJzaW9uCiAgICBteSAkWE1MSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WE1MJyktPlhNTEhhc2hBZGQoCiAgICAgICAgVHlwZSAgICA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgICAgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgIFhNTEhhc2ggPT4gJFBhcmFte1hNTERhdGF9LAogICAgKTsKCiAgICAjIGdldCBsYXN0IHZlcnNpb25zCiAgICBteSAkT2xkVmVyc2lvbklEcyA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgICMgRmluZCBWZXJzaW9uIHRvIG1vdmUKICAgIG15ICRNb3ZlVmVyc2lvbjsKICAgIE9MRFZFUlNJT05JRDoKICAgIGZvciBteSAkT2xkVmVyc2lvbklEICggQHskT2xkVmVyc2lvbklEc30gKSB7CiAgICAgICAgbGFzdCBPTERWRVJTSU9OSUQgaWYgJE9sZFZlcnNpb25JRCBlcSAkUGFyYW17VmVyc2lvbklEfTsKCiAgICAgICAgJE1vdmVWZXJzaW9uID0gJE9sZFZlcnNpb25JRDsKICAgIH0KCiAgICByZXR1cm4gJFhNTElEIGlmICEkTW92ZVZlcnNpb247CgogICAgIyBtb3ZlIG9sZCB2ZXJzaW9uIGluIGFyY2hpdgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlhNTCcpLT5YTUxIYXNoTW92ZSgKICAgICAgICBPbGRUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokUGFyYW17Q2xhc3NJRH0iLAogICAgICAgIE9sZEtleSAgPT4gJE1vdmVWZXJzaW9uLAogICAgICAgIE5ld1R5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBOZXdLZXkgID0+ICRNb3ZlVmVyc2lvbiwKICAgICk7CgogICAgcmV0dXJuICRYTUxJRDsKfQoKPWl0ZW0gX1hNTFZlcnNpb25EZWxldGUoKQoKZGVsZXRlIHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkRlbGV0ZSgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWZXJzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZlcnNpb24gZGF0YQogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFBhcmFte1ZlcnNpb25JRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFZlcnNpb247CgogICAgIyBkZWxldGUgeG1sIGRhdGEgZnJvbSBhIHZlcnNpb24KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpYTUwnKS0+WE1MSGFzaERlbGV0ZSgKICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokVmVyc2lvbi0+e0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSB4bWwgZGF0YSBmcm9tIGFyY2hpdgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlhNTCcpLT5YTUxIYXNoRGVsZXRlKAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFZlcnNpb24tPntDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9YTUxIYXNoU2VhcmNoKCkKClNlYXJjaCBhIHhtbCBoYXNoIGZyb20gZGF0YWJhc2UuClRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIEtlcm5lbDo6U3lzdGVtOjpYTUxIYXNoU2VhcmNoLCBidXQgaGFzIHN1cHBvcnQgZm9yIHNvbWUgZXh0cmEgZmVhdHVyZXMuCkEgc3BlY2lmaWMgb3BlcmF0b3IgY2FuIGJlIHNwZWNpZmllZCBpbiBhIGhhc2guClRoZSBzeW50YXggaXMgYmFzZWQgb24gTDxTUUw6OkFic3RyYWN0Pi4KCiAgICBteSBAS2V5cyA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MSGFzaFNlYXJjaCgKICAgICAgICBUeXBlID0+ICdTb21lVHlwZScsCiAgICAgICAgV2hhdCA9PiBbCiAgICAgICAgICAgICMgZWFjaCBhcnJheSBlbGVtZW50IGlzIGEgYW5kIGNvbmRpdGlvbgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIG9yIGNvbmRpdGlvbiBpbiBoYXNoCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEElJywKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEIlJywKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIHVzZSBhcnJheSByZWZlcmVuY2UgaWYgZGlmZmVyZW50IGNvbnRlbnQgd2l0aCBzYW1lIGtleSB3YXMgc2VhcmNoZWQKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gWyclY29udGVudEMlJywgJyVjb250ZW50RCUnLCAnJWNvbnRlbnRFJSddLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiBbJyVjb250ZW50QyUnLCAnJWNvbnRlbnREJScsICclY29udGVudEUlJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgdXNlIGhhc2ggcmVmZXJlbmNlIGZvciBzcGVjaWZ5aW5nIGNvbXBhcmlzb24gb3BzLCBhcGFydCBmcm9tIHRoZSBkZWZhdWx0ICdMSUtFJwogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc8JyAgICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sb3dlcl9vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPD0nICAgICAgICA9PiAnYWxwaGFiZXRpY2FsbHlfbGVzc19vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPScgICAgICAgICA9PiAnZXhhY3RfbWF0Y2gnIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJyE9JyAgICAgICAgPT4gJ2V4YWN0X21hdGNoJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc+PScgICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sYXJnZXJfb3JfZXF1YWwnIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJz4nICAgICAgICAgPT4gJ2FscGhhYmV0aWNhbGx5X2xhcmdlcicgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnLWJldHdlZW4nICA9PiBbICdsb3dlcl9ib3VuZCcsICd1cHBlcl9ib3VuZCcgXSB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICApOwoKPWN1dAoKc3ViIF9YTUxIYXNoU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAjIGdldCBhbGwgZW50cmllcyBpZiB3ZSBoYXZlIG5vIHJlc3RyaWN0aW9uCiAgICBpZiAoICEkUGFyYW17V2hhdH0gfHwgcmVmICRQYXJhbXtXaGF0fSBuZSAnQVJSQVknICkgewogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBESVNUSU5DVCh4bWxfa2V5KSBGUk9NIHhtbF9zdG9yYWdlIFdIRVJFIHhtbF90eXBlID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1R5cGV9IF0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEtleXM7CiAgICAgICAgd2hpbGUgKCBteSBARGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEtleXMsICREYXRhWzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEBLZXlzOwogICAgfQoKICAgICMgb3RoZXJ3aXNlIG9ubHkgZ2V0IGVudHJpZXMgcmVzdHJpY3RlZCBieSAnV2hhdCcgcGFyYW1ldGVyCgogICAgbXkgJU9wSXNTdXBwb3J0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gKCAnPCcsICc8PScsICc9JywgJyE9JywgJz49JywgJz4nLCAnLWJldHdlZW4nICk7CgogICAgIyB0aGUgYXJyYXkgZWxlbWVudHMgYXJlICdhbmQnIGNvbWJpbmVkCiAgICBteSAkSW50ZXJzZWN0ID0gMDsKICAgIG15ICVIYXNoOwogICAgZm9yIG15ICRBbmQgKCBAeyAkUGFyYW17V2hhdH0gfSApIHsKCiAgICAgICAgIyB0aGUga2V5L3ZhbHVlIHBhaXJzIGFyZSAnb3InIGNvbWJpbmVkCiAgICAgICAgbXkgQE9yQ29uZGl0aW9uczsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRBbmR9ICkgewogICAgICAgICAgICBteSAkVmFsdWUgPSAkQW5kLT57JEtleX07CgogICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJEtleSApOwoKICAgICAgICAgICAgaWYgKCAkVmFsdWUgJiYgcmVmICRWYWx1ZSBlcSAnQVJSQVknICkgewoKICAgICAgICAgICAgICAgICMgd2hlbiBhbiBhcnJheSBvZiBwb3NzaWJsZSB2YWx1ZXMgaXMgZ2l2ZW4sCiAgICAgICAgICAgICAgICAjIHdlIHVzZSAnTElLRSctY29uZGl0aW9ucyBhbmQgY29tYmluZSB0aGVtIHdpdGggJ09SJwogICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHskVmFsdWV9ICkgewoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJEVsZW1lbnQgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAT3JDb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAiICh4bWxfY29udGVudF9rZXkgTElLRSAnJEtleScgJExpa2VFc2NhcGVTdHJpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJBTkQgeG1sX2NvbnRlbnRfdmFsdWUgTElLRSAnJEVsZW1lbnQnICRMaWtlRXNjYXBlU3RyaW5nKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVmFsdWUgJiYgcmVmICRWYWx1ZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAgICAgIyBhIGhhc2hyZWYgaW5kaWNhdGVzIGEgc3BlY2lmaWMgY29tcGFyaXNvbiBvcAogICAgICAgICAgICAgICAgIyBjdXJyZW50bHkgb25seSBhIHNpbmdsZSBvcCwgd2l0aCBhIHNpbmdsZSB2YWx1ZSwgaXMgc3VwcG9ydGVkCgogICAgICAgICAgICAgICAgIyBVbmRlciBPcmFjbGUgdGhlIGF0dHJpYnV0ZSAneG1sX2NvbnRlbnRfdmFsdWUnIGlzIGEgQ0xPQiwKICAgICAgICAgICAgICAgICMgYSBDaGFyYWN0ZXIgTG9jYXRvciBPYmplY3QuIFdoaWxlIHNlbGVjdGlvbiB3aXRoIExJS0UgaXMgcG9zc2libGUsCiAgICAgICAgICAgICAgICAjIHRoZSBhbHBoYWJldGljYWwgY29tcGFyaXNvbiBvcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAjIFNlZSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9kb2NzL2NkL0IxMjAzN18wMS9hcHBkZXYuMTAxL2IxMDc5Ni9cCiAgICAgICAgICAgICAgICAjIGFkbG9iX3NxLmh0bSMxMDA2MjE1CiAgICAgICAgICAgICAgICAjIEFzIGEgd29ya2Fyb3VuZCB3ZSBjYXN0IHRoZSBDTE9CIHRvIGEgVkFSQ0hBUjIgd2l0aCBUT19DSEFSKCkuCiAgICAgICAgICAgICAgICBteSAkWE1MQ29udGVudFZhbHVlQ29sdW1uID0gJ3htbF9jb250ZW50X3ZhbHVlJzsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+R2V0RGF0YWJhc2VGdW5jdGlvbignVHlwZScpIGVxCiAgICAgICAgICAgICAgICAgICAgJ29yYWNsZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFhNTENvbnRlbnRWYWx1ZUNvbHVtbiA9ICdUT19DSEFSKHhtbF9jb250ZW50X3ZhbHVlKSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgKCRPcCkgPSBrZXlzICV7JFZhbHVlfTsKICAgICAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFZhbHVlLT57JE9wfTsKICAgICAgICAgICAgICAgIGlmICggJE9wICYmICRPcCBlcSAnLWJldHdlZW4nICYmIHJlZiAkRWxlbWVudCBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb3dlckJvdW5kID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkRWxlbWVudC0+WzBdICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVwcGVyQm91bmQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVvdGUoICRFbGVtZW50LT5bMV0gKTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBPckNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICIgKCB4bWxfY29udGVudF9rZXkgTElLRSAnJEtleScgJExpa2VFc2NhcGVTdHJpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJBTkQgJFhNTENvbnRlbnRWYWx1ZUNvbHVtbiA+PSAnJExvd2VyQm91bmQnICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiQU5EICRYTUxDb250ZW50VmFsdWVDb2x1bW4gPD0gJyRVcHBlckJvdW5kJyApIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJE9wICYmICRPcElzU3VwcG9ydGVkeyRPcH0gJiYgIXJlZiAkRWxlbWVudCApIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSgkRWxlbWVudCkgLy8gJyc7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAT3JDb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAiICggeG1sX2NvbnRlbnRfa2V5IExJS0UgJyRLZXknICRMaWtlRXNjYXBlU3RyaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiQU5EICRYTUxDb250ZW50VmFsdWVDb2x1bW4gJE9wICckRWxlbWVudCcgKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0dvdCB1bmV4cGVjdGVkIGRhdGEgaW4gc2VhcmNoIScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBPckNvbmRpdGlvbnMsICcoIDEgPSAxICknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgd2hlbiBhIHNpbmdsZSAgcG9zc2libGUgdmFsdWUgaXMgZ2l2ZW4sCiAgICAgICAgICAgICAgICAjIHdlIHVzZSBhICdMSUtFJy1jb25kaXRpb24KICAgICAgICAgICAgICAgICRTZWxmLT5fUHJlcGFyZUxpa2VTdHJpbmcoIFwkVmFsdWUgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBPckNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgIiAoeG1sX2NvbnRlbnRfa2V5IExJS0UgJyRLZXknICRMaWtlRXNjYXBlU3RyaW5nICIKICAgICAgICAgICAgICAgICAgICAuICJBTkQgeG1sX2NvbnRlbnRfdmFsdWUgTElLRSAnJFZhbHVlJyAkTGlrZUVzY2FwZVN0cmluZykiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFzc2VtYmxlIHRoZSBTUUwKICAgICAgICBteSAkU1FMID0gJ1NFTEVDVCBESVNUSU5DVCh4bWxfa2V5KSBGUk9NIHhtbF9zdG9yYWdlIFdIRVJFIHhtbF90eXBlID0gPyAnOwogICAgICAgIGlmIChAT3JDb25kaXRpb25zKSB7CiAgICAgICAgICAgICRTUUwgLj0gJ0FORCAoICcgLiBqb2luKCAnIE9SICcsIEBPckNvbmRpdGlvbnMgKSAuICcgKSc7CiAgICAgICAgfQoKICAgICAgICAjIGV4ZWN1dGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUeXBlfSBdLAogICAgICAgICk7CgogICAgICAgICMgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQga2V5IHNldCwgYW5kIHRoZSBrZXlzIGZyb20gdGhlIGxhc3QgJ1NFTEVDVCcKICAgICAgICAjIG9ubHkgdGhlIGtleXMgd2hpY2ggYXJlIGluIGFsbCByZXN1bHRzIHN1cnZpdmUKICAgICAgICBteSAlSGFzaE5ldzsKICAgICAgICB3aGlsZSAoIG15IEBEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAhJEludGVyc2VjdCB8fCAkSGFzaHsgJERhdGFbMF0gfSApIHsKICAgICAgICAgICAgICAgICRIYXNoTmV3eyAkRGF0YVswXSB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAlSGFzaCA9ICVIYXNoTmV3OwoKICAgICAgICAjIHJlbWVtYmVyIHRvIGxhdGVyIGludGVyc2VjdCByZXN1bHRzCiAgICAgICAgKyskSW50ZXJzZWN0OwogICAgfQoKICAgIG15IEBLZXlzID0ga2V5cyAlSGFzaDsKCiAgICByZXR1cm4gQEtleXM7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5IC0gRXZlbnQgaGFuZGxlciB0aGF0IGRvZXMgdGhlIGhpc3RvcnkKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBoaXN0b3J5LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkRG9IaXN0b3J5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGV2ZW50LgoKICAgICREb0hpc3RvcnlPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJ25ldyB2YWx1ZTogMScsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhcyBEZWZpbml0aW9uQ3JlYXRlIGRvZXMgbm90IGJlbG9uZyB0byBhbiBpdGVtLCB3ZSBkb24ndCBjcmVhdGUKICAgICMgYSBoaXN0b3J5IGVudHJ5CiAgICBpZiAoICRQYXJhbXtFdmVudH0gJiYgJFBhcmFte0V2ZW50fSBlcSAnRGVmaW5pdGlvbkNyZWF0ZScgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBFdmVudCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkdWUgdG8gY29uc2lzdGVuY3kgd2l0aCB0aWNrZXQgaGlzdG9yeSwgd2UgbmVlZCBIaXN0b3J5VHlwZQogICAgJFBhcmFte0hpc3RvcnlUeXBlfSA9ICRQYXJhbXtFdmVudH07CgogICAgIyBkaXNwYXRjaCB0YWJsZSBmb3IgYWxsIGV2ZW50cwogICAgbXkgJURpc3BhdGNoZXIgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQ29uZmlnSXRlbURlbGV0ZSAgICAgID0+IFwmX0NvbmZpZ0l0ZW1EZWxldGUsCiAgICAgICAgTGlua0FkZCAgICAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgTGlua0RlbGV0ZSAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgTmFtZVVwZGF0ZSAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgSW5jaWRlbnRTdGF0ZVVwZGF0ZSAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVwbG95bWVudFN0YXRlVXBkYXRlID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVmaW5pdGlvblVwZGF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmVyc2lvbkNyZWF0ZSAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmFsdWVVcGRhdGUgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVmaW5pdGlvbkNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmVyc2lvbkRlbGV0ZSAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQXR0YWNobWVudEFkZFBvc3QgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQXR0YWNobWVudERlbGV0ZVBvc3QgID0+IFwmX0hpc3RvcnlBZGQsCiAgICApOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggIWV4aXN0cyAkRGlzcGF0Y2hlcnsgJFBhcmFte0V2ZW50fSB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnbm9uIGV4aXN0YW50IGhpc3RvcnkgdHlwZTogJyAuICRQYXJhbXtFdmVudH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBjYWxsYmFjawogICAgbXkgJFN1YiA9ICREaXNwYXRjaGVyeyAkUGFyYW17RXZlbnR9IH07CiAgICAkU2VsZi0+JFN1YigKICAgICAgICAlUGFyYW0sCiAgICAgICAgJXsgJFBhcmFte0RhdGF9IH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ29uZmlnSXRlbURlbGV0ZSgpCgpoaXN0b3J5J3MgZXZlbnQgaGFuZGxlciBmb3IgQ29uZmlnSXRlbURlbGV0ZQoKPWN1dAoKc3ViIF9Db25maWdJdGVtRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgaGlzdG9yeQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkhpc3RvcnlEZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0hpc3RvcnlBZGQoKQoKaGlzdG9yeSdzIGRlZmF1bHQgZXZlbnQgaGFuZGxlci4KCj1jdXQKCnN1YiBfSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIGhpc3RvcnkgZW50cnkKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5IaXN0b3J5QWRkKAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOjpBdXRvSW5jcmVtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOjpBdXRvSW5jcmVtZW50IC0gY29uZmlnIGl0ZW0gbnVtYmVyIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBhdXRvIGluY3JlbWVudCBjb25maWcgaXRlbSBudW1iZXIgZnVuY3Rpb25zCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBfQ29uZmlnSXRlbU51bWJlckNyZWF0ZSgpCgpjcmVhdGUgYSBuZXcgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJE51bWJlciA9ICRCYWNrZW5kT2JqZWN0LT5fQ29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgX0NvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3lzdGVtIGlkCiAgICBteSAkU3lzdGVtSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N5c3RlbUlEJyk7CgogICAgIyBnZXQgY3VycmVudCBjb3VudGVyCiAgICBteSAkQ3VycmVudENvdW50ZXIgPSAkU2VsZi0+Q3VycmVudENvdW50ZXJHZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICApIHx8IDA7CgogICAgQ0lQSEVSOgogICAgZm9yIG15ICRDaXBoZXIgKCAxIC4uIDFfMDAwXzAwMF8wMDAgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyBudW1iZXIKICAgICAgICBteSAkTnVtYmVyID0gJFN5c3RlbUlEIC4gJFBhcmFte0NsYXNzSUR9IC4gc3ByaW50ZiggIiUwNmQiLCAoICRDdXJyZW50Q291bnRlciArICRDaXBoZXIgKSApOwoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgbnVtYmVyCiAgICAgICAgbXkgJER1cGxpY2F0ZSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICROdW1iZXIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDSVBIRVIgaWYgJER1cGxpY2F0ZTsKCiAgICAgICAgIyBzZXQgY291bnRlcgogICAgICAgICRTZWxmLT5DdXJyZW50Q291bnRlclNldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgICAgICBDb3VudGVyID0+ICggJEN1cnJlbnRDb3VudGVyICsgJENpcGhlciApLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTnVtYmVyOwogICAgfQoKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6Q2xhc3NHcm91cENoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6Q2xhc3NHcm91cENoZWNrIC0gY2hlY2sgaWYgYSB1c2VyIGJlbG9uZ3MgdG8gYSBncm91cAoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6Q2xhc3NHcm91cENoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKCnRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrIGlmIHRoZSB1c2UgYmVsb25ncyB0byBhIGdpdmVuIGdyb3VwCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICBDbGFzc0lEID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzczo6Q29tcHV0ZXInLAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBUeXBlIENsYXNzSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQ2xhc3MgZGF0YQogICAgbXkgJENsYXNzSXRlbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSBAR3JvdXBJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGxvb2tpbmcgZm9yIGdyb3VwIGlkLCByZXR1cm4gYWNjZXNzIGlmIHVzZXIgaXMgaW4gZ3JvdXAKICAgIGZvciBteSAkR3JvdXBJRCAoQEdyb3VwSURzKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJENsYXNzSXRlbS0+e1Blcm1pc3Npb259ICYmICRHcm91cElEIGVxICRDbGFzc0l0ZW0tPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICAjIHJldHVybiBubyBhY2Nlc3MKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6SXRlbUNsYXNzR3JvdXBDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6SXRlbUNsYXNzR3JvdXBDaGVjayAtIGNoZWNrIGlmIGEgdXNlciBjYW4gYWNjZXNzIGFuIGl0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENoZWNrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtQ2xhc3NHcm91cENoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKCnRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrIGlmIHRoZSB1c2VyIGNhbiBhY2Nlc3MgYW4gaXRlbQoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgIEl0ZW1JRCA9PiAzNDUsCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIFR5cGUgSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgIG15ICRDb25maWdJdGVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgKTsKCiAgICAjIGdldCBDbGFzcyBkYXRhCiAgICBteSAkQ2xhc3NJdGVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSBAR3JvdXBJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGxvb2tpbmcgZm9yIGdyb3VwIGlkLCByZXR1cm4gYWNjZXNzIGlmIHVzZXIgaXMgaW4gZ3JvdXAKICAgIGZvciBteSAkR3JvdXBJRCAoQEdyb3VwSURzKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJENsYXNzSXRlbS0+e1Blcm1pc3Npb259ICYmICRHcm91cElEIGVxICRDbGFzc0l0ZW0tPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICAjIHJldHVybiBubyBhY2Nlc3MKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBjdXN0b21lciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVDdXN0b21lckJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6Q3VzdG9tZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgIG15ICVDdXN0b21lclNlYXJjaExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFNlYXJjaCA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKCiAgICByZXR1cm4gJEN1c3RvbWVyU2VhcmNoTGlzdHsgJFBhcmFte1ZhbHVlfSB9IHx8ICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdLZXk6OlN1YmtleScsCiAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXR0cmlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lckNvbXBhbnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6Q3VzdG9tZXJDb21wYW55IC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIGN1c3RvbWVyIGNvbXBhbnkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRYTUxUeXBlQ3VzdG9tZXJDb21wYW55QmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lckNvbXBhbnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgIG15ICVDdXN0b21lckNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIHJldHVybiAkQ3VzdG9tZXJDb21wYW55e0N1c3RvbWVyQ29tcGFueU5hbWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGF0dHJpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkRhdGUgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVEYXRlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSBkYXRlIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIFZhbHVlID0+ICcyMDA3LTAzLTI2JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXR0cmlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAkUGFyYW17S2V5fSAuICdOZXdlckRhdGUnLAogICAgICAgICAgICAgICAgVGltZVN0b3AgID0+ICRQYXJhbXtLZXl9IC4gJ09sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlVGltZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlVGltZSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBkYXRlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkWE1MVHlwZURhdGVUaW1lQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlVGltZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZGF0ZSB0aW1lIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIFZhbHVlID0+ICcyMDA3LTAzLTI2IDIyOjAxJywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXR0cmlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJFBhcmFte0tleX0gLiAnTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAkUGFyYW17S2V5fSAuICdPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEdW1teTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKCk7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkR1bW15IC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIGR1bW15IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkWE1MVHlwZUR1bW15QmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEdW1teScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZHVtbXkgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkdlbmVyYWxDYXRhbG9nIC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIGdlbmVyYWwgY2F0YWxvZyBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVHZW5lcmFsQ2F0YWxvZ0JhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6R2VuZXJhbENhdGFsb2cnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtWYWx1ZX07CgogICAgIyBnZXQgaXRlbSBsaXN0CiAgICBteSAkSXRlbUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJdGVtTGlzdDsKICAgIHJldHVybiBpZiByZWYgJEl0ZW1MaXN0IG5lICdIQVNIJzsKCiAgICBteSAkVmFsdWUgPSAkSXRlbUxpc3QtPnsgJFBhcmFte1ZhbHVlfSB9OwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgS2V5ICA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBjcmVhdGUgYXR0cmlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRJdGVtTGlzdCB8fCB7fSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICBAVmFsdWVzID0gZ3JlcCB7JF99IEBWYWx1ZXM7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuICRJdGVtTGlzdC0+eyAkUGFyYW17VmFsdWV9IH0gfHwgJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICAjIGdldCBpdGVtIGxpc3QKICAgIG15ICRJdGVtTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICApOwoKICAgICMgcmV2ZXJzZSB0aGUgbGlzdAogICAgbXkgJU5hbWUySUQgPSByZXZlcnNlICV7JEl0ZW1MaXN0fTsKCiAgICBteSAkR2VuZXJhbENhdGFsb2dJRCA9ICROYW1lMklEeyAkUGFyYW17VmFsdWV9IH07CgogICAgaWYgKCAhJEdlbmVyYWxDYXRhbG9nSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHZW5lcmFsIGNhdGFsb2cgbG9va3VwIG9mJyRQYXJhbXtWYWx1ZX0nIGZhaWxlZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkR2VuZXJhbENhdGFsb2dJRDsKCn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICAjIGdldCBpdGVtIGxpc3QKICAgIG15ICRJdGVtTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICApOwoKICAgICMgcmV2ZXJzZSB0aGUgbGlzdAogICAgbXkgJU5hbWUySUQgPSByZXZlcnNlICV7JEl0ZW1MaXN0fTsKCiAgICBteSAkR2VuZXJhbENhdGFsb2dJRCA9ICROYW1lMklEeyAkUGFyYW17VmFsdWV9IH07CgogICAgaWYgKCAhJEdlbmVyYWxDYXRhbG9nSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHZW5lcmFsIGNhdGFsb2cgbG9va3VwIG9mJyRQYXJhbXtWYWx1ZX0nIGZhaWxlZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkR2VuZXJhbENhdGFsb2dJRDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpJbnRlZ2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkludGVnZXIgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgaW50ZWdlciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVJbnRlZ2VyQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpJbnRlZ2VyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSBpbnRlZ2VyIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIFZhbHVlID0+IDExLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWVNaW4gPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1pbn0gfHwgMTsKICAgIG15ICRWYWx1ZU1heCA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWF4fSB8fCAxOwoKICAgIG15ICVWYWx1ZXMgPSBtYXAgeyAkXyA9PiAkXyB9ICggJFZhbHVlTWluIC4uICRWYWx1ZU1heCApOwoKICAgICMgY3JlYXRlIGF0dHJpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVZhbHVlcywKICAgICAgICAgICAgU29ydCAgICAgICAgICAgICA9PiAnTnVtZXJpY0tleScsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlRleHQgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgdGV4dCBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVUZXh0QmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB0ZXh0IGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIFZhbHVlID0+IDExLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgS2V5ICA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGF0dHJpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0QXJlYTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0QXJlYSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0YXJlYSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFhNTFR5cGVUZXh0QXJlYUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dEFyZWEnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHRleHQgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgID0+ICdLZXk6OlN1YmtleScsCiAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXR0cmlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsL1N5c3RlbS9MaW5rT2JqZWN0L0lUU01Db25maWdJdGVtLnBtIC0gTGlua09iamVjdCBtb2R1bGUgZm9yIElUU01Db25maWdJdGVtCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkTGlua09iamVjdElUU01Db25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01Db25maWdJdGVtJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0xpc3RXaXRoRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMaW5rTGlzdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfSB9ICkgewoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEKICAgICAgICAgICAgICAgIG15ICRWZXJzaW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgaWQgZnJvbSBoYXNoIGlmIGNvbmZpZyBpdGVtIGNhbiBub3QgZ2V0CiAgICAgICAgICAgICAgICBpZiAoICEkVmVyc2lvbkRhdGEgfHwgcmVmICRWZXJzaW9uRGF0YSBuZSAnSEFTSCcgfHwgISV7JFZlcnNpb25EYXRhfSApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRDb25maWdJdGVtSUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIHZlcnNpb24gZGF0YQogICAgICAgICAgICAgICAgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRDb25maWdJdGVtSUR9ID0gJFZlcnNpb25EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3RQZXJtaXNzaW9uKCkKCmNoZWNrcyByZWFkIHBlcm1pc3Npb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IGFuZCBVc2VySUQuCgogICAgJFBlcm1pc3Npb24gPSAkTGlua09iamVjdC0+T2JqZWN0UGVybWlzc2lvbigKICAgICAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBLZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgY29uZmlnaXRlbSB6b29tIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJyk7CgogICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgbXkgJEFjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5QZXJtaXNzaW9uKAogICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICApOwoKICAgIHJldHVybiAkQWNjZXNzOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiQ29uZmlnSXRlbSMgMTIzNDQ1NSIsCiAgICAgICAgTG9uZyAgID0+ICJDb25maWdJdGVtIyAxMjM0NDU1OiBUaGUgQ29uZmlnIEl0ZW0gVGl0bGUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ0NvbmZpZ0l0ZW0nLAogICAgICAgIExvbmcgICA9PiAnQ29uZmlnSXRlbScsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBsYXN0IHZlcnNpb24gZGF0YQogICAgbXkgJFZlcnNpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVmVyc2lvbkRhdGE7CiAgICByZXR1cm4gaWYgcmVmICRWZXJzaW9uRGF0YSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgISV7JFZlcnNpb25EYXRhfTsKCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb25EYXRhLT57TnVtYmVyfSIsCiAgICAgICAgTG9uZyAgID0+ICJDb25maWdJdGVtIyAkVmVyc2lvbkRhdGEtPntOdW1iZXJ9OiAkVmVyc2lvbkRhdGEtPntOYW1lfSIsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb247Cn0KCj1pdGVtIE9iamVjdFNlYXJjaCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzCgpSZXR1cm4KICAgICRTZWFyY2hMaXN0ID0gewogICAgICAgIE5PVExJTktFRCA9PiB7CiAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgIDIxMiA9PiAkRGF0YU9mSXRlbTIxMiwKICAgICAgICAgICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkU2VhcmNoTGlzdCA9ICRMaW5rT2JqZWN0QmFja2VuZC0+T2JqZWN0U2VhcmNoKAogICAgICAgIFN1Yk9iamVjdCAgICA9PiAnMjUnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgU2VhcmNoUGFyYW1zID0+ICRIYXNoUmVmLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgc2V0IGZvY3VzCiAgICBteSAlU2VhcmNoOwogICAgZm9yIG15ICRFbGVtZW50IChxdyhOdW1iZXIgTmFtZSkpIHsKICAgICAgICBpZiAoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9ICkgewogICAgICAgICAgICAkU2VhcmNoeyRFbGVtZW50fSA9ICcqJyAuICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9IC4gJyonOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17U3ViT2JqZWN0fSApIHsKCiAgICAgICAgIyBnZXQgdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0IHN1Ym9iamVjdHMKICAgICAgICBteSAkRGVmYXVsdFN1Ym9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnTGlua09iamVjdDo6RGVmYXVsdFN1Yk9iamVjdCcpIHx8IHt9OwoKICAgICAgICAjIGV4dHJhY3QgZGVmYXVsdCBjbGFzcyBuYW1lCiAgICAgICAgbXkgJERlZmF1bHRDbGFzcyA9ICREZWZhdWx0U3Vib2JqZWN0LT57SVRTTUNvbmZpZ0l0ZW19IHx8ICcnOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRDbGFzc0xpc3Q7CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAgICAgIyBsb29rdXAgdGhlIGNsYXNzIGlkCiAgICAgICAgbXkgJUNsYXNzTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JENsYXNzTGlzdH07CiAgICAgICAgJFBhcmFte1N1Yk9iamVjdH0gPSAkQ2xhc3NMaXN0UmV2ZXJzZXskRGVmYXVsdENsYXNzfSB8fCAnJzsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtTdWJPYmplY3R9OwoKICAgICMgc2VhcmNoIHRoZSBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAleyAkUGFyYW17U2VhcmNoUGFyYW1zfSB9LAogICAgICAgICVTZWFyY2gsCiAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJFBhcmFte1N1Yk9iamVjdH0gXSwKICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMCwKICAgICAgICBVc2luZ1dpbGRjYXJkcyAgICAgICAgPT4gMSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICAgICAgPT4gWydVcCddLAogICAgICAgIExpbWl0ICAgICAgICAgICAgICAgICA9PiA1MCwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVTZWFyY2hMaXN0OwogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRDb25maWdJdGVtSURzfSApIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEKICAgICAgICBteSAkVmVyc2lvbkRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uRGF0YTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJzsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJXskVmVyc2lvbkRhdGF9OwoKICAgICAgICAjIGFkZCB2ZXJzaW9uIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRDb25maWdJdGVtSUR9ID0gJFZlcnNpb25EYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGxpbmtlZCBvYmplY3QKICAgIG15ICRJRCAgICAgPSAkUGFyYW17VGFyZ2V0S2V5fSAgICB8fCAkUGFyYW17U291cmNlS2V5fTsKICAgIG15ICRPYmplY3QgPSAkUGFyYW17VGFyZ2V0T2JqZWN0fSB8fCAkUGFyYW17U291cmNlT2JqZWN0fTsKCiAgICAjIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIHRoaXMgQ0kKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgKTsKCiAgICAjIHRyaWdnZXIgTGlua0FkZCBldmVudAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnTGlua0FkZCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkSUQgLiAnJSUnIC4gJE9iamVjdCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQb3N0KCkKCmxpbmsgZGVsZXRlIHBvc3QgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaW5rZWQgb2JqZWN0CiAgICBteSAkSUQgICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgIyByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIENJCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgIyB0cmlnZ2VyIExpbmtEZWxldGUgZXZlbnQKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0xpbmtEZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJElEIC4gJyUlJyAuICRPYmplY3QsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBvdHJzIC0gOTQwOTYzM2Y4MjJkZGUzOWVjNmZhNGI0NWY5ODYxZWQ4NzZmYjJhNiAtIEtlcm5lbC9TeXN0ZW0vU2VydmljZS9QcmVmZXJlbmNlc0RCLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ1NlcnZpY2VQcmVmZXJlbmNlc0RCJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgICAgICA9ICdzZXJ2aWNlX3ByZWZlcmVuY2VzJzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0gICAgICAgPSAncHJlZmVyZW5jZXNfa2V5JzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZVZhbHVlfSAgICAgPSAncHJlZmVyZW5jZXNfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlU2VydmljZUlEfSA9ICdzZXJ2aWNlX2lkJzsKCiAgICAjIGNyZWF0ZSBjYWNoZSBwcmVmaXgKICAgICRTZWxmLT57Q2FjaGVQcmVmaXh9ID0gJ1NlcnZpY2VQcmVmZXJlbmNlc0RCJwogICAgICAgIC4gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfQogICAgICAgIC4gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fQogICAgICAgIC4gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9CiAgICAgICAgLiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVTZXJ2aWNlSUR9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFNlcnZpY2VQcmVmZXJlbmNlc1NldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFNlcnZpY2VJRCBLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gV0hFUkUgIgogICAgICAgICAgICAuICIkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVTZXJ2aWNlSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17S2V5fSBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAoJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlU2VydmljZUlEfSwgIgogICAgICAgICAgICAuICIgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9KSAiCiAgICAgICAgICAgIC4gIiBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0tleX0sIFwkUGFyYW17VmFsdWV9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFNlbGYtPntDYWNoZVByZWZpeH0gLiAkUGFyYW17U2VydmljZUlEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBTZXJ2aWNlUHJlZmVyZW5jZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudAojIC0tLQojCiMgICAgIyBjaGVjayBpZiBzZXJ2aWNlIHByZWZlcmVuY2VzIGFyZSBhdmFpbGFibGUKIyAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VydmljZVByZWZlcmVuY2VzJyk7CiMgLS0tCgogICAgIyByZWFkIGNhY2hlCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFNlbGYtPntDYWNoZVByZWZpeH0gLiAkUGFyYW17U2VydmljZUlEfSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ICIKICAgICAgICAgICAgLiAiIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVTZXJ2aWNlSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0NhY2hlUHJlZml4fSAuICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuICVEYXRhOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICdJVFNNQ29uZmlnSXRlbSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzM4MzAKICAgIG15ICRUaW1lU3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgICMgY3JlYXRlIG9iamVjdCBhdHRyaWJ1dGUgYXJyYXkKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDbGFzc0lEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0RlcGxTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdJbmNpZGVudCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2hhbmdlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDaGFuZ2VUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRpbWVTdGFtcCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIHRoZSB4bWwgZGF0YQogICAgQ0xBU1NJRDoKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIGdldCB4bWwgZGVmaW5pdGlvbiBoYXNoCiAgICAgICAgbXkgJFhNTERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICBuZXh0IENMQVNTSUQgaWYgISRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfTsKCiAgICAgICAgJFNlbGYtPl9YTUxBdHRyaWJ1dGVBZGQoCiAgICAgICAgICAgIE9iamVjdEF0dHJpYnV0ZXMgPT4gXEBPYmplY3RBdHRyaWJ1dGVzLAogICAgICAgICAgICBYTUxEZWZpbml0aW9uICAgID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJ1hNTDo6JyAuICRDbGFzc0lELAogICAgICAgICAgICBQcmVmaXhOYW1lICAgICAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBfWE1MQXR0cmlidXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17T2JqZWN0QXR0cmlidXRlc307CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAkUGFyYW17UHJlZml4fSAuPSAnOjonOwogICAgfQogICAgaWYgKCAkUGFyYW17UHJlZml4TmFtZX0gKSB7CiAgICAgICAgJFBhcmFte1ByZWZpeE5hbWV9IC49ICc6Oic7CiAgICB9CgogICAgJFBhcmFte0xldmVsfSAgICAgIHx8PSAwOwogICAgJFBhcmFte1ByZWZpeH0gICAgIHx8PSAnJzsKICAgICRQYXJhbXtQcmVmaXhOYW1lfSB8fD0gJyc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U2VhcmNoYWJsZX0gJiYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBjcmVhdGUga2V5IGFuZCBuYW1lCiAgICAgICAgbXkgJEtleSAgPSAkUGFyYW17UHJlZml4fSAuICRJdGVtLT57S2V5fTsKICAgICAgICBteSAkTmFtZSA9ICRQYXJhbXtQcmVmaXhOYW1lfSAuICRJdGVtLT57TmFtZX07CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZQogICAgICAgIG15ICRBdHRyaWJ1dGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+WE1MU3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgTmFtZSA9PiAkTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IElURU0gaWYgISRBdHRyaWJ1dGU7CiAgICAgICAgbmV4dCBJVEVNIGlmIHJlZiAkQXR0cmlidXRlIG5lICdBUlJBWSc7CiAgICAgICAgbmV4dCBJVEVNIGlmICFzY2FsYXIgQHskQXR0cmlidXRlfTsKCiAgICAgICAgIyBhZGQgYXR0cmlidXRlcyB0byBvYmplY3QgYXJyYXkKICAgICAgICBwdXNoIEB7ICRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfSB9LCBAeyRBdHRyaWJ1dGV9OwoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fWE1MQXR0cmlidXRlQWRkKAogICAgICAgICAgICBPYmplY3RBdHRyaWJ1dGVzID0+ICRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfSwKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiAgICA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnRQcmV2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICggaW50IHJhbmQgNTAwICkgKyAxOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBsaW1pdAogICAgJFBhcmFte0xpbWl0fSA9IDFfMDAwXzAwMDsKCiAgICAjIGV4dHJhY3QgYWxsIHhtbCBwYXJhbSBrZXlzIGZyb20gdGhlIHBhcmFtIGhhc2gKICAgIG15IEBYTUxQYXJhbXMgPSBncmVwIHsgJF8gPX4gbXtcQSBYTUw6On14bXMgfSBzb3J0IGtleXMgJVBhcmFtOwoKICAgIGlmIChAWE1MUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuICdZb3UgbXVzdCBkZWZpbmUgYSBjbGFzcyBpbiBvbmUgYXhpcy4nIGlmICEkUGFyYW17Q2xhc3NJRHN9OwogICAgICAgIHJldHVybiAnWW91IG11c3QgZGVmaW5lIGEgY2xhc3MgaW4gb25lIGF4aXMuJyBpZiByZWYgJFBhcmFte0NsYXNzSURzfSBuZSAnQVJSQVknOwogICAgfQoKICAgICMgdG8gY29sbGVjdCBkYXRlIGZpZWxkcyBzZXBhcmF0ZWx5CiAgICBteSAlWE1MUGFyYW1zRGF0ZUZpZWxkczsKCiAgICBteSAlWE1MQ2xhc3NJRHM7CiAgICBQQVJBTUtFWToKICAgIGZvciBteSAkUGFyYW1LZXkgKEBYTUxQYXJhbXMpIHsKCiAgICAgICAgIyBleHRyYWN0IHNlYXJjaCB2YWx1ZXMKICAgICAgICBteSAkU2VhcmNoVmFsdWVzID0gJFBhcmFteyRQYXJhbUtleX07CgogICAgICAgICMgcHJlcGFyZSBwYXJhbSB2YWx1ZQogICAgICAgIGlmICggIXJlZiAkU2VhcmNoVmFsdWVzICkgewogICAgICAgICAgICAkU2VhcmNoVmFsdWVzID0gWyRTZWFyY2hWYWx1ZXNdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBQQVJBTUtFWSBpZiAhQHskU2VhcmNoVmFsdWVzfTsKCiAgICAgICAgIyBzcGxpdCBwYXJhbSBrZXkKICAgICAgICBteSAoICRDbGFzc0lELCAkU2VhcmNoS2V5ICkgPSAkUGFyYW1LZXkgPX4gbXsgXEEgWE1MOjogKCBcZCsgKSA6OiAoLispIFx6IH14bXM7CgogICAgICAgICMgcHJlcGFyZSBzZWFyY2gga2V5CiAgICAgICAgJFNlYXJjaEtleSA9fiBzWyA6OiBdWyd9WyVdeyddeG1zZzsKCiAgICAgICAgIyBBZGQgY2xhc3MgaWQgdG8geG1sIGNsYXNzIGlkIGhhc2gKICAgICAgICAkWE1MQ2xhc3NJRHN7JENsYXNzSUR9ID0gMTsKCiAgICAgICAgIyBjb2xsZWN0IGRhdGUgZmllbGRzIHNlcGFyYXRlbHkgKGUuZyBXYXJyYW50eUV4cGlyYXRpb25EYXRlTmV3ZXJEYXRlKQogICAgICAgIGlmICggJFNlYXJjaEtleSA9fiBteyAoLispICggTmV3ZXJEYXRlIHwgT2xkZXJEYXRlICkgXHogfXhtcyApIHsKICAgICAgICAgICAgJFhNTFBhcmFtc0RhdGVGaWVsZHN7JDF9LT57JDJ9ID0gJFNlYXJjaFZhbHVlcy0+WzBdOwoKICAgICAgICAgICAgbmV4dCBQQVJBTUtFWTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgbXkgJFNlYXJjaEhhc2ggPSB7CiAgICAgICAgICAgICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRTZWFyY2hLZXkgLiAnXCd9WyVde1wnQ29udGVudFwnfScgPT4gJFNlYXJjaFZhbHVlcywKICAgICAgICB9OwoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtXaGF0fSB9LCAkU2VhcmNoSGFzaDsKICAgIH0KCiAgICAjIGJ1aWxkIHNlYXJjaCBoYXNoIGZvciBkYXRlIGZpZWxkcwogICAgZm9yIG15ICREYXRlRmllbGROYW1lICggc29ydCBrZXlzICVYTUxQYXJhbXNEYXRlRmllbGRzICkgewoKICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJERhdGVGaWVsZE5hbWUgLiAnXCd9WyVde1wnQ29udGVudFwnfScgPT4gewogICAgICAgICAgICAgICAgJy1iZXR3ZWVuJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFhNTFBhcmFtc0RhdGVGaWVsZHN7JERhdGVGaWVsZE5hbWV9LT57TmV3ZXJEYXRlfSwKICAgICAgICAgICAgICAgICAgICAkWE1MUGFyYW1zRGF0ZUZpZWxkc3skRGF0ZUZpZWxkTmFtZX0tPntPbGRlckRhdGV9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtXaGF0fSB9LCAkU2VhcmNoSGFzaDsKICAgIH0KCiAgICBpZiAoJVhNTENsYXNzSURzKSB7CiAgICAgICAgbXkgQEV4aXN0cyA9IGdyZXAgeyAkWE1MQ2xhc3NJRHN7JF99IH0gQHsgJFBhcmFte0NsYXNzSURzfSB9OwoKICAgICAgICByZXR1cm4gMCBpZiAhQEV4aXN0czsKICAgIH0KCiAgICAjIHN0YXJ0IGNvbmZpZyBpdGVtIGV4dGVuZGVkIHNlYXJjaAogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCVQYXJhbSk7CgogICAgcmV0dXJuIHNjYWxhciBAeyRDb25maWdJdGVtSURzfTsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRTdGF0dXNMaW5rOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIHJldHVybiAxIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpTZXRJbmNpZGVudFN0YXRlT25MaW5rJyk7CgogICAgIyBnZXQgdGlja2V0IGlkIGRlcGVuZGluZyBvbiBldmVudAogICAgbXkgJFRpY2tldElEOwogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdMaW5rQWRkJyB8fCAkUGFyYW17RXZlbnR9IGVxICdMaW5rRGVsZXRlJyApIHsKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEIENvbW1lbnQpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIGluIERhdGEhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbGluayBldmVudCBjb25jZXJucyBhIHRpY2tldAogICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtEYXRhfS0+e0NvbW1lbnR9ICF+IG17IFxBICggXGQrICkgJSVUaWNrZXQgXHogfXhtczsKICAgICAgICAkVGlja2V0SUQgPSAkMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVGlja2V0SUQgaW4gRGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRUaWNrZXRJRCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfTsKICAgIH0KCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICByZXR1cm4gMSBpZiAhJVRpY2tldDsKCiAgICAjIGNoZWNrIGlmIHRpY2tldCB0eXBlIGlzIHJlbGV2YW50IChvcHRpb25hbCBmdW5jdGlvbmFsaXR5KQogICAgbXkgJE9sZFRpY2tldFR5cGVSZWxldmFudDsKICAgIG15ICROZXdUaWNrZXRUeXBlUmVsZXZhbnQ7CiAgICBteSAkVGlja2V0VHlwZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpMaW5rU3RhdHVzOjpUaWNrZXRUeXBlcycpOwogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdUaWNrZXRUeXBlVXBkYXRlJyApIHsKCiAgICAgICAgIyB0aWNrZXQgdHlwZXMgYXJlIG5vdCB1c2VkLCBjaGFuZ2VzIGRvbid0IGFmZmVjdCBDSSBpbmNpZGVudCBzdGF0ZXMKICAgICAgICByZXR1cm4gMSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRUaWNrZXRUeXBlcyk7CgogICAgICAgICMgZGV0ZXJtaW5lIHR5cGUgb2YgdGlja2V0IGJlZm9yZSBsYXN0IHVwZGF0ZQogICAgICAgIG15ICRPbGRUaWNrZXRUeXBlOwogICAgICAgIG15IEBIaXN0b3J5TGluZXMgPSAkVGlja2V0T2JqZWN0LT5IaXN0b3J5R2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAoIHJldmVyc2UgQEhpc3RvcnlMaW5lcyApIHsKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICRMaW5lLT57SGlzdG9yeVR5cGV9IG5lICdUeXBlVXBkYXRlJzsKICAgICAgICAgICAgbXkgQENvbW1lbnRQYXJ0cyA9IHNwbGl0ICclJScsICRMaW5lLT57TmFtZX07CiAgICAgICAgICAgICRPbGRUaWNrZXRUeXBlID0gJENvbW1lbnRQYXJ0c1szXTsKICAgICAgICAgICAgbGFzdCBMSU5FOwogICAgICAgIH0KICAgICAgICBpZiAoICEkT2xkVGlja2V0VHlwZSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvdW5kIG5vIHByZXZpb3VzIHRpY2tldCB0eXBlIGZvciB0aWNrZXQgaWQgJFRpY2tldElEISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgb25seSBjaGFuZ2VzIHJlbGV2YW50LT5pcnJlbGV2YW50IGFuZCBpcnJlbGV2YW50LT5yZWxldmFudCBhcmUgb2YgaW50ZXJlc3QKICAgICAgICAkT2xkVGlja2V0VHlwZVJlbGV2YW50ID0gMSBpZiBncmVwIHsgJF8gZXEgJE9sZFRpY2tldFR5cGUgfSBAeyRUaWNrZXRUeXBlc307CiAgICAgICAgJE5ld1RpY2tldFR5cGVSZWxldmFudCA9IDEgaWYgZ3JlcCB7ICRfIGVxICRUaWNrZXR7VHlwZX0gfSBAeyRUaWNrZXRUeXBlc307CiAgICAgICAgcmV0dXJuIDEgaWYgKCAkT2xkVGlja2V0VHlwZVJlbGV2YW50IHx8ICcnICkgZXEgKCAkTmV3VGlja2V0VHlwZVJlbGV2YW50IHx8ICcnICk7CiAgICB9CgogICAgIyBzaG9ydGN1dCBmb3Igb3RoZXIgZXZlbnRzIChjaGVjayBpZiB0aWNrZXQgdHlwZSBpcyBpbiBzY29wZSkKICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCRUaWNrZXRUeXBlcykgKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgISRUaWNrZXR7VHlwZX07CiAgICAgICAgcmV0dXJuIDEgaWYgIWdyZXAgeyAkXyBlcSAkVGlja2V0e1R5cGV9IH0gQHskVGlja2V0VHlwZXN9OwogICAgfQoKICAgICMgY2hlY2sgaWYgdGlja2V0IHN0YXRlIGlzIHJlbGV2YW50CiAgICBteSAkT2xkVGlja2V0U3RhdGVSZWxldmFudDsKICAgIG15ICROZXdUaWNrZXRTdGF0ZVJlbGV2YW50OwogICAgbXkgQE9wZW5TdGF0ZVR5cGVzID0gKCAnbmV3JywgJ29wZW4nLCAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nICk7CiAgICBpZiAoICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFN0YXRlVXBkYXRlJyApIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPntPbGRUaWNrZXREYXRhfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVGlja2V0SUQgaW4gT2xkVGlja2V0RGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgY2hhbmdlcyBvcGVuLT5jbG9zZSBhbmQgY2xvc2UtPm9wZW4gYXJlIG9mIGludGVyZXN0CiAgICAgICAgJE5ld1RpY2tldFN0YXRlUmVsZXZhbnQgPSAxIGlmIGdyZXAgeyAkXyBlcSAkVGlja2V0e1N0YXRlVHlwZX0gfSBAT3BlblN0YXRlVHlwZXM7CiAgICAgICAgJE9sZFRpY2tldFN0YXRlUmVsZXZhbnQgPSAxIGlmIGdyZXAgeyAkXyBlcSAkUGFyYW17RGF0YX0tPntPbGRUaWNrZXREYXRhfS0+e1N0YXRlVHlwZX0gfSBAT3BlblN0YXRlVHlwZXM7CiAgICAgICAgcmV0dXJuIDEgaWYgKCAkTmV3VGlja2V0U3RhdGVSZWxldmFudCB8fCAnJyApIGVxICggJE9sZFRpY2tldFN0YXRlUmVsZXZhbnQgfHwgJycgKTsKICAgIH0KCiAgICAjIHNob3J0Y3V0IGZvciBvdGhlciBldmVudHMgKGNoZWNrIGlmIHRpY2tldCBzdGF0ZSBpcyBpbiBzY29wZSkKICAgIGVsc2UgewogICAgICAgIHJldHVybiAxIGlmICFncmVwIHsgJF8gZXEgJFRpY2tldHtTdGF0ZVR5cGV9IH0gQE9wZW5TdGF0ZVR5cGVzOwogICAgfQoKICAgICMgc2hvcnRjdXQgZm9yIHRpY2tldCBldmVudHMgKGNoZWNrIGlmIHRpY2tldCBoYXMgYW55IHBvdGVudGlhbGx5IHJlbGV2YW50IGxpbmtzKQogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdUaWNrZXRTdGF0ZVVwZGF0ZScgfHwgJFBhcmFte0V2ZW50fSBlcSAnVGlja2V0VHlwZVVwZGF0ZScgKSB7CiAgICAgICAgbXkgJUxpbmtLZXlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3QoCiAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIEtleTEgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBPYmplY3QyID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCBcJUxpbmtLZXlMaXN0ICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGluY2lkZW50IHN0YXRlcyBhbmQgcmVsZXZhbnQgbGluayB0eXBlcyBwZXIgaW5jaWRlbnQgc3RhdGUKICAgIG15ICRJbmNpZGVudFN0YXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkxpbmtTdGF0dXM6OkluY2lkZW50U3RhdGVzJyk7CiAgICBteSAkTGlua1R5cGVzICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpMaW5rU3RhdHVzOjpMaW5rVHlwZXMnKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRMaW5rVHlwZXMpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBjb25maWd1cmF0aW9uIGZvciAnSVRTTUNvbmZpZ0l0ZW06OkxpbmtTdGF0dXM6OkxpbmtUeXBlcychIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICVMaW5rVHlwZXNCeUluY2lkZW50U3RhdGU7CiAgICBMSU5LVFlQRToKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXskTGlua1R5cGVzfSApIHsKICAgICAgICBwdXNoIEB7ICRMaW5rVHlwZXNCeUluY2lkZW50U3RhdGV7ICRMaW5rVHlwZXMtPnskTGlua1R5cGV9IH0gfSwgJExpbmtUeXBlOwogICAgfQoKICAgICMgaGFuZGxlIGFkZGVkIG9yIHJlbW92ZWQgbGlua3MKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnTGlua0FkZCcgfHwgJFBhcmFte0V2ZW50fSBlcSAnTGlua0RlbGV0ZScgKSB7CiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRQYXJhbXtEYXRhfS0+e0NvbmZpZ0l0ZW1JRH07CiAgICAgICAgbXkgJFZlcnNpb24gICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIG9wdGlvbmFsOiBjaGVjayBpZiBDSSBkZXBsb3ltZW50IHN0YXRlIGlzIHJlbGV2YW50CiAgICAgICAgbXkgJERlcGxveW1lbnRTdGF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpMaW5rU3RhdHVzOjpEZXBsb3ltZW50U3RhdGVzJyk7CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJERlcGxveW1lbnRTdGF0ZXMpICkgewogICAgICAgICAgICByZXR1cm4gMSBpZiAhZ3JlcCB7ICRfIGVxICRWZXJzaW9uLT57RGVwbFN0YXRlfSB9IEB7JERlcGxveW1lbnRTdGF0ZXN9OwogICAgICAgIH0KCiAgICAgICAgIyByYWlzZSBpbmNpZGVudCBzdGF0ZSBpZiBuZWNlc3NhcnkKICAgICAgICBpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0xpbmtBZGQnICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9DaGVja1JhaXNlSW5jaWRlbnRTdGF0ZSgKICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICAgICAgICAgICAgICA9PiAkVmVyc2lvbiwKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGVzICAgICAgICAgICA9PiAkSW5jaWRlbnRTdGF0ZXMsCiAgICAgICAgICAgICAgICBMaW5rVHlwZXNCeUluY2lkZW50U3RhdGUgPT4gXCVMaW5rVHlwZXNCeUluY2lkZW50U3RhdGUsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBsb3dlciBpbmNpZGVudCBzdGF0ZSBpZiBuZWNlc3NhcnkKICAgICAgICByZXR1cm4gJFNlbGYtPl9DaGVja0xvd2VySW5jaWRlbnRTdGF0ZSgKICAgICAgICAgICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgID0+ICRWZXJzaW9uLAogICAgICAgICAgICBJbmNpZGVudFN0YXRlcyAgICAgICAgICAgPT4gJEluY2lkZW50U3RhdGVzLAogICAgICAgICAgICBMaW5rVHlwZXNCeUluY2lkZW50U3RhdGUgPT4gXCVMaW5rVHlwZXNCeUluY2lkZW50U3RhdGUsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSB0aWNrZXQgY2xvc3VyZS9yZS1vcGVuIGFuZCByZWxldmFudC9pcnJlbGV2YW50IHR5cGUgY2hhbmdlCiAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFN0YXRlVXBkYXRlJyB8fCAkUGFyYW17RXZlbnR9IGVxICdUaWNrZXRUeXBlVXBkYXRlJyApIHsKCiAgICAgICAgIyByZWxldmFudCB0aWNrZXQgc3RhdGUgYW5kIHR5cGUgdXBkYXRlcyBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkKICAgICAgICAjIGJvdGggbWVhbiBhIHRpY2tldCBpcyByZWxldmFudCBmb3IgQ0kgaW5jaWRlbnQgc3RhdGUgY2hhbmdlcyBvciBub3QKICAgICAgICAjIHRpY2tldCByZS1vcGVuIG9yIGNoYW5nZSB0byByZWxldmFudCB0eXBlID0gbWlnaHQgaGF2ZSB0byByYWlzZSBpbmNpZGVudCBzdGF0ZSBvZiBDSXMKICAgICAgICAjIHRpY2tldCBjbG9zdXJlIG9yIGNoYW5nZSB0byBpcnJlbGV2YW50IHR5cGUgPSBtaWdodCBoYXZlIHRvIGxvd2VyIGluY2lkZW50IHN0YXRlIG9mIENJcwogICAgICAgIG15ICRSZWxldmFudE5vdzsKICAgICAgICBpZiAoCiAgICAgICAgICAgICggJFBhcmFte0V2ZW50fSBlcSAnVGlja2V0U3RhdGVVcGRhdGUnICAgJiYgJE5ld1RpY2tldFN0YXRlUmVsZXZhbnQgKQogICAgICAgICAgICB8fCAoICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFR5cGVVcGRhdGUnICYmICROZXdUaWNrZXRUeXBlUmVsZXZhbnQgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUmVsZXZhbnROb3cgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBsb29wIHRocm91Z2ggYWxsIGxpbmsgdHlwZXMgYW5kIGNoZWNrIGxpbmtzIHRvIHNlZSBpZiB0aGVyZSBhcmUgcG9zc2libHkgYWZmZWN0ZWQgQ0lzCiAgICAgICAgbXkgJERlcGxveW1lbnRTdGF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpMaW5rU3RhdHVzOjpEZXBsb3ltZW50U3RhdGVzJyk7CiAgICAgICAgSU5DSURFTlRTVEFURToKICAgICAgICBmb3IgbXkgJEluY2lkZW50U3RhdGUgKCBAeyRJbmNpZGVudFN0YXRlc30gKSB7CiAgICAgICAgICAgIExJTktUWVBFOgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICggQHsgJExpbmtUeXBlc0J5SW5jaWRlbnRTdGF0ZXskSW5jaWRlbnRTdGF0ZX0gfSApIHsKICAgICAgICAgICAgICAgIG15IEBMaW5rZWRDSXMgPSAkU2VsZi0+X0NoZWNrVGlja2V0TGlua3MoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IExJTktUWVBFIGlmICFATGlua2VkQ0lzOwoKICAgICAgICAgICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChATGlua2VkQ0lzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFZlcnNpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbDogY2hlY2sgaWYgQ0kgZGVwbG95bWVudCBzdGF0ZSBpcyByZWxldmFudAogICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREZXBsb3ltZW50U3RhdGVzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgIWdyZXAgeyAkXyBlcSAkVmVyc2lvbi0+e0RlcGxTdGF0ZX0gfSBAeyREZXBsb3ltZW50U3RhdGVzfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBpbmNpZGVudCBzdGF0ZSB2cyBzdGF0ZSBjYXVzZWQgYnkgbGluawoKICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgaXMgbG93ZXIgdGhhbiBjYXVzZWQgYnkgbGluayAtPiBzZXQKICAgICAgICAgICAgICAgICAgICBpZiAoJFJlbGV2YW50Tm93KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNob3J0Y3V0OiBub3RoaW5nIHRvIGRvIGlmIENJIGlzIGFscmVhZHkgaW4gaGlnaGVzdCBpbmNpZGVudCBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkVmVyc2lvbi0+e0luY2lTdGF0ZX0gZXEgJEluY2lkZW50U3RhdGVzLT5bMF07CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNob3J0Y3V0OiBub3RoaW5nIHRvIGRvIGlmIENJIGlzIGFscmVhZHkgaW4gc2FtZSBpbmNpZGVudCBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkVmVyc2lvbi0+e0luY2lTdGF0ZX0gZXEgJEluY2lkZW50U3RhdGU7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIENJIGlzIGluIGhpZ2hlciBpbmNpZGVudCBzdGF0ZSBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgICAgIFRNUElOQ0lERU5UU1RBVEU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVG1wSW5jaWRlbnRTdGF0ZSAoIEB7JEluY2lkZW50U3RhdGVzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsbCBmdXJ0aGVyIGluY2lkZW50IHN0YXRlcyBhcmUgbG93ZXIgdGhhbiBjdXJyZW50IG9uZSAtPiBzZXQgbmV3IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFRNUElOQ0lERU5UU1RBVEUgaWYgJFRtcEluY2lkZW50U3RhdGUgZXEgJEluY2lkZW50U3RhdGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFZlcnNpb24tPntJbmNpU3RhdGV9IGVxICRUbXBJbmNpZGVudFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBuZXcgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9TZXRDSVN0YXR1cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICAgPT4gJFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRJbmNpZGVudFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgaXMgc2FtZSBhcyBjYXVzZWQgYnkgbGluayAtPiByZS1jYWxjdWxhdGUKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvcnRjdXQ6IG5vdGhpbmcgdG8gZG8gaWYgQ0kgaXMgYWxyZWFkeSBpbiBsb3dlc3QgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFZlcnNpb24tPntJbmNpU3RhdGV9IGVxICRJbmNpZGVudFN0YXRlcy0+Wy0xXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvcnRjdXQ6IG5vdGhpbmcgdG8gZG8gaWYgQ0kgaXMgbm90IGluIHNhbWUgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFZlcnNpb24tPntJbmNpU3RhdGV9IG5lICRJbmNpZGVudFN0YXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSBpbmNpZGVudCBzdGF0ZSBleGFjdGx5CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5fQ2hlY2tMb3dlckluY2lkZW50U3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uICAgICAgICAgICAgICAgICAgPT4gJFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlcyAgICAgICAgICAgPT4gJEluY2lkZW50U3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGVzQnlJbmNpZGVudFN0YXRlID0+IFwlTGlua1R5cGVzQnlJbmNpZGVudFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB1bmtub3duL2lycmVsZXZhbnQgZXZlbnQKICAgIGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIFJhdGlvbmFsZToKIyBTdGFydCBhdCBoaWdoZXN0ICh3b3JzdCkgaW5jaWRlbnQgc3RhdGUgYW5kIGxvb3AgZG93biB0byBjdXJyZW50IGluY2lkZW50IHN0YXRlLAojICAgY2hlY2tpbmcgZm9yIGxpbmtzIG9uIGFsbCB0eXBlcyBjb25maWd1cmVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBpbmNpZGVudCBzdGF0ZS4KIyBJZiBhbnkgbGluayBmb3IgYSBoaWdoZXIgaW5jaWRlbnQgc3RhdGUgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMgZm91bmQsCiMgICBzZXQgdGhpcyBzdGF0ZSBhbmQgZXhpdC4KIyBEdWUgdG8gdG9wLXRvLWJvdHRvbSBtZXRob2QsIG5vIGhpZ2hlciBpbmNpZGVudCBzdGF0ZSBjYW4gb2NjdXIgbGF0ZXIuCnN1YiBfQ2hlY2tSYWlzZUluY2lkZW50U3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFZlcnNpb24gSW5jaWRlbnRTdGF0ZXMgTGlua1R5cGVzQnlJbmNpZGVudFN0YXRlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9vcCB0aHJvdWdoIHRhcmdldCBzdGF0ZXMgYW5kIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKICAgIElOQ0lERU5UU1RBVEU6CiAgICBmb3IgbXkgJEluY2lkZW50U3RhdGUgKCBAeyAkUGFyYW17SW5jaWRlbnRTdGF0ZXN9IH0gKSB7CgogICAgICAgICMgQ0kgYWxyZWFkeSBpbiB0YXJnZXQgc3RhdGUgLSBub3RoaW5nIHRvIGRvCiAgICAgICAgcmV0dXJuIDEgaWYgJFBhcmFte1ZlcnNpb259LT57SW5jaVN0YXRlfSBlcSAkSW5jaWRlbnRTdGF0ZTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBoYXZlIGxpbmtlZCB0aWNrZXRzIHRoYXQgbGVhZCB0byBpbmNpZGVudCBzdGF0ZQogICAgICAgIExJTktUWVBFOgogICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBAeyAkUGFyYW17TGlua1R5cGVzQnlJbmNpZGVudFN0YXRlfS0+eyRJbmNpZGVudFN0YXRlfSB9ICkgewogICAgICAgICAgICBuZXh0IExJTktUWVBFIGlmICEkU2VsZi0+X0NoZWNrQ29uZmlnSXRlbUxpbmtzKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtWZXJzaW9ufS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBsaW5rZWQgdGlja2V0IC0gc2V0IGluY2lkZW50IHN0YXRlIGFuZCBleGl0CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1NldENJU3RhdHVzKAogICAgICAgICAgICAgICAgVmVyc2lvbiAgICAgICA9PiAkUGFyYW17VmVyc2lvbn0sCiAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRJbmNpZGVudFN0YXRlLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBSYXRpb25hbGU6CiMgU2hvcnRjdXQgaWYgQ0kgaXMgYWxyZWR5IGluIGxvd2VzdCAoYmVzdCkgaW5jaWRlbnQgc3RhdGUgPSBjYW4ndCBoYXZlIGNoYW5nZWQgYWZ0ZXIgbGluayBkZWxldGUuCiMgU3RhcnQgYXQgaGlnaGVzdCAod29yc3QpIGluY2lkZW50IHN0YXRlIGFuZCBsb29wIGRvd24gdG8gY3VycmVudCBpbmNpZGVudCBzdGF0ZSwKIyAgIGNoZWNraW5nIGZvciBsaW5rcyBvbiBhbGwgdHlwZXMgY29uZmlndXJlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW5jaWRlbnQgc3RhdGVzLgojIElmIGEgbGluayBmb3IgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgaXMgZm91bmQsIGV4aXQgaW1tZWRpYXRlbHkgKG5vIGNoYW5nZSkuCiMgT3RoZXJ3aXNlIHNldCBpbmNpZGVudCBzdGF0ZSBmb3IgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgbGluaywgdGhlbiBleGl0LgojIElmIG5vIGxpbmsgaXMgZm91bmQsIHNldCB0aGUgbG93ZXN0IHN0YXRlLgojIER1ZSB0byB0b3AtdG8tYm90dG9tIG1ldGhvZCwgZmlyc3QgcmVtZW1iZXJlZCBpbmNpZGVudCBzdGF0ZSBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZS4Kc3ViIF9DaGVja0xvd2VySW5jaWRlbnRTdGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVmVyc2lvbiBJbmNpZGVudFN0YXRlcyBMaW5rVHlwZXNCeUluY2lkZW50U3RhdGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG9ydGN1dCBmb3IgbG93ZXN0IGxldmVsCiAgICByZXR1cm4gMSBpZiAkUGFyYW17VmVyc2lvbn0tPntJbmNpU3RhdGV9IGVxICRQYXJhbXtJbmNpZGVudFN0YXRlc30tPlstMV07CgogICAgIyBsb29wIHRocm91Z2ggdGFyZ2V0IHN0YXRlcyBhbmQgY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgY2hhbmdlZAogICAgbXkgJExvd2VySW5jaWRlbnRTdGF0ZTsKICAgIElOQ0lERU5UU1RBVEU6CiAgICBmb3IgbXkgJEluY2lkZW50U3RhdGUgKCBAeyAkUGFyYW17SW5jaWRlbnRTdGF0ZXN9IH0gKSB7CgogICAgICAgICMgc2tpcCBsZXZlbCBpZiBjdXJyZW50IENJIGluY2lkZW50IHN0YXRlIGlzIG5vdCBvbiB0aGlzIG9yIGFueSBoaWdoZXIgbGV2ZWwKICAgICAgICBuZXh0IElOQ0lERU5UU1RBVEUgaWYgJFBhcmFte1ZlcnNpb259LT57SW5jaVN0YXRlfSBuZSAkSW5jaWRlbnRTdGF0ZSAmJiAhJExvd2VySW5jaWRlbnRTdGF0ZTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBoYXZlIGxpbmtlZCB0aWNrZXRzIHRoYXQga2VlcCBpbmNpZGVudCBzdGF0ZQogICAgICAgIExJTktUWVBFOgogICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBAeyAkUGFyYW17TGlua1R5cGVzQnlJbmNpZGVudFN0YXRlfS0+eyRJbmNpZGVudFN0YXRlfSB9ICkgewogICAgICAgICAgICBuZXh0IExJTktUWVBFIGlmICEkU2VsZi0+X0NoZWNrQ29uZmlnSXRlbUxpbmtzKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtWZXJzaW9ufS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBsaW5rZWQgdGlja2V0CgogICAgICAgICAgICAjIGtlZXAgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgcmV0dXJuIDEgaWYgJFBhcmFte1ZlcnNpb259LT57SW5jaVN0YXRlfSBlcSAkSW5jaWRlbnRTdGF0ZTsKCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNldCBuZXcgKGxvd2VyKSBpbmNpZGVudCBzdGF0ZSBhbmQgZXhpdAogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9TZXRDSVN0YXR1cygKICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICAgPT4gJFBhcmFte1ZlcnNpb259LAogICAgICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAkSW5jaWRlbnRTdGF0ZSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCBzdGF0ZSBuZWVkcyB0byBiZSBjaGFuZ2VkICg9IGN1cnJlbnQgbGV2ZWwgaXNuJ1QganVzdGlmaWVkIGJ5IGxpbmtzIGFueW1vcmUpCiAgICAgICAgJExvd2VySW5jaWRlbnRTdGF0ZSA9IDE7CiAgICB9CgogICAgIyBubyByZWxldmFudCBsaW5rcyBoYXZlIGJlZW4gZm91bmQsIGJ1dCBDSSB3YXNuJ3QgaW4gbG93ZXN0IGluY2lkZW50IHN0YXRlIGJlZm9yZSAtIHNldCBpdCBub3cgYW5kIGV4aXQKICAgIHJldHVybiAkU2VsZi0+X1NldENJU3RhdHVzKAogICAgICAgIFZlcnNpb24gICAgICAgPT4gJFBhcmFte1ZlcnNpb259LAogICAgICAgIEluY2lkZW50U3RhdGUgPT4gJFBhcmFte0luY2lkZW50U3RhdGVzfS0+Wy0xXSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwp9CgojIHNldCBDSSB0byBhIHNwZWNpZmllZCBpbmNpZGVudCBzdGF0ZSBhbmQgbG9nIGNoYW5nZSBpbiBjb3JyZXNwb25kaW5nIHRpY2tldApzdWIgX1NldENJU3RhdHVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhWZXJzaW9uIEluY2lkZW50U3RhdGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpZGVudFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSW5jaWRlbnRTdGF0ZUxpc3QpOwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgaXMgdmFsaWQKICAgIG15ICVSZXZlcnNlSW5jaWRlbnRTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lkZW50U3RhdGVMaXN0fTsKICAgIGlmICggISRSZXZlcnNlSW5jaWRlbnRTdGF0ZUxpc3R7ICRQYXJhbXtJbmNpZGVudFN0YXRlfSB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSGF2ZSBpbnZhbGlkIGluY2lkZW50IHN0YXRlICckUGFyYW17SW5jaWRlbnRTdGF0ZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgYSBuZXcgdmVyc2lvbiB3aXRoIHRoZSBuZXcgaW5jaWRlbnQgc3RhdGUKICAgIG15ICRWZXJzaW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+VmVyc2lvbkFkZCgKICAgICAgICAleyAkUGFyYW17VmVyc2lvbn0gfSwKICAgICAgICBJbmNpU3RhdGVJRCA9PiAkUmV2ZXJzZUluY2lkZW50U3RhdGVMaXN0eyAkUGFyYW17SW5jaWRlbnRTdGF0ZX0gfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhJFZlcnNpb25JRDsKCiAgICAjIGxvZyBjaGFuZ2UgaW4gdGlja2V0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkhpc3RvcnlBZGQoCiAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICBOYW1lICAgICAgICAgPT4gIlVwZGF0ZWQgaW5jaWRlbnQgc3RhdGUgb2YgY29uZmlnIGl0ZW0gJyRQYXJhbXtWZXJzaW9ufS0+e051bWJlcn0nIHRvICckUGFyYW17SW5jaWRlbnRTdGF0ZX0nLiIsCiAgICAgICAgQ3JlYXRlVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIGNoZWNrIGlmIHJlbGV2YW50IENJcyBhcmUgbGlua2VkIHRvIGEgdGlja2V0CnN1YiBfQ2hlY2tUaWNrZXRMaW5rcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsaW5rIHR5cGUgbG9va3VwCiAgICBteSAkTGlua1R5cGVMb29rdXAgPSAkU2VsZi0+X0xpbmtUeXBlTG9va3VwR2V0KCk7CgogICAgbXkgJUxpbmtLZXlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3QoCiAgICAgICAgT2JqZWN0MSAgID0+ICdUaWNrZXQnLAogICAgICAgIEtleTEgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIE9iamVjdDIgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFN0YXRlICAgICA9PiAnVmFsaWQnLAogICAgICAgIFR5cGUgICAgICA9PiAkTGlua1R5cGVMb29rdXAtPnsgJFBhcmFte1R5cGV9IH0tPntOYW1lfSwKICAgICAgICBEaXJlY3Rpb24gPT4gJExpbmtUeXBlTG9va3VwLT57ICRQYXJhbXtUeXBlfSB9LT57RGlyZWN0aW9ufS0+e1RpY2tldH0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggXCVMaW5rS2V5TGlzdCApOwogICAgcmV0dXJuICggc29ydCBrZXlzICVMaW5rS2V5TGlzdCApOwp9CgojIGNoZWNrIGlmIHJlbGV2YW50IG9wZW4gdGlja2V0cyBhcmUgbGlua2VkIHRvIGEgQ0kKc3ViIF9DaGVja0NvbmZpZ0l0ZW1MaW5rcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGluayB0eXBlIGxvb2t1cAogICAgbXkgJExpbmtUeXBlTG9va3VwID0gJFNlbGYtPl9MaW5rVHlwZUxvb2t1cEdldCgpOwoKICAgIG15ICVMaW5rS2V5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0KAogICAgICAgIE9iamVjdDEgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleTEgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBPYmplY3QyICAgPT4gJ1RpY2tldCcsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICRMaW5rVHlwZUxvb2t1cC0+eyAkUGFyYW17VHlwZX0gfS0+e05hbWV9LAogICAgICAgIERpcmVjdGlvbiA9PiAkTGlua1R5cGVMb29rdXAtPnsgJFBhcmFte1R5cGV9IH0tPntEaXJlY3Rpb259LT57SVRTTUNvbmZpZ0l0ZW19LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoIFwlTGlua0tleUxpc3QgKTsKCiAgICAjIGxpc3Qgb2YgcmVsZXZhbnQgc3RhdGUgdHlwZXMKICAgIG15IEBPcGVuU3RhdGVUeXBlcyA9ICggJ25ldycsICdvcGVuJywgJ3BlbmRpbmcgcmVtaW5kZXInLCAncGVuZGluZyBhdXRvJyApOwoKICAgICMgdXNlIHRpY2tldCB0eXBlIGNoZWNrPwogICAgbXkgJFRpY2tldFR5cGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6TGlua1N0YXR1czo6VGlja2V0VHlwZXMnKTsKICAgIG15ICRDaGVja1RpY2tldFR5cGVzOwogICAgJENoZWNrVGlja2V0VHlwZXMgPSAxIGlmIElzQXJyYXlSZWZXaXRoRGF0YSgkVGlja2V0VHlwZXMpOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IGtleXMgJUxpbmtLZXlMaXN0ICkgewogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgIWdyZXAgeyAkXyBlcSAkVGlja2V0e1N0YXRlVHlwZX0gfSBAT3BlblN0YXRlVHlwZXM7CiAgICAgICAgaWYgKCRDaGVja1RpY2tldFR5cGVzKSB7CiAgICAgICAgICAgIG5leHQgVElDS0VUSUQgaWYgISRUaWNrZXR7VHlwZX07CiAgICAgICAgICAgIG5leHQgVElDS0VUSUQgaWYgIWdyZXAgeyAkXyBlcSAkVGlja2V0e1R5cGV9IH0gQHskVGlja2V0VHlwZXN9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCiMgY29tcGlsZSBsaXN0IG9mIGludGVybmFsIGxpbmsgdHlwZSBuYW1lcyBhbmQgZGlyZWN0aW9ucyB0byB1c2UgZm9yIExpbmtLZXlMaXN0CnN1YiBfTGlua1R5cGVMb29rdXBHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGlmIHdlIGhhdmUgZ2VuZXJhdGVkIGxvb2t1cCBiZWZvcmUKICAgIHJldHVybiAkU2VsZi0+e0xpbmtUeXBlTG9va3VwfSBpZiAkU2VsZi0+e0xpbmtUeXBlTG9va3VwfTsKCiAgICBteSAlTGlua1R5cGVMb29rdXA7CiAgICBteSAlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5UeXBlTGlzdCgpOwogICAgZm9yIG15ICRUeXBlTmFtZUludGVybmFsICggc29ydCBrZXlzICVUeXBlTGlzdCApIHsKICAgICAgICBteSAkU291cmNlTmFtZSA9ICRUeXBlTGlzdHskVHlwZU5hbWVJbnRlcm5hbH0tPntTb3VyY2VOYW1lfTsKICAgICAgICBteSAkVGFyZ2V0TmFtZSA9ICRUeXBlTGlzdHskVHlwZU5hbWVJbnRlcm5hbH0tPntUYXJnZXROYW1lfTsKICAgICAgICAkTGlua1R5cGVMb29rdXB7JFNvdXJjZU5hbWV9ID0gewogICAgICAgICAgICBOYW1lICAgICAgPT4gJFR5cGVOYW1lSW50ZXJuYWwsCiAgICAgICAgICAgIERpcmVjdGlvbiA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiAkU291cmNlTmFtZSBlcSAkVGFyZ2V0TmFtZSA/ICdCb3RoJyA6ICdUYXJnZXQnLAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgPT4gJFNvdXJjZU5hbWUgZXEgJFRhcmdldE5hbWUgPyAnQm90aCcgOiAnU291cmNlJywKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgICAgICRMaW5rVHlwZUxvb2t1cHskVGFyZ2V0TmFtZX0gPSB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkVHlwZU5hbWVJbnRlcm5hbCwKICAgICAgICAgICAgRGlyZWN0aW9uID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+ICRTb3VyY2VOYW1lIGVxICRUYXJnZXROYW1lID8gJ0JvdGgnIDogJ1NvdXJjZScsCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICA9PiAkU291cmNlTmFtZSBlcSAkVGFyZ2V0TmFtZSA/ICdCb3RoJyA6ICdUYXJnZXQnLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyByZW1lbWJlciByZXN1bHQKICAgICRTZWxmLT57TGlua1R5cGVMb29rdXB9ID0gXCVMaW5rVHlwZUxvb2t1cDsKCiAgICByZXR1cm4gXCVMaW5rVHlwZUxvb2t1cDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXI7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbUNyZWF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBzZXQgVXNlcklEIHRvIHJvb3QKJFNlbGYtPntVc2VySUR9ID0gMTsKCiMgaGVscGVyIG9iamVjdAojIHNraXAgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlU3lzdGVtQ29uZmlndXJhdGlvbiA9PiAxLAogICAgICAgIFNraXBTU0xWZXJpZnkgICAgICAgICAgICAgID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7CgpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgY2hlY2sgaWYgU1NMIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZAokU2VsZi0+SXMoCiAgICAkRU5We1BFUkxfTFdQX1NTTF9WRVJJRllfSE9TVE5BTUV9LAogICAgMCwKICAgICdEaXNhYmxlZCBTU0wgY2VydGl0aWNhdGVzIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCcsCik7CgojIGNyZWF0ZSBDb25maWdJdGVtIG9iamVjdApteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiMgY3JlYXRlIHdlYnNlcnZpY2Ugb2JqZWN0Cm15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKJFNlbGYtPklzKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJywKICAgIHJlZiAkV2Vic2VydmljZU9iamVjdCwKICAgICJDcmVhdGUgd2Vic2VydmljZSBvYmplY3QiLAopOwoKIyBzZXQgd2Vic2VydmljZSBuYW1lCm15ICRXZWJzZXJ2aWNlTmFtZSA9ICctVGVzdC0nIC4gJFJhbmRvbUlEOwoKbXkgJFdlYnNlcnZpY2VJRCA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgTmFtZSAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgRGVidWdnZXIgPT4gewogICAgICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIH0sCiAgICAgICAgUHJvdmlkZXIgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZUlELAogICAgIkFkZGVkIFdlYnNlcnZpY2UiLAopOwoKIyBnZXQgcmVtb3RlIGhvc3Qgd2l0aCBzb21lIHByZWNhdXRpb25zIGZvciBjZXJ0YWluIHVuaXQgdGVzdCBzeXN0ZW1zCm15ICRIb3N0OwpteSAkRlFETiA9ICRDb25maWdPYmplY3QtPkdldCgnRlFETicpOwoKIyB0cnkgdG8gcmVzb2x2ZSBmcWRuIGhvc3QKaWYgKCAkRlFETiBuZSAneW91cmhvc3QuZXhhbXBsZS5jb20nICYmIGdldGhvc3RieW5hbWUoJEZRRE4pICkgewogICAgJEhvc3QgPSAkRlFETjsKfQoKIyB0cnkgdG8gcmVzb2x2ZSBsb2NhbGhvc3QgaW5zdGVhZAppZiAoICEkSG9zdCAmJiBnZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSApIHsKICAgICRIb3N0ID0gJ2xvY2FsaG9zdCc7Cn0KCiMgdXNlIGhhcmRjb2RlZCBsb2NhbGhvc3QgaXAgYWRkcmVzcwppZiAoICEkSG9zdCApIHsKICAgICRIb3N0ID0gJzEyNy4wLjAuMSc7Cn0KCiMgcHJlcGFyZSB3ZWJzZXJ2aWNlIGNvbmZpZwpteSAkUmVtb3RlU3lzdGVtID0KICAgICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKQogICAgLiAnOi8vJwogICAgLiAkSG9zdAogICAgLiAnLycKICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAuICcvbnBoLWdlbmVyaWNpbnRlcmZhY2UucGwvV2Vic2VydmljZUlELycKICAgIC4gJFdlYnNlcnZpY2VJRDsKCm15ICRXZWJzZXJ2aWNlQ29uZmlnID0gewoKICAgICMgICAgTmFtZSA9PiAnJywKICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgJ1Rlc3QgZm9yIENvbmZpZ0l0ZW0gQ29ubmVjdG9yIHVzaW5nIFNPQVAgdHJhbnNwb3J0IGJhY2tlbmQuJywKICAgIERlYnVnZ2VyID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgUHJvdmlkZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTBfMDAwXzAwMCwKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlc3Npb25DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICBSZXF1ZXN0ZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5jb2RpbmcgID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEludm9rZXIgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAp9OwoKIyB1cGRhdGUgd2Vic2VydmljZSB3aXRoIHJlYWwgY29uZmlnCm15ICRXZWJzZXJ2aWNlVXBkYXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICBJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBOYW1lICAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyAgPT4gJFdlYnNlcnZpY2VDb25maWcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VVcGRhdGUsCiAgICAiVXBkYXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQgLSAkV2Vic2VydmljZU5hbWUiLAopOwoKIyBkZWJ1Z2dlciBvYmplY3QKbXkgJERlYnVnZ2VyT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlci0+bmV3KAogICAgRGVidWdnZXJDb25maWcgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBXZWJzZXJ2aWNlSUQgICAgICA9PiAkV2Vic2VydmljZUlELAogICAgQ29tbXVuaWNhdGlvblR5cGUgPT4gJ1Byb3ZpZGVyJywKKTsKJFNlbGYtPklzKAogICAgcmVmICREZWJ1Z2dlck9iamVjdCwKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyJywKICAgICdEZWJ1Z2dlck9iamVjdCBpbnN0YW5jaWF0ZWQgY29ycmVjdGx5JywKKTsKCiMgR2V0IFNlc3Npb25JRAojIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0Cm15ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKJFNlbGYtPklzKAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgIHJlZiAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdCwKICAgICJTZXNzaW9uSUQgLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCik7CgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tY29uZmlnaXRlbScgXSwKKTsKbXkgJFBhc3N3b3JkID0gJFVzZXJMb2dpbjsKCiMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKbXkgJFJlcXVlc3RlclNlc3Npb25SZXN1bHQgPSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdC0+UnVuKAogICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBJbnZva2VyICAgICAgPT4gJ1Nlc3Npb25DcmVhdGUnLAogICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgfSwKKTsKCm15ICROZXdTZXNzaW9uSUQgPSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdC0+e0RhdGF9LT57U2Vzc2lvbklEfTsKCiMgYWN0dWFsIHRlc3RzCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRW1wdHkgUmVxdWVzdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHt9LAogICAgICAgIEV4cGVjdGVkRGF0YSAgID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBDb25maWdJdGVtJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IDEsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIENJWE1MRGF0YScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENJWE1MRGF0YScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ2xhc3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBOYW1lJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBEZXBsU3RhdGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEluY2lTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBDbGFzcycsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ05vdEV4aXNpdG5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIERlcGxTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIEluY2lTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgTklDLT5OSUMnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBOSUMtPklwT3ZlckRIQ1AnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5JQyA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgTklDLT5OSUMgaW4gYXJyYXknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBOSUMtPklwT3ZlckRIQ1AgaW4gYXJyYXknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIE5JQy0+SXBPdmVyREhDUCBHZW5lcmFsIENhdGFsb2cgaW4gSGFzaCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBOSUMtPklwT3ZlckRIQ1AgR2VuZXJhbCBDYXRhbG9nIGluIEFycmF5IEhhc2gnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBWZW5kb3IgTG9uZyBUZXh0ICcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdhJyB4IDUxLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSBEYXRlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5MzAtMzAtMzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBPd25lciBDdXN0b21lcicsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIFJhbSBUb28gTWFueScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgUmFtICAgICAgICAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgIDYsCiAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgIDksCiAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAxMSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBBdHRhY2htZW50JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgICAgICBSYW0gICAgICAgICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEF0dGFjaG1lbnQtPkNvbnRlbnQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZlbmRvciA9PiAnVG9yZXJvIENoaXBzJywKICAgICAgICAgICAgICAgICAgICBOSUMgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0xMicsCiAgICAgICAgICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgICAgIFJhbSAgICAgICAgICAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICA0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICA0MDAwLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBBdHRhY2htZW50LT5Db250ZW50VHlwZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgUmFtICAgICAgICAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEF0dGFjaG1lbnQtPkZpbGVuYW1lJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgICAgICBSYW0gICAgICAgICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtQ3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NvcnJlY3QgQ29uZmlnSXRlbScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZlbmRvciAgICAgICAgICA9PiAnTGVub3ZvJywKICAgICAgICAgICAgICAgICAgICBNb2RlbCAgICAgICAgICAgPT4gJ1RoaW5rcGFkJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ1RoaW5rcGFkIFgzMDAnLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnRGVza3RvcCcsCiAgICAgICAgICAgICAgICAgICAgT3duZXIgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgU2VyaWFsTnVtYmVyICAgID0+ICdhYmMxMjM0NWFiYycsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW5nU3lzdGVtID0+ICdDZW50T1MgNi4wJywKICAgICAgICAgICAgICAgICAgICBDUFUgICAgICAgICAgICAgPT4gJ0ludGVsIENvcmUgaTMnLAogICAgICAgICAgICAgICAgICAgIFJhbSAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICc0MDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgJzIwMDAnLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgSGFyZERpc2sgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIYXJkRGlzayA9PiAnL2RldicsCiAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5ID0+ICc1MDAwMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBGUUROID0+ICdob3RzLmV4YW1wbGUuY29tJywKICAgICAgICAgICAgICAgICAgICBOSUMgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3MgID0+ICcxOTIuMTY4LjMwLjEnLAoKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzICA9PiAnMjAwLjM0LjU2Ljc4JywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIEdyYXBoaWNBZGFwdGVyICAgICAgICAgPT4gJ0FUSSBSYWRlb24gMzAwJywKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBJbnN0YWxsRGF0ZSAgICAgICAgICAgID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBOb3RlICAgICAgICAgICAgICAgICAgID0+ICdUaGlzIGlzIGEgRGVtbyBDSScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoYmlCbGJtTnZaR1ZrSUhSbGVIUT0nLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdNeSBUZXh0LnR4dCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhiaUJsYm1OdlpHVmtJSFJsZUhRPScsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTEnLAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnTXkgVGV4dDIudHh0JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICB9LAopOwoKIyBzdGFydCB0ZXN0aW5nCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgbG9jYWwgb2JqZWN0CiAgICBteSAkTG9jYWxPYmplY3QgPSAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OiRUZXN0LT57T3BlcmF0aW9ufSItPm5ldygKICAgICAgICBEZWJ1Z2dlck9iamVjdCA9PiAkRGVidWdnZXJPYmplY3QsCiAgICAgICAgV2Vic2VydmljZUlEICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6JFRlc3QtPntPcGVyYXRpb259IiwKICAgICAgICByZWYgJExvY2FsT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIGxvY2FsIG9iamVjdCIsCiAgICApOwoKICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgbXkgJENsb25lZFJlcXVlc3REYXRhID0gU3RvcmFibGU6OmRjbG9uZSggJFRlc3QtPntSZXF1ZXN0RGF0YX0gKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICBteSAkTG9jYWxSZXN1bHQgPSAkTG9jYWxPYmplY3QtPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgICAgICBJbnZva2VyICAgICAgPT4gJFRlc3QtPntPcGVyYXRpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgICAgICAgICAleyAkVGVzdC0+e1JlcXVlc3REYXRhfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgcmVzdG9yZSBjbG9uZWQgZGF0YQogICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0gPSAkQ2xvbmVkUmVxdWVzdERhdGE7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICAnSEFTSCcsCiAgICAgICAgcmVmICRMb2NhbFJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBzdHJ1Y3R1cmUgaXMgdmFsaWQiLAogICAgKTsKCiAgICAjIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0CiAgICBteSAkUmVxdWVzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKICAgICRTZWxmLT5JcygKICAgICAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInLAogICAgICAgIHJlZiAkUmVxdWVzdGVyT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIHJlcXVlc3RlciBvYmplY3QiLAogICAgKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICBteSAkUmVxdWVzdGVyUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgICV7ICRUZXN0LT57UmVxdWVzdERhdGF9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICAnSEFTSCcsCiAgICAgICAgcmVmICRSZXF1ZXN0ZXJSZXN1bHQsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IHN0cnVjdHVyZSBpcyB2YWxpZCIsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57U3VjY2Vzc30sCiAgICAgICAgJFRlc3QtPntTdWNjZXNzUmVxdWVzdH0sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgc3VjY2Vzc2Z1bCByZXN1bHQiLAogICAgKTsKCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIHN1Y2NlZWQKICAgIGlmICggJFRlc3QtPntTdWNjZXNzQ3JlYXRlfSApIHsKCiAgICAgICAgIyBsb2NhbCByZXN1bHRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgTnVtYmVyIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfSwKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yIGlzIHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgICMgcmVxdWVzdGVyIHJlc3VsdHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IENvbmZpZ0l0ZW1JRCB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntOdW1iZXJ9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgTnVtYmVyIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgRXJyb3IgaXMgdW5kZWZpbmVkLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIENvbmZpZ0l0ZW0gZW50cnkgKGZyb20gbG9jYWwgcmVzdWx0KQogICAgICAgIG15ICRMb2NhbFZlcnNpb25EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkTG9jYWxWZXJzaW9uRGF0YSksCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gY3JlYXRlZCBsb2NhbCB2ZXJzaW9uIHN0cmN0dXJlIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgaXRlbSBlbnRyeSAoZnJvbSByZXF1ZXN0ZXIgcmVzdWx0KQogICAgICAgIG15ICRSZXF1ZXN0ZXJWZXJzaW9uRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCRSZXF1ZXN0ZXJWZXJzaW9uRGF0YSksCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gY3JlYXRlZCByZXF1ZXN0ZXIgY29uZmlnIGl0ZW0gc3RyY3R1cmUgd2l0aCBUcnVlLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBjb25maWcgaXRlbSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIHRlc3QKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoTnVtYmVyIENsYXNzIE5hbWUgSW5jaVN0YXRlIERlcGxTdGF0ZSBEZXBsU3RhdGVUeXBlKSkgewogICAgICAgICAgICBpZiAoICRUZXN0LT57UmVxdWVzdERhdGF9LT57Q29uZmlnSXRlbX0tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkTG9jYWxWZXJzaW9uRGF0YS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57Q29uZmlnSXRlbX0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIENvbmZpZ0l0ZW0tPiRBdHRyaWJ1dGUiIC4gIiBtYXRjaCB0ZXN0IGRlZmluaXRpb24uIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIFhNTCBkYXRhIHRvIGEgY29tcGFyYWJsZSBmb3JtYXQKICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRMb2NhbFZlcnNpb25EYXRhLT57WE1MRGVmaW5pdGlvbn07CgogICAgICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgcmVzdWx0CiAgICAgICAgbXkgJENsb25lZFhNTERhdGEgPSBTdG9yYWJsZTo6ZGNsb25lKCAkTG9jYWxWZXJzaW9uRGF0YS0+e1hNTERhdGF9ICk7CgogICAgICAgIG15ICRGb3JtYXRlZFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgIFhNTERhdGEgPT4gJENsb25lZFhNTERhdGEtPlsxXS0+e1ZlcnNpb259LAogICAgICAgICk7CgogICAgICAgIG15ICRSZXBsYWNlZFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPkludmVydFJlcGxhY2VYTUxEYXRhKAogICAgICAgICAgICBYTUxEYXRhICAgID0+ICRGb3JtYXRlZFhNTERhdGEsCiAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgIyBjb21wYXJlIFhNTCBkYXRhCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkUmVwbGFjZWRYTUxEYXRhLAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57Q0lYTUxEYXRhfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBDb25maWdJdGVtLT5DSVhNTERhdGEgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhdHRhY2htZW50cwogICAgICAgIG15IEBBdHRhY2htZW50TGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBBdHRhY2htZW50czsKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkRmlsZU5hbWUgKEBBdHRhY2htZW50TGlzdCkgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRGaWxlTmFtZTsKCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVOYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuZXh0IGlmIG5vdCBhdHRhY2htZW50CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnQpOwoKICAgICAgICAgICAgIyBjb252ZXJ0IGNvbnRlbnQgdG8gYmFzZTY0CiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCAkQXR0YWNobWVudC0+e0NvbnRlbnR9LCAnJyApOwoKICAgICAgICAgICAgIyBkZWxldGUgbm90IG5lZWRlZCBhdHRpYnV0ZXMKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFByZWZlcmVuY2VzIEZpbGVzaXplIFR5cGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEF0dGFjaG1lbnQtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQoKICAgICAgICBteSBAUmVxdWVzdGVkQXR0YWNobWVudHM7CiAgICAgICAgaWYgKCByZWYgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntBdHRhY2htZW50fSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlcXVlc3RlZEF0dGFjaG1lbnRzLCAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBAUmVxdWVzdGVkQXR0YWNobWVudHMgPSBAeyAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH0gfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBBdHRhY2htZW50cywKICAgICAgICAgICAgXEBSZXF1ZXN0ZWRBdHRhY2htZW50cywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBDb25maWdJdGVtLT5BdHRhY2htZW50IG1hdGNoIHRlc3QgZGVmaW5pdGlvbi4iLAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIGF0dHJpYnV0ZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBsb2NhbCBhbmQgcmVxdWVzdGVyIHJlc3BvbnNlcwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgKICAgICAgICAgICAgcXcoQ29uZmlnSXRlbUlEIE51bWJlciBDcmVhdGVUaW1lIFZlcnNpb25JRCBMYXN0VmVyc2lvbklEKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgJExvY2FsVmVyc2lvbkRhdGEtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgZGVsZXRlICRSZXF1ZXN0ZXJWZXJzaW9uRGF0YS0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkTG9jYWxWZXJzaW9uRGF0YSwKICAgICAgICAgICAgJFJlcXVlc3RlclZlcnNpb25EYXRhLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIGNvbmZpZyBpdGVtIHJlc3VsdCBtYXRjaGVkIHdpdGggcmVtb3RlIHJlc3VsdC4iLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRoZSBjb25maWcgaXRlbXMKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1EZWxldGUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtRGVsZXRlLAogICAgICAgICAgICAgICAgIkNvbmZpZ0l0ZW1EZWxldGUoKSBzdWNjZXNzZnVsIGZvciBDb25maWdJdGVtIElEICRDb25maWdJdGVtSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIGZhaWwKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgTnVtYmVyIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkRGF0YX0tPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yQ29kZSBtYXRjaGVkIHdpdGggZXhwZWN0ZWQgbG9jYWwgY2FsbCByZXN1bHQuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSB3aXRoIHRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAnJywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb3JNZXNzYWdlIGlzIG5vdCBlbXB0eS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0KICAgICAgICAgICAgICAgIC4gJzogJwogICAgICAgICAgICAgICAgLiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSAob3V0c2lkZSBEYXRhIGhhc2gpIG1hdGNoZWQgd2l0aCBjb25jYXRlbmF0aW9uIgogICAgICAgICAgICAgICAgLiAiIG9mIEVycm9yQ29kZSBhbmQgRXJyb3JNZXNzYWdlIHdpdGhpbiBEYXRhIGhhc2guIiwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBFcnJvck1lc3NhZ2UgcGFyYW1ldGVyIGZyb20gZGlyZWN0IGNhbGwKICAgICAgICAjIHJlc3VsdCB0byBiZSBjb25zaXN0ZW50IHdpdGggU09BUCBjYWxsIHJlc3VsdAogICAgICAgIGlmICggJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApIHsKICAgICAgICAgICAgZGVsZXRlICRMb2NhbFJlc3VsdC0+e0Vycm9yTWVzc2FnZX07CiAgICAgICAgfQoKICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb01lc3NhZ2UgKG91dHNpc2UgRGF0YSBoYXNoKSBnb3QgcmVtb3ZlZCB0byBjb21wYXJlIgogICAgICAgICAgICAgICAgLiAiIGxvY2FsIGFuZCByZW1vdGUgdGVzdHMuIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdCwKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgbWF0Y2hlZCB3aXRoIHJlbW90ZSByZXN1bHQuIiwKICAgICAgICApOwogICAgfQp9CgojIGNsZWFuIHVwIHdlYnNlcnZpY2UKbXkgJFdlYnNlcnZpY2VEZWxldGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZURlbGV0ZSgKICAgIElEICAgICA9PiAkV2Vic2VydmljZUlELAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VEZWxldGUsCiAgICAiRGVsZXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQiLAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcjsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlOwp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1HZXQ7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbURlbGV0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBzZXQgVXNlcklEIHRvIHJvb3QKJFNlbGYtPntVc2VySUR9ID0gMTsKCiMgaGVscGVyIG9iamVjdAojIHNraXAgU1NMIGNlcnRpY2lhdGUgdmVyaWZpY2F0aW9uCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVTeXN0ZW1Db25maWd1cmF0aW9uID0+IDEsCiAgICAgICAgU2tpcFNTTFZlcmlmeSAgICAgICAgICAgICAgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKCm15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKIyBjaGVjayBpZiBTU0wgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIGRpc2FibGVkCiRTZWxmLT5JcygKICAgICRFTlZ7UEVSTF9MV1BfU1NMX1ZFUklGWV9IT1NUTkFNRX0sCiAgICAwLAogICAgJ0Rpc2FibGVkIFNTTCBjZXJ0aXRpY2F0ZXMgdmVyaWZpY2F0aW9uIGluIGVudmlyb25tZW50JywKKTsKCiMgY3JlYXRlIENvbmZpZ0l0ZW0gb2JqZWN0Cm15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgpteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBjcmVhdGUgd2Vic2VydmljZSBvYmplY3QKbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwokU2VsZi0+SXMoCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgcmVmICRXZWJzZXJ2aWNlT2JqZWN0LAogICAgIkNyZWF0ZSB3ZWJzZXJ2aWNlIG9iamVjdCIsCik7CgojIHNldCB3ZWJzZXJ2aWNlIG5hbWUKbXkgJFdlYnNlcnZpY2VOYW1lID0gJy1UZXN0LScgLiAkUmFuZG9tSUQ7CgpteSAkV2Vic2VydmljZUlEID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VBZGQoCiAgICBOYW1lICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgQ29uZmlnID0+IHsKICAgICAgICBEZWJ1Z2dlciA9PiB7CiAgICAgICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgfSwKICAgICAgICBQcm92aWRlciA9PiB7CiAgICAgICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRXZWJzZXJ2aWNlSUQsCiAgICAiQWRkZWQgV2Vic2VydmljZSIsCik7CgojIGdldCByZW1vdGUgaG9zdCB3aXRoIHNvbWUgcHJlY2F1dGlvbnMgZm9yIGNlcnRhaW4gdW5pdCB0ZXN0IHN5c3RlbXMKbXkgJEhvc3Q7Cm15ICRGUUROID0gJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJyk7CgojIHRyeSB0byByZXNvbHZlIGZxZG4gaG9zdAppZiAoICRGUUROIG5lICd5b3VyaG9zdC5leGFtcGxlLmNvbScgJiYgZ2V0aG9zdGJ5bmFtZSgkRlFETikgKSB7CiAgICAkSG9zdCA9ICRGUUROOwp9CgojIHRyeSB0byByZXNvbHZlIGxvY2FsaG9zdCBpbnN0ZWFkCmlmICggISRIb3N0ICYmIGdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpICkgewogICAgJEhvc3QgPSAnbG9jYWxob3N0JzsKfQoKIyB1c2UgaGFyZGNvZGVkIGxvY2FsaG9zdCBpcCBhZGRyZXNzCmlmICggISRIb3N0ICkgewogICAgJEhvc3QgPSAnMTI3LjAuMC4xJzsKfQoKIyBwcmVwYXJlIHdlYnNlcnZpY2UgY29uZmlnCm15ICRSZW1vdGVTeXN0ZW0gPQogICAgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpCiAgICAuICc6Ly8nCiAgICAuICRIb3N0CiAgICAuICcvJwogICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJykKICAgIC4gJy9ucGgtZ2VuZXJpY2ludGVyZmFjZS5wbC9XZWJzZXJ2aWNlSUQvJwogICAgLiAkV2Vic2VydmljZUlEOwoKbXkgJFdlYnNlcnZpY2VDb25maWcgPSB7CgogICAgIyAgICBOYW1lID0+ICcnLAogICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAnVGVzdCBmb3IgQ29uZmlnSXRlbSBDb25uZWN0b3IgdXNpbmcgU09BUCB0cmFuc3BvcnQgYmFja2VuZC4nLAogICAgRGVidWdnZXIgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBQcm92aWRlciA9PiB7CiAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgVHlwZSAgID0+ICdIVFRQOjpTT0FQJywKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMF8wMDBfMDAwLAogICAgICAgICAgICAgICAgTmFtZVNwYWNlID0+ICdodHRwOi8vb3Rycy5vcmcvU29hcFRlc3RJbnRlcmZhY2UvJywKICAgICAgICAgICAgICAgIEVuZHBvaW50ICA9PiAkUmVtb3RlU3lzdGVtLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbURlbGV0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDb25maWdJdGVtOjpDb25maWdJdGVtRGVsZXRlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDb25maWdJdGVtOjpDb25maWdJdGVtR2V0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZXNzaW9uOjpTZXNzaW9uQ3JlYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFJlcXVlc3RlciA9PiB7CiAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgVHlwZSAgID0+ICdIVFRQOjpTT0FQJywKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmNvZGluZyAgPT4gJ1VURi04JywKICAgICAgICAgICAgICAgIEVuZHBvaW50ICA9PiAkUmVtb3RlU3lzdGVtLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgSW52b2tlciA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1EZWxldGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlc3Npb25DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCn07CgojIHVwZGF0ZSB3ZWJzZXJ2aWNlIHdpdGggcmVhbCBjb25maWcKbXkgJFdlYnNlcnZpY2VVcGRhdGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZVVwZGF0ZSgKICAgIElEICAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIE5hbWUgICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgQ29uZmlnICA9PiAkV2Vic2VydmljZUNvbmZpZywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZVVwZGF0ZSwKICAgICJVcGRhdGVkIFdlYnNlcnZpY2UgJFdlYnNlcnZpY2VJRCAtICRXZWJzZXJ2aWNlTmFtZSIsCik7CgojIGRlYnVnZ2VyIG9iamVjdApteSAkRGVidWdnZXJPYmplY3QgPSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyLT5uZXcoCiAgICBEZWJ1Z2dlckNvbmZpZyA9PiB7CiAgICAgICAgRGVidWdUaHJlc2hvbGQgPT4gJ2RlYnVnJywKICAgICAgICBUZXN0TW9kZSAgICAgICA9PiAxLAogICAgfSwKICAgIFdlYnNlcnZpY2VJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBDb21tdW5pY2F0aW9uVHlwZSA9PiAnUHJvdmlkZXInLAopOwokU2VsZi0+SXMoCiAgICByZWYgJERlYnVnZ2VyT2JqZWN0LAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXInLAogICAgJ0RlYnVnZ2VyT2JqZWN0IGluc3RhbmNpYXRlIGNvcnJlY3RseScsCik7CgojIEdldCBTZXNzaW9uSUQKIyBjcmVhdGUgcmVxdWVzdGVyIG9iamVjdApteSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyk7CiRTZWxmLT5JcygKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICByZWYgJFJlcXVlc3RlclNlc3Npb25PYmplY3QsCiAgICAiU2Vzc2lvbklEIC0gQ3JlYXRlIHJlcXVlc3RlciBvYmplY3QiLAopOwoKIyBjcmVhdGUgYSBuZXcgdXNlciBmb3IgY3VycmVudCB0ZXN0Cm15ICRVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLWNvbmZpZ2l0ZW0nIF0sCik7CgpteSAkUGFzc3dvcmQgPSAkVXNlckxvZ2luOwoKIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2Vic2VydmljZQpteSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdCA9ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LT5SdW4oCiAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgIEludm9rZXIgICAgICA9PiAnU2Vzc2lvbkNyZWF0ZScsCiAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQsCiAgICB9LAopOwoKbXkgJE5ld1Nlc3Npb25JRCA9ICRSZXF1ZXN0ZXJTZXNzaW9uUmVzdWx0LT57RGF0YX0tPntTZXNzaW9uSUR9OwoKI0NvbmZpZ0l0ZW10cyBjb250YWluZXIgKHVzZWZ1bGwgZm9yIGxvb2t1cCBjb21wYXJlKQpteSAlQWRkZWRDb25maWdJdGVtczsKbXkgQEFkZGVkQ29uZmlnSXRlbUlEczsKCiMgQ29uZmlnSXRlbSBzZXR0aW5ncwpteSBAQ29uZmlnSXRlbXMgPSAoCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktMS0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0xvMCcsCiAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktMi0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUmVwYWlyJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ1dhcm5pbmcnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIFZlbmRvciAgICAgICAgICA9PiAnTGVub3ZvJywKICAgICAgICAgICAgTW9kZWwgICAgICAgICAgID0+ICdUaGlua3BhZCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnVGhpbmtwYWQgWDMwMCcsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnRGVza3RvcCcsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgICAgPT4gJ2FiYzEyMzQ1YWJjJywKICAgICAgICAgICAgT3BlcmF0aW5nU3lzdGVtID0+ICdDZW50T1MgNi4wJywKICAgICAgICAgICAgQ1BVICAgICAgICAgICAgID0+ICdJbnRlbCBDb3JlIGkzJywKICAgICAgICAgICAgUmFtICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAyMDAwLAogICAgICAgICAgICBdLAogICAgICAgICAgICBIYXJkRGlzayA9PiB7CiAgICAgICAgICAgICAgICBIYXJkRGlzayA9PiAnL2RldicsCiAgICAgICAgICAgICAgICBDYXBhY2l0eSA9PiA1MDAwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRlFETiA9PiAnaG90cy5leGFtcGxlLmNvbScsCiAgICAgICAgICAgIE5JQyAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3MgID0+ICcxOTIuMTY4LjMwLjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgIElQQWRkcmVzcyAgPT4gJzIwMC4zNC41Ni43OCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBHcmFwaGljQWRhcHRlciA9PiAnQVRJIFJhZGVvbiAzMDAnLAogICAgICAgICAgICBJbnN0YWxsRGF0ZSAgICA9PiAnMTk3Ny0xMi0xMicsCiAgICAgICAgICAgIE5vdGUgICAgICAgICAgID0+ICdUaGlzIGlzIGEgRGVtbyBDSScsCiAgICAgICAgfSwKICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdNeSBUZXh0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhiaUJsYm1OdlpHVmtJSFJsZUhRPScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xJywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdNeSBUZXh0Mi50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnSGFyZHdhcmUnLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTMtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIFZlbmRvciAgICAgICA9PiAnSGFyZHdhcmUgVmVuZG9yJywKICAgICAgICAgICAgTW9kZWwgICAgICAgID0+ICdIYXJkd2FyZSBNb2RlbCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICA9PiAnVGVzaXRuZyBIYW5yZHdhcmUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ0NhbWVyYScsCiAgICAgICAgICAgIE93bmVyICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgPT4gJzEyM2FtYzQ1NicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdMb2NhdGlvbicsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktNC0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgSW5jaVN0YXRlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0J1aWxkaW5nJywKICAgICAgICAgICAgUGhvbmUxICAgPT4gJzEyMycsCiAgICAgICAgICAgIFBob25lMiAgID0+ICc0NTYnLAogICAgICAgICAgICBGYXggICAgICA9PiAnNzg5JywKICAgICAgICAgICAgJ0UtTWFpbCcgPT4gJ3NvZW1vbmVAZXhhbXBsZS5jb20nLAogICAgICAgICAgICBBZGRyZXNzICA9PiAnU29tZSBhZGRyZXNzJywKICAgICAgICAgICAgTm90ZSAgICAgPT4gJ1RoaXMgaXMgYSB0ZXN0IGxvY2F0aW9uJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBDbGFzcyAgICAgPT4gJ05ldHdvcmsnLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTUtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICdOZXR3b3JrIENJIGZvciB0ZXN0aW5nJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ0xBTicsCiAgICAgICAgICAgIE5ldHdvcmtBZGRyZXNzID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOZXR3b3JrQWRkcmVzcyA9PiAnMTkyLjEuMS4xJywKICAgICAgICAgICAgICAgICAgICBTdWJuZXRNYXNrICAgICA9PiAnMjU1LjI1NS4yNTUuMCcsCiAgICAgICAgICAgICAgICAgICAgR2F0ZXdheSAgICAgICAgPT4gJzE5Mi4xLjEuMjU0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmV0d29ya0FkZHJlc3MgPT4gJzE5Mi4xLjUwLjEnLAogICAgICAgICAgICAgICAgICAgIFN1Ym5ldE1hc2sgICAgID0+ICcyNTUuMjU1LjI1NS4wJywKICAgICAgICAgICAgICAgICAgICBHYXRld2F5ICAgICAgICA9PiAnMTkyLjEuNTAuMjU0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE5vdGUgPT4gJ1RoaXMgaXMgYSB0ZXN0IENJJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBDbGFzcyAgICAgPT4gJ1NvZnR3YXJlJywKICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSS02LScgLiAkUmFuZG9tSUQsCiAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBWZW5kb3IgICAgICAgPT4gJ1NvbWUgc29mdHdhcmUgdmVuZG9yJywKICAgICAgICAgICAgVmVyc2lvbiAgICAgID0+ICcxLjEuMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICA9PiAnU29tZSBzb2Z0d2FyZSBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnQWRtaW4gVG9vbCcsCiAgICAgICAgICAgIE93bmVyICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgPT4gJzEyM0FCQzQ1NicsCiAgICAgICAgICAgIExpY2VuY2VUeXBlICA9PiAnT3BlbiBTb3VyY2UnLAogICAgICAgICAgICBMaWNlbmNlS2V5ICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgICAgID0+ICcxMjM0JywKICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgRXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBMaWNlbmNlS2V5ICAgICA9PiAnNDU2NycsCiAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIEV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTI1JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE1lZGlhID0+ICdEb3dubG9hZCcsCiAgICAgICAgICAgIE5vdGUgID0+ICdUaGlzIGlzIGEgdGVzdCBDSScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdTb2Z0d2FyZScsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktNy0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgSW5jaVN0YXRlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgVmVuZG9yICAgICAgID0+ICdTb21lIHNvZnR3YXJlIHZlbmRvcicsCiAgICAgICAgICAgIFZlcnNpb24gICAgICA9PiAnMS4xLjEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJ1NvbWUgc29mdHdhcmUgZGVzY3JpcHRpb24nLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ0FkbWluIFRvb2wnLAogICAgICAgICAgICBPd25lciAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0+ICcxMjNBQkM0NTYnLAogICAgICAgICAgICBMaWNlbmNlVHlwZSAgPT4gJ09wZW4gU291cmNlJywKICAgICAgICAgICAgTGljZW5jZUtleSAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBMaWNlbmNlS2V5ICAgICA9PiAnMTIzNCcsCiAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgIEV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTGljZW5jZUtleSAgICAgPT4gJzQ1NjcnLAogICAgICAgICAgICAgICAgICAgIFF1YW50aXR5ICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0yNScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBNZWRpYSA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICBOb3RlICA9PiAnVGhpcyBpcyBhIHRlc3QgQ0knLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnU29mdHdhcmUnLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTgtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIFZlbmRvciAgICAgICA9PiAnU29tZSBzb2Z0d2FyZSB2ZW5kb3InLAogICAgICAgICAgICBWZXJzaW9uICAgICAgPT4gJzEuMS4xJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gID0+ICdTb21lIHNvZnR3YXJlIGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdBZG1pbiBUb29sJywKICAgICAgICAgICAgT3duZXIgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFNlcmlhbE51bWJlciA9PiAnMTIzQUJDNDU2JywKICAgICAgICAgICAgTGljZW5jZVR5cGUgID0+ICdPcGVuIFNvdXJjZScsCiAgICAgICAgICAgIExpY2VuY2VLZXkgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTGljZW5jZUtleSAgICAgPT4gJzEyMzQnLAogICAgICAgICAgICAgICAgICAgIFF1YW50aXR5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0xMicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgICAgID0+ICc0NTY3JywKICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgRXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMjUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTWVkaWEgPT4gJ0Rvd25sb2FkJywKICAgICAgICAgICAgTm90ZSAgPT4gJ1RoaXMgaXMgYSB0ZXN0IENJJywKICAgICAgICB9LAogICAgfSwKKTsKCm15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwpteSAkQ2xhc3NMaXN0ICAgICAgICAgICAgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKKTsKbXkgJVJldmVyc2VDbGFzc0xpc3QgPSByZXZlcnNlICV7JENsYXNzTGlzdH07Cm15ICRJbmNpU3RhdGVMaXN0ICAgID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKKTsKbXkgJVJldmVyc2VJbmNpU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKbXkgJERlcGxTdGF0ZUxpc3QgICAgICAgID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlUmV2ZXJzZURlcGxTdGF0ZUxpc3QgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9Owpmb3IgbXkgJENvbmZpZ0l0ZW0gKEBDb25maWdJdGVtcykgewoKICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgbXkgJENsb25lZENvbmZpZ0l0ZW0gPSBTdG9yYWJsZTo6ZGNsb25lKCRDb25maWdJdGVtKTsKCiAgICAjIGNyZWF0ZSBuZXcgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICBDbGFzc0lEID0+ICRSZXZlcnNlQ2xhc3NMaXN0eyAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVja3MKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkFkZGVkIENvbmZpZ0l0ZW0gJENvbmZpZ0l0ZW1JRCIsCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJFJldmVyc2VDbGFzc0xpc3R7ICRDb25maWdJdGVtLT57Q2xhc3N9IH0sCiAgICApOwoKICAgIG15ICRMb2NhbE9iamVjdCA9IEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlLT5uZXcoCiAgICAgICAgRGVidWdnZXJPYmplY3QgPT4gJERlYnVnZ2VyT2JqZWN0LAogICAgICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICApOwoKICAgIG15ICRSZXBsYWNlZFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPlJlcGxhY2VYTUxEYXRhKAogICAgICAgIFhNTERhdGEgICAgPT4gJENvbmZpZ0l0ZW0tPntDSVhNTERhdGF9LAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICApOwoKICAgIG15ICRYTUxEYXRhID0gJExvY2FsT2JqZWN0LT5Gb3JtYXRYTUxEYXRhKAogICAgICAgIFhNTERhdGEgPT4gJFJlcGxhY2VkWE1MRGF0YSwKICAgICk7CgogICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbS0+e05hbWV9LAogICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkUmV2ZXJzZURlcGxTdGF0ZUxpc3R7ICRDb25maWdJdGVtLT57RGVwbFN0YXRlfSB9LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkUmV2ZXJzZUluY2lTdGF0ZUxpc3R7ICRDb25maWdJdGVtLT57SW5jaVN0YXRlfSB9LAogICAgICAgIFhNTERhdGEgICAgICA9PiAkWE1MRGF0YSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVja3MKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkFkZGVkIENvbmZpZ0l0ZW0gJENvbmZpZ0l0ZW1JRCIsCiAgICApOwoKICAgIG15ICRWZXJzaW9uSW5mbyA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICAkU2VsZi0+SXNOb3REZWVwbHkoCiAgICAgICAgJFZlcnNpb25JbmZvLAogICAgICAgIHt9LAogICAgICAgICJBZGRlZCBDb25maWdJdGVtICRDb25maWdJdGVtSUQgLSBWZXJzaW9uIGlzIG5vdCBhbiBlbXB0eSBoYXNoIiwKICAgICk7CgogICAgIyByZW1lbWJlciB0aGUgY29uZmlnIGl0ZW0KICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CiAgICAgICAgJEFkZGVkQ29uZmlnSXRlbXN7JENvbmZpZ0l0ZW1JRH0gPSAkQ2xvbmVkQ29uZmlnSXRlbTsKICAgICAgICBwdXNoIEBBZGRlZENvbmZpZ0l0ZW1JRHMsICRDb25maWdJdGVtSUQ7CiAgICB9Cn0KCiMgYWN0dWFsIHRlc3RzIGZvciBDb25maWdJdGVtRGVsZXRlIG9wZXJhdGlvbgpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0VtcHR5IFJlcXVlc3QnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0RlbGV0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7fSwKICAgICAgICBFeHBlY3RlZERhdGEgICA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbURlbGV0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbURlbGV0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBDb25maWdJdGVtSUQgZm9ybWF0JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NEZWxldGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gewogICAgICAgICAgICAgICAgVGVzdDEgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbURlbGV0ZS5Xcm9uZ1N0cnVjdHVyZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgQ29uZmlnSXRlbUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NEZWxldGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJ05vdEV4aXN0ZW50JyAuICRSYW5kb21JRCwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbURlbGV0ZS5BY2Nlc3NEZW5pZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtRGVsZXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIENvbmZpZ0l0ZW1JRCBBcnJheScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IFsgJ05vdEV4aXN0ZW50JyAuICRSYW5kb21JRCBdLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtRGVsZXRlLkFjY2Vzc0RlbmllZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgMScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzBdIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgQ29uZmlnSXRlbUlEIDEgKHdhcyBhbHJlYWR5IGRlbGV0ZWQgYmVmb3JlKScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1EZWxldGUuQWNjZXNzRGVuaWVkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbURlbGV0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdDb3JyZWN0IENvbmZpZ0l0ZW1JRCAyJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NEZWxldGUgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEFkZGVkQ29uZmlnSXRlbUlEc1sxXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiBbICRBZGRlZENvbmZpZ0l0ZW1JRHNbMV0gXSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbURlbGV0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdDb3JyZWN0IENvbmZpZ0l0ZW1JRCAzJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NEZWxldGUgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEFkZGVkQ29uZmlnSXRlbUlEc1syXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7fSwKICAgICAgICBPcGVyYXRpb24gICAgPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgNCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbM10sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzRdIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgNScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbNF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzRdIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgNicsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzRGVsZXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbNV0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzVdIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgNy04JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NEZWxldGUgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWwogICAgICAgICAgICAgICAgJEFkZGVkQ29uZmlnSXRlbUlEc1s2XSwKICAgICAgICAgICAgICAgICRBZGRlZENvbmZpZ0l0ZW1JRHNbN10sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWwogICAgICAgICAgICAgICAgJEFkZGVkQ29uZmlnSXRlbUlEc1s2XSwKICAgICAgICAgICAgICAgICRBZGRlZENvbmZpZ0l0ZW1JRHNbN10sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgbG9jYWwgb2JqZWN0CiAgICBteSAkTG9jYWxPYmplY3QgPSAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OiRUZXN0LT57T3BlcmF0aW9ufSItPm5ldygKICAgICAgICBEZWJ1Z2dlck9iamVjdCA9PiAkRGVidWdnZXJPYmplY3QsCiAgICAgICAgV2Vic2VydmljZUlEICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6JFRlc3QtPntPcGVyYXRpb259IiwKICAgICAgICByZWYgJExvY2FsT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIGxvY2FsIG9iamVjdCIsCiAgICApOwoKICAgICMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgJFNlbGYtPklzKAogICAgICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICAgICAgcmVmICRSZXF1ZXN0ZXJPYmplY3QsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCiAgICApOwoKICAgICMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKICAgIG15ICRSZXF1ZXN0ZXJSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgSW52b2tlciAgICAgID0+ICRUZXN0LT57T3BlcmF0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgJXsgJFRlc3QtPntSZXF1ZXN0RGF0YX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgICdIQVNIJywKICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIiwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAkVGVzdC0+e1N1Y2Nlc3NSZXF1ZXN0fSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciBzdWNjZXNzZnVsIHJlc3VsdCIsCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzRGVsZXRlfSApIHsKCiAgICAgICAgIyByZXF1ZXN0ZXIgcmVzdWx0cwogICAgICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBDb25maWdJdGVtSUQgaXMgbm90IHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgIG15ICRFeHBlY3RlZFJlc3VsdFR5cGUgPSByZWYgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntDb25maWdJdGVtSUR9OwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHJlZiAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAkRXhwZWN0ZWRSZXN1bHRUeXBlLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgQ29uZmlnSXRlbUlEIHJlZmVyZW5jZS4iLAogICAgICAgICk7CgogICAgICAgIGlmICggJEV4cGVjdGVkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSApLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IENvbmZpZ0l0ZW1JRCByZWZlcmVuY2UgaXMgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGVzdHMgc3VwcG9zZWQgdG8gZmFpbAogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LT57RXJyb3JDb2RlfSwKICAgICAgICAgICAgJFRlc3QtPntFeHBlY3RlZERhdGF9LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgRXJyb3JDb2RlIG1hdGNoZWQgd2l0aCBleHBlY3RlZCBjYWxsIHJlc3VsdC4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBFcnJvck1lc3NhZ2Ugd2l0aCB0cnVlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgRXJyb3JNZXNzYWdlIGlzIG5vdCBlbXB0eS4iLAogICAgICAgICk7CiAgICB9Cn0gICAgI2VuZCBsb29wCgojIGNsZWFuIHVwCgojIGNsZWFuIHVwIHdlYnNlcnZpY2UKbXkgJFdlYnNlcnZpY2VEZWxldGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZURlbGV0ZSgKICAgIElEICAgICA9PiAkV2Vic2VydmljZUlELAogICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZURlbGV0ZSwKICAgICJEZWxldGVkIFdlYnNlcnZpY2UgJFdlYnNlcnZpY2VJRCIsCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcjsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlOwp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1HZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgc2V0IFVzZXJJRCB0byByb290CiRTZWxmLT57VXNlcklEfSA9IDE7CgojIGhlbHBlciBvYmplY3QKIyBza2lwIFNTTCBjZXJ0aWNpYXRlIHZlcmlmaWNhdGlvbgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlU3lzdGVtQ29uZmlndXJhdGlvbiA9PiAxLAogICAgICAgIFNraXBTU0xWZXJpZnkgICAgICAgICAgICAgID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7CgpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgY2hlY2sgaWYgU1NMIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZAokU2VsZi0+SXMoCiAgICAkRU5We1BFUkxfTFdQX1NTTF9WRVJJRllfSE9TVE5BTUV9LAogICAgMCwKICAgICdEaXNhYmxlZCBTU0wgY2VydGl0aWNhdGVzIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCcsCik7CgojIGNyZWF0ZSBDb25maWdJdGVtIG9iamVjdApteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiMgY3JlYXRlIHdlYnNlcnZpY2Ugb2JqZWN0Cm15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKJFNlbGYtPklzKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJywKICAgIHJlZiAkV2Vic2VydmljZU9iamVjdCwKICAgICJDcmVhdGUgd2Vic2VydmljZSBvYmplY3QiLAopOwoKIyBzZXQgd2Vic2VydmljZSBuYW1lCm15ICRXZWJzZXJ2aWNlTmFtZSA9ICctVGVzdC0nIC4gJFJhbmRvbUlEOwoKbXkgJFdlYnNlcnZpY2VJRCA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgTmFtZSAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgRGVidWdnZXIgPT4gewogICAgICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIH0sCiAgICAgICAgUHJvdmlkZXIgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZUlELAogICAgIkFkZGVkIFdlYnNlcnZpY2UiLAopOwoKIyBnZXQgcmVtb3RlIGhvc3Qgd2l0aCBzb21lIHByZWNhdXRpb25zIGZvciBjZXJ0YWluIHVuaXQgdGVzdCBzeXN0ZW1zCm15ICRIb3N0OwpteSAkRlFETiA9ICRDb25maWdPYmplY3QtPkdldCgnRlFETicpOwoKIyB0cnkgdG8gcmVzb2x2ZSBmcWRuIGhvc3QKaWYgKCAkRlFETiBuZSAneW91cmhvc3QuZXhhbXBsZS5jb20nICYmIGdldGhvc3RieW5hbWUoJEZRRE4pICkgewogICAgJEhvc3QgPSAkRlFETjsKfQoKIyB0cnkgdG8gcmVzb2x2ZSBsb2NhbGhvc3QgaW5zdGVhZAppZiAoICEkSG9zdCAmJiBnZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSApIHsKICAgICRIb3N0ID0gJ2xvY2FsaG9zdCc7Cn0KCiMgdXNlIGhhcmRjb2RlZCBsb2NhbGhvc3QgaXAgYWRkcmVzcwppZiAoICEkSG9zdCApIHsKICAgICRIb3N0ID0gJzEyNy4wLjAuMSc7Cn0KCiMgcHJlcGFyZSB3ZWJzZXJ2aWNlIGNvbmZpZwpteSAkUmVtb3RlU3lzdGVtID0KICAgICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKQogICAgLiAnOi8vJwogICAgLiAkSG9zdAogICAgLiAnLycKICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAuICcvbnBoLWdlbmVyaWNpbnRlcmZhY2UucGwvV2Vic2VydmljZUlELycKICAgIC4gJFdlYnNlcnZpY2VJRDsKCm15ICRXZWJzZXJ2aWNlQ29uZmlnID0gewoKICAgICMgICAgTmFtZSA9PiAnJywKICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgJ1Rlc3QgZm9yIENvbmZpZ0l0ZW0gQ29ubmVjdG9yIHVzaW5nIFNPQVAgdHJhbnNwb3J0IGJhY2tlbmQuJywKICAgIERlYnVnZ2VyID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgUHJvdmlkZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTBfMDAwXzAwMCwKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUdldCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlc3Npb25DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICBSZXF1ZXN0ZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5jb2RpbmcgID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEludm9rZXIgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAp9OwoKIyB1cGRhdGUgd2Vic2VydmljZSB3aXRoIHJlYWwgY29uZmlnCm15ICRXZWJzZXJ2aWNlVXBkYXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICBJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBOYW1lICAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyAgPT4gJFdlYnNlcnZpY2VDb25maWcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VVcGRhdGUsCiAgICAiVXBkYXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQgLSAkV2Vic2VydmljZU5hbWUiLAopOwoKIyBkZWJ1Z2dlciBvYmplY3QKbXkgJERlYnVnZ2VyT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlci0+bmV3KAogICAgRGVidWdnZXJDb25maWcgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBXZWJzZXJ2aWNlSUQgICAgICA9PiAkV2Vic2VydmljZUlELAogICAgQ29tbXVuaWNhdGlvblR5cGUgPT4gJ1Byb3ZpZGVyJywKKTsKJFNlbGYtPklzKAogICAgcmVmICREZWJ1Z2dlck9iamVjdCwKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyJywKICAgICdEZWJ1Z2dlck9iamVjdCBpbnN0YW5jaWF0ZSBjb3JyZWN0bHknLAopOwoKIyBHZXQgU2Vzc2lvbklECiMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKbXkgJFJlcXVlc3RlclNlc3Npb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwokU2VsZi0+SXMoCiAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInLAogICAgcmVmICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LAogICAgIlNlc3Npb25JRCAtIENyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0IiwKKTsKCiMgY3JlYXRlIGEgbmV3IHVzZXIgZm9yIGN1cnJlbnQgdGVzdApteSAkVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdFVzZXJDcmVhdGUoCiAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAnaXRzbS1jb25maWdpdGVtJyBdLAopOwoKbXkgJFBhc3N3b3JkID0gJFVzZXJMb2dpbjsKCiMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKbXkgJFJlcXVlc3RlclNlc3Npb25SZXN1bHQgPSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdC0+UnVuKAogICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBJbnZva2VyICAgICAgPT4gJ1Nlc3Npb25DcmVhdGUnLAogICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgfSwKKTsKCm15ICROZXdTZXNzaW9uSUQgPSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdC0+e0RhdGF9LT57U2Vzc2lvbklEfTsKCiNDb25maWdJdGVtdHMgY29udGFpbmVyICh1c2VmdWxsIGZvciBsb29rdXAgY29tcGFyZSkKbXkgJUFkZGVkQ29uZmlnSXRlbXM7Cm15IEBBZGRlZENvbmZpZ0l0ZW1JRHM7CgojIENvbmZpZ0l0ZW0gc2V0dGluZ3MKbXkgQENvbmZpZ0l0ZW1zID0gKAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTEtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIE5JQyA9PiB7CiAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdMbzAnLAogICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTItJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1JlcGFpcicsCiAgICAgICAgSW5jaVN0YXRlID0+ICdXYXJuaW5nJywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBWZW5kb3IgICAgICAgICAgPT4gJ0xlbm92bycsCiAgICAgICAgICAgIE1vZGVsICAgICAgICAgICA9PiAnVGhpbmtwYWQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ1RoaW5rcGFkIFgzMDAnLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJ0Rlc2t0b3AnLAogICAgICAgICAgICBPd25lciAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyICAgID0+ICdhYmMxMjM0NWFiYycsCiAgICAgICAgICAgIE9wZXJhdGluZ1N5c3RlbSA9PiAnQ2VudE9TIDYuMCcsCiAgICAgICAgICAgIENQVSAgICAgICAgICAgICA9PiAnSW50ZWwgQ29yZSBpMycsCiAgICAgICAgICAgIFJhbSAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICA0MDAwLAogICAgICAgICAgICAgICAgMjAwMCwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSGFyZERpc2sgPT4gewogICAgICAgICAgICAgICAgSGFyZERpc2sgPT4gJy9kZXYnLAogICAgICAgICAgICAgICAgQ2FwYWNpdHkgPT4gNTAwMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEZRRE4gPT4gJ2hvdHMuZXhhbXBsZS5jb20nLAogICAgICAgICAgICBOSUMgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzICA9PiAnMTkyLjE2OC4zMC4xJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMScsCiAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3MgID0+ICcyMDAuMzQuNTYuNzgnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgR3JhcGhpY0FkYXB0ZXIgPT4gJ0FUSSBSYWRlb24gMzAwJywKICAgICAgICAgICAgSW5zdGFsbERhdGUgICAgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICBOb3RlICAgICAgICAgICA9PiAnVGhpcyBpcyBhIERlbW8gQ0knLAogICAgICAgIH0sCiAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhiaUJsYm1OdlpHVmtJSFJsZUhRPScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnTXkgVGV4dC50eHQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoYmlCbGJtTnZaR1ZrSUhSbGVIUT0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMScsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnTXkgVGV4dDIudHh0JywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBDbGFzcyAgICAgPT4gJ0hhcmR3YXJlJywKICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSS0zLScgLiAkUmFuZG9tSUQsCiAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBWZW5kb3IgICAgICAgPT4gJ0hhcmR3YXJlIFZlbmRvcicsCiAgICAgICAgICAgIE1vZGVsICAgICAgICA9PiAnSGFyZHdhcmUgTW9kZWwnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJ1Rlc2l0bmcgSGFucmR3YXJlJywKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdDYW1lcmEnLAogICAgICAgICAgICBPd25lciAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0+ICcxMjNhbWM0NTYnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnTG9jYXRpb24nLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTQtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgID0+ICdCdWlsZGluZycsCiAgICAgICAgICAgIFBob25lMSAgID0+ICcxMjMnLAogICAgICAgICAgICBQaG9uZTIgICA9PiAnNDU2JywKICAgICAgICAgICAgRmF4ICAgICAgPT4gJzc4OScsCiAgICAgICAgICAgICdFLU1haWwnID0+ICdzb2Vtb25lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgQWRkcmVzcyAgPT4gJ1NvbWUgYWRkcmVzcycsCiAgICAgICAgICAgIE5vdGUgICAgID0+ICdUaGlzIGlzIGEgdGVzdCBsb2NhdGlvbicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdOZXR3b3JrJywKICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSS01LScgLiAkUmFuZG9tSUQsCiAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICA9PiAnTmV0d29yayBDSSBmb3IgdGVzdGluZycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdMQU4nLAogICAgICAgICAgICBOZXR3b3JrQWRkcmVzcyA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmV0d29ya0FkZHJlc3MgPT4gJzE5Mi4xLjEuMScsCiAgICAgICAgICAgICAgICAgICAgU3VibmV0TWFzayAgICAgPT4gJzI1NS4yNTUuMjU1LjAnLAogICAgICAgICAgICAgICAgICAgIEdhdGV3YXkgICAgICAgID0+ICcxOTIuMS4xLjI1NCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5ldHdvcmtBZGRyZXNzID0+ICcxOTIuMS41MC4xJywKICAgICAgICAgICAgICAgICAgICBTdWJuZXRNYXNrICAgICA9PiAnMjU1LjI1NS4yNTUuMCcsCiAgICAgICAgICAgICAgICAgICAgR2F0ZXdheSAgICAgICAgPT4gJzE5Mi4xLjUwLjI1NCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBOb3RlID0+ICdUaGlzIGlzIGEgdGVzdCBDSScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdTb2Z0d2FyZScsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktNi0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgSW5jaVN0YXRlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgVmVuZG9yICAgICAgID0+ICdTb21lIHNvZnR3YXJlIHZlbmRvcicsCiAgICAgICAgICAgIFZlcnNpb24gICAgICA9PiAnMS4xLjEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJ1NvbWUgc29mdHdhcmUgZGVzY3JpcHRpb24nLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ0FkbWluIFRvb2wnLAogICAgICAgICAgICBPd25lciAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0+ICcxMjNBQkM0NTYnLAogICAgICAgICAgICBMaWNlbmNlVHlwZSAgPT4gJ09wZW4gU291cmNlJywKICAgICAgICAgICAgTGljZW5jZUtleSAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBMaWNlbmNlS2V5ICAgICA9PiAnMTIzNCcsCiAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgIEV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTGljZW5jZUtleSAgICAgPT4gJzQ1NjcnLAogICAgICAgICAgICAgICAgICAgIFF1YW50aXR5ICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0yNScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBNZWRpYSA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICBOb3RlICA9PiAnVGhpcyBpcyBhIHRlc3QgQ0knLAogICAgICAgIH0sCiAgICB9LAopOwoKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDbGFzc0xpc3QgICAgICAgICAgICA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwpteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKbXkgJEluY2lTdGF0ZUxpc3QgICAgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwpteSAkRGVwbFN0YXRlTGlzdCAgICAgICAgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVSZXZlcnNlRGVwbFN0YXRlTGlzdCA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CmZvciBteSAkQ29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1zKSB7CgogICAgIyBtYWtlIGEgZGVlcCBjb3B5IHRvIGF2b2lkIGNoYW5naW5nIHRoZSBkZWZpbml0aW9uCiAgICBteSAkQ2xvbmVkQ29uZmlnSXRlbSA9IFN0b3JhYmxlOjpkY2xvbmUoJENvbmZpZ0l0ZW0pOwoKICAgICMgY3JlYXRlIG5ldyBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgIENsYXNzSUQgPT4gJFJldmVyc2VDbGFzc0xpc3R7ICRDb25maWdJdGVtLT57Q2xhc3N9IH0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAiQWRkZWQgQ29uZmlnSXRlbSAkQ29uZmlnSXRlbUlEIiwKICAgICk7CgogICAgbXkgJERlZmluaXRpb25EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkUmV2ZXJzZUNsYXNzTGlzdHsgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSwKICAgICk7CgogICAgbXkgJExvY2FsT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1DcmVhdGUtPm5ldygKICAgICAgICBEZWJ1Z2dlck9iamVjdCA9PiAkRGVidWdnZXJPYmplY3QsCiAgICAgICAgV2Vic2VydmljZUlEICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgICk7CgogICAgbXkgJFJlcGxhY2VkWE1MRGF0YSA9ICRMb2NhbE9iamVjdC0+UmVwbGFjZVhNTERhdGEoCiAgICAgICAgWE1MRGF0YSAgICA9PiAkQ29uZmlnSXRlbS0+e0NJWE1MRGF0YX0sCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICk7CgogICAgbXkgJFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPkZvcm1hdFhNTERhdGEoCiAgICAgICAgWE1MRGF0YSA9PiAkUmVwbGFjZWRYTUxEYXRhLAogICAgKTsKCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRSZXZlcnNlRGVwbFN0YXRlTGlzdHsgJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGV9IH0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRSZXZlcnNlSW5jaVN0YXRlTGlzdHsgJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGV9IH0sCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRYTUxEYXRhLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAiQWRkZWQgQ29uZmlnSXRlbSAkQ29uZmlnSXRlbUlEIiwKICAgICk7CgogICAgbXkgJFZlcnNpb25JbmZvID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgICRTZWxmLT5Jc05vdERlZXBseSgKICAgICAgICAkVmVyc2lvbkluZm8sCiAgICAgICAge30sCiAgICAgICAgIkFkZGVkIENvbmZpZ0l0ZW0gJENvbmZpZ0l0ZW1JRCAtIFZlcnNpb24gaXMgbm90IGFuIGVtcHR5IGhhc2giLAogICAgKTsKCiAgICAjIHJlbWVtYmVyIHRoZSBjb25maWcgaXRlbQogICAgaWYgKCRDb25maWdJdGVtSUQpIHsKICAgICAgICAkQWRkZWRDb25maWdJdGVtc3skQ29uZmlnSXRlbUlEfSA9ICRDbG9uZWRDb25maWdJdGVtOwogICAgICAgIHB1c2ggQEFkZGVkQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgIH0KfQoKIyBhY3R1YWwgdGVzdHMgZm9yIENvbmZpZ0l0ZW1HZXQgb3BlcmF0aW9uCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRW1wdHkgUmVxdWVzdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzR2V0ICAgICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHt9LAogICAgICAgIEV4cGVjdGVkRGF0YSAgID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtR2V0Lk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtR2V0JywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIENvbmZpZ0l0ZW1JRCBmb3JtYXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0dldCAgICAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0MSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtR2V0Lldyb25nU3RydWN0dXJlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbUdldCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBDb25maWdJdGVtSUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0dldCAgICAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAnTm90RXhpc3RlbnQnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtR2V0LkFjY2Vzc0RlbmllZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1HZXQnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgQ29uZmlnSXRlbUlEIEFycmF5JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NHZXQgICAgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gWyAnTm90RXhpc3RlbnQnIC4gJFJhbmRvbUlELCBdLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtR2V0LkFjY2Vzc0RlbmllZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1HZXQnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgMScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzR2V0ICAgICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4ge30sCiAgICAgICAgT3BlcmF0aW9uICAgID0+ICdDb25maWdJdGVtR2V0JywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NvcnJlY3QgQ29uZmlnSXRlbUlEIDInLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0dldCAgICAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQWRkZWRDb25maWdJdGVtSURzWzFdLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHt9LAogICAgICAgIE9wZXJhdGlvbiAgICA9PiAnQ29uZmlnSXRlbUdldCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdDb3JyZWN0IENvbmZpZ0l0ZW1JRCAzJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NHZXQgICAgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEFkZGVkQ29uZmlnSXRlbUlEc1syXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7fSwKICAgICAgICBPcGVyYXRpb24gICAgPT4gJ0NvbmZpZ0l0ZW1HZXQnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgNCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzR2V0ICAgICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBZGRlZENvbmZpZ0l0ZW1JRHNbM10sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4ge30sCiAgICAgICAgT3BlcmF0aW9uICAgID0+ICdDb25maWdJdGVtR2V0JywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NvcnJlY3QgQ29uZmlnSXRlbUlEIDUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0dldCAgICAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQWRkZWRDb25maWdJdGVtSURzWzRdLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHt9LAogICAgICAgIE9wZXJhdGlvbiAgICA9PiAnQ29uZmlnSXRlbUdldCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdDb3JyZWN0IENvbmZpZ0l0ZW1JRCA2JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NHZXQgICAgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEFkZGVkQ29uZmlnSXRlbUlEc1s1XSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7fSwKICAgICAgICBPcGVyYXRpb24gICAgPT4gJ0NvbmZpZ0l0ZW1HZXQnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBDb25maWdJdGVtSUQgMS02JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NHZXQgICAgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gXEBBZGRlZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4ge30sCiAgICAgICAgT3BlcmF0aW9uICAgID0+ICdDb25maWdJdGVtR2V0JywKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgY3JlYXRlIGxvY2FsIG9iamVjdAogICAgbXkgJExvY2FsT2JqZWN0ID0gIktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjokVGVzdC0+e09wZXJhdGlvbn0iLT5uZXcoCiAgICAgICAgRGVidWdnZXJPYmplY3QgPT4gJERlYnVnZ2VyT2JqZWN0LAogICAgICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OiRUZXN0LT57T3BlcmF0aW9ufSIsCiAgICAgICAgcmVmICRMb2NhbE9iamVjdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZSBsb2NhbCBvYmplY3QiLAogICAgKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICBteSAkTG9jYWxSZXN1bHQgPSAkTG9jYWxPYmplY3QtPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgICAgICBJbnZva2VyICAgICAgPT4gJFRlc3QtPntPcGVyYXRpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgICAgICAgICAleyAkVGVzdC0+e1JlcXVlc3REYXRhfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVzdWx0CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJ0hBU0gnLAogICAgICAgIHJlZiAkTG9jYWxSZXN1bHQsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIiwKICAgICk7CgogICAgIyBjcmVhdGUgcmVxdWVzdGVyIG9iamVjdAogICAgbXkgJFJlcXVlc3Rlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgICAgICByZWYgJFJlcXVlc3Rlck9iamVjdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0IiwKICAgICk7CgogICAgIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2Vic2VydmljZQogICAgbXkgJFJlcXVlc3RlclJlc3VsdCA9ICRSZXF1ZXN0ZXJPYmplY3QtPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgICAgICBJbnZva2VyICAgICAgPT4gJFRlc3QtPntPcGVyYXRpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICAleyAkVGVzdC0+e1JlcXVlc3REYXRhfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVzdWx0CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJ0hBU0gnLAogICAgICAgIHJlZiAkUmVxdWVzdGVyUmVzdWx0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBzdHJ1Y3R1cmUgaXMgdmFsaWQiLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e1N1Y2Nlc3N9LAogICAgICAgICRUZXN0LT57U3VjY2Vzc1JlcXVlc3R9LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHN1Y2Nlc3NmdWwgcmVzdWx0IiwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3NHZXR9ICkgewoKICAgICAgICAjIGxvY2FsIHJlc3VsdHMKICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBDb25maWdJdGVtIGlzIG5vdCB1bmRlZmluZWQuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgcmVmICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0sCiAgICAgICAgICAgICdBUlJBWScsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IENvbmZpZ0l0ZW0gcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW19ICksCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IENvbmZpZ0l0ZW0gcmVmZXJlbmNlIGlzIG5vdCBlbXB0eS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfSwKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yIGlzIHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgICMgcmVxdWVzdGVyIHJlc3VsdHMKICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW19LAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IENvbmZpZ0l0ZW0gaXMgbm90IHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgIG15ICRFeHBlY3RlZFJlc3VsdFR5cGUgPSByZWYgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntDb25maWdJdGVtSUR9IHx8ICdIQVNIJzsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0sCiAgICAgICAgICAgICRFeHBlY3RlZFJlc3VsdFR5cGUsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBDb25maWdJdGVtIHJlZmVyZW5jZS4iLAogICAgICAgICk7CgogICAgICAgIGlmICggJEV4cGVjdGVkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0gKSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBDb25maWdJdGVtIHJlZmVyZW5jZSBpcyBub3QgZW1wdHkuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW19ICksCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgQ29uZmlnSXRlbSByZWZlcmVuY2UgaXMgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IEVycm9yIGlzIHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgIGlmICggJEV4cGVjdGVkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBsb29wIGFsbCBDb25maWdJdGVtSURzIGluIHRoZSByZXNwb25zZQogICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAwIC4uIHNjYWxhciBAeyAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW1JRH0gfSAtIDEgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzcGVjaWZpYyBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ0lYTUxEYXRhIENsYXNzIERlcGxTdGF0ZSBJbmNpU3RhdGUgTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0tPlskQ291bnRlcl0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEFkZGVkQ29uZmlnSXRlbXN7ICRUZXN0LT57UmVxdWVzdERhdGF9LT57Q29uZmlnSXRlbUlEfS0+WyRDb3VudGVyXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgbWF0Y2ggQ29uZmlnSXRlbS0+WyRDb3VudGVyXSAkQXR0cmlidXRlIGNyZWF0ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBkYXRhLiIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjaGVjayBzcGVjaWZpYyBhdHRyaWJ1dGVzIGZvciB0aGUgb25seSAxIHJlc3VsdAogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ0lYTUxEYXRhIENsYXNzIERlcGxTdGF0ZSBJbmNpU3RhdGUgTmFtZSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW19LT5bMF0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAkQWRkZWRDb25maWdJdGVtc3sgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntDb25maWdJdGVtSUR9IH0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBtYXRjaCBDb25maWdJdGVtICRBdHRyaWJ1dGUgY3JlYXRlIGRhdGEuIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtYWtlIFJlcXVlc3RlciByZXN1bHQgYW4gYXJyYXkgZm9yIGVhc3kgY29tcGFyZQogICAgICAgICAgICBteSAkUmVxdWVzdGVyQ29uZmlnSXRlbSA9IGRlbGV0ZSAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtfTsKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbX0gPSBbJFJlcXVlc3RlckNvbmZpZ0l0ZW1dOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkTG9jYWxSZXN1bHQsCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgY29uZmlnIGl0ZW0gcmVzdWx0IG1hdGNoZWQgd2l0aCByZW1vdGUgcmVzdWx0LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIGZhaWwKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57Q29uZmlnSXRlbX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IENvbmZpZ0l0ZW1JRCB3aXRoIGZhbHNlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e051bWJlcn0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IE51bWJlciB3aXRoIGZhbHNlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LT57RXJyb3JDb2RlfSwKICAgICAgICAgICAgJFRlc3QtPntFeHBlY3RlZERhdGF9LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvckNvZGUgbWF0Y2hlZCB3aXRoIGV4cGVjdGVkIGxvY2FsIGNhbGwgcmVzdWx0LiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvck1lc3NhZ2Ugd2l0aCB0cnVlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSBpcyBub3QgZW1wdHkuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9CiAgICAgICAgICAgICAgICAuICc6ICcKICAgICAgICAgICAgICAgIC4gJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvck1lc3NhZ2UgKG91dHNpZGUgRGF0YSBoYXNoKSBtYXRjaGVkIHdpdGggY29uY2F0ZW5hdGlvbiIKICAgICAgICAgICAgICAgIC4gIiBvZiBFcnJvckNvZGUgYW5kIEVycm9yTWVzc2FnZSB3aXRoaW4gRGF0YSBoYXNoLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgRXJyb3JNZXNzYWdlIHBhcmFtZXRlciBmcm9tIGRpcmVjdCBjYWxsCiAgICAgICAgIyByZXN1bHQgdG8gYmUgY29uc2lzdGVudCB3aXRoIFNPQVAgY2FsbCByZXN1bHQKICAgICAgICBpZiAoICRMb2NhbFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9OwogICAgICAgIH0KCiAgICAgICAgIyBzYW5pdHkgY2hlY2sKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9NZXNzYWdlIChvdXRzaXNlIERhdGEgaGFzaCkgZ290IHJlbW92ZWQgdG8gY29tcGFyZSIKICAgICAgICAgICAgICAgIC4gIiBsb2NhbCBhbmQgcmVtb3RlIHRlc3RzLiIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkTG9jYWxSZXN1bHQsCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IG1hdGNoZWQgd2l0aCByZW1vdGUgcmVzdWx0LiIsCiAgICAgICAgKTsKICAgIH0KfSAgICAjZW5kIGxvb3AKCiMgY2xlYW4gdXAKCiMgY2xlYW4gdXAgd2Vic2VydmljZQpteSAkV2Vic2VydmljZURlbGV0ZSA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlRGVsZXRlKAogICAgSUQgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAopOwokU2VsZi0+VHJ1ZSgKICAgICRXZWJzZXJ2aWNlRGVsZXRlLAogICAgIkRlbGV0ZWQgV2Vic2VydmljZSAkV2Vic2VydmljZUlEIiwKKTsKCmZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICVBZGRlZENvbmZpZ0l0ZW1zICkgewoKICAgICMgZGVsZXRlIHRoZSBDb25maWdJdGVtcwogICAgbXkgJFN1Y2Nlc3NEZWxldGUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3NEZWxldGUsCiAgICAgICAgIlN1Y2Nlc3NEZWxldGUoKSBzdWNjZXNzZnVsIGZvciBDb25maWdJdGVtIElEICRDb25maWdJdGVtSUQiLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcjsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlOwp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1TZWFyY2g7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgc2V0IFVzZXJJRCB0byByb290CiRTZWxmLT57VXNlcklEfSA9IDE7CgojIGhlbHBlciBvYmplY3QKIyBza2lwIFNTTCBjZXJ0aWNpYXRlIHZlcmlmaWNhdGlvbgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlU3lzdGVtQ29uZmlndXJhdGlvbiA9PiAxLAogICAgICAgIFNraXBTU0xWZXJpZnkgICAgICAgICAgICAgID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7CgpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgY2hlY2sgaWYgU1NMIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZAokU2VsZi0+SXMoCiAgICAkRU5We1BFUkxfTFdQX1NTTF9WRVJJRllfSE9TVE5BTUV9LAogICAgMCwKICAgICdEaXNhYmxlZCBTU0wgY2VydGl0aWNhdGVzIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCcsCik7CgojIGNyZWF0ZSBDb25maWdJdGVtIG9iamVjdApteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiMgY3JlYXRlIHdlYnNlcnZpY2Ugb2JqZWN0Cm15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKJFNlbGYtPklzKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJywKICAgIHJlZiAkV2Vic2VydmljZU9iamVjdCwKICAgICJDcmVhdGUgd2Vic2VydmljZSBvYmplY3QiLAopOwoKIyBzZXQgd2Vic2VydmljZSBuYW1lCm15ICRXZWJzZXJ2aWNlTmFtZSA9ICctVGVzdC0nIC4gJFJhbmRvbUlEOwoKbXkgJFdlYnNlcnZpY2VJRCA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgTmFtZSAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgRGVidWdnZXIgPT4gewogICAgICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIH0sCiAgICAgICAgUHJvdmlkZXIgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZUlELAogICAgIkFkZGVkIFdlYnNlcnZpY2UiLAopOwoKIyBnZXQgcmVtb3RlIGhvc3Qgd2l0aCBzb21lIHByZWNhdXRpb25zIGZvciBjZXJ0YWluIHVuaXQgdGVzdCBzeXN0ZW1zCm15ICRIb3N0OwpteSAkRlFETiA9ICRDb25maWdPYmplY3QtPkdldCgnRlFETicpOwoKIyB0cnkgdG8gcmVzb2x2ZSBmcWRuIGhvc3QKaWYgKCAkRlFETiBuZSAneW91cmhvc3QuZXhhbXBsZS5jb20nICYmIGdldGhvc3RieW5hbWUoJEZRRE4pICkgewogICAgJEhvc3QgPSAkRlFETjsKfQoKIyB0cnkgdG8gcmVzb2x2ZSBsb2NhbGhvc3QgaW5zdGVhZAppZiAoICEkSG9zdCAmJiBnZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSApIHsKICAgICRIb3N0ID0gJ2xvY2FsaG9zdCc7Cn0KCiMgdXNlIGhhcmRjb2RlZCBsb2NhbGhvc3QgaXAgYWRkcmVzcwppZiAoICEkSG9zdCApIHsKICAgICRIb3N0ID0gJzEyNy4wLjAuMSc7Cn0KCiMgcHJlcGFyZSB3ZWJzZXJ2aWNlIGNvbmZpZwpteSAkUmVtb3RlU3lzdGVtID0KICAgICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKQogICAgLiAnOi8vJwogICAgLiAkSG9zdAogICAgLiAnLycKICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAuICcvbnBoLWdlbmVyaWNpbnRlcmZhY2UucGwvV2Vic2VydmljZUlELycKICAgIC4gJFdlYnNlcnZpY2VJRDsKCm15ICRXZWJzZXJ2aWNlQ29uZmlnID0gewoKICAgICMgICAgTmFtZSA9PiAnJywKICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgJ1Rlc3QgZm9yIENvbmZpZ0l0ZW0gQ29ubmVjdG9yIHVzaW5nIFNPQVAgdHJhbnNwb3J0IGJhY2tlbmQuJywKICAgIERlYnVnZ2VyID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgUHJvdmlkZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTBfMDAwXzAwMCwKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1TZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbTo6Q29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlc3Npb25DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICBSZXF1ZXN0ZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5jb2RpbmcgID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEludm9rZXIgPT4gewogICAgICAgICAgICBDb25maWdJdGVtU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Rlc3Q6OlRlc3RTaW1wbGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAp9OwoKIyB1cGRhdGUgd2Vic2VydmljZSB3aXRoIHJlYWwgY29uZmlnCm15ICRXZWJzZXJ2aWNlVXBkYXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICBJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBOYW1lICAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyAgPT4gJFdlYnNlcnZpY2VDb25maWcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VVcGRhdGUsCiAgICAiVXBkYXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQgLSAkV2Vic2VydmljZU5hbWUiLAopOwoKIyBkZWJ1Z2dlciBvYmplY3QKbXkgJERlYnVnZ2VyT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlci0+bmV3KAogICAgRGVidWdnZXJDb25maWcgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBXZWJzZXJ2aWNlSUQgICAgICA9PiAkV2Vic2VydmljZUlELAogICAgQ29tbXVuaWNhdGlvblR5cGUgPT4gJ1Byb3ZpZGVyJywKKTsKJFNlbGYtPklzKAogICAgcmVmICREZWJ1Z2dlck9iamVjdCwKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyJywKICAgICdEZWJ1Z2dlck9iamVjdCBpbnN0YW5jaWF0ZSBjb3JyZWN0bHknLAopOwoKIyBHZXQgU2Vzc2lvbklECiMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKbXkgJFJlcXVlc3RlclNlc3Npb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwokU2VsZi0+SXMoCiAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInLAogICAgcmVmICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LAogICAgIlNlc3Npb25JRCAtIENyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0IiwKKTsKCiMgY3JlYXRlIGEgbmV3IHVzZXIgZm9yIGN1cnJlbnQgdGVzdApteSAkVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdFVzZXJDcmVhdGUoCiAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAnaXRzbS1jb25maWdpdGVtJyBdLAopOwpteSAkUGFzc3dvcmQgPSAkVXNlckxvZ2luOwoKIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2Vic2VydmljZQpteSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdCA9ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LT5SdW4oCiAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgIEludm9rZXIgICAgICA9PiAnU2Vzc2lvbkNyZWF0ZScsCiAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQsCiAgICB9LAopOwoKbXkgJE5ld1Nlc3Npb25JRCA9ICRSZXF1ZXN0ZXJTZXNzaW9uUmVzdWx0LT57RGF0YX0tPntTZXNzaW9uSUR9OwoKI0NvbmZpZ0l0ZW10cyBjb250YWluZXIgKHVzZWZ1bGwgZm9yIGxvb2t1cCBjb21wYXJlKQpteSBAQWRkZWRDb25maWdJdGVtSURzOwoKIyBDb25maWdJdGVtIHNldHRpbmdzCm15IEBDb25maWdJdGVtcyA9ICgKICAgIHsKICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSS0xLScgLiAkUmFuZG9tSUQsCiAgICAgICAgRGVwbFN0YXRlID0+ICdSZXBhaXInLAogICAgICAgIEluY2lTdGF0ZSA9PiAnV2FybmluZycsCiAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgVmVuZG9yICAgICAgICAgID0+ICdMZW5vdm8nLAogICAgICAgICAgICBNb2RlbCAgICAgICAgICAgPT4gJ1RoaW5rcGFkJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdUaGlua3BhZCBYMzAwJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgID0+ICdEZXNrdG9wJywKICAgICAgICAgICAgT3duZXIgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFNlcmlhbE51bWJlciAgICA9PiAnYWJjMTIzNDVhYmMnLAogICAgICAgICAgICBPcGVyYXRpbmdTeXN0ZW0gPT4gJ0NlbnRPUyA2LjAnLAogICAgICAgICAgICBDUFUgICAgICAgICAgICAgPT4gJ0ludGVsIENvcmUgaTMnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBSYW0gICAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgIDIwMDAsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEhhcmREaXNrID0+IHsKICAgICAgICAgICAgICAgIEhhcmREaXNrID0+ICcvZGV2JywKICAgICAgICAgICAgICAgIENhcGFjaXR5ID0+IDUwMDAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBGUUROID0+ICdob3RzLmV4YW1wbGUuY29tJywKICAgICAgICAgICAgTklDICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgIElQQWRkcmVzcyAgPT4gJzE5Mi4xNjguMzAuMScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzICA9PiAnMjAwLjM0LjU2Ljc4JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEdyYXBoaWNBZGFwdGVyID0+ICdBVEkgUmFkZW9uIDMwMCcsCiAgICAgICAgICAgIEluc3RhbGxEYXRlICAgID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgTm90ZSAgICAgICAgICAgPT4gJ1RoaXMgaXMgYSBEZW1vIENJJywKICAgICAgICB9LAogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoYmlCbGJtTnZaR1ZrSUhSbGVIUT0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ015IFRleHQudHh0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEnLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ015IFRleHQyLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0ktMi0nIC4gJFJhbmRvbUlELAogICAgICAgIERlcGxTdGF0ZSA9PiAnUmVwYWlyJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBWZW5kb3IgICAgICAgICAgPT4gJ0FwcGxlJywKICAgICAgICAgICAgTW9kZWwgICAgICAgICAgID0+ICdpTWFjJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdBcHBsZSBDb21wdXRlcicsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnRGVza3RvcCcsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgICAgPT4gJ2FiYzEyMzQ1YWJjJywKICAgICAgICAgICAgT3BlcmF0aW5nU3lzdGVtID0+ICdPU1ggMTAuOC4zJywKICAgICAgICAgICAgQ1BVICAgICAgICAgICAgID0+ICdJbnRlbCBDb3JlIGkzJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgUmFtICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAyMDAwLAogICAgICAgICAgICBdLAogICAgICAgICAgICBIYXJkRGlzayA9PiB7CiAgICAgICAgICAgICAgICBIYXJkRGlzayA9PiAnL2RldicsCiAgICAgICAgICAgICAgICBDYXBhY2l0eSA9PiA4MDAwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRlFETiA9PiAnaG90cy5leGFtcGxlLmNvbScsCiAgICAgICAgICAgIE5JQyAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0VuMCcsCiAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3MgID0+ICcxOTIuMTY4LjMwLjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFbjEnLAogICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzICA9PiAnMjAwLjM0LjU2Ljc4JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEdyYXBoaWNBZGFwdGVyID0+ICdudmlkaWEnLAogICAgICAgICAgICBJbnN0YWxsRGF0ZSAgICA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgIE5vdGUgICAgICAgICAgID0+ICdUaGlzIGlzIGEgRGVtbyBDSScsCiAgICAgICAgfSwKICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdNeSBUZXh0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhiaUJsYm1OdlpHVmtJSFJsZUhRPScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xJywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdNeSBUZXh0Mi50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIENsYXNzICAgICA9PiAnU29mdHdhcmUnLAogICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJLTMtJyAuICRSYW5kb21JRCwKICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgIEluY2lTdGF0ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgIFZlbmRvciAgICAgICA9PiAnU29tZSBzb2Z0d2FyZSB2ZW5kb3InLAogICAgICAgICAgICBWZXJzaW9uICAgICAgPT4gJzEuMS4xJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gID0+ICdTb21lIHNvZnR3YXJlIGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdBZG1pbiBUb29sJywKICAgICAgICAgICAgT3duZXIgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFNlcmlhbE51bWJlciA9PiAnMTIzQUJDNDU2JywKICAgICAgICAgICAgTGljZW5jZVR5cGUgID0+ICdPcGVuIFNvdXJjZScsCiAgICAgICAgICAgIExpY2VuY2VLZXkgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTGljZW5jZUtleSAgICAgPT4gJzEyMzQnLAogICAgICAgICAgICAgICAgICAgIFF1YW50aXR5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0xMicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgICAgID0+ICc0NTY3JywKICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgRXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMjUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTWVkaWEgPT4gJ0Rvd25sb2FkJywKICAgICAgICAgICAgTm90ZSAgPT4gJ1RoaXMgaXMgYSB0ZXN0IENJJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBDbGFzcyAgICAgPT4gJ1NvZnR3YXJlJywKICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSS00LScgLiAkUmFuZG9tSUQsCiAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICBJbmNpU3RhdGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICBWZW5kb3IgICAgICAgPT4gJ1NvbWUgc29mdHdhcmUgdmVuZG9yJywKICAgICAgICAgICAgVmVyc2lvbiAgICAgID0+ICcxLjEuMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICA9PiAnU29tZSBzb2Z0d2FyZSBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnQWRtaW4gVG9vbCcsCiAgICAgICAgICAgIE93bmVyICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgPT4gJzEyM0FCQzQ1NicsCiAgICAgICAgICAgIExpY2VuY2VUeXBlICA9PiAnT3BlbiBTb3VyY2UnLAogICAgICAgICAgICBMaWNlbmNlS2V5ICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgICAgID0+ICcxMjM0JywKICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSAgICAgICA9PiAnNCcsCiAgICAgICAgICAgICAgICAgICAgRXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBMaWNlbmNlS2V5ICAgICA9PiAnNDU2NycsCiAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIEV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTI1JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE1lZGlhID0+ICdDRC1ST00nLAogICAgICAgICAgICBOb3RlICA9PiAnVGhpcyBpcyBhIHRlc3QgQ0knLAogICAgICAgIH0sCiAgICB9LAopOwoKIyBjcmVhdGUgbG9jYWwgb2JqZWN0Cm15ICRDb25maWdJdGVtQ3JlYXRlT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1DcmVhdGUtPm5ldygKICAgIERlYnVnZ2VyT2JqZWN0ID0+ICREZWJ1Z2dlck9iamVjdCwKICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCik7Cgpmb3IgbXkgJENvbmZpZ0l0ZW0gKEBDb25maWdJdGVtcykgewoKICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgbXkgJENsb25lZENvbmZpZ0l0ZW0gPSBTdG9yYWJsZTo6ZGNsb25lKCRDb25maWdJdGVtKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICAjIGFkZCBuZXcgQ29uZmlnSXRlbXMKICAgIG15ICRDcmVhdGVSZXN1bHQgPSAkQ29uZmlnSXRlbUNyZWF0ZU9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCAgID0+ICRQYXNzd29yZCwKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENyZWF0ZVJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSB8fCAnJzsKCiAgICAjIHNhbml0eSBjaGVja3MKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkFkZGVkIENvbmZpZ0l0ZW0gJENvbmZpZ0l0ZW1JRCAtICRDcmVhdGVSZXN1bHQtPntEYXRhfS0+e051bWJlcn0iLAogICAgKTsKCiAgICBteSAkVmVyc2lvbkluZm8gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgJFNlbGYtPklzTm90RGVlcGx5KAogICAgICAgICRWZXJzaW9uSW5mbywKICAgICAgICB7fSwKICAgICAgICAiQWRkZWQgQ29uZmlnSXRlbSAkQ29uZmlnSXRlbUlEIC0gVmVyc2lvbiBpcyBub3QgYW4gZW1wdHkgaGFzaCIsCiAgICApOwoKICAgICMgcmVtZW1iZXIgdGhlIGNvbmZpZyBpdGVtCiAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewogICAgICAgIHB1c2ggQEFkZGVkQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgIH0KfQoKIyBhY3R1YWwgdGVzdHMgZm9yIENvbmZpZ0l0ZW1TZWFyY2ggb3BlcmF0aW9uCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRW1wdHkgUmVxdWVzdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHt9LAogICAgICAgIEV4cGVjdGVkRGF0YSAgID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ29uZmlnSXRlbScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2guTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgQ29uZmlnSXRlbSBmb3JtYXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ29uZmlnSXRlbS0+Q2xhc3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbS0+Q2xhc3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ05vbkV4aXN0aW5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVNlYXJjaC5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPkNJWE1MRGF0YScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbS0+SW5jaVN0YXRlcycsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzID0+ICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIENJWE1MRGF0YSAgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbS0+SW5jaVN0YXRlcyBIQVNIJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLldyb25nU3RydWN0dXJlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPkluY2lTdGF0ZXMgQVJSQVknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyA9PiBbICdJbmNpZGVudCcsICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCBdLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlEID0+IDEKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2guSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBDb25maWdJdGVtLT5EZXBsU3RhdGVzJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgPT4gJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlEID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbS0+RGVwbFN0YXRlcyBIQVNIJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLldyb25nU3RydWN0dXJlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPkRlcGxTdGF0ZXMgQVJSQVknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyA9PiBbICdJbmNpZGVudCcsICdXYXJuaW5nJyBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlcyA9PiBbICdQcm9kdWN0aW9uJywgJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlEIF0sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgID0+IHsKICAgICAgICAgICAgICAgICAgICAnTm90RXhpc3RzbmluZycgLiAkUmFuZG9tSUQgPT4gMQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVNlYXJjaC5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPk9yZGVyQnkgSEFTSCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzID0+IFsgJ1Byb2R1Y3Rpb24nLCAnUmV0aXJlZCcgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLldyb25nU3RydWN0dXJlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPk9yZGVyQnlEaXJlY3Rpb24gSEFTSCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgICAgID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgID0+IFsgJ1Byb2R1Y3Rpb24nLCAnUmV0aXJlZCcgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLldyb25nU3RydWN0dXJlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPkNyZWF0ZVRpbWVOZXdlckRhdGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdQcm9kdWN0aW9uJywgJ1JldGlyZWQnIF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgICAgICAgICA9PiBbJ051bWJlciddLAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiAgICAgICAgICAgICAgPT4gWydEb3duJ10sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0wMi0zMCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlEID0+IDEKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2guSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBDb25maWdJdGVtLT5DcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdJbmNpZGVudCcsICdXYXJuaW5nJyBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlcyAgICAgICAgICAgICAgICAgICAgPT4gWyAnUHJvZHVjdGlvbicsICdSZXRpcmVkJyBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gICAgICAgICAgICAgID0+IFsnRG93biddLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMTItMTItMTInLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMTItMDItMzAnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbS0+Q2hhbmdlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyAgICAgICAgICAgICAgICAgICAgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ1Byb2R1Y3Rpb24nLCAnUmV0aXJlZCcgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+IFsnTnVtYmVyJ10sCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICAgICAgICAgICAgICA9PiBbJ0Rvd24nXSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTAyLTMwJywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAnTm90RXhpc3RzbmluZycgLiAkUmFuZG9tSUQgPT4gMQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVNlYXJjaC5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW0tPkNoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdQcm9kdWN0aW9uJywgJ1JldGlyZWQnIF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgICAgICAgICA9PiBbJ051bWJlciddLAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiAgICAgICAgICAgICAgPT4gWydEb3duJ10sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0wMi0zMCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ05vdEV4aXN0c25pbmcnIC4gJFJhbmRvbUlEID0+IDEKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2guSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBDb25maWdJdGVtLT5MaW1pdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyAgICAgICAgICAgICAgICAgICAgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ1Byb2R1Y3Rpb24nLCAnUmV0aXJlZCcgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+IFsnTnVtYmVyJ10sCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICAgICAgICAgICAgICA9PiBbJ0Rvd24nXSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVbmxpbWl0ZWQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICdOb3RFeGlzdHNuaW5nJyAuICRSYW5kb21JRCA9PiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ0lYTUxEYXRhIEdlbmVyYWwgQ2F0YWxvZycsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyAgICAgICAgICAgICAgICAgICAgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ1Byb2R1Y3Rpb24nLCAnUmV0aXJlZCcgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+IFsnTnVtYmVyJ10sCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICAgICAgICAgICAgICA9PiBbJ0Rvd24nXSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDEyLTEyLTEyJywKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ0lYTUxEYXRhIERhdGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdQcm9kdWN0aW9uJywgJ1JldGlyZWQnIF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgICAgICAgICA9PiBbJ051bWJlciddLAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiAgICAgICAgICAgICAgPT4gWydEb3duJ10sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBJbnN0YWxsRGF0ZSA9PiAnMjAxMi0wMi0zMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ0lYTUxEYXRhIFRleHQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvZnR3YXJlJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgICAgICAgICAgICAgICAgID0+IFsgJ0luY2lkZW50JywgJ1dhcm5pbmcnIF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdQcm9kdWN0aW9uJywgJ1JldGlyZWQnIF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgICAgICAgICA9PiBbJ051bWJlciddLAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiAgICAgICAgICAgICAgPT4gWydEb3duJ10sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAxMi0xMi0xMicsCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFZlbmRvciA9PiAnYScgeCA1MSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2guSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBDSVhNTERhdGEgTnVtYmVyJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb2Z0d2FyZScsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgICAgICAgICAgICAgICAgICA9PiBbICdJbmNpZGVudCcsICdXYXJuaW5nJyBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlcyAgICAgICAgICAgICAgICAgICAgPT4gWyAnUHJvZHVjdGlvbicsICdSZXRpcmVkJyBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gICAgICAgICAgICAgID0+IFsnRG93biddLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMTItMTItMTInLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMTItMTItMTInLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJzIwMTItMTItMTInLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJzIwMTItMTItMTInLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENJWE1MRGF0YSAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgICAgID0+ICdhJyB4IDUwLAogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSA9PiAnTm90RXhpc3RpbmcnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtU2VhcmNoLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NvcnJlY3QgQ29tcHV0ZXIgTm8gTGltaXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1NlYXJjaCAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlcyAgICAgICA9PiBbICdJbmNpZGVudCcsICdXYXJuaW5nJyBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlcyAgICAgICA9PiBbICdQcm9kdWN0aW9uJywgJ1JldGlyZWQnLCAnUmVwYWlyJyBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJ051bWJlciddLAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ1VwJ10sCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBDUFUgPT4gJ0ludGVsIENvcmUgaTMnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgICAgIE5JQyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzBdLCAkQWRkZWRDb25maWdJdGVtSURzWzFdIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdDb3JyZWN0IENvbXB1dGVyIExpbWl0JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NTZWFyY2ggID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgICAgPT4gWyAnSW5jaWRlbnQnLCAnV2FybmluZycgXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgICAgICAgPT4gWyAnUHJvZHVjdGlvbicsICdSZXRpcmVkJywgJ1JlcGFpcicgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ1BVID0+ICdJbnRlbCBDb3JlIGkzJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgICAgICBOSUMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSURzID0+IFsgJEFkZGVkQ29uZmlnSXRlbUlEc1swXSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ29ycmVjdCBTb2Z0d2FyZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzU2VhcmNoICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICdTb2Z0d2FyZScsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydOdW1iZXInXSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3duZXIgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgICAgIExpY2VuY2VLZXkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSA9PiBbICczJywgJzQnIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgPT4gWyAkQWRkZWRDb25maWdJdGVtSURzWzJdLCAkQWRkZWRDb25maWdJdGVtSURzWzNdIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRMb2NhbE9iamVjdCA9ICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6JFRlc3QtPntPcGVyYXRpb259Ii0+bmV3KAogICAgICAgIERlYnVnZ2VyT2JqZWN0ID0+ICREZWJ1Z2dlck9iamVjdCwKICAgICAgICBXZWJzZXJ2aWNlSUQgICA9PiAkV2Vic2VydmljZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgIktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjokVGVzdC0+e09wZXJhdGlvbn0iLAogICAgICAgIHJlZiAkTG9jYWxPYmplY3QsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDcmVhdGUgbG9jYWwgb2JqZWN0IiwKICAgICk7CgogICAgIyBtYWtlIGEgZGVlcCBjb3B5IHRvIGF2b2lkIGNoYW5naW5nIHRoZSBkZWZpbml0aW9uCiAgICBteSAkQ2xvbmVkUmVxdWVzdERhdGEgPSBTdG9yYWJsZTo6ZGNsb25lKCAkVGVzdC0+e1JlcXVlc3REYXRhfSApOwoKICAgICMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKICAgIG15ICRMb2NhbFJlc3VsdCA9ICRMb2NhbE9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQsCiAgICAgICAgICAgICV7ICRUZXN0LT57UmVxdWVzdERhdGF9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyByZXN0b3JlIGNsb25lZCBkYXRhCiAgICAkVGVzdC0+e1JlcXVlc3REYXRhfSA9ICRDbG9uZWRSZXF1ZXN0RGF0YTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgICdIQVNIJywKICAgICAgICByZWYgJExvY2FsUmVzdWx0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IHN0cnVjdHVyZSBpcyB2YWxpZCIsCiAgICApOwoKICAgICMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgJFNlbGYtPklzKAogICAgICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICAgICAgcmVmICRSZXF1ZXN0ZXJPYmplY3QsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCiAgICApOwoKICAgICMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKICAgIG15ICRSZXF1ZXN0ZXJSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgSW52b2tlciAgICAgID0+ICRUZXN0LT57T3BlcmF0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgJXsgJFRlc3QtPntSZXF1ZXN0RGF0YX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgICdIQVNIJywKICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIiwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAkVGVzdC0+e1N1Y2Nlc3NSZXF1ZXN0fSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciBzdWNjZXNzZnVsIHJlc3VsdCIsCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzU2VhcmNofSApIHsKCiAgICAgICAgIyBsb2NhbCByZXN1bHRzCiAgICAgICAgJFNlbGYtPklzTm90KAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRHN9LAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEcyBpcyBub3QgdW5kZWZpbmVkLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHJlZiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRHN9LAogICAgICAgICAgICAnQVJSQVknLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBDb25maWdJdGVtSURzIHJlZmVyZW5jZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJExvY2FsUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSURzfSApLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBDb25maWdJdGVtIGlzIGEgbm9uIGVtcHRyeSBhcnJheSB3aXRoIHRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvciBpcyB1bmRlZmluZWQuIiwKICAgICAgICApOwoKICAgICAgICAjIHJlcXVlc3RlciByZXN1bHRzCiAgICAgICAgJFNlbGYtPklzTm90KAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSURzfSwKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBDb25maWdJdGVtSURzIGlzIG5vdCB1bmRlZmluZWQuIiwKICAgICAgICApOwoKICAgICAgICBpZiAoIHJlZiAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSURzfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEc30gKSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBDb25maWdJdGVtSURzIGlzIGEgbm9uIGVtcHRyeSBhcnJheSB3aXRoIHRydWUuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgSXNOdW1iZXIoICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRHN9ICksCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgQ29uZmlnSXRlbUlEcyBpcyBudW1iZXIgd2l0aCB0cnVlLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2UgUmVxdWVzdGVyIHJlc3VsdCBhbiBhcnJheSBmb3IgZWFzeSBjb21wYXJlCiAgICAgICAgICAgIG15ICRSZXF1ZXN0ZXJDb25maWdJdGVtSURzID0gZGVsZXRlICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRHN9OwogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntDb25maWdJdGVtSURzfSA9IFskUmVxdWVzdGVyQ29uZmlnSXRlbUlEc107CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntFeHBlY3RlZERhdGF9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBtYXRjaCBleHBlY3RlZCBkYXRhLiIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkTG9jYWxSZXN1bHQsCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgY29uZmlnIGl0ZW0gcmVzdWx0IG1hdGNoZWQgd2l0aCByZW1vdGUgcmVzdWx0LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIGZhaWwKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgTnVtYmVyIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkRGF0YX0tPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yQ29kZSBtYXRjaGVkIHdpdGggZXhwZWN0ZWQgbG9jYWwgY2FsbCByZXN1bHQuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSB3aXRoIHRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAnJywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb3JNZXNzYWdlIGlzIG5vdCBlbXB0eS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0KICAgICAgICAgICAgICAgIC4gJzogJwogICAgICAgICAgICAgICAgLiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSAob3V0c2lkZSBEYXRhIGhhc2gpIG1hdGNoZWQgd2l0aCBjb25jYXRlbmF0aW9uIgogICAgICAgICAgICAgICAgLiAiIG9mIEVycm9yQ29kZSBhbmQgRXJyb3JNZXNzYWdlIHdpdGhpbiBEYXRhIGhhc2guIiwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBFcnJvck1lc3NhZ2UgcGFyYW1ldGVyIGZyb20gZGlyZWN0IGNhbGwKICAgICAgICAjIHJlc3VsdCB0byBiZSBjb25zaXN0ZW50IHdpdGggU09BUCBjYWxsIHJlc3VsdAogICAgICAgIGlmICggJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApIHsKICAgICAgICAgICAgZGVsZXRlICRMb2NhbFJlc3VsdC0+e0Vycm9yTWVzc2FnZX07CiAgICAgICAgfQoKICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb01lc3NhZ2UgKG91dHNpc2UgRGF0YSBoYXNoKSBnb3QgcmVtb3ZlZCB0byBjb21wYXJlIgogICAgICAgICAgICAgICAgLiAiIGxvY2FsIGFuZCByZW1vdGUgdGVzdHMuIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdCwKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgbWF0Y2hlZCB3aXRoIHJlbW90ZSByZXN1bHQuIiwKICAgICAgICApOwogICAgfQp9ICAgICNlbmQgbG9vcAoKIyBjbGVhbiB1cAoKIyBjbGVhbiB1cCB3ZWJzZXJ2aWNlCm15ICRXZWJzZXJ2aWNlRGVsZXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VEZWxldGUoCiAgICBJRCAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VEZWxldGUsCiAgICAiRGVsZXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQiLAopOwoKZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IEBBZGRlZENvbmZpZ0l0ZW1JRHMgKSB7CgogICAgIyBkZWxldGUgdGhlIENvbmZpZ0l0ZW1zCiAgICBteSAkU3VjY2Vzc0RlbGV0ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2Vzc0RlbGV0ZSwKICAgICAgICAiU3VjY2Vzc0RlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIENvbmZpZ0l0ZW0gSUQgJENvbmZpZ0l0ZW1JRCIsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXI7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6Q29uZmlnSXRlbUNyZWF0ZTsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtVXBkYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIHNldCBVc2VySUQgdG8gcm9vdAokU2VsZi0+e1VzZXJJRH0gPSAxOwoKIyBoZWxwZXIgb2JqZWN0CiMgc2tpcCBTU0wgY2VydGljaWF0ZSB2ZXJpZmljYXRpb24KJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZVN5c3RlbUNvbmZpZ3VyYXRpb24gPT4gMSwKICAgICAgICBTa2lwU1NMVmVyaWZ5ICAgICAgICAgICAgICA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwoKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIGNoZWNrIGlmIFNTTCBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgZGlzYWJsZWQKJFNlbGYtPklzKAogICAgJEVOVntQRVJMX0xXUF9TU0xfVkVSSUZZX0hPU1ROQU1FfSwKICAgIDAsCiAgICAnRGlzYWJsZWQgU1NMIGNlcnRpdGljYXRlcyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQnLAopOwoKIyBjcmVhdGUgQ29uZmlnSXRlbSBvYmplY3QKbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7CgojIGNyZWF0ZSB3ZWJzZXJ2aWNlIG9iamVjdApteSAkV2Vic2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CiRTZWxmLT5JcygKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScsCiAgICByZWYgJFdlYnNlcnZpY2VPYmplY3QsCiAgICAiQ3JlYXRlIHdlYnNlcnZpY2Ugb2JqZWN0IiwKKTsKCiMgc2V0IHdlYnNlcnZpY2UgbmFtZQpteSAkV2Vic2VydmljZU5hbWUgPSAnLVRlc3QtJyAuICRSYW5kb21JRDsKCm15ICRXZWJzZXJ2aWNlSUQgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZUFkZCgKICAgIE5hbWUgICA9PiAkV2Vic2VydmljZU5hbWUsCiAgICBDb25maWcgPT4gewogICAgICAgIERlYnVnZ2VyID0+IHsKICAgICAgICAgICAgRGVidWdUaHJlc2hvbGQgPT4gJ2RlYnVnJywKICAgICAgICB9LAogICAgICAgIFByb3ZpZGVyID0+IHsKICAgICAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VJRCwKICAgICJBZGRlZCBXZWJzZXJ2aWNlIiwKKTsKCiMgZ2V0IHJlbW90ZSBob3N0IHdpdGggc29tZSBwcmVjYXV0aW9ucyBmb3IgY2VydGFpbiB1bml0IHRlc3Qgc3lzdGVtcwpteSAkSG9zdDsKbXkgJEZRRE4gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKTsKCiMgdHJ5IHRvIHJlc29sdmUgZnFkbiBob3N0CmlmICggJEZRRE4gbmUgJ3lvdXJob3N0LmV4YW1wbGUuY29tJyAmJiBnZXRob3N0YnluYW1lKCRGUUROKSApIHsKICAgICRIb3N0ID0gJEZRRE47Cn0KCiMgdHJ5IHRvIHJlc29sdmUgbG9jYWxob3N0IGluc3RlYWQKaWYgKCAhJEhvc3QgJiYgZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JykgKSB7CiAgICAkSG9zdCA9ICdsb2NhbGhvc3QnOwp9CgojIHVzZSBoYXJkY29kZWQgbG9jYWxob3N0IGlwIGFkZHJlc3MKaWYgKCAhJEhvc3QgKSB7CiAgICAkSG9zdCA9ICcxMjcuMC4wLjEnOwp9CgojIHByZXBhcmUgd2Vic2VydmljZSBjb25maWcKbXkgJFJlbW90ZVN5c3RlbSA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykKICAgIC4gJzovLycKICAgIC4gJEhvc3QKICAgIC4gJy8nCiAgICAuICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKQogICAgLiAnL25waC1nZW5lcmljaW50ZXJmYWNlLnBsL1dlYnNlcnZpY2VJRC8nCiAgICAuICRXZWJzZXJ2aWNlSUQ7CgpteSAkV2Vic2VydmljZUNvbmZpZyA9IHsKCiAgICAjICAgIE5hbWUgPT4gJycsCiAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICdUZXN0IGZvciBDb25maWdJdGVtIENvbm5lY3RvciB1c2luZyBTT0FQIHRyYW5zcG9ydCBiYWNrZW5kLicsCiAgICBEZWJ1Z2dlciA9PiB7CiAgICAgICAgRGVidWdUaHJlc2hvbGQgPT4gJ2RlYnVnJywKICAgICAgICBUZXN0TW9kZSAgICAgICA9PiAxLAogICAgfSwKICAgIFByb3ZpZGVyID0+IHsKICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICBUeXBlICAgPT4gJ0hUVFA6OlNPQVAnLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwXzAwMF8wMDAsCiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gewogICAgICAgICAgICBDb25maWdJdGVtVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1VcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDb25maWdJdGVtQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Nlc3Npb246OlNlc3Npb25DcmVhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgUmVxdWVzdGVyID0+IHsKICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICBUeXBlICAgPT4gJ0hUVFA6OlNPQVAnLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgTmFtZVNwYWNlID0+ICdodHRwOi8vb3Rycy5vcmcvU29hcFRlc3RJbnRlcmZhY2UvJywKICAgICAgICAgICAgICAgIEVuY29kaW5nICA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBJbnZva2VyID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ29uZmlnSXRlbVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKfTsKCiMgdXBkYXRlIHdlYnNlcnZpY2Ugd2l0aCByZWFsIGNvbmZpZwpteSAkV2Vic2VydmljZVVwZGF0ZSA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlVXBkYXRlKAogICAgSUQgICAgICA9PiAkV2Vic2VydmljZUlELAogICAgTmFtZSAgICA9PiAkV2Vic2VydmljZU5hbWUsCiAgICBDb25maWcgID0+ICRXZWJzZXJ2aWNlQ29uZmlnLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRXZWJzZXJ2aWNlVXBkYXRlLAogICAgIlVwZGF0ZWQgV2Vic2VydmljZSAkV2Vic2VydmljZUlEIC0gJFdlYnNlcnZpY2VOYW1lIiwKKTsKCiMgZGVidWdnZXIgb2JqZWN0Cm15ICREZWJ1Z2dlck9iamVjdCA9IEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXItPm5ldygKICAgIERlYnVnZ2VyQ29uZmlnID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgV2Vic2VydmljZUlEICAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIENvbW11bmljYXRpb25UeXBlID0+ICdQcm92aWRlcicsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkRGVidWdnZXJPYmplY3QsCiAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcicsCiAgICAnRGVidWdnZXJPYmplY3QgaW5zdGFuY2lhdGUgY29ycmVjdGx5JywKKTsKCiMgR2V0IFNlc3Npb25JRAojIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0Cm15ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKJFNlbGYtPklzKAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgIHJlZiAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdCwKICAgICJTZXNzaW9uSUQgLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCik7CgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tY29uZmlnaXRlbScgXSwKKTsKbXkgJFBhc3N3b3JkID0gJFVzZXJMb2dpbjsKCiMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYnNlcnZpY2UKbXkgJFJlcXVlc3RlclNlc3Npb25SZXN1bHQgPSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdC0+UnVuKAogICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBJbnZva2VyICAgICAgPT4gJ1Nlc3Npb25DcmVhdGUnLAogICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgfSwKKTsKCm15ICROZXdTZXNzaW9uSUQgPSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdC0+e0RhdGF9LT57U2Vzc2lvbklEfTsKCiMgY3JlYXRlIGEgbmV3IGNvbmZpZyBpdGVtIHdpdGggdGhlIGJhc2ljIG9wdGlvbnMKbXkgJENvbmZpZ0l0ZW0gPSB7CiAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgTklDICAgICAgICA9PiAnTG8wJywKICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgIH0sCiAgICB9LAp9OwoKIyBjcmVhdGUgbG9jYWwgb2JqZWN0Cm15ICRDb25maWdJdGVtQ3JlYXRlT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1DcmVhdGUtPm5ldygKICAgIERlYnVnZ2VyT2JqZWN0ID0+ICREZWJ1Z2dlck9iamVjdCwKICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCik7CgojIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCm15ICRDcmVhdGVSZXN1bHQgPSAkQ29uZmlnSXRlbUNyZWF0ZU9iamVjdC0+UnVuKAogICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBJbnZva2VyICAgICAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICBVc2VyTG9naW4gID0+ICRVc2VyTG9naW4sCiAgICAgICAgUGFzc3dvcmQgICA9PiAkUGFzc3dvcmQsCiAgICAgICAgQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSwKICAgIH0sCik7CgpteSAkQ29uZmlnSXRlbUlEID0gJENyZWF0ZVJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSB8fCAnJzsKCiRTZWxmLT5UcnVlKAogICAgJENvbmZpZ0l0ZW1JRCwKICAgICJBZGRlZCBDb25maWdJdGVtICRDb25maWdJdGVtSUQgLSAkQ3JlYXRlUmVzdWx0LT57RGF0YX0tPntOdW1iZXJ9IiwKKTsKCiMgYWN0dWFsIHRlc3RzCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRW1wdHkgUmVxdWVzdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHt9LAogICAgICAgIEV4cGVjdGVkRGF0YSAgID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29uZmlnSXRlbScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ29uZmlnSXRlbUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIENvbmZpZ0l0ZW1JRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICdOb3RFeGlzaXRuZycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBDSVhNTERhdGEnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ0lYTUxEYXRhJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ2xhc3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgTmFtZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIERlcGxTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEluY2lTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgQ2xhc3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdOb3RFeGlzaXRuZycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgRGVwbFN0YXRlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIEluY2lTdGF0ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIE5JQy0+TklDJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOSUMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIE5JQy0+SXBPdmVyREhDUCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTklDID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgTklDLT5OSUMgaW4gYXJyYXknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBOSUMtPklwT3ZlckRIQ1AgaW4gYXJyYXknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIE5JQy0+SXBPdmVyREhDUCBHZW5lcmFsIENhdGFsb2cgaW4gSGFzaCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTklDID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBOSUMtPklwT3ZlckRIQ1AgR2VuZXJhbCBDYXRhbG9nIGluIEFycmF5IEhhc2gnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5JQyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBWZW5kb3IgTG9uZyBUZXh0ICcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdhJyB4IDUxLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnV3JvbmcgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSBEYXRlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5MzAtMzAtMzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBPd25lciBDdXN0b21lcicsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1dyb25nIFJhbSBUb28gTWFueScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgUmFtICAgICAgICAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgIDYsCiAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgIDksCiAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAxMSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdXcm9uZyBBdHRhY2htZW50JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgICAgICBSYW0gICAgICAgICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEF0dGFjaG1lbnQtPkNvbnRlbnQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc1VwZGF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgICAgID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1Rlc3RDSScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZlbmRvciA9PiAnVG9yZXJvIENoaXBzJywKICAgICAgICAgICAgICAgICAgICBOSUMgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSA9PiAnMTk3Ny0xMi0xMicsCiAgICAgICAgICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgICAgIFJhbSAgICAgICAgICAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICA0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICA0MDAwLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBBdHRhY2htZW50LT5Db250ZW50VHlwZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdENJJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIENJWE1MRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+ICdUb3Jlcm8gQ2hpcHMnLAogICAgICAgICAgICAgICAgICAgIE5JQyAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgICAgICAgID0+ICdFdGgxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQb3ZlckRIQ1AgPT4gJ1llcycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgUmFtICAgICAgICAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDQwMDAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnQ29uZmlnSXRlbVVwZGF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEF0dGFjaG1lbnQtPkZpbGVuYW1lJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NVcGRhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ29uZmlnSXRlbSAgID0+IHsKICAgICAgICAgICAgICAgIENsYXNzICAgICA9PiAnQ29tcHV0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXN0Q0knIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ0lYTUxEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWZW5kb3IgPT4gJ1RvcmVybyBDaGlwcycsCiAgICAgICAgICAgICAgICAgICAgTklDICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyAgICAgICAgPT4gJ0V0aDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiAnWWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gJzE5NzctMTItMTInLAogICAgICAgICAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgICAgICBSYW0gICAgICAgICAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgNDAwMCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaGJpQmxibU52WkdWa0lIUmxlSFE9JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdDb25maWdJdGVtVXBkYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdDb25maWdJdGVtVXBkYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NvcnJlY3QgQ29uZmlnSXRlbScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzVXBkYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGVzdCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDSVhNTERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZlbmRvciAgICAgICAgICA9PiAnTGVub3ZvJywKICAgICAgICAgICAgICAgICAgICBNb2RlbCAgICAgICAgICAgPT4gJ1RoaW5rcGFkJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ1RoaW5rcGFkIFgzMDAnLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnRGVza3RvcCcsCiAgICAgICAgICAgICAgICAgICAgT3duZXIgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgU2VyaWFsTnVtYmVyICAgID0+ICdhYmMxMjM0NWFiYycsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW5nU3lzdGVtID0+ICdDZW50T1MgNi4wJywKICAgICAgICAgICAgICAgICAgICBDUFUgICAgICAgICAgICAgPT4gJ0ludGVsIENvcmUgaTMnLAogICAgICAgICAgICAgICAgICAgIFJhbSAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICc0MDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgJzIwMDAnLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgSGFyZERpc2sgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIYXJkRGlzayA9PiAnL2RldicsCiAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5ID0+ICc1MDAwMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBGUUROID0+ICdob3RzLmV4YW1wbGUuY29tJywKICAgICAgICAgICAgICAgICAgICBOSUMgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3MgID0+ICcxOTIuMTY4LjMwLjEnLAoKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTklDICAgICAgICA9PiAnRXRoMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUG92ZXJESENQID0+ICdZZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzICA9PiAnMjAwLjM0LjU2Ljc4JywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIEdyYXBoaWNBZGFwdGVyICAgICAgICAgPT4gJ0FUSSBSYWRlb24gMzAwJywKICAgICAgICAgICAgICAgICAgICBXYXJyYW50eUV4cGlyYXRpb25EYXRlID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBJbnN0YWxsRGF0ZSAgICAgICAgICAgID0+ICcxOTc3LTEyLTEyJywKICAgICAgICAgICAgICAgICAgICBOb3RlICAgICAgICAgICAgICAgICAgID0+ICdUaGlzIGlzIGEgRGVtbyBDSScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHt9LAogICAgICAgIE9wZXJhdGlvbiAgICA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICB9LAopOwoKIyBzdGFydCB0ZXN0aW5nCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgbG9jYWwgb2JqZWN0CiAgICBteSAkTG9jYWxPYmplY3QgPSAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OiRUZXN0LT57T3BlcmF0aW9ufSItPm5ldygKICAgICAgICBEZWJ1Z2dlck9iamVjdCA9PiAkRGVidWdnZXJPYmplY3QsCiAgICAgICAgV2Vic2VydmljZUlEICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q29uZmlnSXRlbTo6JFRlc3QtPntPcGVyYXRpb259IiwKICAgICAgICByZWYgJExvY2FsT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIGxvY2FsIG9iamVjdCIsCiAgICApOwoKICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgbXkgJENsb25lZFJlcXVlc3REYXRhID0gU3RvcmFibGU6OmRjbG9uZSggJFRlc3QtPntSZXF1ZXN0RGF0YX0gKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICBteSAkTG9jYWxSZXN1bHQgPSAkTG9jYWxPYmplY3QtPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgICAgICBJbnZva2VyICAgICAgPT4gJFRlc3QtPntPcGVyYXRpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgICAgICAgICAleyAkVGVzdC0+e1JlcXVlc3REYXRhfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgcmVzdG9yZSBjbG9uZWQgZGF0YQogICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0gPSAkQ2xvbmVkUmVxdWVzdERhdGE7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICAnSEFTSCcsCiAgICAgICAgcmVmICRMb2NhbFJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBzdHJ1Y3R1cmUgaXMgdmFsaWQiLAogICAgKTsKCiAgICAjIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0CiAgICBteSAkUmVxdWVzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKICAgICRTZWxmLT5JcygKICAgICAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInLAogICAgICAgIHJlZiAkUmVxdWVzdGVyT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gVXBkYXRlIHJlcXVlc3RlciBvYmplY3QiLAogICAgKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWJzZXJ2aWNlCiAgICBteSAkUmVxdWVzdGVyUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgICV7ICRUZXN0LT57UmVxdWVzdERhdGF9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICAnSEFTSCcsCiAgICAgICAgcmVmICRSZXF1ZXN0ZXJSZXN1bHQsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IHN0cnVjdHVyZSBpcyB2YWxpZCIsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57U3VjY2Vzc30sCiAgICAgICAgJFRlc3QtPntTdWNjZXNzUmVxdWVzdH0sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgc3VjY2Vzc2Z1bCByZXN1bHQiLAogICAgKTsKCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIHN1Y2NlZWQKICAgIGlmICggJFRlc3QtPntTdWNjZXNzVXBkYXRlfSApIHsKCiAgICAgICAgIyBsb2NhbCByZXN1bHRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgTnVtYmVyIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfSwKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yIGlzIHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgICMgcmVxdWVzdGVyIHJlc3VsdHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IENvbmZpZ0l0ZW1JRCB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntOdW1iZXJ9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgTnVtYmVyIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgRXJyb3IgaXMgdW5kZWZpbmVkLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIENvbmZpZ0l0ZW0gZW50cnkgKGZyb20gbG9jYWwgcmVzdWx0KQogICAgICAgIG15ICRMb2NhbFZlcnNpb25EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkTG9jYWxWZXJzaW9uRGF0YSksCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gY3JlYXRlZCBsb2NhbCB2ZXJzaW9uIHN0cmN0dXJlIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgaXRlbSBlbnRyeSAoZnJvbSByZXF1ZXN0ZXIgcmVzdWx0KQogICAgICAgIG15ICRSZXF1ZXN0ZXJWZXJzaW9uRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCRSZXF1ZXN0ZXJWZXJzaW9uRGF0YSksCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gY3JlYXRlZCByZXF1ZXN0ZXIgY29uZmlnIGl0ZW0gc3RyY3R1cmUgd2l0aCBUcnVlLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBjb25maWcgaXRlbSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIHRlc3QKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoTnVtYmVyIENsYXNzIE5hbWUgSW5jaVN0YXRlIERlcGxTdGF0ZSBEZXBsU3RhdGVUeXBlKSkgewogICAgICAgICAgICBpZiAoICRUZXN0LT57UmVxdWVzdERhdGF9LT57Q29uZmlnSXRlbX0tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkTG9jYWxWZXJzaW9uRGF0YS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57Q29uZmlnSXRlbX0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIENvbmZpZ0l0ZW0tPiRBdHRyaWJ1dGUiIC4gIiBtYXRjaCB0ZXN0IGRlZmluaXRpb24uIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIFhNTCBkYXRhIHRvIGEgY29tcGFyYWJsZSBmb3JtYXQKICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRMb2NhbFZlcnNpb25EYXRhLT57WE1MRGVmaW5pdGlvbn07CgogICAgICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgcmVzdWx0CiAgICAgICAgbXkgJENsb25lZFhNTERhdGEgPSBTdG9yYWJsZTo6ZGNsb25lKCAkTG9jYWxWZXJzaW9uRGF0YS0+e1hNTERhdGF9ICk7CgogICAgICAgIG15ICRGb3JtYXRlZFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPkludmVydEZvcm1hdFhNTERhdGEoCiAgICAgICAgICAgIFhNTERhdGEgPT4gJENsb25lZFhNTERhdGEtPlsxXS0+e1ZlcnNpb259LAogICAgICAgICk7CgogICAgICAgIG15ICRSZXBsYWNlZFhNTERhdGEgPSAkTG9jYWxPYmplY3QtPkludmVydFJlcGxhY2VYTUxEYXRhKAogICAgICAgICAgICBYTUxEYXRhICAgID0+ICRGb3JtYXRlZFhNTERhdGEsCiAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgIyBjb21wYXJlIFhNTCBkYXRhCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkUmVwbGFjZWRYTUxEYXRhLAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57Q0lYTUxEYXRhfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBDb25maWdJdGVtLT5DSVhNTERhdGEgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhdHRhY2htZW50cwogICAgICAgIGlmICggZGVmaW5lZCAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0F0dGFjaG1lbnR9ICkgewogICAgICAgICAgICBteSBAQXR0YWNobWVudExpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXR0YWNobWVudHM7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkRmlsZU5hbWUgKEBBdHRhY2htZW50TGlzdCkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkRmlsZU5hbWU7CgogICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlTmFtZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBuZXh0IGlmIG5vdCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBdHRhY2htZW50KTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBiYXNlNjQKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCAkQXR0YWNobWVudC0+e0NvbnRlbnR9LCAnJyApOwoKICAgICAgICAgICAgICAgICMgZGVsZXRlIG5vdCBuZWVkZWQgYXR0aWJ1dGVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoUHJlZmVyZW5jZXMgRmlsZXNpemUgVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEF0dGFjaG1lbnQtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCAkQXR0YWNobWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFJlcXVlc3RlZEF0dGFjaG1lbnRzOwogICAgICAgICAgICBpZiAoIHJlZiAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0F0dGFjaG1lbnR9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlcXVlc3RlZEF0dGFjaG1lbnRzLCAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAUmVxdWVzdGVkQXR0YWNobWVudHMgPSBAeyAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0NvbmZpZ0l0ZW19LT57QXR0YWNobWVudH0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFxAUmVxdWVzdGVkQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIENvbmZpZ0l0ZW0tPkF0dGFjaG1lbnQgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFZlcnNpb25EYXRhLAogICAgICAgICAgICAkUmVxdWVzdGVyVmVyc2lvbkRhdGEsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgY29uZmlnIGl0ZW0gcmVzdWx0IG1hdGNoZWQgd2l0aCByZW1vdGUgcmVzdWx0LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIGZhaWwKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgQ29uZmlnSXRlbUlEIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgTnVtYmVyIHdpdGggZmFsc2UuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkRGF0YX0tPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yQ29kZSBtYXRjaGVkIHdpdGggZXhwZWN0ZWQgbG9jYWwgY2FsbCByZXN1bHQuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSB3aXRoIHRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAnJywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb3JNZXNzYWdlIGlzIG5vdCBlbXB0eS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0KICAgICAgICAgICAgICAgIC4gJzogJwogICAgICAgICAgICAgICAgLiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSAob3V0c2lkZSBEYXRhIGhhc2gpIG1hdGNoZWQgd2l0aCBjb25jYXRlbmF0aW9uIgogICAgICAgICAgICAgICAgLiAiIG9mIEVycm9yQ29kZSBhbmQgRXJyb3JNZXNzYWdlIHdpdGhpbiBEYXRhIGhhc2guIiwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBFcnJvck1lc3NhZ2UgcGFyYW1ldGVyIGZyb20gZGlyZWN0IGNhbGwKICAgICAgICAjIHJlc3VsdCB0byBiZSBjb25zaXN0ZW50IHdpdGggU09BUCBjYWxsIHJlc3VsdAogICAgICAgIGlmICggJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApIHsKICAgICAgICAgICAgZGVsZXRlICRMb2NhbFJlc3VsdC0+e0Vycm9yTWVzc2FnZX07CiAgICAgICAgfQoKICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb01lc3NhZ2UgKG91dHNpc2UgRGF0YSBoYXNoKSBnb3QgcmVtb3ZlZCB0byBjb21wYXJlIgogICAgICAgICAgICAgICAgLiAiIGxvY2FsIGFuZCByZW1vdGUgdGVzdHMuIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdCwKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgbWF0Y2hlZCB3aXRoIHJlbW90ZSByZXN1bHQuIiwKICAgICAgICApOwogICAgfQp9CgojIGNsZWFuIHVwIGNvbmZpZyBpdGVtcwpteSAkQ29uZmlnSXRlbURlbGV0ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJENvbmZpZ0l0ZW1EZWxldGUsCiAgICAiQ29uZmlnSXRlbURlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIENvbmZpZ0l0ZW0gSUQgJENvbmZpZ0l0ZW1JRCIsCik7CgojIGNsZWFuIHVwIHdlYnNlcnZpY2UKbXkgJFdlYnNlcnZpY2VEZWxldGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZURlbGV0ZSgKICAgIElEICAgICA9PiAkV2Vic2VydmljZUlELAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VEZWxldGUsCiAgICAiRGVsZXRlZCBXZWJzZXJ2aWNlICRXZWJzZXJ2aWNlSUQiLAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKKTsKbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCm15ICRDbGFzc0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1BZGQoCiAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICBOYW1lICAgID0+ICRSYW5kb21JRCwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkQ2xhc3NJRCwKICAgICJDbGFzcyBhZGRlZCB0byBHZW5lcmFsQ2F0YWxvZyIsCik7CgpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnRW1wdHknLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgQ2xhc3NzSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERlZmluaXRpb24gPT4gPDwgJ0VPRicsCi0tLQotIEtleTogVmVuZG9yCiAgTmFtZTogVmVuZG9yCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogNTAKRU9GCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgRGVmaW5pdGlvbicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICBEZWZpbml0aW9uID0+IDw8ICdFT0YnLAotLS0KLSBLZXk6IFZlbmRvcgogIE5hbWU6IFZlbmRvcgogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCkVPRgogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1dyb25nIERlZmluaXRpb24gKExlZ2FjeSBQZXJsKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiA8PCAnRU9GJywKWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1ZlbmRvcicsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmVuZG9yJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwCiAgICAgICAgfSwKICAgIH0sCl07CkVPRgogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBEZWZpbml0aW9uIChJbnZhbGlkIFlBTUwpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICBEZWZpbml0aW9uID0+IDw8ICdFT0YnLAotLS0KVGVzdAogSW52YWxpZAotIEtleTogVmVuZG9yCiAgTmFtZTogVmVuZG9yCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogNTAKRU9GCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NvcnJlY3QgQVNDSUknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIERlZmluaXRpb24gPT4gPDwgJ0VPRicsCi0tLQotIEtleTogVmVuZG9yCiAgTmFtZTogVmVuZG9yCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogNTAKRU9GCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKCik7CgpteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKVEVTVDoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICBteSAkRGVmaW5pdGlvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25BZGQoICV7ICRUZXN0LT57Q29uZmlnfSB9ICk7CgogICAgaWYgKCAhJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICREZWZpbml0aW9uSUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IERlZmluaXRpb25BZGQoKSAtIFdpdGggZmFsc2UiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAkRGVmaW5pdGlvbklEIC8vIDAsCiAgICAgICAgMCwKICAgICAgICAiJFRlc3QtPntOYW1lfSBEZWZpbml0aW9uQWRkKCkgLSBEZWZpbml0aW9uSUQiCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKKTsKbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCm15ICRDbGFzc0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1BZGQoCiAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICBOYW1lICAgID0+ICRSYW5kb21JRCwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkQ2xhc3NJRCwKICAgICJDbGFzcyBhZGRlZCB0byBHZW5lcmFsQ2F0YWxvZyIsCik7CgpteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwpteSAkRGVmaW5pdGlvbklEMSAgICA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQWRkKAogICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgIENyZWF0ZUJ5ICAgPT4gJFVzZXJJRCwKICAgIERlZmluaXRpb24gPT4gPDwgJ0VPRicsCi0tLQotIEtleTogVmVuZG9yCiAgTmFtZTogVmVuZG9yCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogNTAKRU9GCik7CiRTZWxmLT5UcnVlKAogICAgJERlZmluaXRpb25JRDEsCiAgICAiRGVmaW5pdGlvbkFkZCgpIiwKKTsKbXkgJERlZmluaXRpb25JRDIgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkFkZCgKICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICBDcmVhdGVCeSAgID0+ICRVc2VySUQsCiAgICBEZWZpbml0aW9uID0+IDw8ICdFT0YnLAotLS0KLSBLZXk6IFZlbmRvcgogIE5hbWU6IFZlbmRvcgogIFNlYXJjaGFibGU6IDAKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCkVPRgopOwoKJFNlbGYtPlRydWUoCiAgICAkRGVmaW5pdGlvbklEMiwKICAgICJEZWZpbml0aW9uQWRkKCkiLAopOwoKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0VtcHR5JywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdCeSBDbGFzc0lEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyAgICAgICAgID0+IDEsCiAgICAgICAgRXhwZWN0ZWRSZXN1bHRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiA8PCAnRU9GJywKLS0tCi0gS2V5OiBWZW5kb3IKICBOYW1lOiBWZW5kb3IKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MApFT0YKICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICA9PiAxLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uSUQxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+IDw8ICdFT0YnLAotLS0KLSBLZXk6IFZlbmRvcgogIE5hbWU6IFZlbmRvcgogIFNlYXJjaGFibGU6IDAKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCkVPRgogICAgICAgICAgICAgICAgVmVyc2lvbiAgICAgID0+IDIsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25JRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCik7CgpURVNUOgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgIG15ICREZWZpbml0aW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uTGlzdCggJXsgJFRlc3QtPntDb25maWd9IH0gKTsKCiAgICBpZiAoICEkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJERlZmluaXRpb25MaXN0LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSBEZWZpbml0aW9uTGlzdCgpIC0gV2l0aCBmYWxzZSIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgZm9yIG15ICREZWZpbml0aW9uICggQHskRGVmaW5pdGlvbkxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0NyZWF0ZVRpbWV9OwogICAgfQoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkRGVmaW5pdGlvbkxpc3QsCiAgICAgICAgJFRlc3QtPntFeHBlY3RlZFJlc3VsdHN9LAogICAgICAgICIkVGVzdC0+e05hbWV9IERlZmluaXRpb25MaXN0KCkgLSBEZWZpbml0aW9uIgogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKKTsKbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCm15ICRDbGFzc0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1BZGQoCiAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICBOYW1lICAgID0+ICRSYW5kb21JRCwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkQ2xhc3NJRCwKICAgICJDbGFzcyBhZGRlZCB0byBHZW5lcmFsQ2F0YWxvZyIsCik7CgpteSAkQ29uZmlnSXRlbU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7Cm15ICVEZWZpbml0aW9uVGVtcGxhdGUgPSAoCiAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgQ2xhc3MgICAgICA9PiAkUmFuZG9tSUQsCiAgICBDcmVhdGVCeSAgID0+ICRVc2VySUQsCiAgICBWZXJzaW9uICAgID0+IDEsCiAgICBEZWZpbml0aW9uID0+IDw8ICdFT0YnLAotLS0KLSBLZXk6IFZlbmRvcgogIE5hbWU6IFZlbmRvcgogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCkVPRgogICAgRGVmaW5pdGlvblJlZiA9PiBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgID0+ICdWZW5kb3InLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWZW5kb3InLAogICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ291bnRNaW4gICAgID0+IDEsCiAgICAgICAgICAgIENvdW50TWF4ICAgICA9PiAxLAogICAgICAgICAgICBDb3VudERlZmF1bHQgPT4gMSwKICAgICAgICB9LAogICAgXSwKKTsKbXkgJERlZmluaXRpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQWRkKAogICAgJURlZmluaXRpb25UZW1wbGF0ZSwKICAgIFVzZXJJRCA9PiAkVXNlcklELAopOwokU2VsZi0+VHJ1ZSgKICAgICREZWZpbml0aW9uSUQsCiAgICAiRGVmaW5pdGlvbkFkZCgpIiwKKTsKCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdFbXB0eScsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQnkgRGVmaW5pdGlvbklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25JRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgICAgICAgICA9PiAxLAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyA9PiB7CiAgICAgICAgICAgICVEZWZpbml0aW9uVGVtcGxhdGUsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbklELAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQnkgQ2xhc3NJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgICAgICAgICA9PiAxLAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyA9PiB7CiAgICAgICAgICAgICVEZWZpbml0aW9uVGVtcGxhdGUsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbklELAogICAgICAgIH0sCiAgICB9LAopOwoKVEVTVDoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KCAleyAkVGVzdC0+e0NvbmZpZ30gfSApOwoKICAgIGlmICggISRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkRGVmaW5pdGlvbiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gRGVmaW5pdGlvbkdldCgpIC0gV2l0aCBmYWxzZSIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgZGVsZXRlICREZWZpbml0aW9uLT57Q3JlYXRlVGltZX07CgogICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICREZWZpbml0aW9uLAogICAgICAgICRUZXN0LT57RXhwZWN0ZWRSZXN1bHRzfSwKICAgICAgICAiJFRlc3QtPntOYW1lfSBEZWZpbml0aW9uR2V0KCkgLSBEZWZpbml0aW9uIgogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIFNldCB0aW1lem9uZSB2YXJpYWJsZXMuCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdUaW1lWm9uZScsCiAgICBWYWx1ZSA9PiAnKzAnLAopOwokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnVGltZVpvbmVVc2VyJywKICAgIFZhbHVlID0+IDEsCik7CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdUaW1lWm9uZVVzZXJCcm93c2VyQXV0b09mZnNldCcsCiAgICBWYWx1ZSA9PiAwLAopOwoKIyBTZXQgbGF5b3V0IG9iamVjdCB0byB0aW1lIHpvbmUgd2VzdCBvZiBVVEMuCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgTGFuZyAgICAgICAgID0+ICdlbicsCiAgICAgICAgVXNlclRpbWVab25lID0+ICctNicsCiAgICB9LAopOwpteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKIyBUZXN0IElUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoKSB0byBjaGVjayBidWcjMTQxNzQgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNzQpLgpteSAlUGFyYW0gPSAoCiAgICAnSXRlbScgPT4gewogICAgICAgICdTZWFyY2hhYmxlJyA9PiAxLAogICAgICAgICdGb3JtJyAgICAgICA9PiB7CiAgICAgICAgICAgICdJbnN0YWxsRGF0ZTo6MScgPT4ge30KICAgICAgICB9LAogICAgICAgICdLZXknICAgICAgPT4gJ0luc3RhbGxEYXRlJywKICAgICAgICAnQ291bnRNYXgnID0+IDEsCiAgICAgICAgJ05hbWUnICAgICA9PiAnSW5zdGFsbCBEYXRlJywKICAgICAgICAnQ291bnRNaW4nID0+IDAsCiAgICAgICAgJ0lucHV0JyAgICA9PiB7CiAgICAgICAgICAgICdUeXBlJyAgICAgICAgICAgICA9PiAnRGF0ZScsCiAgICAgICAgICAgICdZZWFyUGVyaW9kRnV0dXJlJyA9PiAxMCwKICAgICAgICAgICAgJ1JlcXVpcmVkJyAgICAgICAgID0+IDEsCiAgICAgICAgICAgICdZZWFyUGVyaW9kUGFzdCcgICA9PiAyMAogICAgICAgIH0sCiAgICAgICAgJ0NvdW50RGVmYXVsdCcgPT4gMAogICAgfSwKICAgICdJbnZhbGlkJyAgPT4gMCwKICAgICdWYWx1ZScgICAgPT4gJzIwMTgtMDEtMTYnLAogICAgJ0tleScgICAgICA9PiAnSW5zdGFsbERhdGU6OjEnLAogICAgJ1JlcXVpcmVkJyA9PiAxLAogICAgJ0l0ZW1JZCcgICA9PiAnSXRlbTE0MCcKKTsKCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBPdmVycmlkZVRpbWVab25lID0+IDAsCiAgICAgICAgRXhwZWN0ZWQgICAgICAgICA9PiAnPG9wdGlvbiBccyB2YWx1ZT0iMTUiIFxzIHNlbGVjdGVkPSJzZWxlY3RlZCI+MTU8L29wdGlvbj4nLAogICAgICAgIENvbW1lbnQgICAgICAgICAgPT4gJ2RhdGUgaXMgY2hhbmdlZCcsCiAgICB9LAogICAgewogICAgICAgIE92ZXJyaWRlVGltZVpvbmUgPT4gMSwKICAgICAgICBFeHBlY3RlZCAgICAgICAgID0+ICc8b3B0aW9uIFxzIHZhbHVlPSIxNiIgXHMgc2VsZWN0ZWQ9InNlbGVjdGVkIj4xNjxcL29wdGlvbj4nLAogICAgICAgIENvbW1lbnQgICAgICAgICAgPT4gJ2RhdGUgaXMgbm90IGNoYW5nZWQnLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1JbnB1dENyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSA9PiAkVGVzdC0+e092ZXJyaWRlVGltZVpvbmV9LAogICAgKTsKCiAgICBteSAkU3VjY2VzczsKICAgIGlmICggJFN0cmluZyA9fiBteyAkVGVzdC0+e0V4cGVjdGVkfSB9bXN4ICkgewogICAgICAgICRTdWNjZXNzID0gMTsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiT3ZlcnJpZGVUaW1lWm9uZSA9ICRUZXN0LT57T3ZlcnJpZGVUaW1lWm9uZX0gLSAkVGVzdC0+e0NvbW1lbnR9IiwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY29uZmlnaXRlbScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbklUU01Db25maWdJdGVtCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5JVFNNQ29uZmlnSXRlbSIpOwoKICAgICAgICAjIHRlc3QgZGVmYXVsdCBJVFNNQ29uZmlnSXRlbSBjbGFzcwogICAgICAgIGZvciBteSAkSXRlbSAocXcoIENvbXB1dGVyIEhhcmR3YXJlIExvY2F0aW9uIE5ldHdvcmsgU29mdHdhcmUgKSkgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkSXRlbSwgJ2xpbmtfdGV4dCcgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdGFibGUgc3RydWN0dXJlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRoZWFkIHRyIHRoIiwgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0Ym9keSB0ciB0ZCIsICdjc3MnICk7CgogICAgICAgICAgICAjIGNsaWNrIG9uICdDaGFuZ2UgY2xhc3MgZGVmaW5pdGlvbicKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J0FkZCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgaW5wdXQgYXJlYQogICAgICAgICAgICBteSAkSW5wdXRGaWVsZCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RlZmluaXRpb24iLCAnY3NzJyApOwogICAgICAgICAgICAkSW5wdXRGaWVsZC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkSW5wdXRGaWVsZC0+aXNfZGlzcGxheWVkKCk7CgogICAgICAgICAgICAjIHJldHVybiBiYWNrIHRvIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWRtaW5JVFNNQ29uZmlnSXRlbScgKV0iKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgIG15ICVTaG93Q29sdW1uc0J5Q2xhc3NTeXNDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyktPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Nob3dDb2x1bW5zQnlDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgJVNob3dDb2x1bW5zQnlDbGFzc1N5c0NvbmZpZyA9IG1hcCB7ICRfLT57Q29udGVudH0gPT4gMSB9CiAgICAgICAgICAgIGdyZXAgeyBkZWZpbmVkICRfLT57Q29udGVudH0gfSBAeyAkU2hvd0NvbHVtbnNCeUNsYXNzU3lzQ29uZmlne1NldHRpbmd9LT5bMV0tPntBcnJheX0tPlsxXS0+e0l0ZW19IH07CiAgICAgICAgbXkgQFNob3dDb2x1bW5zQnlDbGFzc1N5c0NvbmZpZyA9IHNvcnQga2V5cyAlU2hvd0NvbHVtbnNCeUNsYXNzU3lzQ29uZmlnOwoKICAgICAgICAjIEVuYWJsZSBBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnNCeUNsYXNzIHN5c2NvbmZpZyBpdGVtLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW0jIyNTaG93Q29sdW1uc0J5Q2xhc3MnLAogICAgICAgICAgICBWYWx1ZSA9PiBcQFNob3dDb2x1bW5zQnlDbGFzc1N5c0NvbmZpZywKICAgICAgICApOwoKICAgICAgICAjIEdldCBjYXRhbG9nIGNsYXNzIElEcy4KICAgICAgICBteSBAQ29uZmlnSXRlbUNsYXNzSURzOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUNsYXNzIChxdyhDb21wdXRlciBIYXJkd2FyZSBMb2NhdGlvbiBOZXR3b3JrIFNvZnR3YXJlKSkgewogICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJENvbmZpZ0l0ZW1DbGFzcywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUNsYXNzSURzLCAkQ29uZmlnSXRlbURhdGFSZWYtPntJdGVtSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgJ1Byb2R1Y3Rpb24nIGRlcGxveW1lbnQgc3RhdGUgSUQuCiAgICAgICAgbXkgJERlcGxTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBteSAkRGVwbFN0YXRlSUQgPSAkRGVwbFN0YXRlRGF0YVJlZi0+e0l0ZW1JRH07CgogICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgogICAgICAgICMgQ3JlYXRlIENvbmZpZ0l0ZW0gZm9yIGVhY2ggQ29uZmlnSXRlbSBjbGFzcy4KICAgICAgICBteSBAQ29uZmlnSXRlbU51bWJlcnM7CiAgICAgICAgbXkgQENvbmZpZ0l0ZW1JRHM7CiAgICAgICAgZm9yIG15ICRJVFNNQ29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1DbGFzc0lEcykgewoKICAgICAgICAgICAgIyBDcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIuCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkSVRTTUNvbmZpZ0l0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbSBudW1iZXIgaXMgY3JlYXRlZCAtICRDb25maWdJdGVtTnVtYmVyIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgJENvbmZpZ0l0ZW1OdW1iZXI7CgogICAgICAgICAgICAjIEFkZCB0aGUgbmV3IENvbmZpZ0l0ZW0uCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRJVFNNQ29uZmlnSXRlbSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgY3JlYXRlZCAtIElEICRDb25maWdJdGVtSUQiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFkZCBhIG5ldyB2ZXJzaW9uLgogICAgICAgICAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlbGVuaXVtVGVzdCcsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlSUQsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAgICAgICAgICJWZXJzaW9uIGlzIGNyZWF0ZWQgLSBJRCAkVmVyc2lvbklEIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbi4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW0sIHNvcnRlZCBieSBjcmVhdGVkIHRpbWUuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW07RmlsdGVyPUFsbDtWaWV3PTs7U29ydEJ5PUNoYW5nZVRpbWU7T3JkZXJCeT1Eb3duIgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtcyB3aXRoICdBbGwnIGZpbHRlciBhY3RpdmUKICAgICAgICBmb3IgbXkgJEFsbENvbmZpZ0l0ZW0gKEBDb25maWdJdGVtTnVtYmVycykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2Rpdltjb250YWlucyhcQHRpdGxlLCAnJEFsbENvbmZpZ0l0ZW0nICldIiksCiAgICAgICAgICAgICAgICAiVGVzdCBDb25maWdJdGVtIG51bWJlciAkQWxsQ29uZmlnSXRlbSAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgZWFjaCBvZiBDb25maWdJdGVtIGNsYXNzIGZpbHRlcnMgZm9yIHRoZXJlIHJlc3BlY3RpdmUgdGVzdCBDb25maWdJdGVtCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBmb3IgbXkgJENoZWNrQ29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gQ29uZmlnSXRlbSBjbGFzcwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtO1NvcnRCeT1DaGFuZ2VUaW1lO09yZGVyQnk9RG93bjtWaWV3PTtGaWx0ZXI9JENvbmZpZ0l0ZW1DbGFzc0lEc1skQ291bnRdJyApXSIKICAgICAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBDaGVjayBmb3IgdGFibGUgc3RydWN0dXJlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI092ZXJ2aWV3Qm9keSAuVGFibGVTbWFsbCIsICdjc3MnICk7CgogICAgICAgICAgICAjIENoZWNrIGZvciBDb25maWdJdGVtIG51bWJlcgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2Rpdltjb250YWlucyhcQHRpdGxlLCAnJENvbmZpZ0l0ZW1OdW1iZXJzWyRDb3VudF0nICldIiksCiAgICAgICAgICAgICAgICAiVGVzdCBDb25maWdJdGVtIG51bWJlciAkQ29uZmlnSXRlbU51bWJlcnNbJENvdW50XSAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZXJlIGlzIGNvbHVtbiBDcmVhdGUgVGltZSBmb3IgQ29tcHV0ZXIgY2xhc3MKICAgICAgICAgICAgIyBTZWUgYnVnIzE0MDQ5CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDaGVja0NvbmZpZ0l0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q2xhc3N9IGVxICdDb21wdXRlcicgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKC4sJ0NyZWF0ZSBUaW1lJyldIiksCiAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIGNvb2x1bW4gJ0NyZWF0ZVRpbWUnLCBlbmFibGVkIGJ5IHN5c2NvbmZpZyBpdGVtICBBZ2VudElUU01Db25maWdJdGVtIyMjU2hvd0NvbHVtbnNCeUNsYXNzIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtcy4KICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1EZWxldGUgKEBDb25maWdJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1EZWxldGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGRlbGV0ZWQgLSBJRCAkQ29uZmlnSXRlbURlbGV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIElEcwogICAgICAgIG15IEBDb25maWdJdGVtQ2xhc3NJRHM7CiAgICAgICAgbXkgQENvbmZpZ0l0ZW1DbGFzc05hbWVzOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUNsYXNzIChxdyhDb21wdXRlciBIYXJkd2FyZSBMb2NhdGlvbiBOZXR3b3JrIFNvZnR3YXJlKSkgewogICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ29uZmlnSXRlbUNsYXNzLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICAgJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUNsYXNzTmFtZXMsICRDb25maWdJdGVtRGF0YVJlZi0+e05hbWV9OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNvbmZpZ2l0ZW0nIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ29uZmlnSXRlbUFkZAogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQiKTsKCiAgICAgICAgIyBjaGVjayBmb3IgSVRTTUNvbmZpZ0l0ZW0gY2xhc3NlcwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUNsYXNzTmFtZSAoQENvbmZpZ0l0ZW1DbGFzc05hbWVzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDb25maWdJdGVtQ2xhc3NOYW1lICkgPiAtMSwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtIGNsYXNzICRDb25maWdJdGVtQ2xhc3NOYW1lIC0gZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgbGlua3MgdG8gJ0FkZCcgbmV3IGl0ZW0gZm9yIGVhY2ggY2xhc3MKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1DbGFzc0FkZCAoQENvbmZpZ0l0ZW1DbGFzc0lEcykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7Q2xhc3NJRD0kQ29uZmlnSXRlbUNsYXNzQWRkJyApXSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDb25maWdJdGVtIElEICRDb25maWdJdGVtQ2xhc3NBZGQgYWRkIGxpbmsgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCAnQ29tcHV0ZXInIGNhdGFsb2cgY2xhc3MgSURzCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICBOYW1lICA9PiAnQ29tcHV0ZXInLAogICAgICAgICk7CiAgICAgICAgbXkgJENvbXB1dGVyQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgJ1Byb2R1Y3Rpb24nIGFuZCAnUmVwYWlyJyBkZXBsb3ltZW50IHN0YXRlIElEcwogICAgICAgIG15IEBEZXBsU3RhdGVJRHM7CiAgICAgICAgZm9yIG15ICREZXBsU3RhdGUgKHF3IChQcm9kdWN0aW9uIFJlcGFpcikpIHsKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREZXBsU3RhdGUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQERlcGxTdGF0ZUlEcywgJERlcGxTdGF0ZURhdGFSZWYtPntJdGVtSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBjcmVhdGUgdGhyZWUgdGVzdCBDb25maWdJdGVtcyBmb3IgJ0NvbXB1dGVyJyBDb25maWdJdGVtIGNsYXNzCiAgICAgICAgbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwogICAgICAgIG15IEBDb25maWdJdGVtSURzOwogICAgICAgIGZvciBteSAkSVRTTUNvbmZpZ0l0ZW0gKCAxIC4uIDMgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBDb25maWdJdGVtIG51bWJlcgogICAgICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbXB1dGVyQ29uZmlnSXRlbUlELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gbnVtYmVyIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU51bWJlciIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCAkQ29uZmlnSXRlbU51bWJlcjsKCiAgICAgICAgICAgICMgYWRkIHRoZSBuZXcgQ29uZmlnSXRlbQogICAgICAgICAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29tcHV0ZXJDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGNyZWF0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgdmVyc2lvbgogICAgICAgICAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlbGVuaXVtVGVzdCcsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlSURzWzBdLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAiVmVyc2lvbiBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW0sIHNvcnRlZCBieSBjcmVhdGVkIHRpbWUKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbTtGaWx0ZXI9QWxsO1ZpZXc9OztTb3J0Qnk9Q2hhbmdlVGltZTtPcmRlckJ5PURvd24iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgdHdvIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtcwogICAgICAgIGZvciBteSAkU2VsZWN0Q29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgICAgICMgZG9uJ3QgY2xpY2sgb24gdGhpcmQgdGVzdCBDb25maWdJdGVtCiAgICAgICAgICAgIGlmICggJFNlbGVjdENvbmZpZ0l0ZW0gbmUgJENvbmZpZ0l0ZW1JRHNbMl0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQHZhbHVlPSckU2VsZWN0Q29uZmlnSXRlbSddIiktPmNsaWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2xpY2sgb24gYnVsayBhY3Rpb24KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nQnVsayddIiktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHRvICdCdWxrJyB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjRGVwbFN0YXRlSUQiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgc2NyZWVuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIExpbmtUb2dldGhlciBMaW5rVG9nZXRoZXJMaW5rVHlwZSBMaW5rVG9nZXRoZXJBbm90aGVyIExpbmtUeXBlIHN1Ym1pdFJpY2hUZXh0KQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgY2hhbmdlIGRlcGxveW1lbnQgc3RhdGUgdG8gJ1JlcGFpcicgZm9yIHRlc3QgQ29uZmlnSXRlbXMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0RlcGxTdGF0ZUlEJykudmFsKCckRGVwbFN0YXRlSURzWzFdJyk7Iik7CgogICAgICAgICMgbGluayAnQWx0ZXJuYXRpdmUgdG8nIHRlc3QgQ29uZmlnSXRlbXMgdG9nZXRoZXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNMaW5rVG9nZXRoZXIgb3B0aW9uW3ZhbHVlPScxJ10iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTGlua1RvZ2V0aGVyTGlua1R5cGUgb3B0aW9uW3ZhbHVlPSdDb25uZWN0ZWRUbzo6U291cmNlJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIGxpbmsgdGhpcmQgdGVzdCBDb25maWdJdGVtIGFzIHBhcnQgb2YgZmlyc3QgdHdvCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTGlua1RvZ2V0aGVyQW5vdGhlciIsICdjc3MnICktPnNlbmRfa2V5cyggJENvbmZpZ0l0ZW1OdW1iZXJzWzJdICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTGlua1R5cGUgb3B0aW9uW3ZhbHVlPSdJbmNsdWRlczo6VGFyZ2V0J10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHN1Ym1pdCBidWxrIGNoYW5nZXMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNzdWJtaXRSaWNoVGV4dCIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAjIFdhaXQgZm9yIHJlbG9hZCB0byBraWNrIGluLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoQ29yZSkgPT0gIm9iamVjdCIgJiYgdHlwZW9mKENvcmUuQXBwKSA9PSAib2JqZWN0IiAmJiBDb3JlLkFwcC5QYWdlTG9hZENvbXBsZXRlJwogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb24gZmlyc3QgY3JlYXRlZCB0ZXN0IENvbmZpZ0l0ZW1zIHRvIGVudGVyIHpvb20gdmlldy4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0NvbmZpZ0l0ZW1JRF8kQ29uZmlnSXRlbUlEc1sxXScpLmNsaWNrKCk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNJVFNNVHJlZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBDaGVjayBmb3Igb3RoZXIgdHdvIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtcy4KICAgICAgICAjIFZlcmlmeSB0aGF0IGxpbmsgYWN0aW9uIGluIGJ1bGsgc2NyZWVuIHdhcyBzdWNjZXNzLgogICAgICAgIGZvciBteSAkQ2hlY2tDb25maWdJdGVtIChAQ29uZmlnSXRlbU51bWJlcnMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoZWNrQ29uZmlnSXRlbSApID4gLTEsCiAgICAgICAgICAgICAgICAiVGVzdCBDb25maWdJdGVtIG51bWJlciAkQ2hlY2tDb25maWdJdGVtIC0gZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5NYXN0ZXJBY3Rpb24gdGQ6ZXEoMSkgc3BhbicpLnRleHQoKTsiKSwKICAgICAgICAgICAgJ1JlcGFpcicsCiAgICAgICAgICAgICJEZXBsb3ltZW50IHN0YXRlIGlzIFJlcGFpci4iLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtcy4KICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1EZWxldGUgKEBDb25maWdJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1EZWxldGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDb25maWcgaXRlbSBpcyBkZWxldGVkIC0gSUQgJENvbmZpZ0l0ZW1EZWxldGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgR2V0ICdIYXJkd2FyZScgY2F0YWxvZyBjbGFzcyBJRHMuCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICBOYW1lICA9PiAnSGFyZHdhcmUnLAogICAgICAgICk7CiAgICAgICAgbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBHZXQgJ1Byb2R1Y3Rpb24nIGRlcGxveW1lbnQgc3RhdGUgSURzLgogICAgICAgIG15ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICApOwogICAgICAgIG15ICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQgPSAkUHJvZHVjdGlvbkRlcGxTdGF0ZURhdGFSZWYtPntJdGVtSUR9OwoKICAgICAgICAjIENyZWF0ZSBDb25maWdJdGVtIG51bWJlci4KICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gbnVtYmVyIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU51bWJlciIKICAgICAgICApOwoKICAgICAgICAjIEFkZCB0aGUgbmV3IENvbmZpZ0l0ZW0uCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGNyZWF0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIgogICAgICAgICk7CgogICAgICAgICMgQWRkIGEgbmV3IHZlcnNpb24uCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1OYW1lID0gJ0hhcmR3YXJlJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFZlcnNpb25JRCAgICAgID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbU5hbWUsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVmVyc2lvbklELAogICAgICAgICAgICAiVmVyc2lvbiBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNvbmZpZ2l0ZW0nIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW1JRDtWZXJzaW9uPSRWZXJzaW9uSUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgQ29uZmlnSXRlbSB2YWx1ZSBwYXJhbXMuCiAgICAgICAgbXkgQENvbmZpZ0l0ZW1WYWx1ZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlID0+ICdIYXJkd2FyZScsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAncC5WYWx1ZTpjb250YWlucyhIYXJkd2FyZSknLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQ29uZmlnSXRlbU5hbWUsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAiaDE6Y29udGFpbnMoJENvbmZpZ0l0ZW1OYW1lKSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBDb25maWdJdGVtIHZhbHVlcyBvbiBzY3JlZW4uCiAgICAgICAgZm9yIG15ICRDaGVja0NvbmZpZ0l0ZW1WYWx1ZSAoQENvbmZpZ0l0ZW1WYWx1ZXMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyRDaGVja0NvbmZpZ0l0ZW1WYWx1ZS0+e0NoZWNrfScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIlRlc3QgQ29uZmlnSXRlbSB2YWx1ZSAkQ2hlY2tDb25maWdJdGVtVmFsdWUtPntWYWx1ZX0gLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENsaWNrIG9uICdEdXBsaWNhdGUnIG1lbnUgaXRlbSBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0O0R1cGxpY2F0ZUlEPSRDb25maWdJdGVtSUQ7VmVyc2lvbklEPSRWZXJzaW9uSURcJyApXSIKICAgICAgICApLT5jbGljaygpOwoKICAgICAgICAjIFN3aXRjaCB3aW5kb3cuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEZXBsU3RhdGVJRCIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGNyZWF0ZWQgQ29uZmlnSXRlbSB2YWx1ZXMuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRDb25maWdJdGVtTmFtZSwKICAgICAgICAgICAgIiNOYW1lIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0RlcGxTdGF0ZUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQsCiAgICAgICAgICAgICIjRGVwbFN0YXRlSUQgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjSW5jaVN0YXRlSUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIiNJbmNpU3RhdGVJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgRWRpdCBuYW1lIGZvciBkdXBsaWNhdGUgdGVzdCBDb25maWdJdGVtLgogICAgICAgIG15ICREdXBsaWNhdGVDb25maWdJdGVtTmFtZSA9ICJEdXBsaWNhdGUiIC4gJENvbmZpZ0l0ZW1OYW1lOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAnY3NzJyApLT5zZW5kX2tleXMoJER1cGxpY2F0ZUNvbmZpZ0l0ZW1OYW1lKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwoKICAgICAgICAjIFN3aXRjaCBiYWNrIHRvIHpvb20gdmlldy4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2gxOmNvbnRhaW5zKCREdXBsaWNhdGVDb25maWdJdGVtTmFtZSknKS5sZW5ndGg7IgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGR1cGxpY2F0ZWQgQ29uZmlnSXRlbSB2YWx1ZS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2gxOmNvbnRhaW5zKCREdXBsaWNhdGVDb25maWdJdGVtTmFtZSknKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiVGVzdCBDb25maWdJdGVtIHZhbHVlICREdXBsaWNhdGVDb25maWdJdGVtTmFtZSAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgQ29uZmlnSXRlbXMuCiAgICAgICAgZm9yIG15ICREZWxldGVDb25maWdJdGVtICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGRlbGV0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCsrOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICBteSBAVGVzdCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNsYXNzID0+ICdDb21wdXRlcicsCiAgICAgICAgICAgICAgICBDaGVja0VkaXRGaWVsZHMgPT4gWwogICAgICAgICAgICAgICAgICAgICdOYW1lJywgJ0RlcGxTdGF0ZUlEJywgJ0luY2lTdGF0ZUlEJywgJ1ZlbmRvcicsICdNb2RlbCcsICdEZXNjcmlwdGlvbicsICdUeXBlJywgJ093bmVyJywKICAgICAgICAgICAgICAgICAgICAnU2VyaWFsTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW5nU3lzdGVtJywgJ0NQVScsICdSYW0nLCAnSGFyZERpc2snLCAnQ2FwYWNpdHknLCAnRlFETicsICdOSUMnLCAnUG92ZXJESENQJywKICAgICAgICAgICAgICAgICAgICAnR3JhcGhpY0FkYXB0ZXInLAogICAgICAgICAgICAgICAgICAgICdPdGhlckVxdWlwbWVudCcsICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJywgJ0luc3RhbGxEYXRlJywgJ05vdGUnLCAnRmlsZVVwbG9hZCcsICdTdWJtaXRTYXZlJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUNsYXNzID0+ICdIYXJkd2FyZScsCiAgICAgICAgICAgICAgICBDaGVja0VkaXRGaWVsZHMgPT4gWwogICAgICAgICAgICAgICAgICAgICdOYW1lJywgJ0RlcGxTdGF0ZUlEJywgJ0luY2lTdGF0ZUlEJywgJ1ZlbmRvcicsICdNb2RlbCcsICdEZXNjcmlwdGlvbicsICdUeXBlJywgJ093bmVyJywKICAgICAgICAgICAgICAgICAgICAnU2VyaWFsTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAnV2FycmFudHlFeHBpcmF0aW9uRGF0ZScsICdJbnN0YWxsRGF0ZScsICdOb3RlJywgJ0ZpbGVVcGxvYWQnLCAnU3VibWl0U2F2ZScKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1DbGFzcyA9PiAnTG9jYXRpb24nLAogICAgICAgICAgICAgICAgQ2hlY2tFZGl0RmllbGRzID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmFtZScsICdEZXBsU3RhdGVJRCcsICdJbmNpU3RhdGVJRCcsICdUeXBlJywgJ1Bob25lMScsICdQaG9uZTInLCAnRmF4JywgJ0UtTWFpbCcsICdBZGRyZXNzJywKICAgICAgICAgICAgICAgICAgICAnTm90ZScsICdGaWxlVXBsb2FkJywgJ1N1Ym1pdFNhdmUnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2xhc3MgPT4gJ05ldHdvcmsnLAogICAgICAgICAgICAgICAgQ2hlY2tFZGl0RmllbGRzID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmFtZScsICdEZXBsU3RhdGVJRCcsICdJbmNpU3RhdGVJRCcsICdEZXNjcmlwdGlvbicsICdUeXBlJywgJ05ldHdvcmtBZGRyZXNzJywgJ1N1Ym5ldE1hc2snLAogICAgICAgICAgICAgICAgICAgICdHYXRld2F5JywKICAgICAgICAgICAgICAgICAgICAnTm90ZScsICdGaWxlVXBsb2FkJywgJ1N1Ym1pdFNhdmUnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtQ2xhc3MgPT4gJ1NvZnR3YXJlJywKICAgICAgICAgICAgICAgIENoZWNrRWRpdEZpZWxkcyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05hbWUnLCAnRGVwbFN0YXRlSUQnLCAnSW5jaVN0YXRlSUQnLCAnVmVuZG9yJywgJ1ZlcnNpb24nLCAnRGVzY3JpcHRpb24nLCAnVHlwZScsICdPd25lcicsCiAgICAgICAgICAgICAgICAgICAgJ1NlcmlhbE51bWJlcicsCiAgICAgICAgICAgICAgICAgICAgJ0xpY2VuY2VUeXBlJywgJ0xpY2VuY2VLZXknLCAnTWVkaWEnLCAnTm90ZScsICdTdWJtaXRTYXZlJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCAnUHJvZHVjdGlvbicgZGVwbG95bWVudCBzdGF0ZSBJRC4KICAgICAgICBteSAkRGVwbFN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICApOwogICAgICAgIG15ICREZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbi4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwogICAgICAgIG15ICRSYW5kb21JRCAgICA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUVkaXQgKEBUZXN0KSB7CgogICAgICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQgc2NyZWVuLgogICAgICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtQWRkIik7CgogICAgICAgICAgICAjIEdldCBDb25maWdJdGVtIGNsYXNzIElELgogICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJENvbmZpZ0l0ZW1FZGl0LT57Q29uZmlnSXRlbUNsYXNzfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1DbGFzc0lEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2FbaHJlZio9XCJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7Q2xhc3NJRD0kQ29uZmlnSXRlbUNsYXNzSURcIl0nKS5sZW5ndGgiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIENsaWNrIG9uIENvbmZpZ0l0ZW0gY2xhc3MuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0O0NsYXNzSUQ9JENvbmZpZ0l0ZW1DbGFzc0lEXCcgKV0iCiAgICAgICAgICAgICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjTmFtZScpLmxlbmd0aCAmJiBcJCgnI1N1Ym1pdEJ1dHRvbicpLmxlbmd0aCIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIENvbmZpZ0l0ZW1FZGl0IGZpZWxkcy4KICAgICAgICAgICAgZm9yIG15ICRDaGVja0NvbmZpZ0l0ZW1GaWVsZCAoIEB7ICRDb25maWdJdGVtRWRpdC0+e0NoZWNrRWRpdEZpZWxkc30gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbY29udGFpbnMoXEBuYW1lLCBcJyRDaGVja0NvbmZpZ0l0ZW1GaWVsZFwnICldIik7CiAgICAgICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENyZWF0ZSB0ZXN0IENvbmZpZ0l0ZW0uCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtTmFtZSA9ICRDb25maWdJdGVtRWRpdC0+e0NvbmZpZ0l0ZW1DbGFzc30gLiAkUmFuZG9tSUQ7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAnY3NzJyApLT5zZW5kX2tleXMoJENvbmZpZ0l0ZW1OYW1lKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNEZXBsU3RhdGVJRCcpLnZhbCgnJERlcGxTdGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNEZXBsU3RhdGVJRCcpLnZhbCgpID09PSAnJERlcGxTdGF0ZUlEJyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjSW5jaVN0YXRlSUQnKS52YWwoJzEnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpIik7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNJbmNpU3RhdGVJRCcpLnZhbCgpID09PSAnMSciICk7CgogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtRWRpdC0+e0NvbmZpZ0l0ZW1DbGFzc30gZXEgJ0NvbXB1dGVyJyApIHsKCiAgICAgICAgICAgICAgICAjIEdldCBHZW5lcmFsIENhdGFsb2cgSUQgZm9yICdZZXMnLgogICAgICAgICAgICAgICAgbXkgJFllc0RhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06Olllc05vJywKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAnWWVzJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkWWVzSUQgPSAkWWVzRGF0YVJlZi0+e0l0ZW1JRH07CgogICAgICAgICAgICAgICAgIyBFbnRlciBOSUMgbmFtZS4KICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbY29udGFpbnMoXEBuYW1lLCBcJ05JQzo6MVwnICldIiktPnNlbmRfa2V5cygnU2VsZW5pdW1OZXR3b3JrJyk7CgogICAgICAgICAgICAgICAgIyBTZWxlY3QgWWVzIGZvciBESENQT3ZlcklQLgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAiXCQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ0l0ZW0xTklDOjoxMScpKS52YWwoJyRZZXNJRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtRWRpdC0+e0NvbmZpZ0l0ZW1DbGFzc30gZXEgJ05ldHdvcmsnICkgewogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vKltjb250YWlucyhcQG5hbWUsIFwnTmV0d29ya0FkZHJlc3NcJyApXSIpLT5zZW5kX2tleXMoJ1NlbGVuaXVtTmV0d29yaycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnaDE6Y29udGFpbnMoJENvbmZpZ0l0ZW1OYW1lKScpLmxlbmd0aCIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IENvbmZpZ0l0ZW0gdmFsdWUuCiAgICAgICAgICAgIG15IEBDb25maWdJdGVtVmFsdWVzID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRDb25maWdJdGVtTmFtZSwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAiaDE6Y29udGFpbnMoJENvbmZpZ0l0ZW1OYW1lKSIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXN1bHQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJENvbmZpZ0l0ZW1FZGl0LT57Q29uZmlnSXRlbUNsYXNzfSwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAicC5WYWx1ZTpjb250YWlucygkQ29uZmlnSXRlbUVkaXQtPntDb25maWdJdGVtQ2xhc3N9KSIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXN1bHQgPT4gMiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIENoZWNrIHN1Ym1pdHRlZCB2YWx1ZXMgaW4gQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gc2NyZWVuLgogICAgICAgICAgICBmb3IgbXkgJENoZWNrQ29uZmlnSXRlbVZhbHVlIChAQ29uZmlnSXRlbVZhbHVlcykgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnJENoZWNrQ29uZmlnSXRlbVZhbHVlLT57Q2hlY2t9JykubGVuZ3RoID09PSAkQ2hlY2tDb25maWdJdGVtVmFsdWUtPntDaGVja1Jlc3VsdH0iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCBDb25maWdJdGVtIHZhbHVlICRDaGVja0NvbmZpZ0l0ZW1WYWx1ZS0+e1ZhbHVlfSAtIGZvdW5kIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IENvbmZpZ0l0ZW1JRC4KICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uU2VhcmNoKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSXRlbU5hbWUKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtLgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQtPlswXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRDb25maWdJdGVtSUQtPlswXSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCAnSGFyZHdhcmUnIGNhdGFsb2cgY2xhc3MgSURzCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICBOYW1lICA9PiAnSGFyZHdhcmUnLAogICAgICAgICk7CiAgICAgICAgbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgJ1Byb2R1Y3Rpb24nIGRlcGxveW1lbnQgc3RhdGUgSURzCiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICk7CiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZi0+e0l0ZW1JRH07CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgY3JlYXRlIENvbmZpZ0l0ZW0gbnVtYmVyCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICAgICAgVHlwZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkSGFyZHdhcmVDb25maWdJdGVtSUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICJDb25maWdJdGVtIG51bWJlciBpcyBjcmVhdGVkIC0gJENvbmZpZ0l0ZW1OdW1iZXIiCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBDb25maWdJdGVtCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGNyZWF0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIgogICAgICAgICk7CgogICAgICAgICMgYWRkIGEgbmV3IHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VsZW5pdW1UZXN0JywKICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+IDEsCiAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkUHJvZHVjdGlvbkRlcGxTdGF0ZUlELAogICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgICAgICJWZXJzaW9uIGlzIGNyZWF0ZWQgLSBJRCAkVmVyc2lvbklEIgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoZWNrIGZvciBlcnJvciBtZXNzYWdlIHdoZW4gbm8gQ29uZmlnSXRlbUlEIGlzIHByb3ZpZGVkIGluIGhpc3Rvcnkgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkiKTsKCiAgICAgICAgbXkgJEVycm9yTWVzc2FnZU5vSUQgPSAnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISc7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkRXJyb3JNZXNzYWdlTm9JRCApID4gLTEsCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlICRFcnJvck1lc3NhZ2VOb0lEIC0gZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgbWVzc2FnZXMgbGlzdAogICAgICAgIG15IEBIaXN0b3J5TWVzc2FnZXMgPSAoCiAgICAgICAgICAgICdOZXcgQ29uZmlnSXRlbSAoSUQ9JyAuICRDb25maWdJdGVtSUQgLiAnKScsCiAgICAgICAgICAgICdOZXcgdmVyc2lvbiAoSUQ9JyAuICRWZXJzaW9uSUQgLiAnKScsCiAgICAgICAgICAgICdDb25maWdJdGVtIGRlZmluaXRpb24gdXBkYXRlZCAoSUQ9MSknLAogICAgICAgICAgICAnTmFtZSB1cGRhdGVkIChuZXc9U2VsZW5pdW1UZXN0LCBvbGQ9KScsCiAgICAgICAgICAgICdJbmNpZGVudCBzdGF0ZSB1cGRhdGVkIChuZXc9T3BlcmF0aW9uYWwsIG9sZD0pJywKICAgICAgICAgICAgJ0RlcGxveW1lbnQgc3RhdGUgdXBkYXRlZCAobmV3PVByb2R1Y3Rpb24sIG9sZD0pJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBoaXN0b3J5IG1lc3NhZ2VzIGluIGhpc3Rvcnkgc2NyZWVuIG9mIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5O0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEO1ZlcnNpb25JRD0kVmVyc2lvbklEIgogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSGlzdG9yeU1lc3NhZ2UgKEBIaXN0b3J5TWVzc2FnZXMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJEhpc3RvcnlNZXNzYWdlICkgPiAtMSwKICAgICAgICAgICAgICAgICJIaXN0b3J5IG1lc3NhZ2UgJEhpc3RvcnlNZXNzYWdlIC0gZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgaXRzbS1jb25maWdpdGVtICdybycgYWNjZXNzIHJpZ2h0IGZvciB0ZXN0IHVzZXIKICAgICAgICAjIGdldCBncm91cCBvYmplY3QKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgIyBnZXQgJ2l0c20tY29uZmlnaXRlbScgZ3JvdXAgSUQKICAgICAgICBteSAkSVRTTUNvbmZpZ0l0ZW1Hcm91cElEID0gJEdyb3VwT2JqZWN0LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgR3JvdXAgPT4gJ2l0c20tY29uZmlnaXRlbScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgYWNjZXNzIHJpZ2h0cyB0byB0ZXN0IHVzZXIKICAgICAgICAkR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRJVFNNQ29uZmlnSXRlbUdyb3VwSUQsCiAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgZXJyb3IgbWVzc2FnZSB3aGVuIHVzZXIgaGF2ZSBubyBhY2Nlc3MgcmlnaHRzIGluIGhpc3Rvcnkgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5O0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEO1ZlcnNpb25JRD0kVmVyc2lvbklEIgogICAgICAgICk7CgogICAgICAgIG15ICRFcnJvck1lc3NhZ2VOb1Blcm1pc3Npb24gPSAnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJEVycm9yTWVzc2FnZU5vUGVybWlzc2lvbiApID4gLTEsCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlICRFcnJvck1lc3NhZ2VOb1Blcm1pc3Npb24gLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IENvbmZpZ0l0ZW0KICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGRlbGV0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIiwKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgppZiAoICRTZWxlbml1bS0+e2Jyb3dzZXJfbmFtZX0gbmUgJ2ZpcmVmb3gnICkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiUERGIHRlc3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgRmlyZWZveCIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICAgICAgIyBnZXQgJ0hhcmR3YXJlJyBjYXRhbG9nIGNsYXNzIElEcwogICAgICAgIG15ICRDb25maWdJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0hhcmR3YXJlJywKICAgICAgICApOwogICAgICAgIG15ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CgogICAgICAgICMgZ2V0ICdQcm9kdWN0aW9uJyBkZXBsb3ltZW50IHN0YXRlIElEcwogICAgICAgIG15ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICApOwogICAgICAgIG15ICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQgPSAkUHJvZHVjdGlvbkRlcGxTdGF0ZURhdGFSZWYtPntJdGVtSUR9OwoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIGNyZWF0ZSBDb25maWdJdGVtIG51bWJlcgogICAgICAgIG15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6TnVtYmVyR2VuZXJhdG9yJyksCiAgICAgICAgICAgIENsYXNzSUQgPT4gJEhhcmR3YXJlQ29uZmlnSXRlbUlELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICAiQ29uZmlnSXRlbSBudW1iZXIgaXMgY3JlYXRlZCAtICRDb25maWdJdGVtTnVtYmVyIgogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBuZXcgQ29uZmlnSXRlbQogICAgICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkSGFyZHdhcmVDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiQ29uZmlnSXRlbSBpcyBjcmVhdGVkIC0gSUQgJENvbmZpZ0l0ZW1JRCIKICAgICAgICApOwoKICAgICAgICAjIGFkZCBhIG5ldyB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlbGVuaXVtVGVzdCcsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVmVyc2lvbklELAogICAgICAgICAgICAiVmVyc2lvbiBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY29uZmlnaXRlbScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU0NvbmZpZ0l0ZW1ab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEIik7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlcmUgaXMgdGhlIGxpbmsgdG8gQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnYVtocmVmKj1cIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtUHJpbnQ7Q29uZmlnSXRlbUlEPSRDb25maWdJdGVtSURcIl0nKS5sZW5ndGg7IgogICAgICAgICk7CgogICAgICAgICMgR28gdG8gQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IHNjcmVlbiBmb3IgdGVzdCBDb25maWdJdGVtLgogICAgICAgICRTZWxlbml1bS0+Z2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50O0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEO1ZlcnNpb25JRD0kVmVyc2lvbklEIgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwcmludCBzY3JlZW4gaXMgbG9hZGVkCiAgICAgICAgQUNUSVZFU0xFRVA6CiAgICAgICAgZm9yIG15ICRTZWNvbmQgKCAxIC4uIDMwICkgewogICAgICAgICAgICBpZiAoIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAicHJpbnRlZCBieSIgKSA+IC0xLCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAicHJpbnRlZCBieSIgKSA+IC0xLAogICAgICAgICAgICAgICAgICAgICJQcmludCBzY3JlZW4gaXMgbG9hZGVkIiwKICAgICAgICAgICAgICAgICkgfHwgZGllOwogICAgICAgICAgICAgICAgbGFzdCBBQ1RJVkVTTEVFUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzbGVlcCAxOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGVzdCBwcmludCB2YWx1ZXMKICAgICAgICBteSBAQ29uZmlnSXRlbVByaW50ID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ29uZmlnSXRlbSMgJENvbmZpZ0l0ZW1OdW1iZXIgLSBmb3VuZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJ1NlbGVuaXVtVGVzdCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb25maWdJdGVtOiBTZWxlbml1bVRlc3QgLSBmb3VuZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJ0hhcmR3YXJlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNsYXNzOiBIYXJkd2FyZSAtIGZvdW5kIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDdXJyZW50IERlcGxveW1lbnQgU3RhdGU6IFByb2R1Y3Rpb24gLSBmb3VuZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkN1cnJlbnQgSW5jaWRlbnQgU3RhdGU6IE9wZXJhdGlvbmFsIC0gZm91bmQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICdWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ3VycmVudCBWZXJzaW9uOiBWZXJzaW9uIDEgLSBmb3VuZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgcHJpbnRlZCB2YWx1ZXMKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1WYWx1ZSAoQENvbmZpZ0l0ZW1QcmludCkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ29uZmlnSXRlbVZhbHVlLT57VmFsdWV9ICkgPiAtMSwKICAgICAgICAgICAgICAgICIkQ29uZmlnSXRlbVZhbHVlLT57TWVzc2FnZX0iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IENvbmZpZ0l0ZW0KICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJDb25maWdJdGVtIGlzIGRlbGV0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIiwKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIEdldCAnQ29tcHV0ZXInIENvbmZpZ0l0ZW0gSUQuCiAgICAgICAgbXkgQENvbmZpZ0l0ZW1DbGFzc0lEczsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1DbGFzcyAocXcoQ29tcHV0ZXIpKSB7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ29uZmlnSXRlbUNsYXNzLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDb25maWdJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CiAgICAgICAgfQoKICAgICAgICAjIEdldCAnUHJvZHVjdGlvbicgZGVwbG95bWVudCBzdGF0ZSBJRHMuCiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICk7CiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZi0+e0l0ZW1JRH07CgogICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIENyZWF0ZSBDb25maWdJdGVtIG51bWJlcnMuCiAgICAgICAgbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwogICAgICAgIGZvciBteSAkQ29uZmlnTnVtYmVyQ3JlYXRlICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtICRDb25maWdJdGVtTnVtYmVyIG51bWJlciBpcyBjcmVhdGVkIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgJENvbmZpZ0l0ZW1OdW1iZXI7CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgbmV3IENvbmZpZ0l0ZW1zLgogICAgICAgIG15IEBDb25maWdJdGVtSURzOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUNyZWF0ZU51bWJlciAoQENvbmZpZ0l0ZW1OdW1iZXJzKSB7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1DcmVhdGVOdW1iZXIsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtSUQgJENvbmZpZ0l0ZW1JRCBpcyBjcmVhdGVkIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KCiAgICAgICAgbXkgJEluY2lTdGF0ZUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdJbmNpZGVudCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgYSBuZXcgdmVyc2lvbiBmb3IgZWFjaCBDb25maWdJdGVtLgogICAgICAgIG15IEBWZXJzaW9uSURzOwogICAgICAgIG15ICRDb3VudCAgICA9IDE7CiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1WZXJzaW9uIChAQ29uZmlnSXRlbUlEcykgewogICAgICAgICAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJENvdW50IC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+IDEsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlSUQtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1WZXJzaW9uLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAiVmVyc2lvbklEICRWZXJzaW9uSUQgaXMgY3JlYXRlZCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAVmVyc2lvbklEcywgJFZlcnNpb25JRDsKCiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbi4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2guCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCIpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NlYXJjaENsYXNzSUQnKS5sZW5ndGgiICk7CgogICAgICAgICMgQ2hlY2sgZm9yICdDbGFzcycgbGFiZWwuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnbGFiZWxbZm9yPVwiQ2xhc3NcIl0nKS5sZW5ndGgiKSwKICAgICAgICAgICAgIkNsYXNzIGxhYmVsIC0gZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZm9yICdDbGFzcycgc2VsZWN0IGJveC4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoQ2xhc3NJRCIsICdjc3MnICksCiAgICAgICAgICAgICJDbGFzcyBzZWxlY3QgYm94IC0gZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgQmUgc3VyZSBtb2Rlcm5pemVkIGZpZWxkIGhhcyBsb2FkZWQuCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyBTZWxlY3QgJ0NvbXB1dGVyJyBjbGFzcy4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNTZWFyY2hDbGFzc0lEJykudmFsKCckQ29uZmlnSXRlbUNsYXNzSURzWzBdJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBmb3JtIGVsZW1lbnRzIGhhcyBsb2FkZWQgYnkgQUpBWC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICIgLgogICAgICAgICAgICAgICAgIiYmIFwkKCcjU2VhcmNoUHJvZmlsZScpLmxlbmd0aCAiIC4KICAgICAgICAgICAgICAgICImJiBcJCgnI1NlYXJjaFByb2ZpbGVOZXcnKS5sZW5ndGggIiAuCiAgICAgICAgICAgICAgICAiJiYgXCQoJyNBdHRyaWJ1dGUnKS5sZW5ndGggIiAuCiAgICAgICAgICAgICAgICAiJiYgXCQoJyNQcmV2aW91c1ZlcnNpb25TZWFyY2gnKS5sZW5ndGggIiAuCiAgICAgICAgICAgICAgICAiJiYgXCQoJyNSZXN1bHRGb3JtJykubGVuZ3RoICIgLgogICAgICAgICAgICAgICAgIiYmIFwkKCcjU2VhcmNoRm9ybVN1Ym1pdCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIENvbmZpZ0l0ZW0gc2VhcmNoIHBhZ2UuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KFNlYXJjaENsYXNzSUQgU2VhcmNoUHJvZmlsZSBTZWFyY2hQcm9maWxlTmV3IEF0dHJpYnV0ZSBQcmV2aW91c1ZlcnNpb25TZWFyY2ggUmVzdWx0Rm9ybSBTZWFyY2hGb3JtU3VibWl0KQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBzbGVlcCAxOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJElEJykubGVuZ3RoIiApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJElEJykubGVuZ3RoOyIpLAogICAgICAgICAgICAgICAgIkVsZW1lbnQgaXMgZm91bmQgLSAkSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiBJVFNNQ2hhbmdlIFNlYXJjaCBmb3JtIGNvbnRhaW4gRXhjZWwgb3V0cHV0IG9wdGlvbiwgc2VlIGJ1ZyMxMjc2OS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVzdWx0Rm9ybSBvcHRpb246Y29udGFpbnMoXCJFeGNlbFwiKScpLmxlbmd0aCIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAnSVRTTUNvbmZpZ0l0ZW0gU2VhcmNoIGNvbnRhaW4gRXhjZWwgb3V0cHV0JywKICAgICAgICApOwoKICAgICAgICAjIFNlYXJjaCBDb25maWdJdGVtcyBieSB0ZXN0IENvbmZpZ0l0ZW0gbnVtYmVyIGFuZCBuYW1lcy4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnTmFtZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuQWRkQnV0dG9uIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoSW5zZXJ0IGlucHV0W25hbWU9XCJOYW1lXCJdJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAbmFtZT0nTnVtYmVyJ10iKS0+c2VuZF9rZXlzKCcqJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdOYW1lJ10iKS0+c2VuZF9rZXlzKCAnKicgLiAkUmFuZG9tSUQgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2hGb3JtU3VibWl0IiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJ0RpYWxvZy5Nb2RhbCcpLmxlbmd0aCAmJiBcJCgnI092ZXJ2aWV3Qm9keSAuVGFibGVTbWFsbCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCByZXN1bHQuCiAgICAgICAgZm9yIG15ICRDaGVja0NvbmZpZ0l0ZW0gKEBDb25maWdJdGVtTnVtYmVycykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnI092ZXJ2aWV3Qm9keSAuVGFibGVTbWFsbCB0ZDpjb250YWlucygkQ2hlY2tDb25maWdJdGVtKScpLmxlbmd0aCIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbSAkQ2hlY2tDb25maWdJdGVtIG51bWJlciBpcyBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFZlcmlmeSBzb3J0aW5nIGluIHRhYmxlLCBieSBkZWZhdWx0IHNvcnRpbmcgaXMgZG9uZSBieSBDb25maWdJdGVtTnVtYmVyIC0gc29ydCBhc2NlbmRpbmcuCiAgICAgICAgIyBMb3dlciBJRCB3aWxsIG9uIHRoZSB0b3Agb2YgdGFibGUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ3Rib2R5IHRyOmVxKDApJykuYXR0cignaWQnKSIpLAogICAgICAgICAgICAnQ29uZmlnSXRlbUlEXycgLiAkQ29uZmlnSXRlbUlEc1sxXSwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEc1sxXSBpcyBvbiB0b3Agb2YgdGFibGUgc29ydCBieSBOdW1iZXIgYXNjZW5kaW5nIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ3Rib2R5IHRyOmVxKDEpJykuYXR0cignaWQnKSIpLAogICAgICAgICAgICAnQ29uZmlnSXRlbUlEXycgLiAkQ29uZmlnSXRlbUlEc1swXSwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEc1swXSBpcyBvbiBib3R0b20gb2YgdGFibGUgc29ydCBieSBOdW1iZXIgYXNjZW5kaW5nIgogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgdG8gc29ydCBieSBOYW1lLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLk5hbWUiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkIHJlc3VsdC4KICAgICAgICBmb3IgbXkgJENoZWNrQ29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1OdW1iZXJzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjT3ZlcnZpZXdCb2R5IC5UYWJsZVNtYWxsIHRkOmNvbnRhaW5zKCRDaGVja0NvbmZpZ0l0ZW0pJykubGVuZ3RoIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtICRDaGVja0NvbmZpZ0l0ZW0gbnVtYmVyIGlzIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU29ydCBpcyBieSBOYW1lIGRlc2NlbmRpbmcuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ3Rib2R5IHRyOmVxKDApJykuYXR0cignaWQnKSIpLAogICAgICAgICAgICAnQ29uZmlnSXRlbUlEXycgLiAkQ29uZmlnSXRlbUlEc1swXSwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEc1sxXSBpcyBvbiB0b3Agb2YgdGFibGUgc29ydCBieSBOYW1lIGRlc2NlbmRpbmciCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6ZXEoMSknKS5hdHRyKCdpZCcpIiksCiAgICAgICAgICAgICdDb25maWdJdGVtSURfJyAuICRDb25maWdJdGVtSURzWzFdLAogICAgICAgICAgICAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSURzWzBdIGlzIG9uIGJvdHRvbSBvZiB0YWJsZSBzb3J0IGJ5IE5hbWUgZGVzY2VuZGluZyIKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIHRvIHNvcnQgYnkgTmFtZSBhZ2Fpbi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5OYW1lIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFZlcmlmeSBvcmRlciBpcyBjaGFuZ2VkLCBzb3J0IGJ5IE5hbWUgYXNjZW5kaW5nLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCd0Ym9keSB0cjplcSgwKScpLmF0dHIoJ2lkJykiKSwKICAgICAgICAgICAgJ0NvbmZpZ0l0ZW1JRF8nIC4gJENvbmZpZ0l0ZW1JRHNbMV0sCiAgICAgICAgICAgICJDb25maWdJdGVtSUQgJENvbmZpZ0l0ZW1JRHNbMF0gaXMgb24gdG9wIG9mIHRhYmxlIHNvcnQgYnkgTmFtZSBhc2NlbmRpbmciCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6ZXEoMSknKS5hdHRyKCdpZCcpIiksCiAgICAgICAgICAgICdDb25maWdJdGVtSURfJyAuICRDb25maWdJdGVtSURzWzBdLAogICAgICAgICAgICAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSURzWzFdIGlzIG9uIGJvdHRvbSBvZiB0YWJsZSBzb3J0IGJ5IE5hbWUgYXNjZW5kaW5nIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIENvbmZpZ0l0ZW0gbnVtYmVycyBhbmQgYWRkIHRoZSBuZXcgQ29uZmlnSXRlbXMuCiAgICAgICAgQENvbmZpZ0l0ZW1OdW1iZXJzID0gKCk7CiAgICAgICAgZm9yIG15ICRDb25maWdOdW1iZXJDcmVhdGUgKCAxIC4uIDM1ICkgewogICAgICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgICAgICJDb25maWdJdGVtICRDb25maWdJdGVtTnVtYmVyIG51bWJlciBpcyBjcmVhdGVkIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgJENvbmZpZ0l0ZW1OdW1iZXI7CgogICAgICAgICAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQgaXMgY3JlYXRlZCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CgogICAgICAgIG15IEBYTUxEYXRhQXJyYXkgPSBbCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnVmVyc2lvbicgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJzIwMTctMTAtMTAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnTklDJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSVBvdmVyREhDUCcgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICczOCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lQQWRkcmVzcycgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICcxNzIuMC4wLjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50JyA9PiAndGVzdCAxNzIuMC4wLjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICdWZXJzaW9uJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgJ1dhcnJhbnR5RXhwaXJhdGlvbkRhdGUnID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50JyA9PiAnMjAxNy0xMS0xMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCiAgICAgICAgIyBBZGQgYSBuZXcgdmVyc2lvbiBmb3IgZWFjaCBDb25maWdJdGVtLgogICAgICAgICRDb3VudCA9IDE7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtVmVyc2lvbiAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgICAgIG15ICRYTUxEYXRhICAgPSAoICRDb3VudCA8PSAzMCApID8gJFhNTERhdGFBcnJheVswXSA6ICRYTUxEYXRhQXJyYXlbMV07CiAgICAgICAgICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkQ291bnQgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkUHJvZHVjdGlvbkRlcGxTdGF0ZUlELAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVJRC0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiAkWE1MRGF0YSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbVZlcnNpb24sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAgICAgICAgICJWZXJzaW9uSUQgJFZlcnNpb25JRCBpcyBjcmVhdGVkIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBWZXJzaW9uSURzLCAkVmVyc2lvbklEOwoKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAjIENoYW5nZSBzZWFyY2ggb3B0aW9uLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0lUU01Db25maWdJdGVtU2VhcmNoIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBdHRyaWJ1dGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgQWRkIHNlYXJjaCBmaWx0ZXIgYnkgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSBhbmQgc2V0IGRhdGUgcmFuZ2UgKDgtMTAtMjAxNyAtIDE1LTEwLTIwMTcpLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnV2FycmFudHlFeHBpcmF0aW9uRGF0ZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IiwKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkFkZEJ1dHRvbicsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoSW5zZXJ0IHNlbGVjdFtpZD1cIldhcnJhbnR5RXhwaXJhdGlvbkRhdGU6OlRpbWVTdGFydDo6RGF5XCJdJykudmFsKCc4Jyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoSW5zZXJ0IHNlbGVjdFtpZD1cIldhcnJhbnR5RXhwaXJhdGlvbkRhdGU6OlRpbWVTdGFydDo6TW9udGhcIl0nKS52YWwoJzEwJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoSW5zZXJ0IHNlbGVjdFtpZD1cIldhcnJhbnR5RXhwaXJhdGlvbkRhdGU6OlRpbWVTdGFydDo6WWVhclwiXScpLnZhbCgnMjAxNycpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlYXJjaEluc2VydCBzZWxlY3RbaWQ9XCJXYXJyYW50eUV4cGlyYXRpb25EYXRlOjpUaW1lU3RvcDo6RGF5XCJdJykudmFsKCcxNScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlYXJjaEluc2VydCBzZWxlY3RbaWQ9XCJXYXJyYW50eUV4cGlyYXRpb25EYXRlOjpUaW1lU3RvcDo6TW9udGhcIl0nKS52YWwoJzEwJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoSW5zZXJ0IHNlbGVjdFtpZD1cIldhcnJhbnR5RXhwaXJhdGlvbkRhdGU6OlRpbWVTdG9wOjpZZWFyXCJdJykudmFsKCcyMDE3Jyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdOdW1iZXInXSIpLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAbmFtZT0nTnVtYmVyJ10iKS0+c2VuZF9rZXlzKCcqJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdOYW1lJ10iKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQG5hbWU9J05hbWUnXSIpLT5zZW5kX2tleXMoICcqJyAuICRSYW5kb21JRCApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2hGb3JtU3VibWl0IiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJ0RpYWxvZy5Nb2RhbCcpLmxlbmd0aCAmJiBcJCgnI092ZXJ2aWV3Qm9keSAuVGFibGVTbWFsbCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcuUGFnaW5hdGlvbicpLnRleHQoKS50cmltKCkuaW5kZXhPZignMS0yNSBvZiAzMCcpID4gLTE7IiksCiAgICAgICAgICAgICJDaGVjayBwYWdpbmF0aW9uIG9uIHRoZSBmaXJzdCBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI092ZXJ2aWV3Qm9keSAuVGFibGVTbWFsbCB0Ym9keSB0cicpLmxlbmd0aDsiKSwKICAgICAgICAgICAgJzI1JywKICAgICAgICAgICAgIk51bWJlciBvZiBjb25maWcgaXRlbXMgb24gdGhlIGZpcnN0IHBhZ2UgaXMgY29ycmVjdCAtIDI1IiwKICAgICAgICApOwoKICAgICAgICAjIEdvIHRvIHRoZSBzZWNvbmQgcGFnZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNHZW5lcmljUGFnZTIiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5QYWdpbmF0aW9uJykudGV4dCgpLnRyaW0oKS5pbmRleE9mKCcyNi0zMCBvZiAzMCcpID4gLTE7IiksCiAgICAgICAgICAgICJDaGVjayBwYWdpbmF0aW9uIG9uIHRoZSBzZWNvbmQgcGFnZSIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNPdmVydmlld0JvZHkgLlRhYmxlU21hbGwgdGJvZHkgdHInKS5sZW5ndGg7IiksCiAgICAgICAgICAgICc1JywKICAgICAgICAgICAgIk51bWJlciBvZiBjb25maWcgaXRlbXMgb24gdGhlIHNlY29uZCBwYWdlIGlzIGNvcnJlY3QgLSA1IiwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZSBzZWFyY2ggb3B0aW9uLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0lUU01Db25maWdJdGVtU2VhcmNoIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBdHRyaWJ1dGUnKS5sZW5ndGggJiYgXCQoJyNTZWFyY2hJbnNlcnQgaW5wdXRbbmFtZT1cIk5hbWVcIl0nKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBJbnB1dCB3cm9uZyBzZWFyY2ggcGFyYW1ldGVycywgcmVzdWx0IHNob3VsZCBiZSAnTm8gZGF0YSBmb3VuZCcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdOYW1lJ10iKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQG5hbWU9J05hbWUnXSIpLT5zZW5kX2tleXMoJ2FzZGZnJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoRm9ybVN1Ym1pdCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgIVwkKCdEaWFsb2cuTW9kYWwnKS5sZW5ndGggJiYgXCQoJyNPdmVydmlld0JvZHkgLlRhYmxlU21hbGwnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgZXhwZWN0ZWQgcmVzdWx0LgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ05vIGRhdGEgZm91bmQnICkgPiAtMSwKICAgICAgICAgICAgIidObyBkYXRhIGZvdW5kJyAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uICJDaGFuZ2Ugc2VhcmNoIG9wdGlvbiIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNJVFNNQ29uZmlnSXRlbVNlYXJjaCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NlYXJjaFByb2ZpbGVOZXcnKS5sZW5ndGgiICk7CiAgICAgICAgc2xlZXAgMjsKCiAgICAgICAgIyBDcmVhdGUgbmV3IHRlbXBsYXRlIHNlYXJjaC4KICAgICAgICBteSAkU2VhcmNoUHJvZmlsZU5hbWUgPSAiU2VhcmNoLSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlYXJjaFByb2ZpbGVOZXciLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTZWFyY2hQcm9maWxlQWRkTmFtZScpLmxlbmd0aCIgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoUHJvZmlsZUFkZE5hbWUiLCAgICdjc3MnICktPnNlbmRfa2V5cygkU2VhcmNoUHJvZmlsZU5hbWUpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlYXJjaFByb2ZpbGVBZGRBY3Rpb24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTZWFyY2hQcm9maWxlJykudmFsKCkgPT09ICckU2VhcmNoUHJvZmlsZU5hbWUnIgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NlYXJjaFByb2ZpbGVBc0xpbms6dmlzaWJsZScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGJ1dHRvbiBmb3IgcHJvZmlsIGxpbmsuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoUHJvZmlsZUFzTGluayIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgQ2xpY2sgb24gIkNoYW5nZSBzZWFyY2ggb3B0aW9uIgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0lUU01Db25maWdJdGVtU2VhcmNoIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoUHJvZmlsZScpLnZhbCgpID09PSAnJFNlYXJjaFByb2ZpbGVOYW1lJyIKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1NlYXJjaFByb2ZpbGUnKS52YWwoKTsiKSwKICAgICAgICAgICAgJFNlYXJjaFByb2ZpbGVOYW1lLAogICAgICAgICAgICAiQ2hlY2sgaWYgcHJvZmlsIGlzIGxvYWRlZCB3ZWxsIgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgY29ycmVjdCBjb25maWcgaXRlbXMgYXJlIHNob3duIGFmdGVyIHN1YiBhdHRyaWJ1dGVzIGFyZSBzZWFyY2hlZC4gU2VlIGJ1ZyMxMjk5OC4KICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlcjIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICAgICAgVHlwZSAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyMiwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gJENvbmZpZ0l0ZW1OdW1iZXIyIG51bWJlciBpcyBjcmVhdGVkIgogICAgICAgICk7CiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRDIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcjIsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQyLAogICAgICAgICAgICAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQyIGlzIGNyZWF0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDI7CgogICAgICAgICMgQ3JlYXRlIGNvbmZpZyB0aGF0IHNob3VsZCBub3QgYXBwZWFyIGluIHNlYXJjaC4KICAgICAgICBteSAkVmVyc2lvbklEMiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJENvdW50IC4gJFJhbmRvbUlELAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQsCiAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlSUQtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQyLAogICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvdmVyREhDUCA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICczOCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIyMi4wLjAuMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAndGVzdCAyMjIuMC4wLjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVmVyc2lvbklEMiwKICAgICAgICAgICAgIlZlcnNpb25JRCAkVmVyc2lvbklEMiBpcyBjcmVhdGVkIgogICAgICAgICk7CgogICAgICAgICMgQ29uZmlndXJlIElQQWRkcmVzIHRvIHNob3cgaW4gc2VhcmNoIHJlc3VsdC4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIyMjU2hvd0NvbHVtbnMnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBDdXJEZXBsU2lnbmFsICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBMYXN0Q2hhbmdlZCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAnTklDOjoxOjpJUEFkZHJlc3M6OjEnID0+IDEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuRGlhbG9nIC5DbG9zZSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoIik7CgogICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoQ2xhc3NJRCcpLmxlbmd0aCIgKTsKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIFNlbGVjdCAnQ29tcHV0ZXInIGNsYXNzLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlYXJjaENsYXNzSUQnKS52YWwoJyRDb25maWdJdGVtQ2xhc3NJRHNbMF0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBdHRyaWJ1dGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgQWRkIHNlYXJjaCBmaWx0ZXIgYnkgTklDOjpJUEFkZHJlc3MgYW5kIHNldCAxNzIqLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnTklDOjpJUEFkZHJlc3MnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQWRkQnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyBXYWl0IGZvciBOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MgdG8gYXBwZWFyLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoSW5zZXJ0IGlucHV0W25hbWU9XCJOSUM6OklQQWRkcmVzc1wiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQG5hbWU9J05JQzo6SVBBZGRyZXNzJ10iKS0+c2VuZF9rZXlzKCcxNzIqJyk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlYXJjaEZvcm1TdWJtaXQiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmICFcJCgnRGlhbG9nLk1vZGFsJykubGVuZ3RoICYmIFwkKCcjT3ZlcnZpZXdCb2R5IC5UYWJsZVNtYWxsJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMgYXJlIHNob3duIG9uIHBhZ2luYXRpb24uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLlBhZ2luYXRpb24nKS50ZXh0KCkudHJpbSgpLmluZGV4T2YoJzEtMjUgb2YgMzAnKSA+IC0xOyIpLAogICAgICAgICAgICAiQ2hlY2sgcGFnaW5hdGlvbiBvbiB0aGUgZmlyc3QgcGFnZSIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNPdmVydmlld0JvZHkgLlRhYmxlU21hbGwgdGJvZHkgdHInKS5sZW5ndGg7IiksCiAgICAgICAgICAgICcyNScsCiAgICAgICAgICAgICJOdW1iZXIgb2YgY29uZmlnIGl0ZW1zIG9uIHRoZSBmaXJzdCBwYWdlIGlzIGNvcnJlY3QgLSAyNSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byB0aGUgc2Vjb25kIHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjR2VuZXJpY1BhZ2UyIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIGlmIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIGFyZSBzaG93biBvbiBwYWdpbmF0aW9uLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5QYWdpbmF0aW9uJykudGV4dCgpLnRyaW0oKS5pbmRleE9mKCcyNi0zMCBvZiAzMCcpID4gLTE7IiksCiAgICAgICAgICAgICJDaGVjayBwYWdpbmF0aW9uIG9uIHRoZSBzZWNvbmQgcGFnZSIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNPdmVydmlld0JvZHkgLlRhYmxlU21hbGwgdGJvZHkgdHInKS5sZW5ndGg7IiksCiAgICAgICAgICAgICc1JywKICAgICAgICAgICAgIk51bWJlciBvZiBjb25maWcgaXRlbXMgb24gdGhlIHNlY29uZCBwYWdlIGlzIGNvcnJlY3QgLSA1IiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgQ29uZmlnSXRlbS4KICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1EZWxldGVJRCAoQENvbmZpZ0l0ZW1JRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbURlbGV0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtRGVsZXRlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDb25maWdJdGVtIFZlcnNpb24pKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCAnSGFyZHdhcmUnIGNhdGFsb2cgY2xhc3MgSURzCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICBOYW1lICA9PiAnSGFyZHdhcmUnLAogICAgICAgICk7CiAgICAgICAgbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgJ1Byb2R1Y3Rpb24nIGFuZCAnUmVwYWlyJyBkZXBsb3ltZW50IHN0YXRlIElEcwogICAgICAgIG15IEBEZXBsU3RhdGVJRHM7CiAgICAgICAgbXkgQERlcGxTdGF0ZXMgPSAocXcoUHJvZHVjdGlvbiBSZXBhaXIpKTsKICAgICAgICBmb3IgbXkgJERlcGxTdGF0ZSAoQERlcGxTdGF0ZXMpIHsKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREZXBsU3RhdGUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQERlcGxTdGF0ZUlEcywgJERlcGxTdGF0ZURhdGFSZWYtPntJdGVtSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBjcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gbnVtYmVyIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU51bWJlciIKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aGUgbmV3IENvbmZpZ0l0ZW0KICAgICAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJEhhcmR3YXJlQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgY3JlYXRlZCAtIElEICRDb25maWdJdGVtSUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdHdvIHZlcnNpb25zCiAgICAgICAgbXkgQFZlcnNpb25JRHM7CiAgICAgICAgZm9yIG15ICRWZXJzaW9uIChARGVwbFN0YXRlSURzKSB7CiAgICAgICAgICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VsZW5pdW1UZXN0JywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRWZXJzaW9uLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAiVmVyc2lvbiBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAVmVyc2lvbklEcywgJFZlcnNpb25JRDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jb25maWdpdGVtJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW0gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtO1NvcnRCeT1OdW1iZXI7T3JkZXJCeT1Eb3duO1ZpZXc9O0ZpbHRlcj0kSGFyZHdhcmVDb25maWdJdGVtSUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiBjcmVhdGVkIENvbmZpZ0l0ZW0uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vZGl2W2NvbnRhaW5zKFxAdGl0bGUsICckQ29uZmlnSXRlbU51bWJlcicgKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGdldCBDb25maWdJdGVtIHZhbHVlIHBhcmFtcwogICAgICAgIG15IEBDb25maWdJdGVtVmFsdWVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnSGFyZHdhcmUnLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ3AuVmFsdWU6Y29udGFpbnMoSGFyZHdhcmUpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJ1NlbGVuaXVtVGVzdCcsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAncC5WYWx1ZTpjb250YWlucyhTZWxlbml1bVRlc3QpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJ1JlcGFpcicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnZGl2LlZhbHVlOmNvbnRhaW5zKFJlcGFpciknLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ2Rpdi5WYWx1ZTpjb250YWlucyhPcGVyYXRpb25hbCknLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAiJENvbmZpZ0l0ZW1OdW1iZXIiLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gImgxOmNvbnRhaW5zKCRDb25maWdJdGVtTnVtYmVyKSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBDb25maWdJdGVtIHZhbHVlcyBvbiBzY3JlZW4KICAgICAgICBmb3IgbXkgJENoZWNrQ29uZmlnSXRlbVZhbHVlIChAQ29uZmlnSXRlbVZhbHVlcykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnJENoZWNrQ29uZmlnSXRlbVZhbHVlLT57Q2hlY2t9JykubGVuZ3RoIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJUZXN0IENvbmZpZ0l0ZW0gdmFsdWUgJENoZWNrQ29uZmlnSXRlbVZhbHVlLT57VmFsdWV9IC0gZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbGljayB0byBzaG93IGFsbCB2ZXJzaW9ucwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkFsbElUU01JdGVtcyIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IGJvdGggdmVyc2lvbnMgYXJlIHByZXNlbnQgb24gc2NyZWVuCiAgICAgICAgZm9yIG15ICRWZXJzaW9uc0NoZWNrIChARGVwbFN0YXRlcykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiU2VsZW5pdW1UZXN0ICgkVmVyc2lvbnNDaGVjaykiICkgPiAtMSwKICAgICAgICAgICAgICAgICJTZWxlbml1bVRlc3QgKCRWZXJzaW9uc0NoZWNrKSAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlc3QgbWVudSBidXR0b25zIHBhcmFtcwogICAgICAgIG15IEBNZW51QnV0dG9ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmFjaycsCiAgICAgICAgICAgICAgICBMaW5rID0+ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbTtTb3J0Qnk9TnVtYmVyO09yZGVyQnk9RG93bjtWaWV3PTtGaWx0ZXI9JEhhcmR3YXJlQ29uZmlnSXRlbUlEIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeScsCiAgICAgICAgICAgICAgICBMaW5rID0+ICJBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeTtDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW1JRDtWZXJzaW9uSUQ9JFZlcnNpb25JRHNbMV0iLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdFZGl0JywKICAgICAgICAgICAgICAgIExpbmsgPT4gIkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0O0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgICAgICAgICAgTGluayA9PiAiQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50O0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEO1ZlcnNpb25JRD0kVmVyc2lvbklEc1sxXSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgTGluayA9PiAiQWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNQ29uZmlnSXRlbTtTb3VyY2VLZXk9JENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R1cGxpY2F0ZScsCiAgICAgICAgICAgICAgICBMaW5rID0+ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7RHVwbGljYXRlSUQ9JENvbmZpZ0l0ZW1JRDtWZXJzaW9uSUQ9JFZlcnNpb25JRHNbMV0iLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWVudSBidXR0b25zCiAgICAgICAgZm9yIG15ICRNZW51QnV0dG9uQ2hlY2sgKEBNZW51QnV0dG9ucykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJyRNZW51QnV0dG9uQ2hlY2stPntMaW5rfScgKV0iKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJNZW51IGJ1dHRvbiAkTWVudUJ1dHRvbkNoZWNrLT57TmFtZX0gLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgQ29uZmlnSXRlbQogICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CiAgICB9CgopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCBDb21wdXRlciBhbmQgSGFyZHdhcmUgY2F0YWxvZyBjbGFzcyBJRHMKICAgICAgICBteSBAQ29uZmlnSXRlbUNsYXNzSURzOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbSAocXcoQ29tcHV0ZXIgSGFyZHdhcmUpKSB7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ29uZmlnSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUNsYXNzSURzLCAkQ29uZmlnSXRlbURhdGFSZWYtPntJdGVtSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgJ1Byb2R1Y3Rpb24nIGRlcGxveW1lbnQgc3RhdGUgSUQKICAgICAgICBteSAkRGVwbFN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICApOwogICAgICAgIG15ICREZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBjcmVhdGUgdHdvIHRlc3QgQ29uZmlnSXRlbXMgZm9yIENvbXB1dGVyIGFuZCBIYXJkd2FyZSBDb25maWdJdGVtIGNsYXNzCiAgICAgICAgbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwogICAgICAgIG15IEBDb25maWdJdGVtSURzOwogICAgICAgIG15IEBWZXJzaW9uSURzOwogICAgICAgIGZvciBteSAkSVRTTUNvbmZpZ0l0ZW0gKEBDb25maWdJdGVtQ2xhc3NJRHMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIENvbmZpZ0l0ZW0gbnVtYmVyCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkSVRTTUNvbmZpZ0l0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbSBudW1iZXIgaXMgY3JlYXRlZCAtICRDb25maWdJdGVtTnVtYmVyIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgJENvbmZpZ0l0ZW1OdW1iZXI7CgogICAgICAgICAgICAjIGFkZCB0aGUgbmV3IENvbmZpZ0l0ZW0KICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJElUU01Db25maWdJdGVtLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAiQ29uZmlnSXRlbSBpcyBjcmVhdGVkIC0gSUQgJENvbmZpZ0l0ZW1JRCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKCiAgICAgICAgICAgICMgYWRkIGEgbmV3IHZlcnNpb24KICAgICAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZWxlbml1bVRlc3QnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+IDEsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUlELAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAiVmVyc2lvbiBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAVmVyc2lvbklEcywgJFZlcnNpb25JRDsKCiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHNlcnZpY2UKICAgICAgICBteSAkU2VydmljZU5hbWUgPSAiU2VydmljZSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRTZXJ2aWNlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgU2VydmljZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2UgaXMgY3JlYXRlZCAtIElEICRTZXJ2aWNlSUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZU51bWJlcigpOwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFROICAgICAgICAgICA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1NlbGVuaXVtVGVzdFRpY2tldCcsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJzEyMzQ2NScsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAnY3VzdG9tZXJAZXhhbXBsZS5jb20nLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSBJRCAkVGlja2V0SUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLWNvbmZpZ2l0ZW0nLCAnaXRzbS1zZXJ2aWNlJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW1JRHNbMF07VmVyc2lvbj0kVmVyc2lvbklEc1swXSIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uICdMaW5rJyBtZW51CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudExpbmtPYmplY3Q7U291cmNlT2JqZWN0PUlUU01Db25maWdJdGVtO1NvdXJjZUtleT0kQ29uZmlnSXRlbUlEc1swXVwnICldIgogICAgICAgICktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHRvICdMaW5rJyB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjVGFyZ2V0SWRlbnRpZmllciIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBzZWxlY3QgdG8gbGluayB3aXRoIHRlc3QgSGFyZHdhcmUgQ29uZmlnSXRlbQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RhcmdldElkZW50aWZpZXInKS52YWwoJ0lUU01Db25maWdJdGVtOjokQ29uZmlnSXRlbUNsYXNzSURzWzFdJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgc2xlZXAoMik7CgogICAgICAgICMgY2hlY2sgJ0xpbmsnIHNjcmVlbiBmb3IgdHdvIENvbmZpZ0l0ZW1zCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KFRhcmdldElkZW50aWZpZXIgU3VibWl0U2VsZWN0IFN1Ym1pdFNlYXJjaCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNlYXJjaCBDb25maWdJdGVtIGJ5IGl0cyBudW1iZXIgYW5kIHNlbGVjdCByZXN1bHQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQGlkPSdTRUFSQ0g6Ok51bWJlciddIiktPnNlbmRfa2V5cyggJENvbmZpZ0l0ZW1OdW1iZXJzWzFdICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3VibWl0U2VhcmNoIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAaWQ9J0xpbmtUYXJnZXRLZXlzJ11bXEB2YWx1ZT0nJENvbmZpZ0l0ZW1JRHNbMV0nXSIpLT5jbGljaygpOwoKICAgICAgICAjIHNlbGVjdCAnQWx0ZXJuYXRpdmVUbycgbGluayB0eXBlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAaWQ9J0FkZExpbmtzJ10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHNlbGVjdCB0byBsaW5rIHdpdGggdGVzdCBTZXJ2aWNlCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjVGFyZ2V0SWRlbnRpZmllcicpLnZhbCgnU2VydmljZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgIHNsZWVwKDIpOwoKICAgICAgICAjIHNlYXJjaCBTZXJ2aWNlIGJ5IG5hbWUgYW5kIHNlbGVjdCByZXN1bHQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQGlkPSdTRUFSQ0g6Ok5hbWUnXSIpLT5zZW5kX2tleXMoJFNlcnZpY2VOYW1lKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRTZWFyY2giLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBpZD0nTGlua1RhcmdldEtleXMnXVtcQHZhbHVlPSckU2VydmljZUlEJ10iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBzZWxlY3QgJ1JlbGV2YW50IHRvJyBsaW5rIHR5cGUKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNUeXBlSWRlbnRpZmllcicpLnZhbCgnUmVsZXZhbnRUbzo6U291cmNlJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBpZD0nQWRkTGlua3MnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgc2VsZWN0IHRvIGxpbmsgd2l0aCB0ZXN0IFRpY2tldAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RhcmdldElkZW50aWZpZXInKS52YWwoJ1RpY2tldCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgIHNsZWVwKDIpOwoKICAgICAgICAjIHNlYXJjaCBUaWNrZXQgYnkgbnVtYmVyIGFuZCBzZWxlY3QgcmVzdWx0CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBpZD0nU0VBUkNIOjpUaWNrZXROdW1iZXInXSIpLT5zZW5kX2tleXMoJFRpY2tldE51bWJlcik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3VibWl0U2VhcmNoIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQGlkPSdMaW5rVGFyZ2V0S2V5cyddW1xAdmFsdWU9JyRUaWNrZXRJRCddIiktPmNsaWNrKCk7CgogICAgICAgICMgc2VsZWN0ICdEZXBlbmRzIHRvJyBsaW5rIHR5cGUKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNUeXBlSWRlbnRpZmllcicpLnZhbCgnRGVwZW5kc09uOjpTb3VyY2UnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQGlkPSdBZGRMaW5rcyddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjbG9zZSBsaW5rIHdpbmRvdywgcmV0dXJuIHRvIFpvb20gdmlldyBhbmQgcmVmcmVzaCBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTGlua0FkZENsb3NlTGluayIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgY2hlY2sgZm9yIGxpbmtlZCB2YWx1ZXMgaW4gQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gc2NyZWVuCiAgICAgICAgZm9yIG15ICRDaGVja1ZhbHVlcyAoICRDb25maWdJdGVtTnVtYmVyc1sxXSwgJFNlcnZpY2VOYW1lLCAkVGlja2V0TnVtYmVyICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hlY2tWYWx1ZXMgKSA+IC0xLAogICAgICAgICAgICAgICAgIkxpbmtlZCB2YWx1ZSAkQ2hlY2tWYWx1ZXMgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNsaWNrIG9uICdMaW5rJyBtZW51IGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudExpbmtPYmplY3Q7U291cmNlT2JqZWN0PUlUU01Db25maWdJdGVtO1NvdXJjZUtleT0kQ29uZmlnSXRlbUlEc1swXVwnICldIgogICAgICAgICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUYXJnZXRJZGVudGlmaWVyIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrICdnbyB0byBsaW5rIGRlbGV0ZSBzY3JlZW4nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50TGlua09iamVjdDtTdWJhY3Rpb249TGlua0RlbGV0ZVwnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgc2VsZWN0IGFsbCBsaW5rZWQgaXRlbXMgYW5kIGRlbGV0ZSBsaW5rcwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAdmFsdWU9J0lUU01Db25maWdJdGVtOjokQ29uZmlnSXRlbUlEc1sxXTo6QWx0ZXJuYXRpdmVUbyddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdGl0bGU9J0RlbGV0ZSBsaW5rcyddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEB2YWx1ZT0nU2VydmljZTo6JFNlcnZpY2VJRFw6OlJlbGV2YW50VG8nXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHRpdGxlPSdEZWxldGUgbGlua3MnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAdmFsdWU9J1RpY2tldDo6JFRpY2tldElEXDo6RGVwZW5kc09uJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0aXRsZT0nRGVsZXRlIGxpbmtzJ10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNsb3NlIGxpbmsgd2luZG93LCByZXR1cm4gdG8gWm9vbSB2aWV3IGFuZCByZWZyZXNoIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNMaW5rQWRkQ2xvc2VMaW5rIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBjaGVjayBmb3Igbm8gbGlua2VkIHZhbHVlcyBpbiBBZ2VudElUU01Db25maWdJdGVtWm9vbSBzY3JlZW4KICAgICAgICBmb3IgbXkgJENoZWNrVmFsdWVzICggJENvbmZpZ0l0ZW1OdW1iZXJzWzFdLCAkU2VydmljZU5hbWUsICRUaWNrZXROdW1iZXIgKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDaGVja1ZhbHVlcyApID09IC0xLAogICAgICAgICAgICAgICAgIkxpbmtlZCB2YWx1ZSAkQ2hlY2tWYWx1ZXMgLSBub3QgZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgdGVzdCBUaWNrZXQKICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0IGlzIGRlbGV0ZWQgLSBJRCAkVGlja2V0SUQgIgogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgQ29uZmlnSXRlbQogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbURlbGV0ZSAoQENvbmZpZ0l0ZW1JRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbURlbGV0ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRDb25maWdJdGVtRGVsZXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IHNlcnZpY2UgYW5kIGl0cyBwcmVmZXJlbmNlcwogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgcHJlZmVyZW5jZXMgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgIH0KCik7CgoxOwo=
LS0tCkRlYnVnZ2VyOgogIERlYnVnVGhyZXNob2xkOiBkZWJ1ZwogIFRlc3RNb2RlOiAwCkRlc2NyaXB0aW9uOiBJVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBDb25uZWN0b3IgU2FtcGxlCkZyYW1ld29ya1ZlcnNpb246IDUuMC54IGdpdApQcm92aWRlcjoKICBPcGVyYXRpb246CiAgICBDb25maWdJdGVtQ3JlYXRlOgogICAgICBEZXNjcmlwdGlvbjogQ3JlYXRlcyBuZXcgQ29uZmlndXJhdGlvbiBJdGVtcyBmcm9tIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudAogICAgICBNYXBwaW5nSW5ib3VuZDoge30KICAgICAgTWFwcGluZ091dGJvdW5kOiB7fQogICAgICBUeXBlOiBDb25maWdJdGVtOjpDb25maWdJdGVtQ3JlYXRlCiAgICBDb25maWdJdGVtRGVsZXRlOgogICAgICBEZXNjcmlwdGlvbjogRGVsZXRlcyBDb25maWd1cmF0aW9uIEl0ZW1zIGZyb20gSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50CiAgICAgIE1hcHBpbmdJbmJvdW5kOiB7fQogICAgICBNYXBwaW5nT3V0Ym91bmQ6IHt9CiAgICAgIFR5cGU6IENvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1EZWxldGUKICAgIENvbmZpZ0l0ZW1HZXQ6CiAgICAgIERlc2NyaXB0aW9uOiBHZXQgdGhlIGRldGFpbHMgZm9yIENvbmZpZ3VyYXRpb24gSXRlbXMgZnJvbSBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogQ29uZmlnSXRlbTo6Q29uZmlnSXRlbUdldAogICAgQ29uZmlnSXRlbVNlYXJjaDoKICAgICAgRGVzY3JpcHRpb246IFNlYXJjaCBDb25maWd1cmF0aW9uIEl0ZW1zIGZyb20gSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50CiAgICAgIE1hcHBpbmdJbmJvdW5kOiB7fQogICAgICBNYXBwaW5nT3V0Ym91bmQ6IHt9CiAgICAgIFR5cGU6IENvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1TZWFyY2gKICAgIENvbmZpZ0l0ZW1VcGRhdGU6CiAgICAgIERlc2NyaXB0aW9uOiBVcGRhdGVzIENvbmZpZ3VyYXRpb24gSXRlbXMgZnJvbSBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogQ29uZmlnSXRlbTo6Q29uZmlnSXRlbVVwZGF0ZQogIFRyYW5zcG9ydDoKICAgIENvbmZpZzoKICAgICAgTWF4TGVuZ3RoOiAxMDAwMDAwMDAKICAgICAgTmFtZVNwYWNlOiBodHRwOi8vd3d3Lm90cnMub3JnL0NvbmZpZ0l0ZW1Db25uZWN0b3IKICAgICAgUmVxdWVzdE5hbWVGcmVlVGV4dDogJycKICAgICAgUmVxdWVzdE5hbWVTY2hlbWU6IFBsYWluCiAgICAgIFJlc3BvbnNlTmFtZUZyZWVUZXh0OiAnJwogICAgICBSZXNwb25zZU5hbWVTY2hlbWU6IFJlc3BvbnNlCiAgICBUeXBlOiBIVFRQOjpTT0FQClJlbW90ZVN5c3RlbTogJycKUmVxdWVzdGVyOgogIFRyYW5zcG9ydDoKICAgIFR5cGU6ICcnCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwpteSAkSW1wb3J0RXhwb3J0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7Cm15ICRPYmplY3RCYWNrZW5kT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtJyk7Cm15ICRYTUxPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpYTUwnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZQpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgYWRkIHNvbWUgdGVzdCB0ZW1wbGF0ZXMgZm9yIGxhdGVyIGNoZWNrcwpteSBAVGVtcGxhdGVJRHM7Cm15ICRDb3VudGVyID0gMDsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgRm9ybWF0ICA9PiAnVW5pdFRlc3QnIC4gJENvdW50ZXIgLiAkUmFuZG9tSUQsCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QnIC4gJENvdW50ZXIgLiAkUmFuZG9tSUQsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgcHVzaCBAVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwoKICAgICRDb3VudGVyKys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgQ1NWIGl0ZW0pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0MSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiMgY2hlY2sgb2JqZWN0IGxpc3QKJFNlbGYtPlRydWUoCiAgICAkT2JqZWN0TGlzdDEgJiYgcmVmICRPYmplY3RMaXN0MSBlcSAnSEFTSCcgJiYgJE9iamVjdExpc3QxLT57SVRTTUNvbmZpZ0l0ZW19LAogICAgIk9iamVjdExpc3QoKSAtIElUU01Db25maWdJdGVtIGV4aXN0cyIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVzR2V0MSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT2JqZWN0QXR0cmlidXRlc0dldDEgJiYgcmVmICRPYmplY3RBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgICAgICJPYmplY3RBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAogICAgKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb3VudE1heCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJzEwJywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVnZXggICAgICAgID0+IHFyeyBcQSBcZCsgXHogfXhtcywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gNSwKICAgICAgICAgICAgICAgIERhdGFUeXBlICAgICA9PiAnSW50ZWdlckJpZ2dlclRoYW5aZXJvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0lucHV0JyA9PiB7CiAgICAgICAgICAgICAgICAnVHlwZScgPT4gJ0NoZWNrYm94JwogICAgICAgICAgICB9LAogICAgICAgICAgICAnTmFtZScgPT4gJ0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCcsCiAgICAgICAgICAgICdLZXknICA9PiAnRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcycsCiAgICAgICAgfQogICAgXTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJE9iamVjdEF0dHJpYnV0ZXNHZXQxLAogICAgICAgICRPYmplY3RBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSwKICAgICAgICAiT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gYXR0cmlidXRlcyBvZiB0aGUgcm93IGFyZSBpZGVudGljYWwiLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdEF0dHJpYnV0ZXNHZXQgdGVzdCAyIChjaGVjayB3aXRoIG5vbiBleGlzdGluZyB0ZW1wbGF0ZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKbXkgJE9iamVjdEF0dHJpYnV0ZXNHZXQyID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldDIsCiAgICAiT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgb2JqZWN0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0MiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDIsCiAgICAiTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMgdG8gdGVzdCBFeHBvcnREYXRhR2V0KCkgYW5kIEltcG9ydERhdGFTYXZlKCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEdlbmVyYWxDYXRhbG9nQ2xhc3MgPSAnVW5pdFRlc3QnIC4gJFJhbmRvbUlEOwoKIyBhZGQgYSBnZW5lcmFsIGNhdGFsb2cgdGVzdCBsaXN0CmZvciBteSAkTmFtZSAocXcoVGVzdDEgVGVzdDIgVGVzdDMgVGVzdDQpKSB7CgogICAgIyBhZGQgYSBuZXcgaXRlbQogICAgbXkgJEl0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJE5hbWUsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpdGVtIGlkCiAgICBpZiAoICEkSXRlbUlEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0uIiwKICAgICAgICApOwogICAgfQp9CgojIGRlZmluZSB0aGUgZmlyc3QgdGVzdCBkZWZpbml0aW9uIChhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcykKbXkgQENvbmZpZ0l0ZW1QZXJsRGVmaW5pdGlvbnM7CiRDb25maWdJdGVtUGVybERlZmluaXRpb25zWzBdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGVUaW1lMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSBUaW1lIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZVRpbWUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdEdW1teTEnLAogICAgICAgIE5hbWUgID0+ICdEdW1teSAxJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0R1bW15JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdHZW5lcmFsQ2F0YWxvZzEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0dlbmVyYWxDYXRhbG9nIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJyRHZW5lcmFsQ2F0YWxvZ0NsYXNzJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdJbnRlZ2VyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnSW50ZWdlciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0ludGVnZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1RleHQxJywKICAgICAgICBOYW1lICAgICAgID0+ICdUZXh0IDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnVGV4dEFyZWExJywKICAgICAgICBOYW1lICAgICAgID0+ICdUZXh0QXJlYSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKIyBkZWZpbmUgdGhlIHNlY29uZCB0ZXN0IGRlZmluaXRpb24gKHN1YiBkYXRhIHR5cGVzKQokQ29uZmlnSXRlbVBlcmxEZWZpbml0aW9uc1sxXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjEnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIxJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAxJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIyJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAyJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjJTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMiBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LApdICI7CgpteSAkWUFNTE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyk7CgpteSBAQ29uZmlnSXRlbURlZmluaXRpb25zOwpmb3IgbXkgJFBlcmxEZWZpbml0aW9uIChAQ29uZmlnSXRlbVBlcmxEZWZpbml0aW9ucykgewogICAgbXkgJFlBTUxEZWZpbml0aW9uID0gJFlBTUxPYmplY3QtPkR1bXAoCiAgICAgICAgRGF0YSA9PiBldmFsICRQZXJsRGVmaW5pdGlvbiwgICAgIyMgbm8gY3JpdGljCiAgICApOwogICAgcHVzaCBAQ29uZmlnSXRlbURlZmluaXRpb25zLCAkWUFNTERlZmluaXRpb247Cn0KCiMgYWRkIHRoZSB0ZXN0IGNsYXNzZXMKbXkgQENvbmZpZ0l0ZW1DbGFzc0lEczsKbXkgQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzOwpmb3IgbXkgJERlZmluaXRpb24gKEBDb25maWdJdGVtRGVmaW5pdGlvbnMpIHsKCiAgICAjIGdlbmVyYXRlIGEgcmFuZG9tIG5hbWUKICAgIG15ICRDbGFzc05hbWUgPSAnVW5pdFRlc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGNsYXNzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDbGFzc0lEOwoKICAgICMgYWRkIGEgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkFkZCgKICAgICAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb24sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24gaWQKICAgIGlmICggISREZWZpbml0aW9uSUQgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBjb25maWcgaXRlbSBkZWZpbml0aW9uLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtRGVmaW5pdGlvbklEcywgJERlZmluaXRpb25JRDsKfQoKIyBjcmVhdGUgc29tZSByYW5kb20gbnVtYmVycwpteSBAQ29uZmlnSXRlbU51bWJlcnM7CmZvciAoIDEgLi4gMTAgKSB7CiAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgJEhlbHBlci0+R2V0UmFuZG9tTnVtYmVyKCk7Cn0KCiMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdApteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKKTsKbXkgJURlcGxTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyREZXBsU3RhdGVMaXN0fTsKCiMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlSW5jaVN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApteSAkR2VuZXJhbENhdGFsb2dMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAopOwpteSAlR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskR2VuZXJhbENhdGFsb2dMaXN0fTsKCiMgZGVmaW5lIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbXMgPSAoCgogICAgIyBjb25maWcgaXRlbSBmb3IgYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGEgc2Vjb25kIGNvbmZpZyBpdGVtIGZvciBhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcwogICAgIyAoZHVwbGljYXRlIG5hbWUgb2YgZmlyc3QgdmVyc2lvbiBmb3Igc2VhcmNoIGNoZWNrcykKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMV0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsICAgICMgZHVwbGljYXRlIG5hbWUgZm9yIHRlc3RzCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdVbml0VGVzdDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMiAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0Mn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3QgVGV4dCBUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdDJcblRleHQgQXJyYXlcblRlc3QgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIHNwZWNpYWwgY2hhcmFjdGVyIHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnIiI7Ozo6Li4tLV9fIyMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdCBUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0XG5UZXN0XHRUZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIFVURi04IHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn4oaCIOKFuyDihZsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ+KYhCDihq4g4oa5IOKGkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAn4oKkIOKCoSDigqkg4oKvIOKCtScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KZiiDimYgg4pmJIOKZiiDimYsg4pmNIOKZkScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KciCDinaQg4piuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn1Yog1YQg1YAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ8KuIMKpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICfjgYsg44GSIOOCkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKKTsKCiMgYWRkIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbUlEczsKZm9yIG15ICRDb25maWdJdGVtIChAQ29uZmlnSXRlbXMpIHsKCiAgICAjIGFkZCBhIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgJXsgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtIGlkCiAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0uIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsICRDb25maWdJdGVtSUQ7CgogICAgIyBhZGQgdGhlIHZlcnNpb25zCiAgICBmb3IgbXkgJFZlcnNpb24gKCBAeyAkQ29uZmlnSXRlbS0+e1ZlcnNpb25zfSB9ICkgewoKICAgICAgICAjIGFkZCBhIHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHZlcnNpb24gaWQKICAgICAgICBpZiAoICEkVmVyc2lvbklEICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgdmVyc2lvbi4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEV4cG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgQEV4cG9ydERhdGFUZXN0cyA9ICgKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGV4aXN0aW5nIHRlbXBsYXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWy0xXSArIDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBtYXBwaW5nIGxpc3QgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbM10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobnVtYmVyIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuYW1lIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjYXNlIGluc2Vuc2l0aXZlIG5hbWUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAndW5pdHRlc3QgLSBjb25maWdpdGVtIDEgdmVyc2lvbiAxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5hbWUgYW5kIG51bWJlciBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoZGVwbG95bWVudCBzdGF0ZSBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzFdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoaW5jaWRlbnQgc3RhdGUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMV0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjb21iaW5lZCBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoWE1MIGRhdGEgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgRGF0ZTEgICAgICAgICAgID0+ICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgIFRleHRBcmVhMSAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICBDdXN0b21lcjEgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgIFRleHQxICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgRGF0ZVRpbWUxICAgICAgID0+ICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIEludGVnZXIxICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY29tYmluZWQgYWxsIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRHMgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSURzICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBEYXRlMSAgICAgICAgICAgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgVGV4dEFyZWExICAgICAgID0+ICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgIEN1c3RvbWVyMSAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgVGV4dDEgICAgICAgICAgID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICBEYXRlVGltZTEgICAgICAgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgSW50ZWdlcjEgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIEdlbmVyYWxDYXRhbG9nMSA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcmV0dXJuZWQgYXJyYXkpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoZG91YmxlIGVsZW1lbnQgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRHVtbXkxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnVGVzdDEnLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3ViIGVsZW1lbnQgY2hlY2tzIHdpdGggdW5kZWYgdmFsdWVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcyB3aXRoIHVuZGVmIHZhbHVlcyBhbmQgZW1wdHkgc3RyaW5ncykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjo0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdUZXN0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSA2IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ+KGgiDihbsg4oWbJywKICAgICAgICAgICAgICAgICfimIQg4oauIOKGuSDihpInLAogICAgICAgICAgICAgICAgJ+KCpCDigqEg4oKpIOKCryDigrUnLAogICAgICAgICAgICAgICAgJ+KZiiDimYgg4pmJIOKZiiDimYsg4pmNIOKZkScsCiAgICAgICAgICAgICAgICAn4pyIIOKdpCDimK4nLAogICAgICAgICAgICAgICAgJ9WKINWEINWAJywKICAgICAgICAgICAgICAgICfCriDCqScsCiAgICAgICAgICAgICAgICAn44GLIOOBkiDjgpInLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIEV4cG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEV4cG9ydFRlc3RDb3VudCA9IDE7ClRFU1Q6CmZvciBteSAkVGVzdCAoQEV4cG9ydERhdGFUZXN0cykgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkV4cG9ydFRlc3QgJEV4cG9ydFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgdGhlIG9iamVjdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntPYmplY3REYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSBlcSAnQVJSQVknCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgZGVsZXRlIGFsbCBleGlzdGluZyBtYXBwaW5nIGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKICAgICAgICBNQVBQSU5HT0JKRUNUREFUQToKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhICggQHsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgbXkgJE1hcHBpbmdJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRNYXBwaW5nT2JqZWN0RGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRoZSBzZWFyY2ggZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntTZWFyY2hEYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57U2VhcmNoRGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBzZWFyY2ggZGF0YQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTZWFyY2hEYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntTZWFyY2hEYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmRPYmplY3QtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9IH0sCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEV4cG9ydERhdGEsCiAgICAgICAgICAgICJFeHBvcnRUZXN0ICRFeHBvcnRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIHJldHVybiBmYWxzZSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggcmVmICRFeHBvcnREYXRhIG5lICdBUlJBWScgKSB7CgogICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJFeHBvcnRUZXN0ICRFeHBvcnRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSByZWZlcmVuY2UiLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIG51bWJlciBvZiByb3dzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JEV4cG9ydERhdGF9LAogICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZUV4cG9ydERhdGF9IH0sCiAgICAgICAgIkV4cG9ydFRlc3QgJEV4cG9ydFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gY29ycmVjdCBudW1iZXIgb2Ygcm93cyIsCiAgICApOwoKICAgICMgY2hlY2sgY29udGVudCBvZiBleHBvcnQgZGF0YQogICAgbXkgJENvdW50ZXJSb3cgPSAwOwogICAgUk9XOgogICAgZm9yIG15ICRFeHBvcnRSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHRyYWN0IHJlZmVyZW5jZSByb3cKICAgICAgICBteSAkUmVmZXJlbmNlUm93ID0gJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfS0+WyRDb3VudGVyUm93XTsKCiAgICAgICAgaWYgKCByZWYgJEV4cG9ydFJvdyBuZSAnQVJSQVknIHx8IHJlZiAkUmVmZXJlbmNlUm93IG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSBleHBvcnQgcm93IGFuZCByZWZlcmVuY2Ugcm93IG1hdGNoZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgY29sdW1ucwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7JEV4cG9ydFJvd30sCiAgICAgICAgICAgIHNjYWxhciBAeyRSZWZlcmVuY2VSb3d9LAogICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSBjb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlckNvbHVtbiA9IDA7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHskRXhwb3J0Um93fSApIHsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRDZWxsICkgewogICAgICAgICAgICAgICAgJENlbGwgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSApIHsKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGNlbGwgZGF0YQogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ2VsbCwKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0sCiAgICAgICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyQ29sdW1uKys7CiAgICAgICAgfQoKICAgICAgICAkQ291bnRlclJvdysrOwogICAgfQp9CmNvbnRpbnVlIHsKICAgICRFeHBvcnRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEltcG9ydERhdGFTYXZlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBJbXBvcnREYXRhVGVzdHMgPSAoCgogICAgIyBJbXBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFtdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY2xhc3MgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbLTFdICsgMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBtYXBwaW5nIGxpc3QgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbW9yZSB0aGFuIG9uZSBpZGVudGlmaWVyIHdpdGggdGhlIHNhbWUgbmFtZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnMTIzJywgJzMyMScgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGlkZW50aWZpZXIgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGlkZW50aWZpZXIgaXMgdW5kZWYgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gW3VuZGVmXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGJvdGggaWRlbnRpZmllcnMgYXJlIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGJvdGggaWRlbnRpZmllcnMgYXJlIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBpZGVudGlmaWVycyBpcyBlbXB0eSwgb25lIGlzIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcxMjMnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBpcyB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJzEyMycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgJzEyMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnMTIzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVE9ETyBBZGQgc29tZSBpZGVudGlmaWVyIHRlc3RzCgogICAgIyBlbXB0eSBuYW1lIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICdQcm9kdWN0aW9uJywgJ09wZXJhdGlvbmFsJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBkZXBsb3ltZW50IHN0YXRlIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAxJywgJ0R1bW15JywgJ09wZXJhdGlvbmFsJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBpbmNpZGVudCBzdGF0ZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMicsICdQcm9kdWN0aW9uJywgJ0R1bW15JyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgTkVXIGNvbmZpZyBpdGVtIG11c3QgYmUgY3JlYXRlZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAzJywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTA2LTA1JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wOC0wNSAwNDo1MCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzJywKICAgICAgICAgICAgICAgICAgICAnMycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzIFRleHQzIFRlc3QzJywKICAgICAgICAgICAgICAgICAgICAiVGVzdDNcblRleHRBcnJheTNcblRlc3QzIiwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDEsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAzJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQ3VzdG9tZXIxOjoxJyAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ0RhdGUxOjoxJyAgICAgICAgICAgPT4gJzIwMDgtMDYtMDUnLAogICAgICAgICAgICAgICAgJ0RhdGVUaW1lMTo6MScgICAgICAgPT4gJzIwMDgtMDgtMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDN9LAogICAgICAgICAgICAgICAgJ0ludGVnZXIxOjoxJyAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ1Rlc3QzIFRleHQzIFRlc3QzJywKICAgICAgICAgICAgICAgICdUZXh0QXJlYTE6OjEnICAgICAgID0+ICJUZXN0M1xuVGV4dEFycmF5M1xuVGVzdDMiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgc2Vjb25kIE5FVyBjb25maWcgaXRlbSBtdXN0IGJlIGNyZWF0ZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNCcsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wOS0wNScsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMTItMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0NCcsCiAgICAgICAgICAgICAgICAgICAgJzQnLAogICAgICAgICAgICAgICAgICAgICdUZXN0NCBUZXh0NCBUZXN0NCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3Q0XG5UZXh0QXJyYXk0XG5UZXN0NCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNCcsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTA5LTA1JywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTEyLTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3Q0fSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICc0JywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0NCBUZXh0NCBUZXN0NCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdDRcblRleHRBcnJheTRcblRlc3Q0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gZmlyc3QgdGVzdCBjb25maWcgaXRlbSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICAnUGlsb3QnLAogICAgICAgICAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDIgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICdUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgJzInLAogICAgICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVVBEQVRFMSBUZXN0JywKICAgICAgICAgICAgICAgICAgICAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUxXG5UZXN0IiwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUGlsb3QnLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0wMi0wMiAwMzo1OScsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0Mn0sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnMicsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFVQREFURTEgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUxXG5UZXN0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gZmlyc3QgdGVzdCBjb25maWcgaXRlbSBhZ2FpbikKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAzJywKICAgICAgICAgICAgICAgICAgICAnUmVwYWlyJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDMnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAzIDAzOjU5JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDMnLAogICAgICAgICAgICAgICAgICAgICczJywKICAgICAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFVQREFURTIgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMlxuVGVzdCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAzLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDMnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1JlcGFpcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTAyLTAzJywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTAyLTAzIDAzOjU5JywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QzfSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0IFRleHQgVVBEQVRFMiBUZXN0JywKICAgICAgICAgICAgICAgICdUZXh0QXJlYTE6OjEnICAgICAgID0+ICJUZXN0XG5UZXh0IEFycmF5IFVQREFURTJcblRlc3QiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgbmV3IHZlcnNpb24gbXVzdCBiZSBhZGRlZCB0byB0aGlyZCB0ZXN0IGNvbmZpZyBpdGVtKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjddLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjIgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIE1haW4yU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMiAoMSkgTWFpbjJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxJyAgICAgICAgICAgICAgID0+ICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnID0+ICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjInID0+ICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgPT4gJ01haW4xICgxKSBNYWluMVN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgID0+ICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnID0+ICdNYWluMiAoMSkgTWFpbjJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJyA9PiAnTWFpbjIgKDEpIE1haW4yU3ViMiAoMiknLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgICMgSW4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMicgMTYgQXR0cmlidXRlcyB3ZXJlIGltcG9ydGVkLAogICAgIyBzbyB0aGVyZSB3aWxsIGJlIDggbGluZ2VyaW5nIGF0dHJpYnV0ZXMuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjEnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyAgICAgICAgICAgICAgICAgICAgICA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gIlRlc3RcblRlc3RcdFRlc3QiLAoKICAgICAgICAgICAgICAgICMgbGluZ2VyaW5nIGZyb20gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjInID0+ICdNYWluMSAoMSkgTWFpbjFTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICAjIEluICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInIDE2IEF0dHJpYnV0ZXMgd2VyZSBpbXBvcnRlZCwKICAgICMgc28gdGhlcmUgd2lsbCBiZSA4IGxpbmdlcmluZyBhdHRyaWJ1dGVzLgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjddLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDQnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICfOqyDOtCDOuycsCiAgICAgICAgICAgICAgICAgICAgJ8+AIM+HIM+YJywKICAgICAgICAgICAgICAgICAgICAnz7ogz7Egz64nLAogICAgICAgICAgICAgICAgICAgICfJryDKkyDKoCcsCiAgICAgICAgICAgICAgICAgICAgJ8qsIMqvJywKICAgICAgICAgICAgICAgICAgICAn0Lkg0YQg0YknLAogICAgICAgICAgICAgICAgICAgICfRmiDRkScsCiAgICAgICAgICAgICAgICAgICAgJ9GsINGmJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDQnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfOqyDOtCDOuycsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ8+AIM+HIM+YJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJyA9PiAnz7ogz7Egz64nLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+ICfJryDKkyDKoCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ8qsIMqvJywKICAgICAgICAgICAgICAgICdNYWluMjo6MScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn0Lkg0YQg0YknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfRmiDRkScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ9GsINGmJywKCiAgICAgICAgICAgICAgICAjIGxpbmdlcmluZyBmcm9tICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicgPT4gJ01haW4xICgxKSBNYWluMVN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjInID0+ICdNYWluMiAoMSkgTWFpbjJTdWIyICgyKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhIHNpbXBsZSBpbXBvcnQgZm9yIHRlc3RpbmcgdGhlIG92ZXJyaWRpbmcgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ0ltcG9ydHRlc3QgNSBmb3IgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDEnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMSwKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdJbXBvcnR0ZXN0IDUgZm9yIGJlaGF2aW9yIG9mIGVtcHR5IHZhbHVlcycsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gZW1wdHkgdmFsdWUgZm9yIFRleHQxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIG5vIG5ldyB2ZXJzaW9uIHNob3VsZCBiZSBjcmVhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDEsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnSW1wb3J0dGVzdCA1IGZvciBiZWhhdmlvciBvZiBlbXB0eSB2YWx1ZXMnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IHVuZGVmIGZvciBUZXh0MSwgd2l0aCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzIHR1cm5lZCBvbgogICAgIyBubyBuZXcgdmVyc2lvbiBzaG91bGQgYmUgY3JlYXRlZAogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJ29uJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ0ltcG9ydHRlc3QgNSBmb3IgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhbiBlbXB0eSB2YWx1ZSBmb3IgVGV4dDEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb2ZmCiAgICAjIGEgbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhIHNpbmdsZSBzcGFjZSB2YWx1ZSBmb3IgVGV4dDEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgYSBuZXcgdmVyc2lvbiBzaG91bGQgYmUgY3JlYXRlZAogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnICcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDMsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnICcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgdGhlIHN0cmluZyAnMCcgdmFsdWUgZm9yIFRleHQxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIGEgbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJzAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGVtcHR5IHZhbHVlIGZvciBHZW5lcmFsQ2F0YWxvZzEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgbm8gbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgR2VuZXJhbENhdGFsb2cxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIHRoZSBpbXBvcnQgc2hvdWxkIGZhaWwKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnbm9uLWV4aXN0ZW50IGdlbmVyYWwgY2F0YWxvZyBlbnRyeScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgR2VuZXJhbENhdGFsb2cxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9mZgogICAgIyB0aGUgaW1wb3J0IHNob3VsZCBmYWlsCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICdub24tZXhpc3RlbnQgZ2VuZXJhbCBjYXRhbG9nIGVudHJ5JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhbiBlbXB0eSB2YWx1ZSBmb3IgRGVwbFN0YXRlLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIG5vIG5ldyB2ZXJzaW9uIHNob3VsZCBiZSBjcmVhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgRGVwbFN0YXRlLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIGFuIGVycm9yIHNob3VsZCBiZSBnZW5lcmF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCBkZXBsb3ltZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGVtcHR5IHZhbHVlIGZvciBJbmNpU3RhdGUsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgbm8gbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGludmFsaWQgdmFsdWUgZm9yIEluY2lTdGF0ZSwgd2l0aCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzIHR1cm5lZCBvbgogICAgIyBhbiBlcnJvciBzaG91bGQgYmUgZ2VuZXJhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGluY2lkZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJbXBvcnRUZXN0Q291bnQgPSAxOwpURVNUOgpmb3IgbXkgJFRlc3QgKEBJbXBvcnREYXRhVGVzdHMpIHsKCiAgICAjIGNoZWNrIFNvdXJjZUltcG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IE5vIFNvdXJjZUltcG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IHRoZSBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntPYmplY3REYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57T2JqZWN0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgb2JqZWN0IGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e09iamVjdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSBlcSAnQVJSQVknCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aGUgbWFwcGluZyBvYmplY3Qgcm93cwogICAgICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdERhdGEgKCBAeyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGFkZCBhIG5ldyBtYXBwaW5nIHJvdwogICAgICAgICAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRNYXBwaW5nT2JqZWN0RGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaW1wb3J0IGRhdGEgc2F2ZQogICAgbXkgKCAkQ29uZmlnSXRlbUlELCAkUmV0Q29kZSApID0gJE9iamVjdEJhY2tlbmRPYmplY3QtPkltcG9ydERhdGFTYXZlKAogICAgICAgICV7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0gfSwKICAgICAgICBDb3VudGVyID0+ICRJbXBvcnRUZXN0Q291bnQsCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgIkltcG9ydFRlc3QgJEltcG9ydFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIHJldHVybiBubyBDb25maWdJdGVtSUQiCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXRDb2RlLAogICAgICAgICAgICAiSW1wb3J0VGVzdCAkSW1wb3J0VGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIG5vIFJldENvZGUiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkltcG9ydFRlc3QgJEltcG9ydFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIHJldHVybiBDb25maWdJdGVtSUQiCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFJldENvZGUsCiAgICAgICAgIkltcG9ydFRlc3QgJEltcG9ydFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIHJldHVybiBSZXRDb2RlIgogICAgKTsKCiAgICAjIGdldCB0aGUgdmVyc2lvbiBsaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApIC8vIFtdOwoKICAgICMgY2hlY2sgbnVtYmVyIG9mIHZlcnNpb25zCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFZlcnNpb25MaXN0fSwKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57VmVyc2lvbk51bWJlcn0gfHwgMCwKICAgICAgICAiSW1wb3J0VGVzdCAkSW1wb3J0VGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gY29ycmVjdCBudW1iZXIgb2YgdmVyc2lvbnMiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGFzdCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbkRhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMSwKICAgICk7CgogICAgIyB0cmFuc2xhdGUgeG1sZGF0YSBpbiBhIDJkIGhhc2gKICAgIG15ICVYTUxIYXNoID0gJFhNTE9iamVjdC0+WE1MSGFzaDJEKAogICAgICAgIFhNTEhhc2ggPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0sCiAgICApOwoKICAgICMgY2xlYW4gdGhlIHhtbCBoYXNoCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlWE1MSGFzaCApIHsKCiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSA9fiBteyBceydDb250ZW50J1x9IFx6IH14bXM7CgogICAgICAgIGRlbGV0ZSAkWE1MSGFzaHskS2V5fTsKICAgIH0KCiAgICAjIGNoZWNrIGdlbmVyYWwgZWxlbWVudHMKICAgIEVMRU1FTlQ6CiAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KE51bWJlciBOYW1lIERlcGxTdGF0ZSBJbmNpU3RhdGUpKSB7CgogICAgICAgIG5leHQgRUxFTUVOVCBpZiAhZXhpc3RzICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH07CgogICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVsZW1lbnQKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+eyRFbGVtZW50fSwKICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fSwKICAgICAgICAgICAgIkltcG9ydFRlc3QgJEltcG9ydFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAkRWxlbWVudCBpcyBpZGVudGljYWwiLAogICAgICAgICk7CgogICAgICAgIGRlbGV0ZSAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9OwogICAgfQoKICAgICMgY2hlY2sgbnVtYmVyIG9mIFhNTCBlbGVtZW50cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBrZXlzICVYTUxIYXNoLAogICAgICAgIHNjYWxhciBrZXlzICV7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0gfSwKICAgICAgICAiSW1wb3J0VGVzdCAkSW1wb3J0VGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gY29ycmVjdCBudW1iZXIgb2YgWE1MIGVsZW1lbnRzIiwKICAgICk7CgogICAgIyBjaGVjayBYTUwgZWxlbWVudHMKICAgIEVMRU1FTlQ6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259IH0gKSB7CgogICAgICAgICMgZHVwbGljYXRlIGtleQogICAgICAgIG15ICRYTUxLZXkgPSAkS2V5OwoKICAgICAgICAjIHByZXBhcmUga2V5CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIHdoaWxlICggJFhNTEtleSA9fiBteyA6OiB9eG1zICkgewoKICAgICAgICAgICAgaWYgKCAkQ291bnRlciAlIDIgKSB7CiAgICAgICAgICAgICAgICAkWE1MS2V5ID1+IHN7IDo6IH17XVx7J314bXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkWE1MS2V5ID1+IHN7IDo6IH17J1x9W314bXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEVMRU1FTlQgaWYgIWV4aXN0cyAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfTsKCiAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfSApIHsKICAgICAgICAgICAgJFhNTEhhc2h7ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRYTUxLZXkgLiAnXXtcJ0NvbnRlbnRcJ30nIH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskS2V5fSApIHsKICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRLZXl9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgWE1MIGVsZW1lbnQKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9LAogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEtleX0sCiAgICAgICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgJEtleSBpcyBpZGVudGljYWwiLAogICAgICAgICk7CiAgICB9Cn0KY29udGludWUgewogICAgJEltcG9ydFRlc3RDb3VudCsrOwp9CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJERCT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7Cm15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwpteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKbXkgJExpbmtPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZQpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcGVyZm9ybSBDb25maWdJdGVtQ291bnQgdG8gZmlsbCB0aGUgZW1wdHkgZmllbGRzCiRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoKTsKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpIHx8IDE7CiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0lUU01Db25maWdJdGVtJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUlUU01Db25maWdJdGVtLScgLiAkQ291bnRlciAuICRSYW5kb21JRCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSVRTTUNvbmZpZ0l0ZW0tJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCm15ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzID0gJ1VuaXRUZXN0JyAuICRSYW5kb21JRDsKCiMgYWRkIGEgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApmb3IgbXkgJE5hbWUgKHF3KFRlc3QxIFRlc3QyIFRlc3QzIFRlc3Q0KSkgewoKICAgICMgYWRkIGEgbmV3IGl0ZW0KICAgIG15ICRJdGVtSUQgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkR2VuZXJhbENhdGFsb2dDbGFzcywKICAgICAgICBOYW1lICAgID0+ICROYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaXRlbSBpZAogICAgaWYgKCAhJEl0ZW1JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtLiIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBkZWZpbmUgdGhlIGZpcnN0IHRlc3QgZGVmaW5pdGlvbiAoYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMpCm15IEBDb25maWdJdGVtUGVybERlZmluaXRpb25zOwokQ29uZmlnSXRlbVBlcmxEZWZpbml0aW9uc1swXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3VzdG9tZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlVGltZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgVGltZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnRHVtbXkxJywKICAgICAgICBOYW1lICA9PiAnRHVtbXkgMScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cxJywKICAgICAgICBOYW1lICAgICAgID0+ICdHZW5lcmFsQ2F0YWxvZyAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICckR2VuZXJhbENhdGFsb2dDbGFzcycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnSW50ZWdlcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0ludGVnZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0MScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dCAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1RleHRBcmVhMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dEFyZWEgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSBzZWNvbmQgdGVzdCBkZWZpbml0aW9uIChzdWIgZGF0YSB0eXBlcykKJENvbmZpZ0l0ZW1QZXJsRGVmaW5pdGlvbnNbMV0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMScsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMicsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMicsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDEnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMlN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKXSAiOwoKIyBkZWZpbmUgdGhlIHRoaXJkIHRlc3QgZGVmaW5pdGlvbiAoZXNwZWNpYWxseSBmb3Igc2VhcmNoIHRlc3RzIHdpdGggWE1MRGF0YSkKJENvbmZpZ0l0ZW1QZXJsRGVmaW5pdGlvbnNbMl0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZVRpbWUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIFRpbWUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlVGltZScsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSBmb3VydGggdGVzdCBkZWZpbml0aW9uIChvbmx5IGZvciBzZWFyY2ggdGVzdHMpCiRDb25maWdJdGVtUGVybERlZmluaXRpb25zWzNdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKbXkgJFlBTUxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpOwoKbXkgQENvbmZpZ0l0ZW1EZWZpbml0aW9uczsKZm9yIG15ICRQZXJsRGVmaW5pdGlvbiAoQENvbmZpZ0l0ZW1QZXJsRGVmaW5pdGlvbnMpIHsKICAgIG15ICRZQU1MRGVmaW5pdGlvbiA9ICRZQU1MT2JqZWN0LT5EdW1wKAogICAgICAgIERhdGEgPT4gZXZhbCAkUGVybERlZmluaXRpb24sICAgICMjIG5vIGNyaXRpYwogICAgKTsKICAgIHB1c2ggQENvbmZpZ0l0ZW1EZWZpbml0aW9ucywgJFlBTUxEZWZpbml0aW9uOwp9CgojIGFkZCB0aGUgdGVzdCBjbGFzc2VzCm15IEBDb25maWdJdGVtQ2xhc3NJRHM7Cm15IEBDb25maWdJdGVtQ2xhc3NlczsKbXkgQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzOwpmb3IgbXkgJERlZmluaXRpb24gKEBDb25maWdJdGVtRGVmaW5pdGlvbnMpIHsKCiAgICAjIGdlbmVyYXRlIGEgcmFuZG9tIG5hbWUKICAgIG15ICRDbGFzc05hbWUgPSAnVW5pdFRlc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGNsYXNzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDbGFzc0lEOwogICAgcHVzaCBAQ29uZmlnSXRlbUNsYXNzZXMsICAkQ2xhc3NOYW1lOwoKICAgICMgYWRkIGEgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkFkZCgKICAgICAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb24sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24gaWQKICAgIGlmICggISREZWZpbml0aW9uSUQgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBjb25maWcgaXRlbSBkZWZpbml0aW9uLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtRGVmaW5pdGlvbklEcywgJERlZmluaXRpb25JRDsKfQoKIyB0ZXN0IERlZmluaXRpb25MaXN0IGZvciB0aG9zZSBzaW1wbGUgY2FzZXMKbXkgJENvdW50ZXIgPSAwOwpmb3IgbXkgJENsYXNzSUQgKEBDb25maWdJdGVtQ2xhc3NJRHMpIHsKICAgIG15ICREZWZpbml0aW9uTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgKTsKCiAgICAjIGV4cGVjdCBhIHNpbmdsZSBkZWZpbml0aW9uIHBlciBjb25maWcgaXRlbSBjbGFzcwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyREZWZpbml0aW9uTGlzdFJlZn0sCiAgICAgICAgMSwKICAgICAgICAiRGVmaW5pdGlvbkxpc3QoKSBmb3IgY2xhc3MgaWQgJENsYXNzSUQ6IGdvdCBhIHNpbmdsZSByZXN1bHQiLAogICAgKTsKCiAgICAjIGV4cGVjdCB0aGUgcmVtZW1iZXJlZCBkZWZpbml0aW9uIGlkIGluIHRoZSBmaXJzdCBkZWZpbml0aW9uCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJERlZmluaXRpb25MaXN0UmVmLT5bMF0tPntEZWZpbml0aW9uSUR9LAogICAgICAgICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1skQ291bnRlcl0sCiAgICAgICAgIkRlZmluaXRpb25MaXN0KCkgZm9yIGNsYXNzIGlkICRDbGFzc0lEOiBnb3QgZXhwZWN0ZWQgZGVmaW5pdGlvbiBpZCIsCiAgICApOwoKICAgICRDb3VudGVyKys7Cn0KCiMgY3JlYXRlIHNvbWUgcmFuZG9tIG51bWJlcnMKbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwpmb3IgKCAxIC4uIDEwMCApIHsKICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCAkSGVscGVyLT5HZXRSYW5kb21OdW1iZXIoKTsKfQoKIyBnZXQgY2xhc3MgbGlzdApteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7Cm15ICVDbGFzc0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRDbGFzc0xpc3R9OwoKIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0Cm15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlRGVwbFN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9OwoKIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdApteSAkSW5jaVN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCik7Cm15ICVJbmNpU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW5jaVN0YXRlTGlzdH07CgojIGdldCBnZW5lcmFsIGNhdGFsb2cgdGVzdCBsaXN0Cm15ICRHZW5lcmFsQ2F0YWxvZ0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJEdlbmVyYWxDYXRhbG9nQ2xhc3MsCik7Cm15ICVHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRHZW5lcmFsQ2F0YWxvZ0xpc3R9OwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIGNvbmZpZyBpdGVtIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDb25maWdJdGVtVGVzdHMgPSBbCgogICAgIyBDb25maWdJdGVtQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBDb25maWdJdGVtQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIGNvbmZpZyBpdGVtIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybmVkIGNvbmZpZyBpdGVtIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgTGFzdFZlcnNpb25JRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCBjb25maWcgaXRlbSB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayBudW1iZXIgYXR0cmlidXRlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIHdpdGggdGhpcyBudW1iZXIgYWxyZWFkeSBleGlzdHMgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFZlcnNpb25BZGQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBWZXJzaW9uQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAyIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBWZXJzaW9uQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gNCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA1IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuZWQgdmFsdWVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzZdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDYgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiA5OTk5OTk5LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzZdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGluY2lkZW50IHN0YXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm5lZCB2YWx1ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbN10sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gNyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gOTk5OTk5OSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybmVkIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s4XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA4IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzhdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChnZW5lcmFsIGNoZWNrIHdpdGggdHdvIHZlcnNpb25zKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzldLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDkgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOSBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOV0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s5XSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA5IFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDEwIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDEwIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxMF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzEwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1BsYW5uZWQnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3ByZXByb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzEwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgY29uZmlnIGl0ZW0gb25seSBmb3IgbGF0ZXIgc2VhcmNoIHRlc3RzCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBjb25maWcgaXRlbSBvbmx5IGZvciBsYXRlciBzZWFyY2ggdGVzdHMKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAyIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGNvbmZpZyBpdGVtIG9ubHkgZm9yIGxhdGVyIHNlYXJjaCB0ZXN0cywgaW5jbHVkaW5nIFhNTERhdGEKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdkdW1teV9jdXN0b21lcl9mb3JfdW5pdGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDEwLTAyLTEyIDA5OjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyAgPT4gJ1sxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbicgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyMScgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICdkdW1teV9jdXN0b21lcl9mb3JfdW5pdGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhZ0tleScgID0+ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnQ3VzdG9tZXIxXCd9WzFdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlMScgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyAgPT4gJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCdEYXRlMVwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJzIwMTAtMDItMTIgMDk6MTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYWdLZXknICA9PiAnWzFde1wnVmVyc2lvblwnfVsxXXtcJ0RhdGVUaW1lMVwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyA9PiAnWzFde1wnVmVyc2lvblwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgY29uZmlnIGl0ZW0gb25seSBmb3IgbGF0ZXIgc2VhcmNoIHRlc3RzCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzNdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDQgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbM10sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbM10sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbM10gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDQgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZGVkIHRvIGNoZWNrIGhpc3RvcnkgZnVuY3Rpb25zCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0IFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0JywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQbGFubmVkJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcmVwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBIaXN0b3J5VGVzdCBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEhpc3RvcnlHZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ1ZlcnNpb25DcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gNiwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0RlZmluaXRpb25VcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gOCwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ05hbWVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gNSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0JSUnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnSW5jaWRlbnRTdGF0ZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA5LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSAuICclJScsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdEZXBsb3ltZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UGxhbm5lZH0gLiAnJSUnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnVmVyc2lvbkNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA2LAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnTmFtZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA1LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QgVmVyc2lvbiAyJSVVbml0VGVzdCAtIEhpc3RvcnlUZXN0JywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdJbmNpZGVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9IC4gJyUlJwogICAgICAgICAgICAgICAgICAgICAgICAuICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnRGVwbG95bWVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEwLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSAuICclJScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UGxhbm5lZH0sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGRlZCBmb3IgQnVnNDE5NgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIGNhbGN1bGF0aW9uIG9mIGRlcGxveW1lbnQgYW5kIGluY2lkZW50IHN0YXRlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYgVjInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0MTk2IFYyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NiBWMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1BsYW5uZWQnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3ByZXByb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYgVjInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGRlZCBmb3IgQnVnIDQzNzcgLSBDSS1BCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzJdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uR2V0ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0Mzc3IC0gQ0ktQScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkZWQgZm9yIEJ1ZyA0Mzc3IC0gQ0ktQgogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzczXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQzNzcgLSBDSS1CJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzNdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgY29uZmlnIGl0ZW0gdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBDb25maWdJdGVtSURzOwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskQ29uZmlnSXRlbVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGV4dHJhY3Qgc291cmNlIGRhdGEKICAgIG15ICRTb3VyY2VEYXRhID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKCiAgICAjIGFkZCBhIG5ldyBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIGlmICggJFNvdXJjZURhdGEtPntDb25maWdJdGVtQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDb25maWdJdGVtQWRkfSB9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CiAgICAgICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsICRDb25maWdJdGVtSUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIGNvbmZpZyBpdGVtCiAgICBpZiAoICRUZXN0LT57UmVmZXJlbmNlRGF0YX0gJiYgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ29uZmlnSXRlbUFkZCgpIC0gQWRkIG5ldyBjb25maWcgaXRlbS4gSW5zZXJ0IHN1Y2Nlc3MuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1QgaWYgISRDb25maWdJdGVtSUQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtQWRkKCkgLSBBZGQgbmV3IGNvbmZpZyBpdGVtLiBSZXR1cm4gZmFsc2UuIiwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIGFsbCBkZWZpbmVkIHZlcnNpb25zCiAgICBteSBAVmVyc2lvbklEczsKICAgIG15ICVWZXJzaW9uSURzU2VlbjsKICAgIGlmICggJFNvdXJjZURhdGEtPntWZXJzaW9uQWRkfSApIHsKCiAgICAgICAgZm9yIG15ICRWZXJzaW9uICggQHsgJFNvdXJjZURhdGEtPntWZXJzaW9uQWRkfSB9ICkgewoKICAgICAgICAgICAgaWYgKCRDb25maWdJdGVtSUQpIHsKICAgICAgICAgICAgICAgICRWZXJzaW9uLT57Q29uZmlnSXRlbUlEfSA9ICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGEgbmV3IHZlcnNpb24KICAgICAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFZlcnNpb25JRCkgewogICAgICAgICAgICAgICAgcHVzaCBAVmVyc2lvbklEcywgJFZlcnNpb25JRCBpZiAhJFZlcnNpb25JRHNTZWVueyRWZXJzaW9uSUR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtRGF0YTsKICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgJENvbmZpZ0l0ZW1EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRDb25maWdJdGVtRGF0YSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1HZXQoKSAtIGdldCBjb25maWcgaXRlbSBkYXRhLiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYWxsIGNvbmZpZyBpdGVtIGF0dHJpYnV0ZXMKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9IH0gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ29uZmlnSXRlbURhdGEtPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtRGF0YS0+eyRBdHRyaWJ1dGV9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fS0+eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9LT57JEF0dHJpYnV0ZX0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGF0dHJpYnV0ZXMKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1EYXRhLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1HZXQoKSAtICRBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgdmVyc2lvbnMKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9CiAgICAgICAgJiYgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9CiAgICAgICAgJiYgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9IH0KICAgICAgICApCiAgICB7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBWZXJzaW9uSURzLAogICAgICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9IH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIHZlcnNpb25zIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1QgaWYgISRDb25maWdJdGVtSUQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICBzY2FsYXIgQFZlcnNpb25JRHMsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSAtIG5vIHZlcnNpb25zIGV4aXRzIiwKICAgICAgICApOwogICAgfQoKICAgIG5leHQgVEVTVCBpZiAhJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKICAgIG5leHQgVEVTVCBpZiAhJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9OwoKICAgIG15ICRDb3VudGVyICAgICAgICAgICA9IDA7CiAgICBteSAkTGFzdFZlcnNpb25JRE11c3QgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgVkVSU0lPTklEOgogICAgZm9yIG15ICRWZXJzaW9uSUQgKEBWZXJzaW9uSURzKSB7CgogICAgICAgICMgZ2V0IHRoaXMgdmVyc2lvbgogICAgICAgIG15ICRWZXJzaW9uRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBWZXJzaW9uSUQgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVmVyc2lvbkRhdGEgKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uR2V0KCkgLSBnZXQgdmVyc2lvbiBkYXRhLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVkVSU0lPTklEOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIGxhc3QgdmVyc2lvbiBpZAogICAgICAgICRMYXN0VmVyc2lvbklETXVzdCA9ICRWZXJzaW9uRGF0YS0+e1ZlcnNpb25JRH07CgogICAgICAgICMgY2hlY2sgYWxsIHZlcnNpb24gYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fS0+WyRDb3VudGVyXSB9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBuZWVkZWQgYXR0cmlidXRlcwogICAgICAgICAgICBteSAkVmVyc2lvbkF0dHJpYnV0ZSAgID0gJFZlcnNpb25EYXRhLT57JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0tPlskQ291bnRlcl0tPnskQXR0cmlidXRlfTsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRWZXJzaW9uQXR0cmlidXRlICkgewogICAgICAgICAgICAgICAgJFZlcnNpb25BdHRyaWJ1dGUgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZUF0dHJpYnV0ZSApIHsKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGF0dHJpYnV0ZXMKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFZlcnNpb25BdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkdldCgpIC0gJEF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgcHJlcGFyZSBsYXN0IHZlcnNpb24gaWQKICAgIG15ICRMYXN0VmVyc2lvbklEQWN0dWFsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57TGFzdFZlcnNpb25JRH0gKSB7CiAgICAgICAgJExhc3RWZXJzaW9uSURBY3R1YWwgPSAkQ29uZmlnSXRlbURhdGEtPntMYXN0VmVyc2lvbklEfTsKICAgIH0KCiAgICAjIGNoZWNrIGxhc3QgdmVyc2lvbiBpZAogICAgJFNlbGYtPklzKAogICAgICAgICRDb25maWdJdGVtRGF0YS0+e0xhc3RWZXJzaW9uSUR9LAogICAgICAgICRMYXN0VmVyc2lvbklETXVzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBsYXN0IHZlcnNpb24gaWQgaWRlbnRpY2FsIiwKICAgICk7CgogICAgIyBjaGVjayBoaXN0b3J5IGVudHJpZXMKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9CiAgICAgICAgJiYgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0hpc3RvcnlHZXR9CiAgICAgICAgJiYgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0hpc3RvcnlHZXR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJENvbXBsZXRlSGlzdG9yeSA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG5yIG9mIGhpc3RvcnkgZW50cmllcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntIaXN0b3J5R2V0fSB9LAogICAgICAgICAgICBzY2FsYXIgQHskQ29tcGxldGVIaXN0b3J5fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogbnIgb2YgaGlzdG9yeSBlbnRyaWVzIiwKICAgICAgICApOwoKICAgICAgICBDSEVDS05SOiBmb3IgbXkgJENoZWNrTnIgKCAwIC4uICQjeyRDb21wbGV0ZUhpc3Rvcnl9ICkgewogICAgICAgICAgICBteSAkQ2hlY2sgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57SGlzdG9yeUdldH0tPlskQ2hlY2tOcl07CiAgICAgICAgICAgIG15ICREYXRhICA9ICRDb21wbGV0ZUhpc3RvcnktPlskQ2hlY2tOcl07CgogICAgICAgICAgICBuZXh0IENIRUNLTlIgaWYgISggJENoZWNrICYmICREYXRhICk7CgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDaGVja30gKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBoaXN0b3J5IGRhdGEKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQ2hlY2stPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAkRGF0YS0+eyRLZXl9LAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IGZvciBidWdmaXggNDM3NwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJENJMSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcyXSwKICAgICk7CgogICAgbXkgJENJMiA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzczXSwKICAgICk7CgogICAgIyBsaW5rIHRoZSBDSSB3aXRoIGEgQ0kKICAgIG15ICRMaW5rUmVzdWx0ID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRDSTEsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRDSTIsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdEZXBlbmRzT24nLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHVwZGF0ZSBpbmNpZGVudCBzdGF0ZSBvZiBDSTEKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUEnLAogICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGFkZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSBmb3IgJENJMSAtIFNldCB0byAnSW5jaWRlbnQnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciBDSTEKICAgIG15ICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgb2YgQ0kxIGlzICdJbmNpZGVudCcKICAgICRTZWxmLT5JcygKICAgICAgICAkVmVyc2lvblJlZi0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIENJICRDSTEiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIENJMgogICAgJFZlcnNpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTIgaXMgJ1dhcm5pbmcnCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFZlcnNpb25SZWYtPntDdXJJbmNpU3RhdGV9LAogICAgICAgICdXYXJuaW5nJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIENJICRDSTIiLAogICAgKTsKCiAgICAjIHVwZGF0ZSBpbmNpZGVudCBzdGF0ZSBvZiBDSTIgdG8gJ0luY2lkZW50JwogICAgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ0kyLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0Mzc3IC0gQ0ktQicsCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHZlcnNpb24gY291bGQgYmUgYWRkZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkFkZCgpIGZvciBDSSAkQ0kyIC0gU2V0IHRvICdJbmNpZGVudCciLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIENJMgogICAgJFZlcnNpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTIgaXMgJ0luY2lkZW50JwogICAgJFNlbGYtPklzKAogICAgICAgICRWZXJzaW9uUmVmLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMiIsCiAgICApOwoKICAgICMgdXBkYXRlIGluY2lkZW50IHN0YXRlIG9mIENJMSB0byAnT3BlcmF0aW9uYWwnCiAgICAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQzNzcgLSBDSS1BJywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgdmVyc2lvbiBjb3VsZCBiZSBhZGRlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uQWRkKCkgZm9yIENJICRDSTEgLSBTZXQgdG8gJ09wZXJhdGlvbmFsJyIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmb3IgQ0kxCiAgICAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ0kxLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGluY2lkZW50IHN0YXRlIG9mIENJMSBpcyAnV2FybmluZycgKGJlY2F1c2Ugb2YgbGlua2VkIENJMiBpbiBzdGF0ZSAnaW5jaWRlbnQnKQogICAgJFNlbGYtPklzKAogICAgICAgICRWZXJzaW9uUmVmLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAnV2FybmluZycsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBDSSAkQ0kxIiwKICAgICk7CgogICAgIyB1cGRhdGUgaW5jaWRlbnQgc3RhdGUgb2YgQ0kyIHRvICdPcGVyYXRpb25hbCcKICAgICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUInLAogICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGFkZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSBmb3IgQ0kgJENJMiAtIFNldCB0byAnT3BlcmF0aW9uYWwnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciBDSTEKICAgICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgb2YgQ0kxIGlzICdPcGVyYXRpb25hbCcKICAgICRTZWxmLT5JcygKICAgICAgICAkVmVyc2lvblJlZi0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIENJICRDSTEiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIENJMgogICAgJFZlcnNpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTIgaXMgJ1dhcm5pbmcnCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFZlcnNpb25SZWYtPntDdXJJbmNpU3RhdGV9LAogICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBDSSAkQ0kyIiwKICAgICk7CgogICAgIyBpbmNyZWFzZSB0aGUgdGVzdCBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IGZvciBidWdmaXggMTAzNTYKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICRDSTEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICApOwoKICAgICMgYWRkIGEgdmVyc2lvbiwgc2V0IGluY2lkZW50IHN0YXRlIHRvIGluY2lkZW50CiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDEwMzU2JywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgdmVyc2lvbiBjb3VsZCBiZSBhZGRlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uQWRkKCkgZm9yICRDSTEgLSBTZXQgdG8gJ0luY2lkZW50JyIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmb3IgQ0kxCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ0kxLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGluY2lkZW50IHN0YXRlIG9mIENJMSBpcyAnSW5jaWRlbnQnCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFZlcnNpb25SZWYtPntDdXJJbmNpU3RhdGV9LAogICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBDSSAkQ0kxIiwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIGxhc3QgdmVyc2lvbgogICAgbXkgJFZlcnNpb25EZWxldGVTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25EZWxldGUoCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uUmVmLT57VmVyc2lvbklEfSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGRlbGV0ZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRWZXJzaW9uRGVsZXRlU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uRGVsZXRlKCkgZm9yICRDSTEnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGhpc3RvcnkKICAgIG15ICRIaXN0b3J5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICApOwoKICAgIG15ICRMYXN0SGlzdG9yeUVudHJ5ID0gcG9wIEB7JEhpc3RvcnlSZWZ9OwoKICAgICMgY2hlY2sgaWYgbGFzdCBoaXN0b3J5IGVudHJ5IGhhcyB0aGUgY29ycmVjdCBoaXN0b3J5IHR5cGUKICAgICRTZWxmLT5JcygKICAgICAgICAkTGFzdEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAnVmVyc2lvbkRlbGV0ZScsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSGlzdG9yeVR5cGUgb2YgbGFzdCB2ZXJzaW9uIG9mIENJICRDSTEiLAogICAgKTsKCiAgICAjIGluY3JlYXNlIHRoZSB0ZXN0IGNvdW50ZXIKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIGNvbmZpZyBpdGVtIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSBAU2VhcmNoVGVzdHMgPSAoCgogICAgIyBzZWFyY2ggQUxMIGNvbmZpZyBpdGVtcyBpbiB0aGUgdHdvIHRlc3QgY2xhc3NlcwogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBudW1iZXIgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbnVtYmVyIHBhcmFtIHdpdGggd2lsZGNhcmRzCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyID0+ICcqJyAuICRDb25maWdJdGVtTnVtYmVyc1s1MF0gLiAnKicsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG51bWJlciBwYXJhbSB3aXRoIHdpbGRjYXJkcyBidXQgd2l0aCBkZWFjdGl2YXRlZCB3aWxkY2FyZCBmZWF0dXJlCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyICAgICAgICAgPT4gJyonIC4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSAuICcqJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG9yZGVyIGJ5IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJ0NyZWF0ZUJ5J10sCiAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCAgICA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNyZWF0ZSBieSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY3JlYXRlIGJ5IHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDcmVhdGVCeSA9PiBbICRVc2VySURzWzFdLCAgICAgICAgICAgICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY2hhbmdlIGJ5IHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbMV0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWyAkVXNlcklEc1sxXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjaGFuZ2UgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgc2VhcmNoIEFMTCBjb25maWcgaXRlbXMgaW4gdGhlIHR3byB0ZXN0IGNsYXNzZXMgdXNpbmcgdGhlIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggYW4gd2lsZGNhcmQKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVW5pdFRlc3QgLSAqIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbSB3aXRoIGFuIHdpbGRjYXJkIGFuZCBhIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtICogMScsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0gd2l0aCB3aWxkY2FyZHMKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzKicsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggd2lsZGNhcmRzIGJ1dCB3aXRoIGRlYWN0aXZhdGVkIHdpbGRjYXJkIGZlYXR1cmUKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzKicsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsYXN0IHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIFByZXZpb3VzVmVyc2lvblNlYXJjaCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCAgICA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyAgICAgICAgICA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgICAgICAgID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgICAgICAgICAgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzICAgICAgICAgID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoQ3VzdG9tZXIxKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnQ3VzdG9tZXIxJ31bMV17J0NvbnRlbnQnfSIgPT4gJ2R1bW15X2N1c3RvbWVyX2Zvcl91bml0ZXN0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlVGltZTEpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZVRpbWUxJ31bMV17J0NvbnRlbnQnfSIgPT4gJzIwMTAtMDItMTIgMDk6MTQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKEN1c3RvbWVyMSwgRGF0ZTEsIERhdGVUaW1lMSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydDdXN0b21lcjEnfVsxXXsnQ29udGVudCd9IiA9PiAnZHVtbXlfY3VzdG9tZXJfZm9yX3VuaXRlc3QnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIgPT4gJzIwMTAtMDItMTInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGVUaW1lMSd9WzFdeydDb250ZW50J30iID0+ICcyMDEwLTAyLTEyIDA5OjE0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPCwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICc8JyA9PiAnMjAxMC0wMi0xMicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPCwgdHJ1ZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJzwnID0+ICcyMDEwLTAyLTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA8PSwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICc8PScgPT4gJzIwMTAtMDItMTEnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAoKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsIDw9LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnPD0nID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA8PSwgdHJ1ZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJzw9JyA9PiAnMjAxMC0wMi0xMycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPSwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICc9JyA9PiAnMjAxMC0wMi0xMScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA9LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnPScgPT4gJzIwMTAtMDItMTInLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgIT0sIGZhbHNlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnIT0nID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsICE9LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnIT0nID0+ICcyMDEwLTAyLTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsID49LCBmYWxzZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJz49JyA9PiAnMjAxMC0wMi0xMycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA+PSwgdHJ1ZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJz49JyA9PiAnMjAxMC0wMi0xMicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPj0sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICc+PScgPT4gJzIwMTAtMDItMTEnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPiwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICc+JyA9PiAnMjAxMC0wMi0xMicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA+LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnPicgPT4gJzIwMTAtMDItMTEnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgLWJldHdlZW4sIGZhbHNlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4geyAnLWJldHdlZW4nID0+IFsgJzIwMTAtMDEtMDEnLCAnMjAxMC0wMS0zMScgXSB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgLWJldHdlZW4sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICctYmV0d2VlbicgPT4gWyAnMjAxMC0wMi0wMScsICcyMDEwLTAyLTMxJyBdIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCBOYW1lID0gMCB3aXRob3V0IGFueSB3aWxkY2FyZHMKICAgICMgc2hvdWxkIHJldHVybiBubyByZXN1bHRzCiAgICAjIEJ1Z2ZpeCMgODg4MQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIE5hbWUgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCBOdW1iZXIgPSAwIHdpdGhvdXQgYW55IHdpbGRjYXJkcwogICAgIyBzaG91bGQgcmV0dXJuIG5vIHJlc3VsdHMKICAgICMgQnVnZml4IyA4ODgxCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgTnVtYmVyICAgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIGNvbmZpZyBpdGVtIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojICRTZWFyY2hUZXN0Q291bnQgcHJvdmlkZXMgZ3JvdXBpbmcgb2YgdGVzdCBjYXNlcwpteSAkU2VhcmNoVGVzdENvdW50ID0gMTsKClRFU1Q6CmZvciBteSAkVGVzdCAoQFNlYXJjaFRlc3RzKSB7CgogICAgIyBjaGVjayBTZWFyY2hEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTZWFyY2hEYXRhfSB8fCByZWYgJFRlc3QtPntTZWFyY2hEYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiBObyBTZWFyY2hEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntGdW5jdGlvbn0gfHwgcmVmICRUZXN0LT57RnVuY3Rpb259IG5lICdBUlJBWScgfHwgIUB7ICRUZXN0LT57RnVuY3Rpb259IH0gKSB7CiAgICAgICAgJFRlc3QtPntGdW5jdGlvbn0gPSBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddOwogICAgfQoKICAgIGZvciBteSAkRnVuY3Rpb24gKCBAeyAkVGVzdC0+e0Z1bmN0aW9ufSB9ICkgewoKICAgICAgICAjIHN0YXJ0IHNlYXJjaAogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT4kRnVuY3Rpb24oCiAgICAgICAgICAgICV7ICRUZXN0LT57U2VhcmNoRGF0YX0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRoZSBjb25maWcgaXRlbSBsaXN0CiAgICAgICAgaWYgKCAkVGVzdC0+e1JlZmVyZW5jZURhdGF9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUxpc3QgJiYgcmVmICRDb25maWdJdGVtTGlzdCBlcSAnQVJSQVknLAogICAgICAgICAgICAgICAgIlNlYXJjaFRlc3QgJFNlYXJjaFRlc3RDb3VudDogJEZ1bmN0aW9uKCkgLSBMaXN0IGlzIGFuIGFycmF5IHJlZmVyZW5jZS4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUIGlmICEkQ29uZmlnSXRlbUxpc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1MaXN0LAogICAgICAgICAgICAgICAgIlNlYXJjaFRlc3QgJFNlYXJjaFRlc3RDb3VudDogJEZ1bmN0aW9uKCkgLSBSZXR1cm4gZmFsc2UuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1MaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgZm91bmQgY29uZmlnIGl0ZW1zCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskQ29uZmlnSXRlbUxpc3R9LAogICAgICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfSB9LAogICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNvbmZpZyBpdGVtcyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFJlZmVyZW5jZUxpc3Q7CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGZpbmQgaWQgb2YgdGhlIGl0ZW0KICAgICAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFICIKICAgICAgICAgICAgICAgICAgICAuICJjb25maWdpdGVtX251bWJlciA9ICckTnVtYmVyJyAiCiAgICAgICAgICAgICAgICAgICAgLiAiT1JERVIgQlkgaWQgREVTQyIsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFJlZmVyZW5jZUxpc3QsICRDb25maWdJdGVtSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFycmF5cwogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1MaXN0LAogICAgICAgICAgICBcQFJlZmVyZW5jZUxpc3QsCiAgICAgICAgICAgICJTZWFyY2hUZXN0ICRTZWFyY2hUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gTGlzdCIsCiAgICAgICAgKTsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkU2VhcmNoVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0aW5nIGFkZGluZyBvZiBpbnZhbGlkIGRlZmluaXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKICAgICMgZGVmaW5lIHNvbWUgaW52YWxpZCBkZWZpbml0aW9ucwoKICAgIG15IEBJbnZhbGlkQ29uZmlnSXRlbURlZmluaXRpb25zOwoKICAgICMgRGF0YSBzY3RydWN0dXJlIGlzIG5vIGFycmF5IHJlZmVyZW5jZS4KICAgIHB1c2ggQEludmFsaWRDb25maWdJdGVtRGVmaW5pdGlvbnMsICIKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICB9LAogICAgICAgIH0KICAgICI7CgogICAgIyBEYXRhIHNjdHJ1Y3R1cmUgaGFzaCBlbGVtZW50cyBjb250YWluIG5vIGRhdGEuCiAgICBwdXNoIEBJbnZhbGlkQ29uZmlnSXRlbURlZmluaXRpb25zLCAiIFsKICAgICAgICB7CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgfSwKICAgIF0iOwoKICAgICMgTWlzc2luZyBjb21tYSBiZXR3ZWVuIHRoZSAyIGVsZW1lbnRzCiAgICBwdXNoIEBJbnZhbGlkQ29uZmlnSXRlbURlZmluaXRpb25zLCAiIFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICB9LAogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGUxJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSAxJywKICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdIjsKCiAgICAjIEtleSAiQ3VzdG9tZXIgMSIgY29udGFpbmluZyBhIHNwYWNlLgogICAgcHVzaCBASW52YWxpZENvbmZpZ0l0ZW1EZWZpbml0aW9ucywgIiBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lciAxJywgICAjIEtleSBjb250YWluaW5nIGEgc3BhY2UhCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdIjsKCiAgICAjIEtleSAiQ3VzdG9tZXIxzqPVjs6tIiBjb250YWluaW5nIG5vbi1hc2NpaSBjaGFyYWN0ZXJzLgogICAgcHVzaCBASW52YWxpZENvbmZpZ0l0ZW1EZWZpbml0aW9ucywgIiBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjHOo9WOzq0nLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXSI7CgogICAgIyBJbnZhbGlkIGVtcHR5IHN1YiBlbGVtZW50LgogICAgcHVzaCBASW52YWxpZENvbmZpZ0l0ZW1EZWZpbml0aW9ucywgIiBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjEnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgICAgIHt9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICBdIjsKCiAgICAjIGdlbmVyYXRlIGEgcmFuZG9tIG5hbWUKICAgIG15ICRDbGFzc05hbWUgPSAnVW5pdFRlc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gY2xhc3MuIiwKICAgICAgICApOwogICAgfQoKICAgIGZvciBteSAkRGVmaW5pdGlvbiAoQEludmFsaWRDb25maWdJdGVtRGVmaW5pdGlvbnMpIHsKCiAgICAgICAgIyBhZGQgYSBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcwogICAgICAgIG15ICREZWZpbml0aW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkFkZCgKICAgICAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbiwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZGVmaW5pdGlvbiBpZCwgbXVzdCBiZSBmYWxzZSwgYmVjYXVzZSBhbGwgZGVmaW5pdGlvbnMgaGF2ZSBlcnJvcnMKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICREZWZpbml0aW9uSUQsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGRlZmluaXRpb24uIiwKICAgICAgICApOwogICAgfQoKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3Rpbmcgc3VwcG9ydCBmb3IgYXR0YWNobWVudHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEF0dGFjaG1lbnRUZXN0Q29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1JRHNbMF07CgojIHZlcmlmeSB0aGF0IGluaXRpYWxseSBubyBhdHRhY2htZW50IGV4aXN0cwpteSBAQXR0YWNobWVudExpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgQ29uZmlnSXRlbUlEID0+ICRBdHRhY2htZW50VGVzdENvbmZpZ0l0ZW1JRCwKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQXR0YWNobWVudExpc3QsCiAgICAwLAogICAgJ05vIGF0dGFjaG1lbnRzIGluaXRpYWxseScsCik7CgpteSBAVGVzdEZpbGVMaXN0ID0gKAogICAgewogICAgICAgIEZpbGVuYW1lICAgID0+ICdmaXJzdCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICA9PiAnRmlyc3QgYXR0YWNobWVudCBmcm9tIElUU01Db25maWdJdGVtLnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgIH0sCiAgICB7CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NlY29uZCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICA9PiAnU2Vjb25kIGF0dGFjaG1lbnQgZnJvbSBJVFNNQ29uZmlnSXRlbS50JywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICB9LAopOwoKbXkgJEZpbGVDb3VudDsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgICRGaWxlQ291bnQrKzsKCiAgICBteSAkQWRkT2sgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskVGVzdEZpbGV9LAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXR0YWNobWVudFRlc3RDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFkZE9rLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgYWRkZWQiLAogICAgKTsKCiAgICBteSBAQXR0YWNobWVudExpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXR0YWNobWVudFRlc3RDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAQXR0YWNobWVudExpc3QsCiAgICAgICAgJEZpbGVDb3VudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgYWRkaW5nIiwKICAgICk7CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBsYXN0IGFkZGVkIGF0dGFjaG1lbnQgaXMgaW4gdGhlIGxpc3QKICAgIG15ICVBdHRhY2htZW50TG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEBBdHRhY2htZW50TGlzdDsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRhY2htZW50TG9va3VweyAkVGVzdEZpbGUtPntGaWxlbmFtZX0gfSwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBmaWxlbmFtZSBmcm9tIENvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgpIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGF0dGFjaG1lbnQKICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXR0YWNobWVudFRlc3RDb25maWdJdGVtSUQsCiAgICAgICAgRmlsZW5hbWUgICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0YWNobWVudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBDb25maWdJdGVtQXR0YWNobWVudEdldCgpIHJldHVybmVkIHRydWUiLAogICAgKTsKCiAgICAjIGNoZWNrIGF0dGFjaG1lbnQgZmlsZSBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoRmlsZW5hbWUgQ29udGVudCBDb250ZW50VHlwZSkpIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICRUZXN0RmlsZS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiAkQXR0cmlidXRlIGZyb20gQ29uZmlnSXRlbUF0dGFjaG1lbnRHZXQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBleGlzdGVuY2Ugb2YgYXR0YWNobWVudAogICAgbXkgJEF0dGFjaG1lbnRFeGlzdHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBdHRhY2htZW50VGVzdENvbmZpZ0l0ZW1JRCwKICAgICAgICBGaWxlbmFtZSAgICAgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRhY2htZW50RXhpc3RzLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgZXhpc3RzIiwKICAgICk7Cgp9CgojIG5vdyBkZWxldGUgdGhlIGF0dGFjaG1lbnRzCiRGaWxlQ291bnQgPSAwOwpteSAkTWF4VGVzdEZpbGVzID0gc2NhbGFyIEBUZXN0RmlsZUxpc3Q7CmZvciBteSAkVGVzdEZpbGUgKEBUZXN0RmlsZUxpc3QpIHsKCiAgICAkRmlsZUNvdW50Kys7CgogICAgbXkgJERlbGV0ZU9rID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXR0YWNobWVudFRlc3RDb25maWdJdGVtSUQsCiAgICAgICAgRmlsZW5hbWUgICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlT2ssCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogYXR0YWNobWVudCBkZWxldGVkIiwKICAgICk7CgogICAgbXkgQEF0dGFjaG1lbnRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBBdHRhY2htZW50TGlzdCwKICAgICAgICAkTWF4VGVzdEZpbGVzIC0gJEZpbGVDb3VudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgZGVsZXRpb24iLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEV4aXN0cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEV4aXN0cygKICAgICAgICBGaWxlbmFtZSAgICAgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXR0YWNobWVudFRlc3RDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRBdHRhY2htZW50RXhpc3RzLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgaXMgZ29uZSIsCiAgICApOwp9CgojIGNoZWNrIGNvbmZpZyBpdGVtIGRlbGV0ZQpteSAkRGVsZXRlVGVzdENvdW50ID0gMTsKZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CiAgICBteSAkRGVsZXRlT2sgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlT2ssCiAgICAgICAgIkRlbGV0ZVRlc3QgJERlbGV0ZVRlc3RDb3VudCAtIENvbmZpZ0l0ZW1EZWxldGUoKSAoQ29uZmlnSXRlbUlEPSRDb25maWdJdGVtSUQpIgogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjb25maWcgaXRlbSBpcyByZWFsbHkgZGVsZXRlZAogICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRDb25maWdJdGVtRGF0YS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgIkRlbGV0ZVRlc3QgJERlbGV0ZVRlc3RDb3VudCAtIGRvdWJsZSBjaGVjayAoQ29uZmlnSXRlbUlEPSRDb25maWdJdGVtSUQpIiwKICAgICk7CgogICAgJERlbGV0ZVRlc3RDb3VudCsrOwp9CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJFNlcnZpY2VPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwpteSAkTGlua09iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgpteSAkQ29uZmlnSXRlbU5hbWUgPSAnVW5pdFRlc3RDb25maWdJdGVtVGVzdCcgLiAkUmFuZG9tSUQ7Cm15ICRTZXJ2aWNlTmFtZSAgICA9ICdVbml0VGVzdFNlcnZpY2VUZXN0JyAuICRSYW5kb21JRDsKCm15IEBDb25maWdJdGVtSURzOwpteSBAU2VydmljZUlEczsKCm15ICRDaGVja0V4cGVjdGVkUmVzdWx0cyA9IHN1YiB7CgogICAgIyBnZXQgcGFyYW1ldGVycwogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBteSAlRXhwZWN0ZWRJbmNpZGVudFN0YXRlcyA9ICV7ICRQYXJhbXtFeHBlY3RlZEluY2lkZW50U3RhdGVzfSB9OwogICAgbXkgJU9iamVjdE5hbWVTdWZmaXgySUQgICAgPSAleyAkUGFyYW17T2JqZWN0TmFtZVN1ZmZpeDJJRH0gfTsKCiAgICAjIGNoZWNrIHRoZSByZXN1bHRzCiAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAlRXhwZWN0ZWRJbmNpZGVudFN0YXRlcyApIHsKCiAgICAgICAgaWYgKCAkT2JqZWN0IGVxICdJVFNNQ29uZmlnSXRlbScgKSB7CgogICAgICAgICAgICBmb3IgbXkgJE5hbWVTdWZmaXggKCBzb3J0IGtleXMgJXsgJEV4cGVjdGVkSW5jaWRlbnRTdGF0ZXN7JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkT2JqZWN0TmFtZVN1ZmZpeDJJRHskT2JqZWN0fS0+eyROYW1lU3VmZml4fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9LAogICAgICAgICAgICAgICAgICAgICRFeHBlY3RlZEluY2lkZW50U3RhdGVzeyRPYmplY3R9LT57JE5hbWVTdWZmaXh9LAogICAgICAgICAgICAgICAgICAgICJDaGVjayBpbmNpZGVudCBzdGF0ZSBvZiBjb25maWcgaXRlbSAkTmFtZVN1ZmZpeC4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPYmplY3QgZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICAgICAgZm9yIG15ICROYW1lU3VmZml4ICggc29ydCBrZXlzICV7ICRFeHBlY3RlZEluY2lkZW50U3RhdGVzeyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhIChpbmNsdWRpbmcgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUpCiAgICAgICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRPYmplY3ROYW1lU3VmZml4MklEeyRPYmplY3R9LT57JE5hbWVTdWZmaXh9LAogICAgICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGhlIHJlc3VsdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGV9LAogICAgICAgICAgICAgICAgICAgICRFeHBlY3RlZEluY2lkZW50U3RhdGVzeyRPYmplY3R9LT57JE5hbWVTdWZmaXh9LAogICAgICAgICAgICAgICAgICAgICJDaGVjayBpbmNpZGVudCBzdGF0ZSBvZiBzZXJ2aWNlICROYW1lU3VmZml4LiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9OwoKIyBnZXQgY2xhc3MgbGlzdApteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7Cm15ICVDbGFzc0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRDbGFzc0xpc3R9OwoKIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0Cm15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlRGVwbFN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9OwoKIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdApteSAkSW5jaVN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCik7Cm15ICVJbmNpU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW5jaVN0YXRlTGlzdH07CgojIGdldCBkZWZpbml0aW9uIGZvciAnSGFyZHdhcmUnIGNsYXNzCm15ICREZWZpbml0aW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICBDbGFzc0lEID0+ICRDbGFzc0xpc3RSZXZlcnNle0hhcmR3YXJlfSwKKTsKCm15ICVPYmplY3ROYW1lU3VmZml4MklEOwoKIyBjcmVhdGUgY29uZmlnIGl0ZW1zCmZvciBteSAkTmFtZVN1ZmZpeCAoIDEgLi4gNywgcXcoQSBCIEMgRCBFIEYgRykgKSB7CgogICAgIyBhZGQgYSBjb25maWdpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NMaXN0UmV2ZXJzZXtIYXJkd2FyZX0sCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICJBZGRlZCBjb25maWdpdGVtIGlkICRDb25maWdJdGVtSUQuIiwKICAgICk7CgogICAgIyByZW1lbWJlciB0aGUgY29uZmlnIGl0ZW0gaWQKICAgICRPYmplY3ROYW1lU3VmZml4MklEe0lUU01Db25maWdJdGVtfS0+eyROYW1lU3VmZml4fSA9ICRDb25maWdJdGVtSUQ7CgogICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKCiAgICAjIHNldCBhIG5hbWUgZm9yIGVhY2ggY29uZmlnaXRlbQogICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbU5hbWUgLiAnX0hhcmR3YXJlXycgLiAkTmFtZVN1ZmZpeCwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25SZWYtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9yID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3RWZW5kb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJBZGRlZCBhIHZlcnNpb24gZm9yIHRoZSBjb25maWdpdGVtIGlkICRDb25maWdJdGVtSUQiLAogICAgKTsKfQoKIyBjcmVhdGUgc2VydmljZXMKZm9yIG15ICROYW1lU3VmZml4ICggMSAuLiAyICkgewoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VydmljZU5hbWUgLiAnXycgLiAkTmFtZVN1ZmZpeCwKICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU2VydmljZUlELAogICAgICAgICJBZGRlZCBzZXJ2aWNlIGlkICRTZXJ2aWNlSUQuIiwKICAgICk7CgogICAgIyByZW1lbWJlciB0aGUgc2VydmljZSBpZAogICAgJE9iamVjdE5hbWVTdWZmaXgySUR7U2VydmljZX0tPnskTmFtZVN1ZmZpeH0gPSAkU2VydmljZUlEOwoKICAgIHB1c2ggQFNlcnZpY2VJRHMsICRTZXJ2aWNlSUQ7Cn0KCiMgcmVhZCB0aGUgb3JpZ2luYWwgc2V0dGluZyBmb3IgSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbgpteSAkT3JpZ0luY2lkZW50TGlua1R5cGVEaXJlY3Rpb25TZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNOjpDb3JlOjpJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uJyk7CgojIHNldCBuZXcgY29uZmlnIGZvciBJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uJywKICAgIFZhbHVlID0+IHsKICAgICAgICBEZXBlbmRzT24gPT4gJ1NvdXJjZScsCiAgICAgICAgSW5jbHVkZXMgID0+ICdTb3VyY2UnLAogICAgfSwKKTsKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rIERpYWdyYW0KIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIwojCiMgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgMQojICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgojICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAojICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAojICAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAojICAgICAgICAgQyA8KioqKioqKiogNSAtLS0tLS0+IDQgLS0tLS0tPiAzIC0tLS0tLT4gMSAqKioqKioqKio+IEEgKioqKioqKj4gRiAqKioqKioqKioqPiBHCiMgICAgICAgICAqICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICBeCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBCICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAqICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAqICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICAqICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAqICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICB2ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB2ICAgICAgICAgICAgKiAgICAgICAgICAqCiMgICAgICAgICBEICoqKioqKioqPiA3ICAgICAgICAgICAgICAgICAgICstLS0tLS0tPiAyICoqKioqKioqKioqKiAgICAgICAgICBFCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIDIKIwojCiMKIwojICBFeHBsYW5hdGlvbjoKIyAgICAgICAgICAgICAgIDEgLi4gNyBhbmQgQSAuLiBHIGFyZSBJVFNNQ29uZmlnSXRlbXMKIwojICAgICAgICAgICAgICAgRGVwZW5kc09uIExpbmtzIGFyZSBzaG93biBhcyAtLS0tLT4KIyAgICAgICAgICAgICAgIEluY2x1ZGVzICBMaW5rcyBhcmUgc2hvd24gYXMgKioqKio+CiMKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIGRlZmluZSB0aGUgbGlua3MgYmV0d2VlbiBDSXMgYW5kIFNlcnZpY2VzCm15ICVMaW5rcyA9ICgKICAgIERlcGVuZHNPbiA9PiB7CiAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAnNycgPT4gewogICAgICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gWyc1J10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICc2JyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbJzUnXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJzUnID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsnNCddLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnNCcgPT4gewogICAgICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gWyczJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICczJyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbICcxJywgJzInIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICcxJyA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+IFsnMSddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICcyJyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbJzInXSwKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICB9LAogICAgSW5jbHVkZXMgPT4gewogICAgICAgIElUU01Db25maWdJdGVtID0+IHsKICAgICAgICAgICAgJzUnID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsnQyddLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnQycgPT4gewogICAgICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gWydEJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdEJyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbJzcnXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0InID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsnMiddLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnMicgPT4gewogICAgICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gWydBJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICcxJyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbJ0EnXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0EnID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsnRiddLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnRicgPT4gewogICAgICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gWydHJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdFJyA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbJ0YnXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgbGluayB0aGUgY29uZmlnIGl0ZW1zIGFuZCBzZXJ2aWNlcyBhcyBzaG93biBpbiB0aGUgZGlhZ3JhbQpmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICVMaW5rcyApIHsKICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0ICggc29ydCBrZXlzICV7ICRMaW5rc3skTGlua1R5cGV9IH0gKSB7CiAgICAgICAgZm9yIG15ICRUYXJnZXRLZXkgKCBzb3J0IGtleXMgJXsgJExpbmtzeyRMaW5rVHlwZX0tPnskVGFyZ2V0T2JqZWN0fSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJFNvdXJjZU9iamVjdCAoIHNvcnQga2V5cyAleyAkTGlua3N7JExpbmtUeXBlfS0+eyRUYXJnZXRPYmplY3R9LT57JFRhcmdldEtleX0gfSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciBteSAkU291cmNlS2V5ICgKICAgICAgICAgICAgICAgICAgICBAeyAkTGlua3N7JExpbmtUeXBlfS0+eyRUYXJnZXRPYmplY3R9LT57JFRhcmdldEtleX0tPnskU291cmNlT2JqZWN0fSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgbGlua3MKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRPYmplY3ROYW1lU3VmZml4MklEeyRTb3VyY2VPYmplY3R9LT57JFNvdXJjZUtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJE9iamVjdE5hbWVTdWZmaXgySUR7JFRhcmdldE9iamVjdH0tPnskVGFyZ2V0S2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmtBZGQoKSAtICRTb3VyY2VPYmplY3Q6JFNvdXJjZUtleSBsaW5rZWQgd2l0aCAkVGFyZ2V0T2JqZWN0OiRUYXJnZXRLZXkgd2l0aCBMaW5rVHlwZSAnJExpbmtUeXBlJy4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzZXQgQ0k2IHRvICJJbmNpZGVudCIgYW5kIGNoZWNrIHRoZSByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkTmFtZVN1ZmZpeCAgICA9IDY7CiAgICBteSAkSW5jaWRlbnRTdGF0ZSA9ICdJbmNpZGVudCc7CgogICAgIyBjaGFuZ2UgaW5jaWRlbnQgc3RhdGUKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJE9iamVjdE5hbWVTdWZmaXgySUR7SVRTTUNvbmZpZ0l0ZW19LT57JE5hbWVTdWZmaXh9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbU5hbWUgLiAnX0hhcmR3YXJlXycgLiAkTmFtZVN1ZmZpeCwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25SZWYtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXskSW5jaWRlbnRTdGF0ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgIlNldCBjb25maWcgaXRlbSBpZCAkTmFtZVN1ZmZpeCB0byBzdGF0ZSAnJEluY2lkZW50U3RhdGUnLiIsCiAgICApOwoKICAgICRDaGVja0V4cGVjdGVkUmVzdWx0cy0+KAogICAgICAgIEV4cGVjdGVkSW5jaWRlbnRTdGF0ZXMgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzInID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICczJyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnNCcgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzUnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICc2JyA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgJzcnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQScgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdCJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0MnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRCcgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdFJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0YnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzInID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPYmplY3ROYW1lU3VmZml4MklEID0+IFwlT2JqZWN0TmFtZVN1ZmZpeDJJRCwKICAgICk7Cgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc2V0IENJNiBiYWNrIHRvICJPcGVyYXRpb25hbCIgYW5kIGNoZWNrIHRoZSByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkTmFtZVN1ZmZpeCAgICA9IDY7CiAgICBteSAkSW5jaWRlbnRTdGF0ZSA9ICdPcGVyYXRpb25hbCc7CgogICAgIyBjaGFuZ2UgaW5jaWRlbnQgc3RhdGUKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJE9iamVjdE5hbWVTdWZmaXgySUR7SVRTTUNvbmZpZ0l0ZW19LT57JE5hbWVTdWZmaXh9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbU5hbWUgLiAnX0hhcmR3YXJlXycgLiAkTmFtZVN1ZmZpeCwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25SZWYtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXskSW5jaWRlbnRTdGF0ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRWZXJzaW9uSUQsCiAgICAgICAgIlNldCBjb25maWcgaXRlbSBpZCAkTmFtZVN1ZmZpeCB0byBzdGF0ZSAnJEluY2lkZW50U3RhdGUnLiIsCiAgICApOwoKICAgICRDaGVja0V4cGVjdGVkUmVzdWx0cy0+KAogICAgICAgIEV4cGVjdGVkSW5jaWRlbnRTdGF0ZXMgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICcyJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzMnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnNCcgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICc1JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzYnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnNycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdBJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0InID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdEJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0UnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdHJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXJ2aWNlID0+IHsKICAgICAgICAgICAgICAgICcxJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzInID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPYmplY3ROYW1lU3VmZml4MklEID0+IFwlT2JqZWN0TmFtZVN1ZmZpeDJJRCwKICAgICk7Cgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc2V0IENJMSB0byAiSW5jaWRlbnQiIGFuZCBjaGVjayB0aGUgcmVzdWx0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJE5hbWVTdWZmaXggICAgPSAxOwogICAgbXkgJEluY2lkZW50U3RhdGUgPSAnSW5jaWRlbnQnOwoKICAgICMgY2hhbmdlIGluY2lkZW50IHN0YXRlCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRPYmplY3ROYW1lU3VmZml4MklEe0lUU01Db25maWdJdGVtfS0+eyROYW1lU3VmZml4fSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lIC4gJ19IYXJkd2FyZV8nIC4gJE5hbWVTdWZmaXgsCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uUmVmLT57RGVmaW5pdGlvbklEfSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7JEluY2lkZW50U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJTZXQgY29uZmlnIGl0ZW0gaWQgJE5hbWVTdWZmaXggdG8gc3RhdGUgJyRJbmNpZGVudFN0YXRlJy4iLAogICAgKTsKCiAgICAkQ2hlY2tFeHBlY3RlZFJlc3VsdHMtPigKICAgICAgICBFeHBlY3RlZEluY2lkZW50U3RhdGVzID0+IHsKICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgJzEnID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAnMicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICczJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzQnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnNScgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICc2JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzcnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQScgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJ0InID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdEJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0UnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRicgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJ0cnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICcyJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT2JqZWN0TmFtZVN1ZmZpeDJJRCA9PiBcJU9iamVjdE5hbWVTdWZmaXgySUQsCiAgICApOwoKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHNldCBDSTUgdG8gIkluY2lkZW50IiBhbmQgY2hlY2sgdGhlIHJlc3VsdHMgKENJMSBpcyBzdGlsbCBpbiAiSW5jaWRlbnQiKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJE5hbWVTdWZmaXggICAgPSA1OwogICAgbXkgJEluY2lkZW50U3RhdGUgPSAnSW5jaWRlbnQnOwoKICAgICMgY2hhbmdlIGluY2lkZW50IHN0YXRlCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRPYmplY3ROYW1lU3VmZml4MklEe0lUU01Db25maWdJdGVtfS0+eyROYW1lU3VmZml4fSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lIC4gJ19IYXJkd2FyZV8nIC4gJE5hbWVTdWZmaXgsCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uUmVmLT57RGVmaW5pdGlvbklEfSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7JEluY2lkZW50U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJTZXQgY29uZmlnIGl0ZW0gaWQgJE5hbWVTdWZmaXggdG8gc3RhdGUgJyRJbmNpZGVudFN0YXRlJy4iLAogICAgKTsKCiAgICAkQ2hlY2tFeHBlY3RlZFJlc3VsdHMtPigKICAgICAgICBFeHBlY3RlZEluY2lkZW50U3RhdGVzID0+IHsKICAgICAgICAgICAgSVRTTUNvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICAgICAgJzEnID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAnMicgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzMnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICc0JyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnNScgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICc2JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzcnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICdBJyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnQicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDJyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnRCcgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJ0UnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRicgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJ0cnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICcyJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT2JqZWN0TmFtZVN1ZmZpeDJJRCA9PiBcJU9iamVjdE5hbWVTdWZmaXgySUQsCiAgICApOwoKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc2V0IENJMSB0byAiT3BlcmF0aW9uYWwiIGFuZCBjaGVjayB0aGUgcmVzdWx0cyAoQ0k1IGlzIHN0aWxsIGluICJJbmNpZGVudCIpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICROYW1lU3VmZml4ICAgID0gMTsKICAgIG15ICRJbmNpZGVudFN0YXRlID0gJ09wZXJhdGlvbmFsJzsKCiAgICAjIGNoYW5nZSBpbmNpZGVudCBzdGF0ZQogICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkT2JqZWN0TmFtZVN1ZmZpeDJJRHtJVFNNQ29uZmlnSXRlbX0tPnskTmFtZVN1ZmZpeH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtTmFtZSAuICdfSGFyZHdhcmVfJyAuICROYW1lU3VmZml4LAogICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvblJlZi0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNleyRJbmNpZGVudFN0YXRlfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAiU2V0IGNvbmZpZyBpdGVtIGlkICROYW1lU3VmZml4IHRvIHN0YXRlICckSW5jaWRlbnRTdGF0ZScuIiwKICAgICk7CgogICAgJENoZWNrRXhwZWN0ZWRSZXN1bHRzLT4oCiAgICAgICAgRXhwZWN0ZWRJbmNpZGVudFN0YXRlcyA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgICcxJyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnMicgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzMnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICc0JyA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICAnNScgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICc2JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzcnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICdBJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0InID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQycgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJ0QnID0+ICdXYXJuaW5nJywKICAgICAgICAgICAgICAgICdFJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0YnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAnMScgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgJzInID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPYmplY3ROYW1lU3VmZml4MklEID0+IFwlT2JqZWN0TmFtZVN1ZmZpeDJJRCwKICAgICk7Cgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzZXQgQ0k1IHRvICJPcGVyYXRpb25hbCIgYW5kIGNoZWNrIHRoZSByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICROYW1lU3VmZml4ICAgID0gNTsKICAgIG15ICRJbmNpZGVudFN0YXRlID0gJ09wZXJhdGlvbmFsJzsKCiAgICAjIGNoYW5nZSBpbmNpZGVudCBzdGF0ZQogICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkT2JqZWN0TmFtZVN1ZmZpeDJJRHtJVFNNQ29uZmlnSXRlbX0tPnskTmFtZVN1ZmZpeH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtTmFtZSAuICdfSGFyZHdhcmVfJyAuICROYW1lU3VmZml4LAogICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvblJlZi0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNleyRJbmNpZGVudFN0YXRlfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAiU2V0IGNvbmZpZyBpdGVtIGlkICROYW1lU3VmZml4IHRvIHN0YXRlICckSW5jaWRlbnRTdGF0ZScuIiwKICAgICk7CgogICAgJENoZWNrRXhwZWN0ZWRSZXN1bHRzLT4oCiAgICAgICAgRXhwZWN0ZWRJbmNpZGVudFN0YXRlcyA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IHsKICAgICAgICAgICAgICAgICcxJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzInID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnMycgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICc0JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJzUnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnNicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICc3JyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0EnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0QnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnRScgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdGJyA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0cnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlcnZpY2UgPT4gewogICAgICAgICAgICAgICAgJzEnID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnMicgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9iamVjdE5hbWVTdWZmaXgySUQgPT4gXCVPYmplY3ROYW1lU3VmZml4MklELAogICAgKTsKCn0KCiMgcmVzZXQgdGhlIGVuYWJsZWQgc2V0dGluZyBmb3IgSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbiB0byBpdHMgb3JpZ2luYWwgdmFsdWUKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24nLAogICAgVmFsdWUgPT4gJE9yaWdJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uU2V0dGluZywKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBhZGQgdGhlIHRlc3QgY2xhc3NlcwpteSBAQ29uZmlnSXRlbUNsYXNzSURzOwpteSBAQ29uZmlnSXRlbUNsYXNzZXM7Cm15IEBDb25maWdJdGVtRGVmaW5pdGlvbklEczsKCiMgZ2VuZXJhdGUgYSByYW5kb20gbmFtZQpteSAkRmlyc3RDbGFzc05hbWUgID0gJ1VuaXRUZXN0Q2xhc3MxJyAuICRSYW5kb21JRDsKbXkgJFNlY29uZENsYXNzTmFtZSA9ICdVbml0VGVzdENsYXNzMicgLiAkUmFuZG9tSUQ7CgojIHNldCBhIG5hbWUgcHJlZml4Cm15ICROYW1lUHJlZml4ID0gJ1VuaXRUZXN0TmFtZScgLiAkUmFuZG9tSUQ7CgojIGFkZCBib3RoIHVuaXR0ZXN0IGNvbmZpZyBpdGVtIGNsYXNzZXMKbXkgJEZpcnN0Q2xhc3NJRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgIENsYXNzICAgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgIE5hbWUgICAgPT4gJEZpcnN0Q2xhc3NOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBjaGVjayBmaXJzdCBjbGFzcyBpZAppZiAoICEkRmlyc3RDbGFzc0lEICkgewoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDAsCiAgICAgICAgIkNhbid0IGFkZCBmaXJzdCBjb25maWcgaXRlbSBjbGFzcy4iLAogICAgKTsKfQoKcHVzaCBAQ29uZmlnSXRlbUNsYXNzSURzLCAkRmlyc3RDbGFzc0lEOwpwdXNoIEBDb25maWdJdGVtQ2xhc3NlcywgICRGaXJzdENsYXNzTmFtZTsKCm15ICRTZWNvbmRDbGFzc0lEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgTmFtZSAgICA9PiAkU2Vjb25kQ2xhc3NOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBjaGVjayBzZWNvbmQgY2xhc3MgaWQKaWYgKCAhJFNlY29uZENsYXNzSUQgKSB7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMCwKICAgICAgICAiQ2FuJ3QgYWRkIHNlY29uZCBjb25maWcgaXRlbSBjbGFzcy4iLAogICAgKTsKfQoKcHVzaCBAQ29uZmlnSXRlbUNsYXNzSURzLCAkU2Vjb25kQ2xhc3NJRDsKcHVzaCBAQ29uZmlnSXRlbUNsYXNzZXMsICAkU2Vjb25kQ2xhc3NOYW1lOwoKIyBhZGQgYW4gZW1wdHkgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MuIHRoZSBkZWZpbml0aW9uIGRvZXNuJ3QgbmVlZCBhbnkgZWxlbWVudHMsIGFzIHdlJ3JlIG9ubHkKIyB0ZXN0aW5nIHRoZSBuYW1lIHdoaWNoIGlzbid0IHBhcnQgb2YgdGhlIGRlZmluaXRpb24sIGJ1dCBvZiB0aGUgY29uZmlnIGl0ZW0gaXRzZWxmCm15ICRGaXJzdERlZmluaXRpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQWRkKAogICAgQ2xhc3NJRCAgICA9PiAkRmlyc3RDbGFzc0lELAogICAgRGVmaW5pdGlvbiA9PiAiLS0tIFtdIiwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZGVmaW5pdGlvbiBpZAppZiAoICEkRmlyc3REZWZpbml0aW9uSUQgKSB7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMCwKICAgICAgICAiQ2FuJ3QgYWRkIGZpcnN0IGNvbmZpZyBpdGVtIGRlZmluaXRpb24uIiwKICAgICk7Cn0KCnB1c2ggQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzLCAkRmlyc3REZWZpbml0aW9uSUQ7CgpteSAkU2Vjb25kRGVmaW5pdGlvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25BZGQoCiAgICBDbGFzc0lEICAgID0+ICRTZWNvbmRDbGFzc0lELAogICAgRGVmaW5pdGlvbiA9PiAiLS0tIFtdIiwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZGVmaW5pdGlvbiBpZAppZiAoICEkU2Vjb25kRGVmaW5pdGlvbklEICkgewoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDAsCiAgICAgICAgIkNhbid0IGFkZCBzZWNvbmQgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbi4iLAogICAgKTsKfQoKcHVzaCBAQ29uZmlnSXRlbURlZmluaXRpb25JRHMsICRTZWNvbmREZWZpbml0aW9uSUQ7CgpteSBAQ29uZmlnSXRlbUlEczsKCiMgYWRkIGEgY29uZmlnaXRlbSB0byBlYWNoIGNsYXNzCm15ICRGaXJzdENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgQ2xhc3NJRCA9PiAkRmlyc3RDbGFzc0lELAogICAgVXNlcklEICA9PiAxLAopOwoKaWYgKCAhJEZpcnN0Q29uZmlnSXRlbUlEICkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMCwKICAgICAgICAiRmFpbGVkIHRvIGFkZCB0aGUgZmlyc3QgY29uZmlnaXRlbSIsCiAgICApOwp9CgpwdXNoIEBDb25maWdJdGVtSURzLCAkRmlyc3RDb25maWdJdGVtSUQ7CgpteSAkU2Vjb25kQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICBDbGFzc0lEID0+ICRTZWNvbmRDbGFzc0lELAogICAgVXNlcklEICA9PiAxLAopOwoKaWYgKCAhJFNlY29uZENvbmZpZ0l0ZW1JRCApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDAsCiAgICAgICAgIkZhaWxlZCB0byBhZGQgdGhlIHNlY29uZCBjb25maWdpdGVtIiwKICAgICk7Cn0KCnB1c2ggQENvbmZpZ0l0ZW1JRHMsICRTZWNvbmRDb25maWdJdGVtSUQ7CgojIGNyZWF0ZSBhIDNyZCBjb25maWdpdGVtIGluIHRoZSAybmQgY2xhc3MKbXkgJFRoaXJkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICBDbGFzc0lEID0+ICRTZWNvbmRDbGFzc0lELAogICAgVXNlcklEICA9PiAxLAopOwoKaWYgKCAhJFRoaXJkQ29uZmlnSXRlbUlEICkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMCwKICAgICAgICAiRmFpbGVkIHRvIGFkZCB0aGUgdGhpcmQgY29uZmlnaXRlbSIsCiAgICApOwp9CgpwdXNoIEBDb25maWdJdGVtSURzLCAkVGhpcmRDb25maWdJdGVtSUQ7CgojIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVEZXBsU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgojIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0Cm15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKKTsKbXkgJUluY2lTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKCiMgc2V0IGEgbmFtZSBmb3IgZWFjaCBjb25maWdpdGVtCm15ICRGaXJzdEluaXRpYWxWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgIENvbmZpZ0l0ZW1JRCA9PiAkRmlyc3RDb25maWdJdGVtSUQsCiAgICBOYW1lICAgICAgICAgPT4gJE5hbWVQcmVmaXggLiAnRmlyc3QjMDAxJywKICAgIERlZmluaXRpb25JRCA9PiAkRmlyc3REZWZpbml0aW9uSUQsCiAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCmlmICggISRGaXJzdEluaXRpYWxWZXJzaW9uSUQgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAwLAogICAgICAgICJGYWlsZWQgdG8gYWRkIHRoZSBpbml0aWFsIHZlcnNpb24gZm9yIHRoZSBmaXJzdCBjb25maWdpdGVtIiwKICAgICk7Cn0KCm15ICRTZWNvbmRJbml0aWFsVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICBDb25maWdJdGVtSUQgPT4gJFNlY29uZENvbmZpZ0l0ZW1JRCwKICAgIE5hbWUgICAgICAgICA9PiAkTmFtZVByZWZpeCAuICdTZWNvbmQjMDAxJywKICAgIERlZmluaXRpb25JRCA9PiAkU2Vjb25kRGVmaW5pdGlvbklELAogICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgppZiAoICEkU2Vjb25kSW5pdGlhbFZlcnNpb25JRCApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDAsCiAgICAgICAgIkZhaWxlZCB0byBhZGQgdGhlIGluaXRpYWwgdmVyc2lvbiBmb3IgdGhlIHNlY29uZCBjb25maWdpdGVtIiwKICAgICk7Cn0KCm15ICRUaGlyZEluaXRpYWxWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgIENvbmZpZ0l0ZW1JRCA9PiAkVGhpcmRDb25maWdJdGVtSUQsCiAgICBOYW1lICAgICAgICAgPT4gJE5hbWVQcmVmaXggLiAnU2Vjb25kIzAwMicsCiAgICBEZWZpbml0aW9uSUQgPT4gJFNlY29uZERlZmluaXRpb25JRCwKICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKaWYgKCAhJFRoaXJkSW5pdGlhbFZlcnNpb25JRCApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDAsCiAgICAgICAgIkZhaWxlZCB0byBhZGQgdGhlIGluaXRpYWwgdmVyc2lvbiBmb3IgdGhlIHRoaXJkIGNvbmZpZ2l0ZW0iLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biB0aGUgYWN0dWFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVhZCB0aGUgb3JpZ2luYWwgc2V0dGluZyBmb3IgdGhlIHNldHRpbmcgRW5hYmxlVW5pcXVlbmVzc0NoZWNrCm15ICRPcmlnRW5hYmxlU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCgnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snKTsKCiMgZW5hYmxlIHRoZSB1bmlxdWVuZXNzIGNoZWNrCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdVbmlxdWVDSU5hbWU6OkVuYWJsZVVuaXF1ZW5lc3NDaGVjaycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyByZWFkIHRoZSBvcmlnaW5hbCBzZXR0aW5nIGZvciB0aGUgc2NvcGUgb2YgdGhlIHVuaXF1ZW5lc3MgY2hlY2sKbXkgJE9yaWdTY29wZSA9ICRDb25maWdPYmplY3QtPkdldCgnVW5pcXVlQ0lOYW1lOjpVbmlxdWVuZXNzQ2hlY2tTY29wZScpOwoKIyBtYWtlIHN1cmUsIHRoZSBzY29wZSBmb3IgdGhlIHVuaXF1ZW5lc3MgY2hlY2sgaXMgc2V0IHRvICdnbG9iYWwnCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlJywKICAgIFZhbHVlID0+ICdnbG9iYWwnLAopOwoKbXkgJFJlbmFtZVN1Y2Nlc3M7CgojIHRyeSB0byBnaXZlIHRoZSAxc3QgY29uZmlnaXRlbSB0aGUgc2FtZSBuYW1lIGFzIHRoZSAybmQgb25lCiRSZW5hbWVTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICBDb25maWdJdGVtSUQgPT4gJEZpcnN0Q29uZmlnSXRlbUlELAogICAgTmFtZSAgICAgICAgID0+ICROYW1lUHJlZml4IC4gJ1NlY29uZCMwMDEnLAogICAgRGVmaW5pdGlvbklEID0+ICRGaXJzdERlZmluaXRpb25JRCwKICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJFJlbmFtZVN1Y2Nlc3MsCiAgICAiU2NvcGUgPT4gZ2xvYmFsOiBSZW5hbWluZyBGaXJzdCMwMDEgdG8gYWxyZWFkeSBleGlzdGluZyBTZWNvbmQjMDAxIHN1Y2Nlc3NmdWxseSBwcmV2ZW50ZWQiCik7CgojIHRyeSB0byBnaXZlIHRoZSAybmQgY29uZmlnaXRlbSB0aGUgc2FtZSBuYW1lIGFzIHRoZSAzcmQgb25lCiRSZW5hbWVTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICBDb25maWdJdGVtSUQgPT4gJFNlY29uZENvbmZpZ0l0ZW1JRCwKICAgIE5hbWUgICAgICAgICA9PiAkTmFtZVByZWZpeCAuICdTZWNvbmQjMDAyJywKICAgIERlZmluaXRpb25JRCA9PiAkRmlyc3REZWZpbml0aW9uSUQsCiAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSZW5hbWVTdWNjZXNzLAogICAgIlNjb3BlID0+IGdsb2JhbDogUmVuYW1pbmcgU2Vjb25kIzAwMSB0byBhbHJlYWR5IGV4aXN0aW5nIFNlY29uZCMwMDIgc3VjY2Vzc2Z1bGx5IHByZXZlbnRlZCIKKTsKCiMgc2V0IHRoZSBzY29wZSBmb3IgdGhlIHVuaXF1ZW5lc3MgY2hlY2sgdG8gJ2NsYXNzJwokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnVW5pcXVlQ0lOYW1lOjpVbmlxdWVuZXNzQ2hlY2tTY29wZScsCiAgICBWYWx1ZSA9PiAnY2xhc3MnLAopOwoKIyB0cnkgdG8gcmVuYW1lIEZpcnN0IzAwMSBhZ2FpbiB0byBTZWNvbmQjMDAxIHdoaWNoIHNob3VsZCB3b3JrIG5vdywgZHVlIHRvIHRoZSBkaWZmZXJlbnQgY2xhc3MKJFJlbmFtZVN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgIENvbmZpZ0l0ZW1JRCA9PiAkRmlyc3RDb25maWdJdGVtSUQsCiAgICBOYW1lICAgICAgICAgPT4gJE5hbWVQcmVmaXggLiAnU2Vjb25kIzAwMScsCiAgICBEZWZpbml0aW9uSUQgPT4gJEZpcnN0RGVmaW5pdGlvbklELAogICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRSZW5hbWVTdWNjZXNzLAogICAgIlNjb3BlID0+IGNsYXNzOiBSZW5hbWluZyBGaXJzdCMwMDEgdG8gYWxyZWFkeSBleGlzdGluZyBTZWNvbmQjMDAxIHN1Y2NlZWRlZCIKKTsKCiMgdHJ5aW5nIG5vdyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgbmFtZSB3aXRoaW4gYSBjbGFzcwokUmVuYW1lU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgQ29uZmlnSXRlbUlEID0+ICRTZWNvbmRDb25maWdJdGVtSUQsCiAgICBOYW1lICAgICAgICAgPT4gJE5hbWVQcmVmaXggLiAnU2Vjb25kIzAwMicsCiAgICBEZWZpbml0aW9uSUQgPT4gJFNlY29uZERlZmluaXRpb25JRCwKICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJFJlbmFtZVN1Y2Nlc3MsCiAgICAiU2NvcGUgPT4gY2xhc3M6IFJlbmFtaW5nIFNlY29uZCMwMDEgdG8gYWxyZWFkeSBleGlzdGluZyBTZWNvbmQjMDAyIHN1Y2Nlc3NmdWxseSBwcmV2ZW50ZWQiCik7CgojIHJlc2V0IHRoZSBlbmFibGVkIHNldHRpbmcgZm9yIHRoZSB1bmlxdWVuZXNzIGNoZWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snLAogICAgVmFsdWUgPT4gJE9yaWdFbmFibGVTZXR0aW5nLAopOwoKIyByZXNldCB0aGUgc2NvcGUgZm9yIHRoZSB1bmlxdWVuZXNzIGNoZWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnVW5pcXVlQ0lOYW1lOjpVbmlxdWVuZXNzQ2hlY2tTY29wZScsCiAgICBWYWx1ZSA9PiAkT3JpZ1Njb3BlLAopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGNvbW1hbmQgb2JqZWN0Cm15ICRDb21tYW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpDb25maWdpdGVtOjpMaXN0RHVwbGljYXRlcycpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBjaGVjayBjb21tYW5kIHdpdGhvdXQgYW55IG9wdGlvbnMKbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiTm8gb3B0aW9ucyAtIGxpc3QgYWxsIGNvbmZpZyBpdGVtcyBpbiBwcm9kdWN0aXZlIHN0YXRlcyIsCik7CgojIGNoZWNrIGNvbW1hbmQgd2l0aCAtLWNsYXNzIG9wdGlvbnMgKGludmFsaWQgY2xhc3MpCm15ICRSYW5kb21DbGFzcyA9ICdOb25FeGlzdGluZ0NsYXNzJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1jbGFzcycsICRSYW5kb21DbGFzcyApOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMSwKICAgICJPcHRpb24gJ2NsYXNzJyAoYnV0IGNsYXNzICRSYW5kb21DbGFzcyBkb2Vzbid0IGV4aXN0KSAiLAopOwoKIyBhZGQgdGVzdCBjb25maWcgaXRlbQpteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiMgZ2V0ICdIYXJkd2FyZScgY2F0YWxvZyBjbGFzcyBJRHMKbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgIE5hbWUgID0+ICdIYXJkd2FyZScsCik7Cm15ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CgojIGdldCAnUHJvZHVjdGlvbicgZGVwbG95bWVudCBzdGF0ZSBJRHMKbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICBOYW1lICA9PiAnUHJvZHVjdGlvbicsCik7Cm15ICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQgPSAkUHJvZHVjdGlvbkRlcGxTdGF0ZURhdGFSZWYtPntJdGVtSUR9OwoKIyBnZXQgQ29uZmlnSXRlbSBvYmplY3QKbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiMgY3JlYXRlIENvbmZpZ0l0ZW0gbnVtYmVyCm15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICBUeXBlICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgQ2xhc3NJRCA9PiAkSGFyZHdhcmVDb25maWdJdGVtSUQsCik7CgpteSBAQ29uZmlnSXRlbUlEOwoKIyBhZGQgdGhlIG5ldyBDb25maWdJdGVtCm15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgIFVzZXJJRCAgPT4gMSwKKTsKcHVzaCBAQ29uZmlnSXRlbUlELCAkQ29uZmlnSXRlbUlEOwoKbXkgJENvbmZpZ0l0ZW1OYW1lID0gJ1Rlc3RDb25maWdJdGVtJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7Cm15ICRWZXJzaW9uSUQgICAgICA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtTmFtZSwKICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgRGVwbFN0YXRlSUQgID0+ICRQcm9kdWN0aW9uRGVwbFN0YXRlSUQsCiAgICBJbmNpU3RhdGVJRCAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCik7CgojIGFkZCB0aGUgbmV3IGR1cGxpY2F0ZSBDb25maWdJdGVtCiRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgIENsYXNzSUQgPT4gJEhhcmR3YXJlQ29uZmlnSXRlbUlELAogICAgVXNlcklEICA9PiAxLAopOwpwdXNoIEBDb25maWdJdGVtSUQsICRDb25maWdJdGVtSUQ7CgokVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgRGVmaW5pdGlvbklEID0+IDEsCiAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgIEluY2lTdGF0ZUlEICA9PiAxLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKKTsKCiMgYWRkIHRoZSBuZXcgZHVwbGljYXRlIENvbmZpZ0l0ZW0gaW4gU29mdHdhcmUgY2F0YWxvZyBjbGFzcwojIGdldCAnU29mdHdhcmUnIGNhdGFsb2cgY2xhc3MgSURzCiRDb25maWdJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICBOYW1lICA9PiAnU29mdHdhcmUnLAopOwpteSAkU29mdHdhcmVDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbURhdGFSZWYtPntJdGVtSUR9OwoKJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgQ2xhc3NJRCA9PiAkU29mdHdhcmVDb25maWdJdGVtSUQsCiAgICBVc2VySUQgID0+IDEsCik7CnB1c2ggQENvbmZpZ0l0ZW1JRCwgJENvbmZpZ0l0ZW1JRDsKCiRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgIE5hbWUgICAgICAgICA9PiAkQ29uZmlnSXRlbU5hbWUsCiAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgIERlcGxTdGF0ZUlEICA9PiAkUHJvZHVjdGlvbkRlcGxTdGF0ZUlELAogICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAopOwoKIyBjaGVjayBjb21tYW5kIHdpdGggLS1jbGFzcyBIYXJkd2FyZSBvcHRpb25zCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1jbGFzcycsICJIYXJkd2FyZSIgKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiT3B0aW9uICdjbGFzcycgKEhhcmR3YXJlKSAiLAopOwoKIyBjaGVjayBjb21tYW5kIHdpdGggLS1zY29wZSBvcHRpb25zIChpbnZhbGlkIHNjb3BlKQpteSAkUmFuZG9tU2NvcGUgPSAnc2NvcGUnIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLXNjb3BlJywgJFJhbmRvbVNjb3BlICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIk9wdGlvbiAnc2NvcGUnIChidXQgcHJvdmlkZWQgaW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICctLXNjb3BlJyAtICRSYW5kb21TY29wZSApICIsCik7CgojIGNoZWNrIGNvbW1hbmQgd2l0aCAtLXNjb3BlIGNsYXNzIG9wdGlvbnMKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLXNjb3BlJywgJ2NsYXNzJyApOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJPcHRpb24gJ3Njb3BlJyAoY2xhc3MpICIsCik7CgojIGNoZWNrIGNvbW1hbmQgd2l0aCAtLXNjb3BlIGdsb2JhbCBvcHRpb25zCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1zY29wZScsICdnbG9iYWwnICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAnc2NvcGUnIChnbG9iYWwpICIsCik7CgojIGNoZWNrIGNvbW1hbmQgd2l0aCAtLWFsbC1zdGF0ZXMgb3B0aW9ucwokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgnLS1hbGwtc3RhdGVzJyk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAnc2NvcGUnIChhbGwtc3RhdGVzKSAiLAopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFic2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRDb21tYW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpDb25maWdpdGVtOjpEZWxldGUnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIkFkbWluOjpJVFNNOjpDb25maWdpdGVtOjpEZWxldGUgZXhpdCBjb2RlIHdpdGhvdXQgb3B0aW9ucyIsCik7CgojIGNoZWNrIGNvbW1hbmQgd2l0aCBvcHRpb24gLS1hbGwgYW5kIGFyZ3VtZW50IC0tYWNjZXB0IG4gKCBjYW5jZWwgZGVsZXRpbmcgYWxsIGNvbmZpZyBpdGVtKQokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tYWxsJywgJ24nICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAnLS1hbGwnIG4iLAopOwoKIyBjaGVjayBjb21tYW5kIHdpdGggY2xhc3Mgb3B0aW9ucyAoaW52YWxpZCBjbGFzcykKbXkgJFJhbmRvbUNsYXNzID0gJ1Rlc3RDbGFzcycgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tY2xhc3MnLCAkUmFuZG9tQ2xhc3MgKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiT3B0aW9uICdjbGFzcycgKGJ1dCBjbGFzcyAkUmFuZG9tQ2xhc3MgZG9lc24ndCBleGlzdCkgIiwKKTsKCiMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgojIGFkZCB0ZXN0IGdlbmVyYWwgY2F0YWxvZyBpdGVtCm15ICRHZW5lcmFsQ2F0YWxvZ0l0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgIENsYXNzICAgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgIE5hbWUgICAgPT4gJFJhbmRvbUNsYXNzLAogICAgVmFsaWRJRCA9PiAxLAogICAgQ29tbWVudCA9PiAnQ29tbWVudCcsCiAgICBVc2VySUQgID0+IDEsCik7CgokR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICBJdGVtSUQgPT4gJEdlbmVyYWxDYXRhbG9nSXRlbUlELAogICAgS2V5ICAgID0+ICdQZXJtaXNzaW9uJywKICAgIFZhbHVlICA9PiA1LAopOwoKJFNlbGYtPlRydWUoCiAgICAkR2VuZXJhbENhdGFsb2dJdGVtSUQsCiAgICAiVGVzdCBnZW5lcmFsIGNhdGFsb2cgaXRlbSBpcyBjcmVhdGVkIC0gJEdlbmVyYWxDYXRhbG9nSXRlbUlEICIsCik7CgojIGdldCBDb25maWdJdGVtIG9iamVjdApteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBnZXQgbGlzdCBvZiBhbGwgZGVwbG95bWVudCBzdGF0ZXMKbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVSZXZlcnNlRGVwbFN0YXRlTGlzdCA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgojIGdldCBsaXN0IG9mIGFsbCBpbmNpZGVudCBzdGF0ZXMKbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwpteSAkQ29uZmlnSXRlbUlEOwoKZm9yICggMSAuLiAxMCApIHsKCiAgICAjIGNyZWF0ZSBDb25maWdJdGVtIG51bWJlcgogICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICBUeXBlICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgIENsYXNzSUQgPT4gJEdlbmVyYWxDYXRhbG9nSXRlbUlELAogICAgKTsKCiAgICAjIGFkZCB0ZXN0IENvbmZpZ0l0ZW0KICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgIENsYXNzSUQgPT4gJEdlbmVyYWxDYXRhbG9nSXRlbUlELAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgcHVzaCBAQ29uZmlnSXRlbU51bWJlcnMsICRDb25maWdJdGVtTnVtYmVyOwoKICAgICMgYWRkIG5ldyB2ZXJzaW9ucyBmb3IgdGhlIGxhc3QgYWRkZWQgaW4gcHJldmlvdXMgbG9vcAogICAgbXkgJENvbmZpZ0l0ZW1OYW1lID0gJ1Rlc3RDb25maWdJdGVtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA1MCApIHsKCiAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lIC4gJy0nIC4gJENvdW50LAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gMSwKICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRSZXZlcnNlRGVwbFN0YXRlTGlzdHtQbGFubmVkfSwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRSZXZlcnNlSW5jaVN0YXRlTGlzdHtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAgICAgIlZlcnNpb24gJENvdW50IGZvciBjb25maWcgaXRlbSAkQ29uZmlnSXRlbUlEIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU5hbWUiLAogICAgICAgICk7CgogICAgICAgICMgY2hhbmdlIHRoZSBkYXRlIGludG8gcGFzdCBmb3IgdGhlIGZpcnN0IDIwIHZlcnNpb25zCiAgICAgICAgbmV4dCBDT1VOVCBpZiAkQ291bnQgPiAxMDsKCiAgICAgICAgbXkgJFZlcnNpb25UZXN0Q3JlYXRlVGltZSA9ICcyMDEwLTAxLTAxIDAwOjAwOjAwJzsKCiAgICAgICAgIyBpbnNlcnQgbmV3IHZlcnNpb24KICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgY29uZmlnaXRlbV92ZXJzaW9uCiAgICAgICAgICAgICAgICBTRVQgY3JlYXRlX3RpbWUgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkVmVyc2lvblRlc3RDcmVhdGVUaW1lLAogICAgICAgICAgICAgICAgXCRWZXJzaW9uSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGNvbW1hbmQgd2l0aCBhbGwtb2xkZXItdGhhbi1kYXlzLXZlcnNpb25zIG9wdGlvbnMgKGRlbGV0ZSBhbGwgdmVyc2lvbnMgb2xkZXIgdGhhbiBvbmUgZGF5KQogICAgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLWFsbC1vbGRlci10aGFuLWRheXMtdmVyc2lvbnMnLCAxICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRFeGl0Q29kZSwKICAgICAgICAwLAogICAgICAgICJFeGl0IGNvZGU6IE9wdGlvbnMgLS1hbGwtb2xkZXItdGhhbi1kYXlzLXZlcnNpb25zIDEiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiByZW1haW5pbmcgdmVyc2lvbnMgb2YgdGhpcyBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb25MaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICAjIHJlc3VsdCBzaG91bGQgb25seSBiZSA0MCB2ZXJzaW9ucyBub3cKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskVmVyc2lvbkxpc3R9LAogICAgICAgIDQwLAogICAgICAgICJOdW1iZXIgb2YgcmVtYWluaW5nIHZlcnNpb25zIGFmdGVyIHJ1bm5pbmcgY29tbWFuZCB3aXRoIE9wdGlvbnMgLS1hbGwtb2xkZXItdGhhbi1kYXlzLXZlcnNpb25zIDEiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbW1hbmQgd2l0aCBhbGwtYnV0LWtlZXAtbGFzdC12ZXJzaW9ucyBvcHRpb25zIChkZWxldGUgYWxsIHZlcnNpb25zIGJ1dCBrZWVwIHRoZSBsYXN0IDMwIHZlcnNpb25zKQogICAgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLWFsbC1idXQta2VlcC1sYXN0LXZlcnNpb25zJywgMzAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4aXRDb2RlLAogICAgICAgIDAsCiAgICAgICAgIkV4aXQgY29kZTogT3B0aW9ucyAtLWFsbC1idXQta2VlcC1sYXN0LXZlcnNpb25zIDMwIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2YgcmVtYWluaW5nIHZlcnNpb25zIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgICRWZXJzaW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyByZXN1bHQgc2hvdWxkIG9ubHkgYmUgNDAgdmVyc2lvbnMgbm93CiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFZlcnNpb25MaXN0fSwKICAgICAgICAzMCwKICAgICAgICAiTnVtYmVyIG9mIHJlbWFpbmluZyB2ZXJzaW9ucyBhZnRlciBydW5uaW5nIGNvbW1hbmQgd2l0aCBPcHRpb25zIC0tYWxsLWJ1dC1rZWVwLWxhc3QtdmVyc2lvbnMgMzAiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbW1hbmQgd2l0aCBhbGwtb2xkLXZlcnNpb25zIG9wdGlvbnMgKGRlbGV0ZSBhbGwgb2xkIHZlcnNpb25zIGV4Y2VwdCB0aGUgbGFzdCBvbmUpCiAgICAkRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgnLS1hbGwtb2xkLXZlcnNpb25zJyk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRFeGl0Q29kZSwKICAgICAgICAwLAogICAgICAgICJFeGl0IGNvZGU6IE9wdGlvbnMgLS1hbGwtb2xkLXZlcnNpb25zIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2YgcmVtYWluaW5nIHZlcnNpb25zIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgICRWZXJzaW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyByZXN1bHQgc2hvdWxkIG9ubHkgYmUgNDAgdmVyc2lvbnMgbm93CiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFZlcnNpb25MaXN0fSwKICAgICAgICAxLAogICAgICAgICJOdW1iZXIgb2YgcmVtYWluaW5nIHZlcnNpb25zIGFmdGVyIHJ1bm5pbmcgY29tbWFuZCB3aXRoIE9wdGlvbnMgLS1hbGwtb2xkLXZlcnNpb25zIiwKICAgICk7Cn0KCiMgY2hlY2sgY29tbWFuZCB3aXRoIGNsYXNzIG9wdGlvbnMgKCRSYW5kb21DbGFzcyBjbGFzcykgYW5kIGRlcGxveW1lbnQtc3RhdGUgJ1BsYW5uZWQnCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1jbGFzcycsICRSYW5kb21DbGFzcywgJy0tZGVwbG95bWVudC1zdGF0ZScsICdQbGFubmVkJyApOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJFeGl0IGNvZGU6IE9wdGlvbnMgLS1jbGFzcyAkUmFuZG9tQ2xhc3MgLS1kZXBsb3ltZW50LXN0YXRlJyBQbGFubmVkIiwKKTsKCiMgY2hlY2sgY29tbWFuZCB3aXRoIGNvbmZpZ2l0ZW0tbnVtYmVyIG9wdGlvbnMKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoCiAgICAnLS1jb25maWdpdGVtLW51bWJlcicsICRDb25maWdJdGVtTnVtYmVyc1swXSwgJy0tY29uZmlnaXRlbS1udW1iZXInLAogICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzFdCik7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIkV4aXQgY29kZTogT3B0aW9ucyAtLWNvbmZpZ2l0ZW0tbnVtYmVyIiwKKTsKCiMgY2hlY2sgY29tbWFuZCB3aXRoIGNsYXNzIG9wdGlvbnMgKCRSYW5kb21DbGFzcyBjbGFzcykKIyB0aHJlZSBjb25maWcgSXRlbXMgb2YgdGVuIGNyZWF0ZWQgaW4gdGVzdCB3ZXJlIGRlbGV0ZWQgd2l0aCB0aGUgcHJldmlvdXMgY29tbWFuZHMKIyB3aXRoIHRoZSBuZXh0IGNvbW1hbmQgb3RoZXIgc2V2ZW4gd2lsbCBiZSBkZWxldGVkCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1jbGFzcycsICRSYW5kb21DbGFzcyApOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJFeGl0IGNvZGU6IE9wdGlvbiAtLWNsYXNzICRSYW5kb21DbGFzcyIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRDb21tYW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpJbmNpZGVudFN0YXRlOjpSZWNhbGN1bGF0ZScpOwoKbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiQWRtaW46OklUU006OkluY2lkZW50U3RhdGU6OlJlY2FsY3VsYXRlIGV4aXQgY29kZSIsCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKKTsKbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCm15ICRDbGFzc0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1BZGQoCiAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICBOYW1lICAgID0+ICRSYW5kb21JRCwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkQ2xhc3NJRCwKICAgICJDbGFzcyBhZGRlZCB0byBHZW5lcmFsQ2F0YWxvZyIsCik7CgpteSAkVmVyc2lvbiA9IDE7CgpteSAkUGVybERlZmluaXRpb24gPSA8PCAnRU9GJzsKWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1ZlbmRvcicsCiAgICAgICAgTmFtZSAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1ZlbmRvcicpLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiAgICAgPT4gMSwKICAgICAgICBDb3VudE1heCAgICAgPT4gMSwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMSwKICAgIH0sCl0KRU9GCgpteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCnJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAnCiAgICAgICAgSU5TRVJUIElOVE8gY29uZmlnaXRlbV9kZWZpbml0aW9uCiAgICAgICAgICAgIChjbGFzc19pZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KQogICAgICAgIFZBTFVFUwogICAgICAgICAgICAoPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgIEJpbmQgPT4gWyBcJENsYXNzSUQsIFwkUGVybERlZmluaXRpb24sIFwkVmVyc2lvbiwgXCRVc2VySUQgXSwKKTsKCnJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgU1FMID0+ICcKICAgICAgICBTRUxFQ1QgaWQKICAgICAgICBGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbgogICAgICAgIFdIRVJFIGNsYXNzX2lkID0gPwogICAgICAgICAgICBBTkQgdmVyc2lvbiA9ID8KICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uIERFU0MnLAogICAgQmluZCAgPT4gWyBcJENsYXNzSUQsIFwkVmVyc2lvbiBdLAogICAgTGltaXQgPT4gMSwKKTsKCm15ICREZWZpbml0aW9uSUQ7CndoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgJERlZmluaXRpb25JRCA9ICRSb3dbMF07Cn0KCm15ICRHZXREZWZpbml0aW9uID0gc3ViIHsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBjb25maWdpdGVtX2RlZmluaXRpb24KICAgICAgICAgICAgRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24KICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIHZlcnNpb24gREVTQycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0RlZmluaXRpb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRGVmaW5pdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREZWZpbml0aW9uID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkRGVmaW5pdGlvbjsKfTsKCm15ICREZWZpbml0aW9uID0gJEdldERlZmluaXRpb24tPiggRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uSUQgKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICREZWZpbml0aW9uLAogICAgJFBlcmxEZWZpbml0aW9uLAogICAgIkRlZmluaXRpb24gYmVmb3JlIHJ1biAoUGVybCkiLAopOwoKbXkgJENvbW1hbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OklUU006OkNvbmZpZ2l0ZW06OkRlZmluaXRpb25QZXJsMllBTUwnKTsKCm15ICggJFJlc3VsdCwgJEV4aXRDb2RlICk7Cgp7CiAgICBsb2NhbCAqU1RET1VUOwogICAgb3BlbiBTVERPVVQsICc+OnV0ZjgnLCBcJFJlc3VsdDsgICAgIyMgbm8gY3JpdGljCiAgICAkRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgpOwp9CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIkNvbW1hbmQgZXhpdCBjb2RlIiwKKTsKCiREZWZpbml0aW9uID0gJEdldERlZmluaXRpb24tPiggRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uSUQgKTsKCm15ICRZQU1MRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkR1bXAoCiAgICBEYXRhID0+IGV2YWwgJFBlcmxEZWZpbml0aW9uLCAgICAjIyBubyBjcml0aWMKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICREZWZpbml0aW9uLAogICAgJFlBTUxEZWZpbml0aW9uLAogICAgIkRlZmluaXRpb24gYmVmb3JlIHJ1biAoWUFNTCkiLAopOwoKMTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKCi8vIFRPRE86Ci8vUmVtb3ZlIHRoaXMgbGluZSBhbmQgZml4IEpTRG9jCi8vIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6SmF2YVNjcmlwdDo6RVNMaW50KQoKCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ29uZmlnSXRlbSA9IElUU00uQWdlbnQuQ29uZmlnSXRlbSB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlCiAqIEBleHBvcnRzIFRhcmdldE5TIGFzIElUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2gKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIHNlYXJjaC4KICovCklUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2ggPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJlYnVpbGQgYXR0cmlidXRlIHNlbGVjdGlvbiwgb25seSBzaG93IGF2YWlsYWJsZSBhdHRyaWJ1dGVzLgogICAgICovCiAgICBUYXJnZXROUy5BZGRpdGlvbmFsQXR0cmlidXRlU2VsZWN0aW9uUmVidWlsZCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gZ2V0IG9yaWdpbmFsIHNlbGVjdGlvbiB3aXRoIGFsbCBwb3NzaWJsZSBmaWVsZHMgYW5kIGNsb25lIGl0CiAgICAgICAgdmFyICRBdHRyaWJ1dGVDbG9uZSA9ICQoJyNBdHRyaWJ1dGVPcmlnIG9wdGlvbicpLmNsb25lKCksCiAgICAgICAgICAgICRBdHRyaWJ1dGVTZWxlY3Rpb24gPSAkKCcjQXR0cmlidXRlJykuZW1wdHkoKSwKICAgICAgICAgICAgVmFsdWU7CgogICAgICAgIC8vIHN0cmlwIGFsbCBhbHJlYWR5IHVzZWQgYXR0cmlidXRlcwogICAgICAgICRBdHRyaWJ1dGVDbG9uZS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgVmFsdWUgPSBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigkKHRoaXMpLmF0dHIoJ3ZhbHVlJykpOwogICAgICAgICAgICBpZiAoISQoJyNTZWFyY2hJbnNlcnQgbGFiZWwjTGFiZWwnICsgVmFsdWUpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZVNlbGVjdGlvbi5hcHBlbmQoJCh0aGlzKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJEF0dHJpYnV0ZVNlbGVjdGlvbi50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvZiBhdHRyaWJ1dGUgdG8gYWRkLgogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBvbmUgYXR0cmlidXRlIGZvciBzZWFyY2gKICAgICAqLwogICAgVGFyZ2V0TlMuU2VhcmNoQXR0cmlidXRlQWRkID0gZnVuY3Rpb24gKEF0dHJpYnV0ZSkgewoKICAgICAgICAvLyBlc2NhcGUgcG9zc2libGUgY29sb25zICg6KSBpbiBlbGVtZW50IGlkIGJlY2F1c2UgalF1ZXJ5IGNhbiBub3QgaGFuZGxlIGl0IGluIGlkIGF0dHJpYnV0ZSBzZWxlY3RvcnMKICAgICAgICBBdHRyaWJ1dGUgPSBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihBdHRyaWJ1dGUpOwoKICAgICAgICB2YXIgJExhYmVsID0gJCgnI1NlYXJjaEF0dHJpYnV0ZXNIaWRkZW4gbGFiZWwjTGFiZWwnICsgQXR0cmlidXRlKTsKCiAgICAgICAgaWYgKCRMYWJlbC5sZW5ndGgpIHsKICAgICAgICAgICAgJExhYmVsLnByZXYoKS5jbG9uZSgpLmFwcGVuZFRvKCcjU2VhcmNoSW5zZXJ0Jyk7CiAgICAgICAgICAgICRMYWJlbC5jbG9uZSgpLmFwcGVuZFRvKCcjU2VhcmNoSW5zZXJ0Jyk7CiAgICAgICAgICAgICRMYWJlbC5uZXh0KCkuY2xvbmUoKS5hcHBlbmRUbygnI1NlYXJjaEluc2VydCcpCgogICAgICAgICAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uIG5vdwogICAgICAgICAgICAgICAgLmZpbmQoJy5SZW1vdmVCdXR0b24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJEVsZW1lbnQgPSAkKHRoaXMpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNlYXJjaEF0dHJpYnV0ZVJlbW92ZSgkRWxlbWVudCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlYnVpbGQgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkaXRpb25hbEF0dHJpYnV0ZVNlbGVjdGlvblJlYnVpbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gc2V0IGF1dG9jb21wbGV0ZSB0byBjdXN0b21lciB0eXBlIGZpZWxkcwogICAgICAgICAgICAgICAgJCgnI1NlYXJjaEluc2VydCcpLmZpbmQoJy5JVFNNQ3VzdG9tZXJTZWFyY2gnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBJbnB1dElEID0gJCh0aGlzKS5hdHRyKCdpZCcpICsgJ0F1dG9jb21wbGV0ZSc7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnSVRTTUN1c3RvbWVyU2VhcmNoJyk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdpZCcsIElucHV0SUQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucHJldigpLmF0dHIoJ2lkJywgSW5wdXRJRCArICdTZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgcG9zc2libGUgY29sb25zICg6KSBpbiBlbGVtZW50IGlkIGJlY2F1c2UgalF1ZXJ5IGNhbiBub3QgaGFuZGxlIGl0IGluIGlkIGF0dHJpYnV0ZSBzZWxlY3RvcnMKICAgICAgICAgICAgICAgICAgICBJVFNNLkFnZW50LkN1c3RvbWVyU2VhcmNoLkluaXQoICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoSW5wdXRJRCkgKSApOwoKICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRpYWxvZyBjbG9zdXJlIHdoZW4gc2VsZWN0IGEgY3VzdG9tZXIgZnJvbSB0aGUgbGlzdAogICAgICAgICAgICAgICAgICAgICQoJ3VsLnVpLWF1dG9jb21wbGV0ZScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnI1NlYXJjaEluc2VydCcpKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBmb3JtICBvciBhbnkgZWxlbWVudAogICAgICogICAgICB3aXRoaW4gdGhpcyBmb3JtIGNoZWNrLgogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSBhbiBlbGVtZW50LgogICAgICovCgogICAgVGFyZ2V0TlMuU2VhcmNoQXR0cmlidXRlUmVtb3ZlID0gZnVuY3Rpb24gKCRFbGVtZW50KSB7CiAgICAgICAgJEVsZW1lbnQucHJldigpLnByZXYoKS5yZW1vdmUoKTsKICAgICAgICAkRWxlbWVudC5wcmV2KCkucmVtb3ZlKCk7CiAgICAgICAgJEVsZW1lbnQucmVtb3ZlKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtTdHJpbmd9IFByb2ZpbGUgVGhlIHByb2ZpbGUgbmFtZSB0aGF0IHdpbGwgYmUgZGVsZXRlLgogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlIGEgcHJvZmlsZSB2aWEgYW4gYWpheCByZXF1ZXN0cy4KICAgICAqLwogICAgZnVuY3Rpb24gU2VhcmNoUHJvZmlsZURlbGV0ZShQcm9maWxlKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICBTdWJhY3Rpb246ICdBSkFYUHJvZmlsZURlbGV0ZScsCiAgICAgICAgICAgIFByb2ZpbGU6IFByb2ZpbGUsCiAgICAgICAgICAgIENsYXNzSUQ6ICQoJyNTZWFyY2hDbGFzc0lEJykudmFsKCkKICAgICAgICB9OwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHt9CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogQGRlc2NyaXB0aW9uIFNob3dzIHdhaXRpbmcgZGlhbG9nIHVudGlsIHNlYXJjaCBzY3JlZW4gaXMgcmVhZHkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dXYWl0aW5nRGlhbG9nKCl7CiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJzxkaXYgY2xhc3M9IlNwYWNpbmcgQ2VudGVyIj48c3BhbiBjbGFzcz0iQUpBWExvYWRlciIgdGl0bGU9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ0xvYWRpbmdNc2cnKSArICciPjwvc3Bhbj48L2Rpdj4nLCBDb3JlLkNvbmZpZy5HZXQoJ0xvYWRpbmdNc2cnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSBub25lCiAgICAgKiBAcmV0dXJuIG5vdGhpbmcKICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIGFsbCBzZWFyY2ggZGlhbG9nIHNldHRpbmdzCiAgICAgKi8KCiAgICBUYXJnZXROUy5TZXRTZWFyY2hEaWFsb2cgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgLy8gaGlkZSBhZGQgdGVtcGxhdGUgYmxvY2sKICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZUFkZEJsb2NrJykuaGlkZSgpOwoKICAgICAgICAvLyBoaWRlIHNhdmUgY2hhbmdlcyBpbiB0ZW1wbGF0ZSBibG9jawogICAgICAgICQoJyNTYXZlUHJvZmlsZScpLnBhcmVudCgpLmhpZGUoKS5wcmV2KCkuaGlkZSgpLnByZXYoKS5oaWRlKCk7CgogICAgICAgIC8vIHNlYXJjaCBwcm9maWxlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCQoJyNTZWFyY2hQcm9maWxlJykudmFsKCkgJiYgJCgnI1NlYXJjaFByb2ZpbGUnKS52YWwoKSAhPT0gJ2xhc3Qtc2VhcmNoJykgewoKICAgICAgICAgICAgLy8gc2hvdyBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlRGVsZXRlJykuc2hvdygpOwoKICAgICAgICAgICAgLy8gc2hvdyBwcm9maWxlIGxpbmsKICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBc0xpbmsnKS5zaG93KCk7CgogICAgICAgICAgICAvLyBzaG93IHNhdmUgY2hhbmdlcyBpbiB0ZW1wbGF0ZSBibG9jawogICAgICAgICAgICAkKCcjU2F2ZVByb2ZpbGUnKS5wYXJlbnQoKS5zaG93KCkucHJldigpLnNob3coKS5wcmV2KCkuc2hvdygpOwoKICAgICAgICAgICAgLy8gc2V0IFNhdmVQcm9maWxlIHRvIDAKICAgICAgICAgICAgJCgnI1NhdmVQcm9maWxlJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAvLyByZWdpc3RlciBhZGQgb2YgYXR0cmlidXRlCiAgICAgICAgJCgnLkFkZEJ1dHRvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgQXR0cmlidXRlID0gJCgnI0F0dHJpYnV0ZScpLnZhbCgpOwogICAgICAgICAgICBUYXJnZXROUy5TZWFyY2hBdHRyaWJ1dGVBZGQoQXR0cmlidXRlKTsKICAgICAgICAgICAgVGFyZ2V0TlMuQWRkaXRpb25hbEF0dHJpYnV0ZVNlbGVjdGlvblJlYnVpbGQoKTsKCiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGZvciB0cmVlIHNlbGVjdGlvbiBkaWFsb2cKICAgICAgICAgICAgJCgnLlNob3dUcmVlU2VsZWN0aW9uJykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5UcmVlU2VsZWN0aW9uLlNob3dUcmVlU2VsZWN0aW9uKCQodGhpcykpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gcmVnaXN0ZXIgcmV0dXJuIGtleQogICAgICAgICQoJyNTZWFyY2hGb3JtJykudW5iaW5kKCdrZXlwcmVzcy5GaWx0ZXJJbnB1dCcpLmJpbmQoJ2tleXByZXNzLkZpbHRlcklucHV0JywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIGlmICgoRXZlbnQuY2hhckNvZGUgfHwgRXZlbnQua2V5Q29kZSkgPT09IDEzKSB7CiAgICAgICAgICAgICAgICBpZiAoIUNoZWNrRm9yU2VhcmNoZWRWYWx1ZXMoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtU3VibWl0JykudHJpZ2dlcignY2xpY2snKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyByZWdpc3RlciBzdWJtaXQKICAgICAgICAkKCcjU2VhcmNoRm9ybVN1Ym1pdCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIFNob3duQXR0cmlidXRlcyA9IFtdOwoKICAgICAgICAgICAgaWYgKCQoJyNTZWFyY2hQcm9maWxlQWRkQWN0aW9uLCAjU2VhcmNoUHJvZmlsZUFkZE5hbWUnKS5pcygnOnZpc2libGUnKSAmJiAkKCcjU2VhcmNoUHJvZmlsZUFkZE5hbWUnKS52YWwoKSkgewogICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBZGRBY3Rpb24nKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1lbWJlciBzaG93biBhdHRyaWJ1dGVzCiAgICAgICAgICAgICQoJyNTZWFyY2hJbnNlcnQgbGFiZWwnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2lkJykpIHsKICAgICAgICAgICAgICAgICAgICBTaG93bkF0dHJpYnV0ZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgnI1NlYXJjaEZvcm0gI1Nob3duQXR0cmlidXRlcycpLnZhbChTaG93bkF0dHJpYnV0ZXMuam9pbignOycpKTsKCiAgICAgICAgICAgIC8vIE5vcm1hbCByZXN1bHRzIG1vZGUgd2lsbCByZXR1cm4gSFRNTCBpbiB0aGUgc2FtZSB3aW5kb3cKICAgICAgICAgICAgaWYgKCQoJyNTZWFyY2hGb3JtICNSZXN1bHRGb3JtJykudmFsKCkgPT09ICdOb3JtYWwnKSB7CgogICAgICAgICAgICAgICAgaWYgKCFDaGVja0ZvclNlYXJjaGVkVmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBDaGVja1NlYXJjaFN0cmluZ3NGb3JTdG9wV29yZHMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoRm9ybScpLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsgLy8gUHJpbnQgYW5kIENTViBzaG91bGQgb3BlbiBpbiBhIG5ldyB3aW5kb3csIG5vIHdhaXRpbmcgZGlhbG9nCiAgICAgICAgICAgICAgICAkKCcjU2VhcmNoRm9ybScpLmF0dHIoJ3RhcmdldCcsICdTZWFyY2hSZXN1bHRQYWdlJyk7CiAgICAgICAgICAgICAgICBpZiAoIUNoZWNrRm9yU2VhcmNoZWRWYWx1ZXMoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIENoZWNrU2VhcmNoU3RyaW5nc0ZvclN0b3BXb3JkcyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykuYXR0cigndGFyZ2V0JywgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkluaXQoKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI1NlYXJjaEZvcm0nKSwgZnVuY3Rpb24gKEZvcm0pIHsKICAgICAgICAgICAgRm9ybS5zdWJtaXQoKTsKCiAgICAgICAgICAgIC8vIFNob3cgb25seSBhIHdhaXRpbmcgZGlhbG9nIGZvciBOb3JtYWwgcmVzdWx0cyBtb2RlLCBiZWNhdXNlIHRoaXMgcmVzdWx0CiAgICAgICAgICAgIC8vICB3aWxsIHJldHVybiB0aGUgSFRNTCBpbiB0aGUgc2FtZSB3aW5kb3cuCiAgICAgICAgICAgIGlmICgkKCcjU2VhcmNoRm9ybSAjUmVzdWx0Rm9ybScpLnZhbCgpID09PSAnTm9ybWFsJykgewogICAgICAgICAgICAgICAgU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBsb2FkIHByb2ZpbGUKICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZScpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFNlYXJjaFByb2ZpbGUgPSAkKCcjU2VhcmNoUHJvZmlsZScpLnZhbCgpLAogICAgICAgICAgICAgICAgU2VhcmNoUHJvZmlsZUNsYXNzSUQgPSAkKCcjU2VhcmNoQ2xhc3NJRCcpLnZhbCgpLAogICAgICAgICAgICAgICAgU2VhcmNoUHJvZmlsZUFjdGlvbiA9ICQoJyNTZWFyY2hBY3Rpb24nKS52YWwoKTsKICAgICAgICAgICAgVGFyZ2V0TlMuT3BlblNlYXJjaERpYWxvZyhTZWFyY2hQcm9maWxlQWN0aW9uLCBTZWFyY2hQcm9maWxlLCBTZWFyY2hQcm9maWxlQ2xhc3NJRCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gc2hvdyBhZGQgcHJvZmlsZSBibG9jayBvciBub3QKICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZU5ldycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQWRkQmxvY2snKS50b2dnbGUoKTsKICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBZGROYW1lJykuZm9jdXMoKTsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBhZGQgbmV3IHByb2ZpbGUKICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZUFkZEFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgUHJvZmlsZU5hbWUsICRFbGVtZW50MTsKCiAgICAgICAgICAgIC8vIGdldCBuYW1lCiAgICAgICAgICAgIFByb2ZpbGVOYW1lID0gJCgnI1NlYXJjaFByb2ZpbGVBZGROYW1lJykudmFsKCk7CgogICAgICAgICAgICAvLyBjaGVjayBuYW1lCiAgICAgICAgICAgIGlmICghUHJvZmlsZU5hbWUubGVuZ3RoIHx8IFByb2ZpbGVOYW1lLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIG5hbWUgdG8gcHJvZmlsZSBzZWxlY3Rpb24KICAgICAgICAgICAgJEVsZW1lbnQxID0gJCgnI1NlYXJjaFByb2ZpbGUnKS5jaGlsZHJlbigpLmZpcnN0KCkuY2xvbmUoKTsKICAgICAgICAgICAgJEVsZW1lbnQxLnRleHQoUHJvZmlsZU5hbWUpOwogICAgICAgICAgICAkRWxlbWVudDEuYXR0cigndmFsdWUnLCBQcm9maWxlTmFtZSk7CiAgICAgICAgICAgICRFbGVtZW50MS5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOwogICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZScpLmFwcGVuZCgkRWxlbWVudDEpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICAvLyBzZXQgaW5wdXQgYm94IHRvIGVtcHR5CiAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQWRkTmFtZScpLnZhbCgnJyk7CgogICAgICAgICAgICAvLyBoaWRlIGFkZCB0ZW1wbGF0ZSBibG9jawogICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZUFkZEJsb2NrJykuaGlkZSgpOwoKICAgICAgICAgICAgLy8gaGlkZSBzYXZlIGNoYW5nZXMgaW4gdGVtcGxhdGUgYmxvY2sKICAgICAgICAgICAgJCgnI1NhdmVQcm9maWxlJykucGFyZW50KCkuaGlkZSgpLnByZXYoKS5oaWRlKCkucHJldigpLmhpZGUoKTsKCiAgICAgICAgICAgIC8vIHNldCBTYXZlUHJvZmlsZSB0byAxCiAgICAgICAgICAgICQoJyNTYXZlUHJvZmlsZScpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKCiAgICAgICAgICAgIC8vIHNob3cgZGVsZXRlIGJ1dHRvbgogICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZURlbGV0ZScpLnNob3coKTsKCiAgICAgICAgICAgIC8vIHNob3cgcHJvZmlsZSBsaW5rCiAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQXNMaW5rJykuc2hvdygpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBkaXJlY3QgbGluayB0byBwcm9maWxlCiAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBc0xpbmsnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgU2VhcmNoUHJvZmlsZSA9ICQoJyNTZWFyY2hQcm9maWxlJykudmFsKCksCiAgICAgICAgICAgICAgICBTZWFyY2hQcm9maWxlQWN0aW9uID0gJCgnI1NlYXJjaEFjdGlvbicpLnZhbCgpLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9ICQoJyNDbGFzc0lEJykudmFsKCk7CgogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249JyArIFNlYXJjaFByb2ZpbGVBY3Rpb24gKwogICAgICAgICAgICAnO1N1YmFjdGlvbj1TZWFyY2g7VGFrZUxhc3RTZWFyY2g9MTtTYXZlUHJvZmlsZT0xO1Byb2ZpbGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChTZWFyY2hQcm9maWxlKQogICAgICAgICAgICArICc7Q2xhc3NJRD0nICsgQ2xhc3NJRDsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBkZWxldGUgcHJvZmlsZQogICAgICAgICQoJyNTZWFyY2hQcm9maWxlRGVsZXRlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKCiAgICAgICAgICAgIC8vIHN0cmlwIGFsbCBhbHJlYWR5IHVzZWQgYXR0cmlidXRlcwogICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZScpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSAhPT0gJ2xhc3Qtc2VhcmNoJykgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoSW5zZXJ0JykudGV4dCgnJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByZW1vdGUKICAgICAgICAgICAgICAgICAgICBTZWFyY2hQcm9maWxlRGVsZXRlKCQodGhpcykudmFsKCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbG9jYWwKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzaG93IGZ1bGx0ZXh0CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2VhcmNoQXR0cmlidXRlQWRkKCdGdWxsdGV4dCcpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZScpLnRyaWdnZXIoJ2NoYW5nZScpOwoKICAgICAgICAgICAgaWYgKCQoJyNTZWFyY2hQcm9maWxlJykudmFsKCkgJiYgJCgnI1NlYXJjaFByb2ZpbGUnKS52YWwoKSA9PT0gJ2xhc3Qtc2VhcmNoJykgewoKICAgICAgICAgICAgICAgIC8vIGhpZGUgZGVsZXRlIGxpbmsKICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlRGVsZXRlJykuaGlkZSgpOwoKICAgICAgICAgICAgICAgIC8vIHNob3cgcHJvZmlsZSBsaW5rCiAgICAgICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZUFzTGluaycpLmhpZGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1Byb2ZpbGV9IFRoZSBwcm9maWxlIHRoYXQgaXMgc2V0IHRvIHRoZSBzZWFyY2ggZGlhbG9nCiAgICAgKiBAcmV0dXJuIG5vdGhpbmcKICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZWZyZXNoIHRoZSBzZWFyY2ggZGlhbG9nIHdpdGggdGhlIHNlbGVjdGVkIHByb2ZpbGUKICAgICAqLwoKICAgIFRhcmdldE5TLkxvYWRQcm9maWxlID0gZnVuY3Rpb24gKFByb2ZpbGUpIHsKICAgICAgICB2YXIgQmFzZUxpbmsgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgIEFjdGlvbiA9ICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaDsnLAogICAgICAgICAgICBTdWJBY3Rpb24gPSAnU3ViYWN0aW9uPUFKQVhVcGRhdGU7JywKICAgICAgICAgICAgQ2xhc3NJRCA9ICdDbGFzc0lEPScgKyAkKCcjU2VhcmNoQ2xhc3NJRCcpLnZhbCgpICsgJzsnLAogICAgICAgICAgICBTZWFyY2hQcm9maWxlID0gJ1Byb2ZpbGU9JyArIFByb2ZpbGUsCiAgICAgICAgICAgIFVSTCA9ICBCYXNlTGluayArIEFjdGlvbiArIFN1YkFjdGlvbiArIENsYXNzSUQgKyBTZWFyY2hQcm9maWxlOwoKICAgICAgICAkKCcjRGl2Q2xhc3NJRCcpLmFkZENsYXNzKCd1aS1hdXRvY29tcGxldGUtbG9hZGluZycpOwogICAgICAgIENvcmUuQUpBWC5Db250ZW50VXBkYXRlKCQoJyNBSkFYVXBkYXRlJyksIFVSTCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlNldFNlYXJjaERpYWxvZyggJyRFbnZ7IkFjdGlvbiJ9JyApOwogICAgICAgICAgICAkKCcjSVRTTVNlYXJjaFByb2ZpbGUnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICQoJyNJVFNNU2VhcmNoRmllbGRzJykucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUgI1NlYXJjaEZvcm1TdWJtaXQnKS5hcHBlbmRUbygkKCcuRGlhbG9nOnZpc2libGUgPiAuQ29udGVudCA+IC5Db250ZW50Rm9vdGVyJykpOwogICAgICAgICAgICAkKCcjU2VhcmNoRm9ybVN1Ym1pdCcpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgJCgnI0RpdkNsYXNzSUQnKS5yZW1vdmVDbGFzcygndWktYXV0b2NvbXBsZXRlLWxvYWRpbmcnKTsKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcjU2VhcmNoRm9ybScpKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBGYWxzZSBpZiBubyB2YWx1ZXMgd2VyZSBmb3VuZCwgdHJ1ZSBpZiB2YWx1ZXMgd2hlcmUgdGhlcmUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2tzIGlmIGFueSB2YWx1ZXMgd2VyZSBlbnRlcmVkIGluIHRoZSBzZWFyY2guCiAgICAgKiAgICAgIElmIG5vdGhpbmcgYXQgYWxsIGV4aXN0cywgaXQgYWxlcnRzIHdpdGggdHJhbnNsYXRlZDoKICAgICAqICAgICAgIlBsZWFzZSBlbnRlciBhdCBsZWFzdCBvbmUgc2VhcmNoIHZhbHVlIG9yICogdG8gZmluZCBhbnl0aGluZyIKICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcygpIHsKICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIFNlcmFjaEZvcm0gbGFiZWxzCiAgICAgICAgdmFyIFNlYXJjaFZhbHVlRmxhZyA9IGZhbHNlOwogICAgICAgICQoJyNTZWFyY2hGb3JtIGxhYmVsJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBFbGVtZW50TmFtZSwKICAgICAgICAgICAgICAgICRFbGVtZW50LAogICAgICAgICAgICAgICAgJExhYmVsRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAkRmllbGRFbGVtZW50ID0gJExhYmVsRWxlbWVudC5uZXh0KCcuRmllbGQnKTsKICAgICAgICAgICAgLy8gdGhvc2Ugd2l0aCBJRCdzIGFyZSB1c2VkIGZvciBzZWFyY2hpbmcKICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cignaWQnKSkgewoKICAgICAgICAgICAgICAgIC8vIHN1YnN0cmluZyAiTGFiZWwiIChlLmcuIGZpcnN0IGZpdmUgY2hhcmFjdGVycyApIGZyb20gdGhlCiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpZCwgdXNlIHRoZSByZW1haW5pbmcgbmFtZSBhcyBuYW1lIHN0cmluZyBmb3IgYWNjZXNzaW5nCiAgICAgICAgICAgICAgICAvLyB0aGUgZm9ybSBpbnB1dCdzIHZhbHVlCiAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9ICQodGhpcykuYXR0cignaWQnKS5zdWJzdHJpbmcoNSk7CiAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICQoJyNTZWFyY2hGb3JtIGlucHV0W25hbWU9JyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKEVsZW1lbnROYW1lKSArICddJyk7CgogICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBpbnB1dCBlbGVtZW50IHdpdGggdGhlIHNlbGVjdGVkIG5hbWUKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG5leHQgInNlbGVjdCIgZWxlbWVudCBhbmQgdXNlIHRoYXQgb25lIGZvciBjaGVja2luZwogICAgICAgICAgICAgICAgaWYgKCEkRWxlbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICQodGhpcykubmV4dCgpLmZpbmQoJ3NlbGVjdCcpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgYnVnIzEwODQ1OiBtYWtlIHN1cmUgdGltZSBzbG90IGZpZWxkcyB3aXRoIFRpbWVJbnB1dEZvcm1hdAogICAgICAgICAgICAgICAgLy8gJ0lucHV0JyBzZXQgYXJlIGJlaW5nIGNvbnNpZGVyZWQgY29ycmVjdGx5LCB0b28uIEFzIHRoaXMgaXMgb25seQogICAgICAgICAgICAgICAgLy8gcmVsZXZhbnQgZm9yIHNlYXJjaCB0eXBlICdUaW1lU2xvdCcsIHdlIGNoZWNrIGZvciB0aGUgZmlyc3QKICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGU9dGV4dCBlbG1lbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgZWxlbWVudC4KICAgICAgICAgICAgICAgIC8vIEFsbCB0aW1lIGZpZWxkIGVsZW1lbnRzIGhhdmUgdG8gYmUgZmlsbGVkIGluLCBidXQgaWYgb25seSBvbmUKICAgICAgICAgICAgICAgIC8vIGlzIG1pc3NpbmcsIHdlIHRyZWF0IHRoZSB3aG9sZSBmaWVsZCBhcyBpbnZhbGlkLgogICAgICAgICAgICAgICAgaWYgKCRGaWVsZEVsZW1lbnQuZmluZCgnaW5wdXRbbmFtZSQ9IlNlYXJjaFR5cGUiXScpLnZhbCgpID09PSAnVGltZVNsb3QnICYmICEkRmllbGRFbGVtZW50LmZpbmQoJ3NlbGVjdCcpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID0gJEZpZWxkRWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPXRleHRdJykuZmlyc3QoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRFbGVtZW50LnZhbCgpICYmICRFbGVtZW50LnZhbCgpICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hWYWx1ZUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICghU2VhcmNoVmFsdWVGbGFnKSB7CiAgICAgICAgICAgYWxlcnQoQ29yZS5Db25maWcuR2V0KCdFbXB0eVNlYXJjaE1zZycpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFNlYXJjaFZhbHVlRmxhZzsKICAgIH0KCiAgICAgICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tTZWFyY2hTdHJpbmdzRm9yU3RvcFdvcmRzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5TZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBmdW5jdGlvbiB0byBleGVjdXRlLCBpZiBubyBzdG9wIHdvcmRzIHdlcmUgZm91bmQuCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHNwZWNpZmljIHZhbHVlcyBvZiB0aGUgc2VhcmNoIGZvcm0gY29udGFpbiBzdG9wIHdvcmRzLgogICAgICogICAgICAgICAgICAgIElmIHN0b3Agd29yZHMgYXJlIHByZXNlbnQsIGEgd2FybmluZyB3aWxsIGJlIGRpc3BsYXllZC4KICAgICAqICAgICAgICAgICAgICBJZiBzdG9wIHdvcmRzIGFyZSBub3QgcHJlc2VudCwgdGhlIGdpdmVuIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENoZWNrU2VhcmNoU3RyaW5nc0ZvclN0b3BXb3JkcyhDYWxsYmFjaykgewogICAgICAgIHZhciBTZWFyY2hTdHJpbmdzID0ge30sCiAgICAgICAgICAgIFNlYXJjaFN0cmluZ3NGb3VuZCA9IDAsCiAgICAgICAgICAgIFJlbGV2YW50RWxlbWVudE5hbWVzID0gewogICAgICAgICAgICAgICAgJ0Zyb20nOiAxLAogICAgICAgICAgICAgICAgJ1RvJzogMSwKICAgICAgICAgICAgICAgICdDYyc6IDEsCiAgICAgICAgICAgICAgICAnU3ViamVjdCc6IDEsCiAgICAgICAgICAgICAgICAnQm9keSc6IDEsCiAgICAgICAgICAgICAgICAnRnVsbHRleHQnOiAxCiAgICAgICAgICAgIH07CgogICAgICAgIGlmICghQ29yZS5Db25maWcuR2V0KCdDaGVja1NlYXJjaFN0cmluZ3NGb3JTdG9wV29yZHMnKSkgewogICAgICAgICAgICBDYWxsYmFjaygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkKCcjU2VhcmNoRm9ybSBsYWJlbCcpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRWxlbWVudE5hbWUsCiAgICAgICAgICAgICAgICAkRWxlbWVudDsKCiAgICAgICAgICAgIC8vIHRob3NlIHdpdGggSUQncyBhcmUgdXNlZCBmb3Igc2VhcmNoaW5nCiAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2lkJykpIHsKCiAgICAgICAgICAgICAgICAvLyBzdWJzdHJpbmcgIkxhYmVsIiAoZS5nLiBmaXJzdCBmaXZlIGNoYXJhY3RlcnMgKSBmcm9tIHRoZQogICAgICAgICAgICAgICAgLy8gbGFiZWwgaWQsIHVzZSB0aGUgcmVtYWluaW5nIG5hbWUgYXMgbmFtZSBzdHJpbmcgZm9yIGFjY2Vzc2luZwogICAgICAgICAgICAgICAgLy8gdGhlIGZvcm0gaW5wdXQncyB2YWx1ZQogICAgICAgICAgICAgICAgRWxlbWVudE5hbWUgPSAkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDUpOwogICAgICAgICAgICAgICAgaWYgKCFSZWxldmFudEVsZW1lbnROYW1lc1tFbGVtZW50TmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEVsZW1lbnQgPSAkKCcjU2VhcmNoRm9ybSBpbnB1dFtuYW1lPScgKyBFbGVtZW50TmFtZSArICddJyk7CgogICAgICAgICAgICAgICAgaWYgKCRFbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC52YWwoKSAmJiAkRWxlbWVudC52YWwoKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoU3RyaW5nc1tFbGVtZW50TmFtZV0gPSAkRWxlbWVudC52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoU3RyaW5nc0ZvdW5kID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgc3RvcCB3b3JkcyBhcmUgcHJlc2VudC4KICAgICAgICBpZiAoIVNlYXJjaFN0cmluZ3NGb3VuZCkgewogICAgICAgICAgICBDYWxsYmFjaygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBBSkFYU3RvcFdvcmRDaGVjaygKICAgICAgICAgICAgU2VhcmNoU3RyaW5ncywKICAgICAgICAgICAgZnVuY3Rpb24gKEZvdW5kU3RvcFdvcmRzKSB7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkNvbmZpZy5HZXQoJ1NlYXJjaFN0cmluZ3NDb250YWluU3RvcFdvcmRzTXNnJykgKyAiXG4iICsgRm91bmRTdG9wV29yZHMpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBDYWxsYmFjawogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7RXZlbnR9IEFjdGlvbgogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgc2VhcmNoIGRpYWxvZwogICAgICovCgogICAgVGFyZ2V0TlMuT3BlblNlYXJjaERpYWxvZyA9IGZ1bmN0aW9uIChBY3Rpb24sIFByb2ZpbGUsIENsYXNzKSB7CgogICAgICAgIHZhciBSZWZlcnJlciA9IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJyksCiAgICAgICAgICAgIERhdGE7CgogICAgICAgIGlmICghQWN0aW9uKSB7CiAgICAgICAgICAgIEFjdGlvbiA9J0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnOwogICAgICAgIH0KICAgICAgICBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246IEFjdGlvbiwKICAgICAgICAgICAgUmVmZXJyZXI6IFJlZmVycmVyLAogICAgICAgICAgICBQcm9maWxlOiBQcm9maWxlLAogICAgICAgICAgICBTdWJhY3Rpb246ICdBSkFYJywKICAgICAgICAgICAgQ2xhc3NJRDogQ2xhc3MKICAgICAgICB9OwoKICAgICAgICBTaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChIVE1MKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlIHdhaXRpbmcgZGlhbG9nIHdhcyBjYW5jZWxlZCwgZG8gbm90IHNob3cgdGhlIHNlYXJjaAogICAgICAgICAgICAgICAgLy8gIGRpYWxvZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICBpZiAoISQoJy5EaWFsb2c6dmlzaWJsZScpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhIVE1MLCBDb3JlLkNvbmZpZy5HZXQoJ1NlYXJjaE1zZycpLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLCBbXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5TZXRTZWFyY2hEaWFsb2coKTsKICAgICAgICAgICAgfSwgJ2h0bWwnCiAgICAgICAgKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWdlbnQuQ29uZmlnSXRlbS5TZWFyY2ggfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKCi8vIFRPRE86Ci8vUmVtb3ZlIHRoaXMgbGluZSBhbmQgZml4IEpTRG9jCi8vIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6SmF2YVNjcmlwdDo6RVNMaW50KQoKCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5VSSA9IElUU00uVUkgfHwge307CgovKioKICogQG5hbWVzcGFjZQogKiBAZXhwb3J0cyBUYXJnZXROUyBhcyBJVFNNLlVJLkNvbmZpZ0l0ZW1BY3Rpb25Sb3cKICogQGRlc2NyaXB0aW9uCiAqICAgICAgQWN0aW9uIHJvdyBmdW5jdGlvbmFsaXR5CiAqIEByZXF1aXJlcwogKiAgICAgIENvcmUuSlNPTgogKiAgICAgIENvcmUuRGF0YQogKi8KSVRTTS5VSS5Db25maWdJdGVtQWN0aW9uUm93ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIGlmICghQ29yZS5EZWJ1Zy5DaGVja0RlcGVuZGVuY3koJ0lUU00uVUkuQ29uZmlnSXRlbUFjdGlvblJvdycsICdDb3JlLkpTT04nLCAnSlNPTiBBUEknKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghQ29yZS5EZWJ1Zy5DaGVja0RlcGVuZGVuY3koJ0lUU00uVUkuQ29uZmlnSXRlbUFjdGlvblJvdycsICdDb3JlLkRhdGEnLCAnRGF0YSBBUEknKSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgQ29uZmlnSXRlbUVsZW1lbnRTZWxlY3RvcnMgPSB7CiAgICAgICAgICAgICdTbWFsbCc6ICdkaXYuT3ZlcnZpZXcgdGFibGUgdGQgaW5wdXQ6Y2hlY2tib3hbbmFtZT1Db25maWdJdGVtSURdJywKICAgICAgICAgICAgJ01lZGl1bSc6ICd1bC5PdmVydmlldyBpbnB1dDpjaGVja2JveFtuYW1lPUNvbmZpZ0l0ZW1JRF0nLAogICAgICAgICAgICAnTGFyZ2UnOiAndWwuT3ZlcnZpZXcgaW5wdXQ6Y2hlY2tib3hbbmFtZT1Db25maWdJdGVtSURdJwogICAgICAgIH0sCiAgICAgICAgQ29uZmlnSXRlbVZpZXc7CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGF0YSBUaGUgZGF0YSB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcXVlcnkgc3RyaW5nIG9mIHRoZSBkYXRhCiAgICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBnaXZlbiBoYXNoIGludG8gYSBxdWVyeSBzdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gU2VyaWFsaXplRGF0YShEYXRhKSB7CiAgICAgICAgdmFyIFF1ZXJ5U3RyaW5nID0gJyc7CiAgICAgICAgJC5lYWNoKERhdGEsIGZ1bmN0aW9uIChLZXksIFZhbHVlKSB7CiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nICs9ICc7JyArIGVuY29kZVVSSUNvbXBvbmVudChLZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFZhbHVlKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gUXVlcnlTdHJpbmc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9ucyBhZGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YWxpZCBhY3Rpb24gb2YgYW4gZWxlbWVudCB0byB0aGUgZWxlbWVudC4KICAgICAqICAgICAgVGhlc2UgaW5mb3JtYXRpb24gYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGFjdGlvbiByb3cgaW5kaXZpZHVhbGx5IGZvciB0aGlzIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQKICAgICAqICAgICAgVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBkYXRhIGlzIHN0b3JlZAogICAgICogQHBhcmFtIHtTdHJpbmd9IEpTT05TdHJpbmcKICAgICAqICAgICAgVGhlIEpTT04gc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWQgYWN0aW9ucyBvZiB0aGUgZWxlbWVudCAoZ2VuZXJhdGVkIGJ5IFBlcmwgbW9kdWxlKQogICAgICogICAgICBDb3VsZCBhbHNvIGJlIGFuIGphdmFzY3JpcHQgb2JqZWN0IGRpcmVjdGx5CiAgICAgKiBAcmV0dXJuIG5vdGhpbmcKICAgICAqLwogICAgVGFyZ2V0TlMuQWRkQWN0aW9ucyA9IGZ1bmN0aW9uICgkRWxlbWVudCwgSlNPTlN0cmluZykgewogICAgICAgIHZhciBBY3Rpb25zOwogICAgICAgIC8vIFRoZSBlbGVtZW50IG9mIHRoZSBnaXZlbiBJRCBtdXN0IGV4aXN0LCBKU09OU3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5CiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICBpZiAodHlwZW9mIEpTT05TdHJpbmcgPT09ICdTdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBBY3Rpb25zID0gQ29yZS5KU09OLlBhcnNlKEpTT05TdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQWN0aW9ucyA9IEpTT05TdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNhdmUgYWN0aW9uIGRhdGEgdG8gdGhlIGdpdmVuIGVsZW1lbnQKICAgICAgICAgICAgQ29yZS5EYXRhLlNldCgkRWxlbWVudCwgJ0FjdGlvbnMnLCBBY3Rpb25zKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIENvcmUuRGVidWcuTG9nKCdFbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIG5vIHZhbGlkIGRhdGEgc3RydWN0dXJlIHBhc3NlZC4nKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gY2xpY2sgb24gdGhlIGNoZWNrYm94IG9mIGFuIENvbmZpZ0l0ZW0gZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgYWN0aW9uIHJvdyBmb3IgdGhpcyBlbGVtZW50LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDbGlja2VkRWxlbWVudAogICAgICogICAgICBqUXVlcnlPYmplY3Qgb2YgdGhlIGNsaWNrZWQgZWxlbWVudCAobm9ybWFsbHkgJCh0aGlzKSkKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBDaGVja2JveGVzCiAgICAgKiAgICAgIGpRdWVyeU9iamVjdCBvZiB0aGUgY2hlY2tib3hlcyBvZiB0aGUgZGlmZmVyZW50IENvbmZpZ0l0ZW1zCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEFjdGlvblJvdwogICAgICogICAgICBUaGUgalF1ZXJ5T2JqZWN0IG9mIHRoZSBBY3Rpb25Sb3cgd3JhcHBlciAobm9ybWFsbHkgdGhlIDx1bD4tRWxlbWVudCkKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVBY3Rpb25Sb3cgPSBmdW5jdGlvbiAoJENsaWNrZWRFbGVtZW50LCAkQ2hlY2tib3hlcywgJEFjdGlvblJvdykgewogICAgICAgIHZhciBDb25maWdJdGVtQWN0aW9uRGF0YSwKICAgICAgICAgICAgQWN0aW9uUm93RWxlbWVudDsKCiAgICAgICAgLy8gQ2hlY2ssIGlmIG9uZSBvciBtb3JlIGl0ZW1zIGFyZSBzZWxlY3RlZAogICAgICAgICRDaGVja2JveGVzID0gJENoZWNrYm94ZXMuZmlsdGVyKCc6Y2hlY2tlZCcpOwogICAgICAgIC8vIE5vIGNoZWNrYm94IGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCEkQ2hlY2tib3hlcy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gUmVtb3ZlIGFjdGlvbnMgYW5kIGRlYWN0aXZhdGUgYnVsayBhY3Rpb24KICAgICAgICAgICAgJEFjdGlvblJvdwogICAgICAgICAgICAgICAgLmZpbmQoJ2xpJykuZmlsdGVyKCc6bm90KC5CdWxrKScpLnJlbW92ZSgpCiAgICAgICAgICAgICAgICAuZW5kKCkuZW5kKCkKICAgICAgICAgICAgICAgIC5maW5kKCcjQ29uZmlnSXRlbUJ1bGtBY3Rpb24nKS5hZGRDbGFzcygnSW5hY3RpdmUnKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZmluZCgnbGkuTGFzdCcpLnJlbW92ZUNsYXNzKCdMYXN0JykKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJ2xpOmxhc3QnKS5hZGRDbGFzcygnTGFzdCcpOwogICAgICAgIH0KICAgICAgICAvLyBFeGFjdGx5IG9uZSBjaGVja2JveCBpcyBzZWxlY3RlZAogICAgICAgIGVsc2UgaWYgKCRDaGVja2JveGVzLmxlbmd0aCA9PT0gMSAmJiAhJCgnI1NlbGVjdEFsbENvbmZpZ0l0ZW1zJykuaXMoJzpjaGVja2VkJykgKSB7CiAgICAgICAgICAgIC8vIFVwZGF0ZSBhY3Rpb25zIGFuZCBhY3RpdmF0ZSBidWxrIGFjdGlvbgogICAgICAgICAgICAkQWN0aW9uUm93LmZpbmQoJyNDb25maWdJdGVtQnVsa0FjdGlvbicpLnJlbW92ZUNsYXNzKCdJbmFjdGl2ZScpOwoKICAgICAgICAgICAgLy8gRmluZCB0aGUgZWxlbWVudCB3aGljaCBpcyBhY3RpdmUgKGl0IG11c3Qgbm90IGJlIHRoZSBjbGlja2VkIGVsZW1lbnQhKQogICAgICAgICAgICAvLyBhbmQgZ2V0IHRoZSBkYXRhCiAgICAgICAgICAgIENvbmZpZ0l0ZW1BY3Rpb25EYXRhID0gQ29yZS5EYXRhLkdldCgkQ2hlY2tib3hlcy5jbG9zZXN0KCdsaSwgdHInKSwgJ0FjdGlvbnMnKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBDb25maWdJdGVtQWN0aW9uRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICQuZWFjaChDb25maWdJdGVtQWN0aW9uRGF0YSwgZnVuY3Rpb24gKEluZGV4LCBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChWYWx1ZS5IVE1MKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoVmFsdWUuSFRNTCkuYXR0cignaWQnLCBWYWx1ZS5JRCkuYXBwZW5kVG8oJEFjdGlvblJvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvblJvd0VsZW1lbnQgPSAkQWN0aW9uUm93LmZpbmQoJyMnICsgVmFsdWUuSUQpLmZpbmQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBWYWx1ZS5UYXJnZXQgPT09ICd1bmRlZmluZWQnIHx8IFZhbHVlLlRhcmdldCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvblJvd0VsZW1lbnQuYXR0cignaHJlZicsIFZhbHVlLkxpbmspOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWYWx1ZS5Qb3B1cFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvblJvd0VsZW1lbnQuYmluZCgnY2xpY2suUG9wdXAnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVmFsdWUuTGluaywgVmFsdWUuUG9wdXBUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBcHBseSB0aGUgTGFzdCBjbGFzcyB0byB0aGUgcmlnaHQgZWxlbWVudAogICAgICAgICAgICAkQWN0aW9uUm93CiAgICAgICAgICAgICAgICAuZmluZCgnbGkuTGFzdCcpLnJlbW92ZUNsYXNzKCdMYXN0JykKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJ2xpOmxhc3QnKS5hZGRDbGFzcygnTGFzdCcpOwogICAgICAgIH0KICAgICAgICAvLyBUd28gb3JlIG1vcmUgY2hlY2tib3hlcyBzZWxlY3RlZAogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBSZW1vdmUgYWN0aW9ucyBhbmQgYWN0aXZhdGUgYnVsayBhY3Rpb24KICAgICAgICAgICAgJEFjdGlvblJvdwogICAgICAgICAgICAgICAgLmZpbmQoJ2xpJykuZmlsdGVyKCc6bm90KC5CdWxrKScpLnJlbW92ZSgpCiAgICAgICAgICAgICAgICAuZW5kKCkuZW5kKCkKICAgICAgICAgICAgICAgIC5maW5kKCcjQ29uZmlnSXRlbUJ1bGtBY3Rpb24nKS5yZW1vdmVDbGFzcygnSW5hY3RpdmUnKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZmluZCgnbGkuTGFzdCcpLnJlbW92ZUNsYXNzKCdMYXN0JykKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJ2xpOmxhc3QnKS5hZGRDbGFzcygnTGFzdCcpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb21wbGV0ZSBBY3Rpb25Sb3cgZnVuY3Rpb25hbGl0eSBhbmQgYmluZHMgYWxsIGNsaWNrIGV2ZW50cy4KICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIEdldCB1c2VkIENvbmZpZ0l0ZW0gdmlldyBtb2RlCiAgICAgICAgaWYgKCQoJyNDb25maWdJdGVtT3ZlcnZpZXdNZWRpdW0nKS5sZW5ndGgpIHsKICAgICAgICAgICAgQ29uZmlnSXRlbVZpZXcgPSAnTWVkaXVtJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJCgnI0NvbmZpZ0l0ZW1PdmVydmlld0xhcmdlJykubGVuZ3RoKSB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1WaWV3ID0gJ0xhcmdlJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1WaWV3ID0gJ1NtYWxsJzsKICAgICAgICB9CgogICAgICAgICQoJyNTZWxlY3RBbGxDb25maWdJdGVtcycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgU3RhdHVzID0gJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk7CiAgICAgICAgICAgICQoQ29uZmlnSXRlbUVsZW1lbnRTZWxlY3RvcnNbQ29uZmlnSXRlbVZpZXddKS5wcm9wKCdjaGVja2VkJywgU3RhdHVzKS50cmlnZ2VySGFuZGxlcignY2xpY2snKTsKICAgICAgICB9KTsKCiAgICAgICAgJChDb25maWdJdGVtRWxlbWVudFNlbGVjdG9yc1tDb25maWdJdGVtVmlld10pLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBJVFNNLlVJLkNvbmZpZ0l0ZW1BY3Rpb25Sb3cuVXBkYXRlQWN0aW9uUm93KCQodGhpcyksICQoQ29uZmlnSXRlbUVsZW1lbnRTZWxlY3RvcnNbQ29uZmlnSXRlbVZpZXddKSwgJCgnZGl2Lk92ZXJ2aWV3QWN0aW9ucyB1bC5BY3Rpb25zJykpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjQ29uZmlnSXRlbUJ1bGtBY3Rpb24gYScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJEVsZW1lbnQgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgJFNlbGVjdGVkQ29uZmlnSXRlbXMsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSURQYXJhbWV0ZXIgPSAiQ29uZmlnSXRlbUlEPSIsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSURzID0gIiIsCiAgICAgICAgICAgICAgICBVUkw7CiAgICAgICAgICAgIGlmICgkRWxlbWVudC5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ0luYWN0aXZlJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZENvbmZpZ0l0ZW1zID0gJChDb25maWdJdGVtRWxlbWVudFNlbGVjdG9yc1tDb25maWdJdGVtVmlld10gKyAnOmNoZWNrZWQnKTsKICAgICAgICAgICAgICAgICRTZWxlY3RlZENvbmZpZ0l0ZW1zLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgKz0gQ29uZmlnSXRlbUlEUGFyYW1ldGVyICsgJCh0aGlzKS52YWwoKSArICI7IjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtQnVsazsiICsgQ29uZmlnSXRlbUlEczsKICAgICAgICAgICAgICAgIFVSTCArPSBTZXJpYWxpemVEYXRhKENvcmUuQXBwLkdldFNlc3Npb25JbmZvcm1hdGlvbigpKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKFVSTCwgJ0NvbmZpZ0l0ZW1BY3Rpb24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLlVJLkNvbmZpZ0l0ZW1BY3Rpb25Sb3cgfHwge30pKTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQ7ICAgICMjIG5vIGNyaXRpYwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6T3V0cHV0OjpUZW1wbGF0ZTo6UHJvdmlkZXI7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpJVFNNOjpDb25maWdpdGVtOjpEZWZpbml0aW9uUGVybDJZQU1MJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkZ1bmN0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50IHBhY2thZ2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHJlYnVpbGQgWlpaKiBmaWxlcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpLT5Xcml0ZURlZmF1bHQoKTsKCiAgICAjIGRlZmluZSB0aGUgWlpaIGZpbGVzCiAgICBteSBAWlpaRmlsZXMgPSAoCiAgICAgICAgJ1paWkFBdXRvLnBtJywKICAgICAgICAnWlpaQXV0by5wbScsCiAgICApOwoKICAgICMgcmVsb2FkIHRoZSBaWlogZmlsZXMgKG1vZF9wZXJsIHdvcmthcm91bmQpCiAgICBmb3IgbXkgJFpaWkZpbGUgKEBaWlpGaWxlcykgewoKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgIS1mICRGaWxlOwogICAgICAgICAgICBkbyAkRmlsZTsKICAgICAgICAgICAgbGFzdCBQUkVGSVg7CiAgICAgICAgfQogICAgfQoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICAjIHRoZSBzdGF0cyBvYmplY3QgbmVlZHMgYSBVc2VySUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IKICAgICMgd2UgbmVlZCB0byBkaXNjYXJkIGFueSBleGlzdGluZyBzdGF0cyBvYmplY3QgYmVmb3JlCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoCiAgICAgICAgT2JqZWN0cyA9PiBbJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cyddLAogICAgKTsKCiAgICAjIGRlZmluZSBVc2VySUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN0YXRzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBkZWZpbmUgZmlsZSBwcmVmaXggZm9yIHN0YXRzCiAgICAkU2VsZi0+e0ZpbGVQcmVmaXh9ID0gJ0lUU01TdGF0cyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ29uZmlnSXRlbSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgc2V0IHByZWZlcmVuY2VzIGZvciBzb21lIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPl9TZXRQcmVmZXJlbmNlcygpOwoKICAgICMgc2V0IGRlZmF1bHQgcGVybWlzc2lvbiBncm91cAogICAgJFNlbGYtPl9TZXREZWZhdWx0UGVybWlzc2lvbigpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ29uZmlnSXRlbSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgc2V0IHByZWZlcmVuY2VzIGZvciBzb21lIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPl9TZXRQcmVmZXJlbmNlcygpOwoKICAgICMgc2V0IGRlZmF1bHQgcGVybWlzc2lvbiBncm91cAogICAgJFNlbGYtPl9TZXREZWZhdWx0UGVybWlzc2lvbigpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuMi4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSB0aGUgRFRMIENvbnRlbnQgaW4gdGhlIFN5c0NvbmZpZwogICAgJFNlbGYtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF84KCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuOC4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF84KCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF84IHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZml4IGEgdHlwbyBpbiB0aGUgZ2VuZXJhbCBjYXRhbG9nCiAgICAkU2VsZi0+X0ZpeFR5cG8oKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSgpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gNC4wLjkxLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSB7ICAgICMjIG5vIGNyaXRpYwogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoYW5nZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgbmV3IG1vZHVsZSBsb2NhdGlvbi4KICAgICRTZWxmLT5fTWlncmF0ZUNvbmZpZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgc2V0IHByZWZlcmVuY2VzIGZvciBzb21lIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPl9TZXRQcmVmZXJlbmNlcygpOwoKICAgICMgc2V0IGRlZmF1bHQgcGVybWlzc2lvbiBncm91cAogICAgJFNlbGYtPl9TZXREZWZhdWx0UGVybWlzc2lvbigpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIENvbnZlcnQgYW55IFBlcmwgZGVmaW5pdGlvbiB0byBZQU1MCiAgICAjIFRoaXMgY291bGQgYmUgbW92ZWQgdG8gYSB2ZXJzaW9uIHNwZWNpZmljCiAgICAkU2VsZi0+X0NvbnZlcnRQZXJsRGVmaW5pdGlvbnMyWUFNTCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBhbGwgbGlua3Mgd2l0aCBjb25maWcgaXRlbXMKICAgICRTZWxmLT5fTGlua0RlbGV0ZSgpOwoKICAgICMgZGVhY3RpdmF0ZSB0aGUgZ3JvdXAgaXRzbS1jb25maWdpdGVtCiAgICAkU2VsZi0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICdpdHNtLWNvbmZpZ2l0ZW0nLAogICAgKTsKCiAgICAjIGRlbGV0ZSAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnIHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICRTZWxmLT5fRGVsZXRlU2VydmljZVByZWZlcmVuY2VzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRQcmVmZXJlbmNlcygpCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0UHJlZmVyZW5jZXMoKQoKPWN1dAoKc3ViIF9TZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVNYXAgPSAoCiAgICAgICAgRXhwaXJlZCAgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIEluYWN0aXZlICAgID0+ICdwb3N0cHJvZHVjdGl2ZScsCiAgICAgICAgTWFpbnRlbmFuY2UgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIFBpbG90ICAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICBQbGFubmVkICAgICA9PiAncHJlcHJvZHVjdGl2ZScsCiAgICAgICAgUHJvZHVjdGlvbiAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIFJlcGFpciAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICBSZXRpcmVkICAgICA9PiAncG9zdHByb2R1Y3RpdmUnLAogICAgICAgIFJldmlldyAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAnVGVzdC9RQScgICA9PiAncHJlcHJvZHVjdGl2ZScsCiAgICApOwoKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJU1hcCApIHsKICAgICAgICBteSAkSXRlbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBOYW1lICA9PiAkTmFtZSwKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBOQU1FIGlmICEkSXRlbTsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbS0+e0l0ZW1JRH0sCiAgICAgICAgICAgIEtleSAgICA9PiAnRnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgIFZhbHVlICA9PiAkTWFweyROYW1lfSwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBfU2V0RGVmYXVsdFBlcm1pc3Npb24oKQoKc2V0IHRoZSBkZWZhdWx0IGdyb3VwIHRoYXQgaGFzIGFjY2VzcyByaWdodHMKCj1jdXQKCnN1YiBfU2V0RGVmYXVsdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgY2hlY2sgaWYgZ3JvdXAgYWxyZWFkeSBleGlzdHMKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiBhIHBlcm1pc3Npb24gZ3JvdXAgaXMgYWxyZWFkeSBzZXQuIElmIG5vdCwgc2V0IGRlZmF1bHQgcGVybWlzc2lvbiBncm91cAogICAgZm9yIG15ICRDbGFzc0lEICggc29ydCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgbXkgJENsYXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQ2xhc3MtPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJENsYXNzLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnUGVybWlzc2lvbicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBfR3JvdXBBZGQoKQoKYWRkIGEgZ3JvdXAKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAndGhlLWdyb3VwLW5hbWUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgZ3JvdXAgZGVzY3JpcHRpb24uJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGxpc3Qgb2YgYWxsIGdyb3VwcwogICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoKTsKCiAgICAjIHJldmVyc2UgdGhlIGdyb3VwIGxpc3QgZm9yIGVhc2llciBsb29rdXAKICAgIG15ICVHcm91cExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlR3JvdXBMaXN0OwoKICAgICMgY2hlY2sgaWYgZ3JvdXAgYWxyZWFkeSBleGlzdHMKICAgIG15ICRHcm91cElEID0gJEdyb3VwTGlzdFJldmVyc2V7ICRQYXJhbXtOYW1lfSB9OwoKICAgICMgcmVhY3RpdmF0ZSB0aGUgZ3JvdXAKICAgIGlmICgkR3JvdXBJRCkgewoKICAgICAgICAjIGdldCBjdXJyZW50IGdyb3VwIGRhdGEKICAgICAgICBteSAlR3JvdXBEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVhY3RpdmF0ZSBncm91cAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cFVwZGF0ZSgKICAgICAgICAgICAgJUdyb3VwRGF0YSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGFkZCB0aGUgZ3JvdXAKICAgIGVsc2UgewogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgQ29tbWVudCA9PiAkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29rdXAgdGhlIG5ldyBncm91cCBpZAogICAgbXkgJE5ld0dyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBhZGQgdXNlciByb290IHRvIHRoZSBncm91cAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyQWRkKAogICAgICAgIEdJRCAgICAgICAgPT4gJE5ld0dyb3VwSUQsCiAgICAgICAgVUlEICAgICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR3JvdXBEZWFjdGl2YXRlKCkKCmRlYWN0aXZhdGUgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cERlYWN0aXZhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgZ3JvdXAgaWQKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICRQYXJhbXtOYW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGdldCBjdXJyZW50IGdyb3VwIGRhdGEKICAgIG15ICVHcm91cERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBHZXQoCiAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgZ3JvdXAKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cFVwZGF0ZSgKICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7aW52YWxpZH0sCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucygpCgppbnN0YWxscyBDb25maWdJdGVtIGRlZmluaXRpb25zCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCk7Cgo9Y3V0CgpzdWIgX0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUcmFuc2xhdGlvbnMgPSAoCiAgICAgICAgVmVuZG9yICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1ZlbmRvcicpLAogICAgICAgIE1vZGVsICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdNb2RlbCcpLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdEZXNjcmlwdGlvbicpLAogICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUeXBlJyksCiAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ093bmVyJyksCiAgICAgICAgU2VyaWFsTnVtYmVyICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1NlcmlhbCBOdW1iZXInKSwKICAgICAgICBPcGVyYXRpbmdTeXN0ZW0gICAgICAgID0+IFRyYW5zbGF0YWJsZSgnT3BlcmF0aW5nIFN5c3RlbScpLAogICAgICAgIENQVSAgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDUFUnKSwKICAgICAgICBSYW0gICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmFtJyksCiAgICAgICAgSGFyZERpc2sgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0hhcmQgRGlzaycpLAogICAgICAgIENhcGFjaXR5ICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDYXBhY2l0eScpLAogICAgICAgIEZRRE4gICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdGUUROJyksCiAgICAgICAgTmV0d29ya0FkYXB0ZXIgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05ldHdvcmsgQWRhcHRlcicpLAogICAgICAgIElQb3ZlckRIQ1AgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdJUCBvdmVyIERIQ1AnKSwKICAgICAgICBJUEFkZHJlc3MgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnSVAgQWRkcmVzcycpLAogICAgICAgIEdyYXBoaWNBZGFwdGVyICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdHcmFwaGljIEFkYXB0ZXInKSwKICAgICAgICBPdGhlckVxdWlwbWVudCAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnT3RoZXIgRXF1aXBtZW50JyksCiAgICAgICAgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSA9PiBUcmFuc2xhdGFibGUoJ1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZScpLAogICAgICAgIEluc3RhbGxEYXRlICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdJbnN0YWxsIERhdGUnKSwKICAgICAgICBOb3RlICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTm90ZScpLAogICAgICAgIFBob25lMSAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdQaG9uZSAxJyksCiAgICAgICAgUGhvbmUyICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1Bob25lIDInKSwKICAgICAgICBGYXggICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnRmF4JyksCiAgICAgICAgRU1haWwgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0UtTWFpbCcpLAogICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBZGRyZXNzJyksCiAgICAgICAgTmV0d29ya0FkZHJlc3MgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05ldHdvcmsgQWRkcmVzcycpLAogICAgICAgIFN1Ym5ldE1hc2sgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdTdWJuZXQgTWFzaycpLAogICAgICAgIEdhdGV3YXkgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdHYXRld2F5JyksCiAgICAgICAgVmVyc2lvbiAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1ZlcnNpb24nKSwKICAgICAgICBMaWNlbmNlVHlwZSAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTGljZW5jZSBUeXBlJyksCiAgICAgICAgTGljZW5jZUtleSAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0xpY2VuY2UgS2V5JyksCiAgICAgICAgUXVhbnRpdHkgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1F1YW50aXR5JyksCiAgICAgICAgRXhwaXJhdGlvbkRhdGUgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0V4cGlyYXRpb24gRGF0ZScpLAogICAgICAgIE1lZGlhICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdNZWRpYScpLAogICAgKTsKCiAgICAjIGNvbmZpZyBpdGVtIGRlZmluaXRpb25zCiAgICBteSAlRGVmaW5pdGlvbiA9ICgKICAgICAgICBDb21wdXRlciA9PiA8PCAiRU9GIiwKLS0tCi0gS2V5OiBWZW5kb3IKICBOYW1lOiBWZW5kb3IKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAogICAgIyBFeGFtcGxlIGZvciBDSSBhdHRyaWJ1dGUgc3ludGF4IGNoZWNrIGZvciB0ZXh0IGFuZCB0ZXh0YXJlYSBmaWVsZHMKICAgICNSZWdFeDogXkFCQy4qCiAgICAjUmVnRXhFcnJvck1lc3NhZ2U6IFZhbHVlIG11c3Qgc3RhcnQgd2l0aCBBQkMhCgotIEtleTogTW9kZWwKICBOYW1lOiBNb2RlbAogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCgotIEtleTogRGVzY3JpcHRpb24KICBOYW1lOiBEZXNjcmlwdGlvbgogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHRBcmVhCgotIEtleTogVHlwZQogIE5hbWU6IFR5cGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBDbGFzczogSVRTTTo6Q29uZmlnSXRlbTo6Q29tcHV0ZXI6OlR5cGUKICAgIFRyYW5zbGF0aW9uOiAxCiAgICBUeXBlOiBHZW5lcmFsQ2F0YWxvZwoKLSBLZXk6IE93bmVyCiAgTmFtZTogT3duZXIKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBDdXN0b21lcgoKLSBLZXk6IFNlcmlhbE51bWJlcgogIE5hbWU6IFNlcmlhbCBOdW1iZXIKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBPcGVyYXRpbmdTeXN0ZW0KICBOYW1lOiBPcGVyYXRpbmcgU3lzdGVtCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBDUFUKICBOYW1lOiBDUFUKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDEwMAogIENvdW50TWF4OiAxNgoKLSBLZXk6IFJhbQogIE5hbWU6IFJhbQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogMTAwCiAgQ291bnRNYXg6IDEwCgotIEtleTogSGFyZERpc2sKICBOYW1lOiBIYXJkIERpc2sKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDEwMAogIENvdW50TWF4OiAxMAogIFN1YjoKICAtIEtleTogQ2FwYWNpdHkKICAgIE5hbWU6IENhcGFjaXR5CiAgICBJbnB1dDoKICAgICAgVHlwZTogVGV4dAogICAgICBTaXplOiAyMAogICAgICBNYXhMZW5ndGg6IDEwCgotIEtleTogRlFETgogIE5hbWU6IEZRRE4KICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBOSUMKICBOYW1lOiBOZXR3b3JrIEFkYXB0ZXIKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDEwMAogICAgUmVxdWlyZWQ6IDEKICBDb3VudE1pbjogMAogIENvdW50TWF4OiAxMAogIENvdW50RGVmYXVsdDogMQogIFN1YjoKICAtIEtleTogSVBvdmVyREhDUAogICAgTmFtZTogSVAgb3ZlciBESENQCiAgICBJbnB1dDoKICAgICAgQ2xhc3M6IElUU006OkNvbmZpZ0l0ZW06Olllc05vCiAgICAgIFR5cGU6IEdlbmVyYWxDYXRhbG9nCiAgICAgIFRyYW5zbGF0aW9uOiAxCiAgICAgIFJlcXVpcmVkOiAxCiAgLSBLZXk6IElQQWRkcmVzcwogICAgTmFtZTogSVAgQWRkcmVzcwogICAgU2VhcmNoYWJsZTogMQogICAgSW5wdXQ6CiAgICAgIFR5cGU6IFRleHQKICAgICAgU2l6ZTogNDAKICAgICAgTWF4TGVuZ3RoOiA0MAogICAgICBSZXF1aXJlZDogMQogICAgQ291bnRNYXg6IDIwCiAgICBDb3VudE1pbjogMAogICAgQ291bnREZWZhdWx0OiAwCgotIEtleTogR3JhcGhpY0FkYXB0ZXIKICBOYW1lOiBHcmFwaGljIEFkYXB0ZXIKICBJbnB1dDoKICAgIE1heExlbmd0aDogMTAwCiAgICBTaXplOiA1MAogICAgVHlwZTogVGV4dAoKLSBLZXk6IE90aGVyRXF1aXBtZW50CiAgTmFtZTogT3RoZXIgRXF1aXBtZW50CiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0QXJlYQogICAgUmVxdWlyZWQ6IDEKICBDb3VudE1pbjogMAogIENvdW50RGVmYXVsdDogMAoKLSBLZXk6IFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUKICBOYW1lOiBXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBEYXRlCiAgICBZZWFyUGVyaW9kUGFzdDogMjAKICAgIFllYXJQZXJpb2RGdXR1cmU6IDEwCgotIEtleTogSW5zdGFsbERhdGUKICBOYW1lOiBJbnN0YWxsIERhdGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBEYXRlCiAgICBSZXF1aXJlZDogMQogICAgWWVhclBlcmlvZFBhc3Q6IDIwCiAgICBZZWFyUGVyaW9kRnV0dXJlOiAxMAogIENvdW50TWluOiAwCiAgQ291bnREZWZhdWx0OiAwCgotIEtleTogTm90ZQogIE5hbWU6IE5vdGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0QXJlYQogICAgUmVxdWlyZWQ6IDEKICBDb3VudE1pbjogMAogIENvdW50RGVmYXVsdDogMApFT0YKICAgICAgICBIYXJkd2FyZSA9PiA8PCAiRU9GIiwKLS0tCi0gS2V5OiBWZW5kb3IKICBOYW1lOiBWZW5kb3IKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAoKLSBLZXk6IE1vZGVsCiAgTmFtZTogTW9kZWwKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAoKLSBLZXk6IERlc2NyaXB0aW9uCiAgTmFtZTogRGVzY3JpcHRpb24KICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0QXJlYQoKLSBLZXk6IFR5cGUKICBOYW1lOiBUeXBlCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogR2VuZXJhbENhdGFsb2cKICAgIENsYXNzOiBJVFNNOjpDb25maWdJdGVtOjpIYXJkd2FyZTo6VHlwZQogICAgVHJhbnNsYXRpb246IDEKCi0gS2V5OiBPd25lcgogIE5hbWU6IE93bmVyCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogQ3VzdG9tZXIKCi0gS2V5OiBTZXJpYWxOdW1iZXIKICBOYW1lOiBTZXJpYWwgTnVtYmVyCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogMTAwCgotIEtleTogV2FycmFudHlFeHBpcmF0aW9uRGF0ZQogIE5hbWU6IFdhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZQogIElucHV0OgogICAgVHlwZTogRGF0ZQogICAgWWVhclBlcmlvZFBhc3Q6IDIwCiAgICBZZWFyUGVyaW9kRnV0dXJlOiAxMAogIFNlYXJjaGFibGU6IDEKCi0gS2V5OiBJbnN0YWxsRGF0ZQogIE5hbWU6IEluc3RhbGwgRGF0ZQogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IERhdGUKICAgIFJlcXVpcmVkOiAxCiAgICBZZWFyUGVyaW9kUGFzdDogMjAKICAgIFllYXJQZXJpb2RGdXR1cmU6IDEwCiAgQ291bnRNaW46IDAKICBDb3VudE1heDogMQogIENvdW50RGVmYXVsdDogMAoKLSBLZXk6IE5vdGUKICBOYW1lOiBOb3RlCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgUmVxdWlyZWQ6IDEKICAgIFR5cGU6IFRleHRBcmVhCiAgQ291bnRNaW46IDAKICBDb3VudE1heDogMQogIENvdW50RGVmYXVsdDogMApFT0YKICAgICAgICBMb2NhdGlvbiA9PiA8PCAiRU9GIiwKLS0tCi0gS2V5OiBUeXBlCiAgTmFtZTogVHlwZQogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IEdlbmVyYWxDYXRhbG9nCiAgICBDbGFzczogSVRTTTo6Q29uZmlnSXRlbTo6TG9jYXRpb246OlR5cGUKICAgIFRyYW5zbGF0aW9uOiAxCgotIEtleTogUGhvbmUxCiAgTmFtZTogUGhvbmUgMQogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDEwMAoKLSBLZXk6IFBob25lMgogIE5hbWU6IFBob25lIDIKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBGYXgKICBOYW1lOiBGYXgKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBFLU1haWwKICBOYW1lOiBFLU1haWwKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiAxMDAKCi0gS2V5OiBBZGRyZXNzCiAgTmFtZTogQWRkcmVzcwogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHRBcmVhCgotIEtleTogTm90ZQogIE5hbWU6IE5vdGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0QXJlYQogICAgUmVxdWlyZWQ6IDEKICBDb3VudE1pbjogMAogIENvdW50RGVmYXVsdDogMApFT0YKICAgICAgICBOZXR3b3JrID0+IDw8ICJFT0YiLAotLS0KLSBLZXk6IERlc2NyaXB0aW9uCiAgTmFtZTogRGVzY3JpcHRpb24KICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0QXJlYQoKLSBLZXk6IFR5cGUKICBOYW1lOiBUeXBlCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogR2VuZXJhbENhdGFsb2cKICAgIENsYXNzOiBJVFNNOjpDb25maWdJdGVtOjpOZXR3b3JrOjpUeXBlCiAgICBUcmFuc2xhdGlvbjogMQoKLSBLZXk6IE5ldHdvcmtBZGRyZXNzCiAgTmFtZTogTmV0d29yayBBZGRyZXNzCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogMzAKICAgIE1heExlbmd0aDogMjAKICAgIFJlcXVpcmVkOiAxCiAgQ291bnRNaW46IDAKICBDb3VudE1heDogMTAwCiAgQ291bnREZWZhdWx0OiAxCiAgU3ViOgogIC0gS2V5OiBTdWJuZXRNYXNrCiAgICBOYW1lOiBTdWJuZXQgTWFzawogICAgSW5wdXQ6CiAgICAgIFR5cGU6IFRleHQKICAgICAgU2l6ZTogMzAKICAgICAgTWF4TGVuZ3RoOiAyMAogICAgICBWYWx1ZURlZmF1bHQ6IDI1NS4yNTUuMjU1LjAKICAgICAgUmVxdWlyZWQ6IDEKICAgIENvdW50TWluOiAwCiAgICBDb3VudE1heDogMQogICAgQ291bnREZWZhdWx0OiAwCiAgLSBLZXk6IEdhdGV3YXkKICAgIE5hbWU6IEdhdGV3YXkKICAgIElucHV0OgogICAgICBUeXBlOiBUZXh0CiAgICAgIFNpemU6IDMwCiAgICAgIE1heExlbmd0aDogMjAKICAgICAgUmVxdWlyZWQ6IDEKICAgIENvdW50TWluOiAwCiAgICBDb3VudE1heDogMTAKICAgIENvdW50RGVmYXVsdDogMAoKLSBLZXk6IE5vdGUKICBOYW1lOiBOb3RlCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgUmVxdWlyZWQ6IDEKICAgIFR5cGU6IFRleHRBcmVhCiAgQ291bnRNaW46IDAKICBDb3VudE1heDogMQogIENvdW50RGVmYXVsdDogMApFT0YKICAgICAgICBTb2Z0d2FyZSA9PiA8PCAiRU9GIiwKLS0tCi0gS2V5OiBWZW5kb3IKICBOYW1lOiBWZW5kb3IKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAoKLSBLZXk6IFZlcnNpb24KICBOYW1lOiBWZXJzaW9uCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNTAKICAgIE1heExlbmd0aDogNTAKCi0gS2V5OiBEZXNjcmlwdGlvbgogIE5hbWU6IERlc2NyaXB0aW9uCiAgU2VhcmNoYWJsZTogMQogIElucHV0OgogICAgVHlwZTogVGV4dEFyZWEKCi0gS2V5OiBUeXBlCiAgTmFtZTogVHlwZQogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IEdlbmVyYWxDYXRhbG9nCiAgICBDbGFzczogSVRTTTo6Q29uZmlnSXRlbTo6U29mdHdhcmU6OlR5cGUKICAgIFRyYW5zbGF0aW9uOiAxCgotIEtleTogT3duZXIKICBOYW1lOiBPd25lcgogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IEN1c3RvbWVyCgotIEtleTogU2VyaWFsTnVtYmVyCiAgTmFtZTogU2VyaWFsIE51bWJlcgogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFR5cGU6IFRleHQKICAgIFNpemU6IDUwCiAgICBNYXhMZW5ndGg6IDUwCgotIEtleTogTGljZW5jZVR5cGUKICBOYW1lOiBMaWNlbmNlIFR5cGUKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBHZW5lcmFsQ2F0YWxvZwogICAgQ2xhc3M6IElUU006OkNvbmZpZ0l0ZW06OlNvZnR3YXJlOjpMaWNlbmNlVHlwZQogICAgVHJhbnNsYXRpb246IDEKCi0gS2V5OiBMaWNlbmNlS2V5CiAgTmFtZTogTGljZW5jZSBLZXkKICBTZWFyY2hhYmxlOiAxCiAgSW5wdXQ6CiAgICBUeXBlOiBUZXh0CiAgICBTaXplOiA1MAogICAgTWF4TGVuZ3RoOiA1MAogICAgUmVxdWlyZWQ6IDEKICBDb3VudE1pbjogMAogIENvdW50TWF4OiAxMDAKICBDb3VudERlZmF1bHQ6IDAKICBTdWI6CiAgLSBLZXk6IFF1YW50aXR5CiAgICBOYW1lOiBRdWFudGl0eQogICAgSW5wdXQ6CiAgICAgIFR5cGU6IEludGVnZXIKICAgICAgVmFsdWVNaW46IDEKICAgICAgVmFsdWVNYXg6IDEwMDAKICAgICAgVmFsdWVEZWZhdWx0OiAxCiAgICAgIFJlcXVpcmVkOiAxCiAgICBDb3VudE1pbjogMAogICAgQ291bnRNYXg6IDEKICAgIENvdW50RGVmYXVsdDogMAogIC0gS2V5OiBFeHBpcmF0aW9uRGF0ZQogICAgTmFtZTogRXhwaXJhdGlvbiBEYXRlCiAgICBJbnB1dDoKICAgICAgVHlwZTogRGF0ZQogICAgICBSZXF1aXJlZDogMQogICAgICBZZWFyUGVyaW9kUGFzdDogMjAKICAgICAgWWVhclBlcmlvZEZ1dHVyZTogMTAKICAgIENvdW50TWF4OiAxCiAgICBDb3VudE1pbjogMAogICAgQ291bnREZWZhdWx0OiAwCgotIEtleTogTWVkaWEKICBOYW1lOiBNZWRpYQogIElucHV0OgogICAgVHlwZTogVGV4dAogICAgU2l6ZTogNDAKICAgIE1heExlbmd0aDogMjAKCi0gS2V5OiBOb3RlCiAgTmFtZTogTm90ZQogIFNlYXJjaGFibGU6IDEKICBJbnB1dDoKICAgIFJlcXVpcmVkOiAxCiAgICBUeXBlOiBUZXh0QXJlYQogIENvdW50TWluOiAwCiAgQ291bnRNYXg6IDEKICBDb3VudERlZmF1bHQ6IDAKRU9GCiAgICApOwoKICAgICMgZ2V0IGxpc3Qgb2YgaW5zdGFsbGVkIGNvbmZpZyBpdGVtIGNsYXNzZXMKICAgIG15ICRDbGFzc0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CiAgICBteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKCiAgICBDTEFTU05BTUU6CiAgICBmb3IgbXkgJENsYXNzTmFtZSAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVEZWZpbml0aW9uICkgewoKICAgICAgICAjIGNoZWNrIGlmIGNsYXNzIGV4aXN0cwogICAgICAgIG15ICRDbGFzc0lEID0gJFJldmVyc2VDbGFzc0xpc3R7JENsYXNzTmFtZX07CgogICAgICAgIG5leHQgQ0xBU1NOQU1FIGlmICEkQ2xhc3NJRDsKCiAgICAgICAgIyBjaGVjayBpZiBkZWZpbml0aW9uIGFscmVhZHkgZXhpc3RzCiAgICAgICAgbXkgJERlZmluaXRpb25MaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkRlZmluaXRpb25MaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NOQU1FIGlmICFkZWZpbmVkICREZWZpbml0aW9uTGlzdDsKICAgICAgICBuZXh0IENMQVNTTkFNRSBpZiAkRGVmaW5pdGlvbkxpc3QgJiYgcmVmICREZWZpbml0aW9uTGlzdCBlcSAnQVJSQVknICYmIEB7JERlZmluaXRpb25MaXN0fTsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBkZWZpbml0aW9uCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkRlZmluaXRpb25BZGQoCiAgICAgICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb257JENsYXNzTmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTGlua0RlbGV0ZSgpCgpkZWxldGUgYWxsIGV4aXN0aW5nIGxpbmtzIHRvIGNvbmZpZyBpdGVtcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0xpbmtEZWxldGUoKTsKCj1jdXQKCnN1YiBfTGlua0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1TZWFyY2goKTsKCiAgICByZXR1cm4gaWYgISRDb25maWdJdGVtSURzOwogICAgcmV0dXJuIGlmIHJlZiAkQ29uZmlnSXRlbUlEcyBuZSAnQVJSQVknOwoKICAgICMgZGVsZXRlIHRoZSBjb25maWcgaXRlbSBsaW5rcwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRDb25maWdJdGVtSURzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rRGVsZXRlQWxsKAogICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgS2V5ICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGxhc3RfdmVyc2lvbl9pZCBjb2x1bW4gb2YgdGhlIGNvbmZpZ2l0ZW0gdGFibGUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIHdpdGggZW1wdHkgbGFzdF92ZXJzaW9uX2lkCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgJwogICAgICAgICAgICAuICdsYXN0X3ZlcnNpb25faWQgPSAwIE9SIGxhc3RfdmVyc2lvbl9pZCBJUyBOVUxMJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBnZXQgdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbV92ZXJzaW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmZpZ2l0ZW1faWQgPSA/IE9SREVSIEJZIGlkIERFU0MnLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkQ29uZmlnSXRlbUlEIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJFZlcnNpb25JRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkVmVyc2lvbklEID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkVmVyc2lvbklEOwoKICAgICAgICAjIHVwZGF0ZSBpbmNpX3N0YXRlX2lkCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25maWdpdGVtICcKICAgICAgICAgICAgICAgIC4gJ1NFVCBsYXN0X3ZlcnNpb25faWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZlcnNpb25JRCwgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCkKCmZpbGx1cCBlbXB0eSBlbnRyaWVzIGluIHRoZSBpbmNpX3N0YXRlX2lkIGNvbHVtbiBvZiB0aGUgY29uZmlnaXRlbV92ZXJzaW9uIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG9wZXJhdGlvbmFsIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdCB8fCByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRJbmNpU3RhdGVMaXN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgYW55IGl0ZW0gaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIElUU006OkNvcmU6OkluY2lkZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNvcnQgaWRzCiAgICBteSBASW5jaVN0YXRlS2V5TGlzdCA9IHNvcnQga2V5cyAleyRJbmNpU3RhdGVMaXN0fTsKCiAgICAjIHVwZGF0ZSBpbmNpX3N0YXRlX2lkCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgIC4gJ1NFVCBpbmNpX3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGluY2lfc3RhdGVfaWQgPSAwIE9SIGluY2lfc3RhdGVfaWQgSVMgTlVMTCcsCiAgICAgICAgQmluZCA9PiBbIFwkSW5jaVN0YXRlS2V5TGlzdFswXSBdLAogICAgKTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyB3aXRoIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgJwogICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCA9IDAgT1IgY3VyX2RlcGxfc3RhdGVfaWQgSVMgTlVMTCBPUiAnCiAgICAgICAgICAgIC4gJ2N1cl9pbmNpX3N0YXRlX2lkID0gMCBPUiBjdXJfaW5jaV9zdGF0ZV9pZCBJUyBOVUxMJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkTGFzdFZlcnNpb247CiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgcmVmICRMYXN0VmVyc2lvbiBuZSAnSEFTSCc7CiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRMYXN0VmVyc2lvbi0+e0RlcGxTdGF0ZUlEfTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlSUR9OwoKICAgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBpdGVtCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25maWdpdGVtIFNFVCAnCiAgICAgICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCA9ID8sICcKICAgICAgICAgICAgICAgIC4gJ2N1cl9pbmNpX3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkTGFzdFZlcnNpb24tPntEZXBsU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBcJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgICAgICAgICAgICAgXCRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0RlbGV0ZVNlcnZpY2VQcmVmZXJlbmNlcygpCgpEZWxldGVzIHRoZSBzZXJ2aWNlIHByZWZlcmVuY2VzIGZvciB0aGUga2V5ICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRGVsZXRlU2VydmljZVByZWZlcmVuY2VzKCk7Cgo9Y3V0CgpzdWIgX0RlbGV0ZVNlcnZpY2VQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIFNFUlZJQ0VJRDoKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmcm9tIENJcyBvZiB0aGUgc2VydmljZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJycsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9NaWdyYXRlRFRMSW5TeXNDb25maWcoKQoKQ29udmVydHMgRFRMIHNldHRpbmdzIGluIHN5c2NvbmZpZyB0byBUVC4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZURUTEluU3lzQ29uZmlnIHsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJFByb3ZpZGVyT2JqZWN0ICA9IEtlcm5lbDo6T3V0cHV0OjpUZW1wbGF0ZTo6UHJvdmlkZXItPm5ldygpOwoKICAgICMgaGFuZGxlIGhhc2ggc2V0dGluZ3MKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHF3KAogICAgICAgIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZQogICAgICAgIElUU01Db25maWdJdGVtOjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZ2V0IHNldHRpbmcncyBjb250ZW50CiAgICAgICAgbXkgJFNldHRpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJE5hbWUpOwogICAgICAgIG5leHQgTkFNRSBpZiAhJFNldHRpbmc7CgogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51TW9kdWxlICggc29ydCBrZXlzICV7JFNldHRpbmd9ICkgewoKICAgICAgICAgICAgIyBzZXR0aW5nIGlzIGEgaGFzaAogICAgICAgICAgICBTRVRUSU5HSVRFTToKICAgICAgICAgICAgZm9yIG15ICRTZXR0aW5nSXRlbSAoIHNvcnQga2V5cyAleyAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTZXR0aW5nQ29udGVudCA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57JFNldHRpbmdJdGVtfTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIG1pZ3JhdGluZwogICAgICAgICAgICAgICAgbmV4dCBTRVRUSU5HSVRFTSBpZiAhJFNldHRpbmdDb250ZW50OwoKICAgICAgICAgICAgICAgIG15ICRUVENvbnRlbnQ7CiAgICAgICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICAgICAkVFRDb250ZW50ID0gJFByb3ZpZGVyT2JqZWN0LT5NaWdyYXRlRFRMdG9UVCggQ29udGVudCA9PiAkU2V0dGluZ0NvbnRlbnQgKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRNZW51TW9kdWxlLT4kU2V0dGluZ0l0ZW0gOiAkQCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+eyRTZXR0aW5nSXRlbX0gPSAkVFRDb250ZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNldHRpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRml4VHlwbygpCgpGaXhlcyBhIHR5cG8gaW4gdGhlIGdlbmVyYWwgY2F0YWxvZwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpeFR5cG8oKTsKCj1jdXQKCnN1YiBfRml4VHlwbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBpdGVtIGRhdGEgd2l0aCB0aGUgd3JvbmcgbmFtZSAiS2V5Ym9yZCIKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpIYXJkd2FyZTo6VHlwZScsCiAgICAgICAgTmFtZSAgPT4gJ0tleWJvcmQnLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGdlbmVyYWwgY2F0YWxvZyBlbnRyeSBleGlzdHMKICAgIGlmICggJEl0ZW1EYXRhUmVmICYmIHJlZiAkSXRlbURhdGFSZWYgZXEgJ0hBU0gnICYmICV7JEl0ZW1EYXRhUmVmfSApIHsKCiAgICAgICAgIyB1cGRhdGUgdGhlIGl0ZW0gZGF0YSB3aXRoIHRoZSBjb3JyZWN0IG5hbWUgIktleWJvYXJkIgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtVXBkYXRlKAogICAgICAgICAgICAleyRJdGVtRGF0YVJlZn0sCiAgICAgICAgICAgIE5hbWUgICA9PiAnS2V5Ym9hcmQnLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZUNvbmZpZ3MoKQoKY2hhbmdlIGNvbmZpZ3VyYXRpb25zIHRvIG1hdGNoIHRoZSBuZXcgbW9kdWxlIGxvY2F0aW9uLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X01pZ3JhdGVDb25maWdzKCk7Cgo9Y3V0CgpzdWIgX01pZ3JhdGVDb25maWdzIHsKCiAgICBmb3IgbXkgJFR5cGUgKHF3KE1lbnVNb2R1bGUgT3ZlcnZpZXcpKSB7CgogICAgICAgICMgbWlncmF0ZSBJVFNNQ29uZmlndXJhdGlvbiBQcmVmZXJlbmNlcwogICAgICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgSVRTTUNvbmZpZ3VyYXRpb24gUHJlZmVyZW5jZXMKICAgICAgICBteSAkU2V0dGluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCggJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JyAuICRUeXBlICk7CgogICAgICAgIENPTkZJR0lURU06CiAgICAgICAgZm9yIG15ICRNZW51TW9kdWxlICggc29ydCBrZXlzICV7JFNldHRpbmd9ICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgbW9kdWxlIGxvY2F0aW9uCiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+eydNb2R1bGUnfTsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlICF+IG17S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtKFx3Kyl9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTW9kdWxlID1+IHN7S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtKFx3Kyl9e0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbTo6JDF9eG1zZzsKICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPntNb2R1bGV9ID0gJE1vZHVsZTsKCiAgICAgICAgICAgICMgc2V0IG5ldyBzZXR0aW5nCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpLT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OicgLiAkVHlwZSAuICcjIyMnIC4gJE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Db252ZXJ0UGVybERlZmluaXRpb25zMllBTUwoKQoKQ29udmVydHMgUGVybCBkZWZpbml0aW9ucyB0byBZQU1MLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0NvbnZlcnRQZXJsRGVmaW5pdGlvbnMyWUFNTCgpOwoKPWN1dAoKc3ViIF9Db252ZXJ0UGVybERlZmluaXRpb25zMllBTUwgewoKICAgIG15ICRDb21tYW5kT2JqZWN0CiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OklUU006OkNvbmZpZ2l0ZW06OkRlZmluaXRpb25QZXJsMllBTUwnKTsKCiAgICBteSAoICRSZXN1bHQsICRFeGl0Q29kZSApOwoKICAgIHsKICAgICAgICBsb2NhbCAqU1RET1VUOwogICAgICAgIG9wZW4gU1RET1VULCAnPjp1dGY4JywgXCRSZXN1bHQ7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRFeGl0Q29kZTsKCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICIkUmVzdWx0IiwKICAgICk7CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
ITSM::ConfigItem::Class
Computer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Hardware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Network
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Software
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Expired
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Inactive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Maintenance
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Pilot
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Planned
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Production
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Repair
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Retired
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Review
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Test/QA
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
Yes
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
No
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Laptop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Desktop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Phone
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
PDA
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Monitor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Printer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Switch
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Router
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
WLAN Access Point
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Security Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Backup Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Mouse
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Keyboard
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Camera
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Beamer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Modem
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
PCMCIA Card
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
USB Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Docking Station
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Scanner
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Building
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Office
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Floor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Room
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Rack
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Workplace
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Outlet
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
IT Facility
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
LAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
WLAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Telco
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
GSM
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Middleware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Admin Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
User Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Embedded
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Single Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per User
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Concurrent Users
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Processor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Node
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Volume Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Enterprise Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Developer Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Demo
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Time Restricted
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Freeware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Open Source
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Unlimited
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1
AttachmentAdd
1
current_timestamp
1
current_timestamp
1
AttachmentDelete
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1
AttachmentAdd
1
current_timestamp
1
current_timestamp
1
AttachmentDelete
1
current_timestamp
1
current_timestamp
1