TextModules
1.2.1
c.a.p.e. IT GmbH
http://www.cape-it.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Bugfix: check for value and not defined TicketTypeID in Kernel::System::TextModule::TextModuleGetByTicketTypeID; set message type note TextModuleGetByQueueAndTicketTypeID if no TicketTypeID given.
CR: added ticket type assignment of text modules; added textmodule attribute for use in CustomerFrontend; improved layout for TextModulesSelection; removed support for OTRS framework 2.3.x.
Bugfix: new Requirement for CiCS, cause of errors on JSON-Updates; CR: improved placeholder-handle (especially Richtext); FR: added option to NOT replace placeholder.
CR: added sort option for TextModule; Bugfixes: various.
Bugfix for placeholder.
CR: added RichTextEditor in AdminTextModules.
First version for OTRS 2.4.x.
2009-06-22 v1.0.0 new package
Text::Modules - c.a.p.e. IT text modules addon
Text::Bausteine - c.a.p.e. IT Text-Bausteine Zusatzmodul
2.4.x
<br>
<b>Welcome</b>
<br>
<br>
You are about to install TextModules. This package requires the following OTRS.extensions to be already installed:<br>
<br>
<ul>
<li>OTRS::CiCS 3.1.71 or higher</li>
</ul>
<br>
<br>
If you are performing an upgrade from TextModules version less than 1.2.x, please be advised that this version of TextModules contains TicketType-assignment of text modules. All existing text modules will automatically be assigned to all existing, valid ticket types. <br>
<br>
<br>
c.a.p.e. IT ...global consulting - individual solutions.<br>
<br>
<br>
<b>Willkommen</b>
<br>
Sie sind im Begriff TextModules zu installieren. Dieses Paket verlangt, dass folgende OTRS-Erweiterungen bereits installiert sind:<br>
<br>
<ul>
<li>OTRS::CiCS 3.1.5 oder hoeher</li>
</ul>
<br>
<br>
Wenn Sie eine Aktuealisierung von TextModules Version niedriger als 1.2.x durchfuehren, moechten wir darauf hinweisen, dass diese Version der TextModule-Erweiterung Tickettypen-Zuordnung von Textbausteinen mit sich bringt. Alle vorhandenen Textbausteine werden automatisch allen aktuell gueltigen Tickettypen zugeordnet.<br>
<br>
<br>
c.a.p.e. IT ...global consulting - individual solutions.<br>
<br>
OTRS-CiCS
my $FunctionName = 'CodeInstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUpgrade';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUninstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeReinstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2010-07-09 12:12:33
cvs.intra.cape-it.de
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRleHRNb2R1bGVzLnhtbCx2IDEuOSAyMDEwLTA2LTE1IDE0OjIzOjA0IHR0byBFeHAgJDwvQ1ZTPgogICAgCgogICAgPCEtLSBGUk9OVEVORCBNT0RVTEUgUkVHSVNUUkFUSU9OUyAtLT4gCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5UZXh0TW9kdWxlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbnRUZXh0TW9kdWxlcyBvYmplY3QgaW4gdGhlIGFkbWluIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluVGV4dE1vZHVsZXMtT2JqZWt0cyBpbSBBZG1pbi1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGV4dE1vZHVsZXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlRleHQgTW9kdWxlczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5UZXh0IE1vZHVsZXM8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrMjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTUwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblF1ZXVlVGV4dE1vZHVsZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5RdWV1ZVRleHRNb2R1bGVzIG9iamVjdCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluUXVldWVUZXh0TW9kdWxlcy1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGV4dE1vZHVsZXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlRleHQgTW9kdWxlcyAmbHQ7LSZndDsgUXVldWU8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+VGV4dCBNb2R1bGVzICZsdDstJmd0OyBRdWV1ZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2syPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xNTU8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8IS0tIEVPIEZST05URU5EIE1PRFVMRSBSRUdJU1RSQVRJT05TIC0tPgogICAgCiAgICAKICAgIDwhLS0gRlJPTlRFTkQgQ09ORklHVVJBVElPTlMgLS0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UjIyNSZXNldEJvZHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIGlmIHRoZSBtZXNzYWdlcyBib2R5IGlzIHJlc2V0IGFmdGVyIHRpY2tldCB0eXBlIG9yIHF1ZXVlIGNoYW5nZS4gUmVsZXZhbnQgZm9yIGF1dG9tYXRpYyBsb2FkaW5nIG9mIGEgc2luZ2xlIHRleHQgbW9kdWxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgb2IgZGllIE5hY2hyaWNodCBiZWkgQWVuZGVydW5nIHZvbiBUaWNrZXR0eXAgb2RlciBRdWV1ZSB6dXJ1ZWNrZ2VzZXR6dCB3aXJkLiBSZWxldmFudCBmdWVyIGF1dG9tLiBMYWRlbiBlaW5lcyBlaW56ZWxuZW4gVGV4dGJhdXN0ZWlucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6OlRpY2tldDo6Vmlld05ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIAogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGV4dE1vZHVsZTo6TGltaXRTaG93bkVudHJpZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHZhbHVlIGZvciBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHNob3duIGluIFRleHRNb2R1bGUgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkYXVzd2FobCBmdWVyIG1heGltYWxlIEFuemFobCBhbiBhbmdlemVpZ3RlbiBUZXh0YmF1c3RlaW5lbiBpbiBVZWJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRleHRNb2R1bGVzPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xMDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGV4dE1vZHVsZTo6WE1MVXBsb2FkRG9Ob3RBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHZhbHVlIGZvciBEby1Ob3QtQWRkLUZsYWcgaW4gWE1MLXRleHRtb2R1bGUgdXBsb2FkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZGF1c3dhaGwgZnVlciBOaWNodC1IaW56dWZ1ZWdlbi1LZW5udW5nIGluIFhNTC1UZXh0YmF1c3RlaW51cGxvYWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGV4dE1vZHVsZXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGV4dE1vZHVsZTo6TGFuZ3VhZ2VRdWV1ZU1hdGNoaW5nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgYWN0aXZhdGVkIHF1ZXVlcyBvZmZlcmVkIGZvciB1c2UgaW4gRWRpdFZpZXcgYXJlIGxpbWl0ZWQgYnkgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIChsYW5ndWFnZSBzaG9ydCBpZGVudGlmaWVyIG11c3QgYmUgY29udGFpbmVkIGFzIHN1YnF1ZXVlbmFtZSBpbiBjb21wbGV0ZSBxdWV1ZSBuYW1lKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBha3RpdmllcnQsIHdlcmRlbiBkaWUgUXVldWVzIGluIGRlciBCZWFyYmVpdGVuYW5zaWNodCBiYXNpZXJlbmQgYXVmIGRlciBTcHJhY2hhdXN3YWhsIGVpbmdlc2NocmFlbmt0IChTcHJhY2hrdWVyemVsIG11c3MgYWxzIFN1YnF1ZXVlbmFtZSBpbiB2b2xsc3RhZW5kaWdlbSBRdWV1ZW5hbWVuIGVudGhhbHRlbiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UZXh0TW9kdWxlczwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0TW9kdWxlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNlbGVjdCBmcm9udGVuZCBhZ2VudCBtb2R1bGVzIHdoZXJlIHRleHQgbW9kdWxlcyBhcmUgYWN0aXZhdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GZXN0bGVndW5nIGluIHdlbGNoZW4gQWdlbnQtRnJvbnRlbmQtTW9kdWxlbiBkaWUgVGV4dGJhdXN0ZWluZSBha3RpdmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UZXh0TW9kdWxlczwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclRpY2tldE1lc3NhZ2UiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0Q29tcG9zZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRFbWFpbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRGb3J3YXJkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudFRpY2tldE5vdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0UGhvbmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDwhLS0gRU8gRlJPTlRFTkQgQ09ORklHVVJBVElPTlMgLS0+CgoKICAgIDwhLS0gQ09SRSBDT05GSUdVUkFUSU9OUyAtLT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRleHRNb2R1bGU6OkN1c3RvbU1vZHVsZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BZGRpdGlvbmFsIGFuZCBleHRlbmRlZCBUZXh0TW9kdWxlIG1ldGhvZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlp1c2FldHpsaWNoZSB1bmQgZXJ3ZWl0ZXJ0ZSBUZXh0TW9kdWxlLU1ldGhvZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRleHRNb2R1bGVzPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBZG1pblJlc3BvbnNlc1VwbG9hZHM6OlRleHRNb2R1bGVEZWZhdWx0cyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgdmFsdWVzIGZvciB1cGxvYWRlZCBUZXh0TW9kdWxlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmR3ZXJ0ZSBmdWVyIGhvY2hnZWxhZGVuZSBUZXh0YmF1c3RlaW5lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRleHRNb2R1bGVzPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWYWxpZElEIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPCEtLSBFTyBDT1JFIENPTkZJR1VSQVRJT05TIC0tPgogICAgCiAgICAKPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9UZXh0TW9kdWxlcy5wbSAtIHByb3ZpZGVzIGdlcm1hbiBsYW5ndWFnZSB0cmFuc2xhdGlvbiBmb3IKIyBUZXh0TW9kdWxlcwojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgICBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUtaXQuZGUKIwojIC0tCiMgJElkOiBkZV9UZXh0TW9kdWxlcy5wbSx2IDEuNSAyMDEwLTA2LTE1IDE0OjA3OjQ5IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfVGV4dE1vZHVsZXM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKIyAtLQpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIDAgaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAjICQkU1RBUlQkJAoKICAgICRMYW5nLT57J1RleHQgbW9kdWxlIE1hbmFnZW1lbnQnfSA9ICdUZXh0LUJhdXN0ZWluZSBWZXJ3YWx0dW5nJzsKICAgICRMYW5nLT57J1RleHQgbW9kdWxlcyA8LT4gUXVldWUgTWFuYWdlbWVudCd9CiAgICAgICAgPSAnVGV4dC1CYXVzdGVpbmUgPC0+IFF1ZXVlIFZlcndhbHR1bmcnOwogICAgJExhbmctPnsnVGV4dCBtb2R1bGVzJ30gICAgICAgICAgID0gJ1RleHQtQmF1c3RlaW5lJzsKICAgICRMYW5nLT57J1RleHQgbW9kdWxlcyBzZWxlY3Rpb24nfSA9ICdUZXh0LUJhdXN0ZWluZSBBdXN3YWhsJzsKICAgICRMYW5nLT57J1RleHQgbW9kdWxlJ30gICAgICAgICAgICA9ICdUZXh0LUJhdXN0ZWluJzsKICAgICRMYW5nCiAgICAgICAgLT57J0EgdGV4dCBtb2R1bGUgaXMgZGVmYXVsdCB0ZXh0IHRvIHdyaXRlIGZhc3RlciBhbnN3ZXIgKHdpdGggZGVmYXVsdCB0ZXh0KSB0byBjdXN0b21lcnMuJ30KICAgICAgICA9ICdFaW4gVGV4dC1CYXVzdGVpbiBpc3QgZWluIHZvcmRlZmluaWVydGVyIFRleHQsIHVtIEt1bmRlbiBzY2huZWxsZXIgYW50d29ydGVuIHp1IGv2bm5lbi4nOwogICAgJExhbmctPnsnRG9uXCd0IGZvcmdldCB0byBhZGQgYSBuZXcgdGV4dCBtb2R1bGUgYSBxdWV1ZSEnfQogICAgICAgID0gJ0VpbiBuZXVlciBUZXh0LUJhdXN0ZWluIG11c3MgZWluZXIgUXVldWUgenVnZXdpZXNlbiB3ZXJkZW4hJzsKICAgICRMYW5nLT57J2FkZCBhIHRleHQgbW9kdWxlJ30gICAgICAgPSAnRWluZW4gVGV4dC1CYXVzdGVpbiBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J2RlbGV0ZSB0aGlzIHRleHQgbW9kdWxlJ30gPSAnRGllc2VuIFRleHQtQmF1c3RlaW4gbPZzY2hlbic7CiAgICAkTGFuZy0+eycoQ2xpY2sgaGVyZSB0byBhZGQpJ30gICAgID0gJyhIaWVyIGtsaWNrZW4gdW0gaGluenVm/GdlbiknOwogICAgJExhbmctPnsnQ2hhbmdlIFRleHQgbW9kdWxlIHNldHRpbmdzJ30KICAgICAgICA9ICfEbmRlcm4gZGVyIFRleHQtQmF1c3RlaW4gRWluc3RlbGx1bmdlbic7CiAgICAkTGFuZy0+eydBIHRleHQgbW9kdWxlIHNob3VsZCBoYXZlIGEgbmFtZSEnfQogICAgICAgID0gJ0VpbiBUZXh0LUJhdXN0ZWluIHNvbGx0ZSBlaW5lbiBOYW1lbiBoYWJlbiEnOwogICAgJExhbmctPnsnQSB0ZXh0IG1vZHVsZSBzaG91bGQgaGF2ZSBhIGNvbnRlbnQhJ30KICAgICAgICA9ICdFaW4gVGV4dC1CYXVzdGVpbiBzb2xsdGUgZWluZW4gSW5oYWx0IGhhYmVuISc7CiAgICAkTGFuZy0+eydBc3N1bWUgdG8gdGV4dCd9ID0gJ0luIGRlbiBUZXh0IPxiZXJuZWhtZW4nOwogICAgJExhbmctPnsnRG91YmxlIGNsaWNrIG9uIHRoZSB0ZXh0IG1vZHVsZSwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBib2R5J30KICAgICAgICA9ICdBdWYgZGVuIFRleHQtQmF1c3RlaW4gZG9wcGVsdCBrbGlja2VuLCBkZXIgaW4gZGVuIFRleHQg/GJlcm5vbW1lbiB3ZXJkZW4gc29sbCc7CiAgICAkTGFuZy0+eydVbmRvJ30gICAgICAgICAgICAgICAgICAgID0gJ1L8Y2tn5G5naWcnOwogICAgJExhbmctPnsnUGFzdGUnfSAgICAgICAgICAgICAgICAgICA9ICdFaW5m/Gdlbic7CiAgICAkTGFuZy0+eydRdWV1ZSBBc3NpZ25tZW50J30gICAgICAgID0gJ1F1ZXVlenVvcmRudW5nJzsKICAgICRMYW5nLT57J0ZpbHRlciBPdmVydmlldyd9ICAgICAgICAgPSAn3GJlcnNpY2h0IGVpbnNjaHLkbmtlbic7CiAgICAkTGFuZy0+eydMaW1pdCBSZXN1bHRzJ30gICAgICAgICAgID0gJ0FuemFobCBsaW1pdGllcmVuJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyB0ZXh0IG1vZHVsZSd9ICAgPSAnRWluZW4gbmV1ZW4gVGV4dGJhdXN0ZWluIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnZW50cmllcyBzaG93bid9ICAgICAgICAgICA9ICdFaW50cuRnZSBhbmdlemVpZ3QnOwogICAgJExhbmctPnsnRG93bmxvYWQnfSAgICAgICAgICAgICAgICA9ICdIZXJ1bnRlcmxhZGVuJzsKICAgICRMYW5nLT57J1RleHQgTW9kdWxlcyBNYW5hZ2VtZW50J30gPSAnVmVyd2FsdHVuZyBUZXh0YmF1c3RlaW5lJzsKICAgICRMYW5nLT57J1VwbG9hZCB0ZXh0IG1vZHVsZXMnfSAgICAgPSAnVGV4dGJhdXN0ZWluZSBob2NobGFkZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGZhaWxlZCAtIE5vIGZpbGUgdXBsb2FkZWQvcmVjZWl2ZWQnfQogICAgICAgID0gJ0ltcG9ydCBmZWhsZ2VzY2hsYWdlbiAtIGtlaW5lIERhdGVpIGhvY2hnZWxhZGVuL2VtcGZhbmdlbic7CiAgICAkTGFuZy0+eydSZXN1bHQgb2YgdGhlIHVwbG9hZCd9ICAgICAgPSAnRXJnZWJuaXMgZGVzIEltcG9ydHMnOwogICAgJExhbmctPnsnZW50cmllcyB1cGxvYWRlZCd9ICAgICAgICAgID0gJ0hvY2hnZWxhZGVuZSBFaW50cuRnZSc7CiAgICAkTGFuZy0+eyd1cGRhdGVkJ30gICAgICAgICAgICAgICAgICAgPSAnYWt0dWFsaXNpZXJ0JzsKICAgICRMYW5nLT57J2FkZGVkJ30gICAgICAgICAgICAgICAgICAgICA9ICdoaW56dWdlZvxndCc7CiAgICAkTGFuZy0+eyd1cGRhdGUgZmFpbGVkJ30gICAgICAgICAgICAgPSAnQWt0dWFsaXNpZXJ1bmcgZmVobGdlc2NobGFnZW4nOwogICAgJExhbmctPnsnaW5zZXJ0IGZhaWxlZCd9ICAgICAgICAgICAgID0gJ0hpbnp1ZvxnZW4gZmVobGdlc2NobGFnZW4nOwogICAgJExhbmctPnsnRG93bmxvYWQgYWxsIHRleHQgbW9kdWxlcyd9ID0gJ0FsbGUgVGV4dGJhdXN0ZWluZSBoZXJ1bnRlcmxhZGVuJzsKICAgICRMYW5nLT57J0Rvd25sb2FkIGNvbXBsZXRlIHJlc3VsdCBvZiB5b3VyIHVwbG9hZCd9CiAgICAgICAgPSAnSGVydW50ZXJsYWRlbiBkZXMgdm9sbHN05G5kaWdlbiBJbXBvcnRlcmdlYm5pc3Nlcyc7CiAgICAkTGFuZy0+eydTdW1tYXJ5J30gICAgICAgICAgID0gJ1p1c2FtbWVuZmFzc3VuZyc7CiAgICAkTGFuZy0+eydBdmFpbGFibGUgaW4nfSAgICAgID0gJ1Zlcmb8Z2JhciBpbic7CiAgICAkTGFuZy0+eydBZ2VudCBGcm9udGVuZCd9ICAgID0gJ0FnZW50ZW5mcm9udGVuZCc7CiAgICAkTGFuZy0+eydDdXN0b21lciBGcm9udGVuZCd9ID0gJ0t1bmRlbmZyb250ZW5kJzsKICAgICRMYW5nLT57J1B1YmxpYyBGcm9udGVuZCd9ICAgPSAn1mZmZW50bGljaGVzIEZyb250ZW5kJzsKICAgICRMYW5nLT57J0E6IGFnZW50IGZyb250ZW5kOyBDOiBjdXN0b21lciBmcm9udGVuZCwgUDogcHVibGljIGZyb250ZW5kJ30gPQogICAgICAgICdBOiBBZ2VudGVub2JlcmZs5GNoZTsgQzogS3VuZGVub2JlcmZs5GNoZTsgUDog1mZmZW50bGljaGUgT2JlcmZs5GNoZSc7CiAgICAkTGFuZy0+eydBc3NpZ2VuZCBUbyd9ID0gJ1p1Z2dlb3JkbmV0IHp1JzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMDsKCiAgICAjICQkU1RPUCQkCn0KCiMgLS0KMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluUXVldWVUZXh0TW9kdWxlcy5wbSAtIHF1ZXVlIDwtPiB0ZXh0IG1vZHVsZXMKIyBiYXNlZCB1cG9uIEFkbWluUXVldWVSZXNwb25zZXMuZHRsLCB2IDEuMjQKIwojIE9yaWdpbmFsIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBFeHRlbnNpb25zIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgICBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUtaXQuZGUKIyAgIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IEFkbWluUXVldWVUZXh0TW9kdWxlcy5wbSx2IDEuMyAyMDEwLTAzLTAzIDA5OjA3OjI3IG1hYmEgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluUXVldWVUZXh0TW9kdWxlczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6UXVldWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e1F1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dCAgICA9ICcnOwogICAgbXkgJFN1YmFjdGlvbiA9ICRTZWxmLT57U3ViYWN0aW9ufTsKICAgIG15ICRVc2VySUQgICAgPSAkU2VsZi0+e1VzZXJJRH07CiAgICBteSAkSUQgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAkSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRJRCwgJ0ludGVnZXInICkgaWYgKCRJRCk7CiAgICBteSAkTmV4dFNjcmVlbiA9ICdBZG1pblF1ZXVlVGV4dE1vZHVsZXMnOwoKICAgICMgdXNlciA8LT4gZ3JvdXAgMTpuCiAgICBpZiAoICRTdWJhY3Rpb24gZXEgJ1RleHRNb2R1bGUnICkgewogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhciggVHlwZSA9PiAnQWRtaW4nICk7CgogICAgICAgICMgZ2V0IFRleHRNb2R1bGVzIGRhdGEKICAgICAgICBteSAlVGV4dE1vZHVsZXNEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgVGFibGUgPT4gJ3RleHRfbW9kdWxlJywKICAgICAgICAgICAgV2hhdCAgPT4gJ2lkLCBuYW1lJywKICAgICAgICAgICAgV2hlcmUgPT4gImlkID0gJElEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBxdWV1ZSBkYXRhCiAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoIFZhbGlkID0+IDEgKTsKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICdxdWV1ZV90ZXh0X21vZHVsZScsCiAgICAgICAgICAgIFdoYXQgID0+ICdxdWV1ZV9pZCwgdGV4dF9tb2R1bGVfaWQnLAogICAgICAgICAgICBXaGVyZSA9PiAidGV4dF9tb2R1bGVfaWQgPSAkSUQiCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgRmlyc3REYXRhICA9PiBcJVRleHRNb2R1bGVzRGF0YSwKICAgICAgICAgICAgU2Vjb25kRGF0YSA9PiBcJVF1ZXVlRGF0YSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJ1RleHRNb2R1bGUnLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIH0KCiAgICAjIGdyb3VwIDwtPiB1c2VyIG46MQogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCBUeXBlID0+ICdBZG1pbicgKTsKCiAgICAgICAgIyBnZXQgVGV4dE1vZHVsZXMgZGF0YQogICAgICAgIG15ICVUZXh0TW9kdWxlc0RhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICBUYWJsZSA9PiAndGV4dF9tb2R1bGUnLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnLAogICAgICAgICAgICBWYWxpZCA9PiAxCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcXVldWUgZGF0YQogICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICBUYWJsZSA9PiAncXVldWUnLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnLAogICAgICAgICAgICBXaGVyZSA9PiAiaWQgPSAkSUQiLAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICBUYWJsZSA9PiAncXVldWVfdGV4dF9tb2R1bGUnLAogICAgICAgICAgICBXaGF0ICA9PiAndGV4dF9tb2R1bGVfaWQsIHF1ZXVlX2lkJywKICAgICAgICAgICAgV2hlcmUgPT4gInF1ZXVlX2lkID0gJElEIgogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIEZpcnN0RGF0YSAgPT4gXCVRdWV1ZURhdGEsCiAgICAgICAgICAgIFNlY29uZERhdGEgPT4gXCVUZXh0TW9kdWxlc0RhdGEsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBUeXBlICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICB9CgogICAgIyBxdWV1ZXMgdG8gdGV4dF9tb2R1bGVzCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0NoYW5nZVF1ZXVlJyApIHsKICAgICAgICBteSBATmV3SURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSURzJyApOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZV90ZXh0X21vZHVsZSBXSEVSRSBxdWV1ZV9pZCA9ICRJRCIgKTsKICAgICAgICBmb3IgbXkgJE5ld0lEIChATmV3SURzKSB7CgogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgICROZXdJRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJE5ld0lELCAnSW50ZWdlcicgKTsKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiSU5TRVJUIElOVE8gcXVldWVfdGV4dF9tb2R1bGUgKHF1ZXVlX2lkLCB0ZXh0X21vZHVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgIgogICAgICAgICAgICAgICAgLiAiIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIgogICAgICAgICAgICAgICAgLiAiIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIgKCRJRCwgJE5ld0lELCBjdXJyZW50X3RpbWVzdGFtcCwgJFVzZXJJRCwgY3VycmVudF90aW1lc3RhbXAsICRVc2VySUQpIjsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgICAgIH0KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW4iICk7CiAgICB9CgogICAgIyB0ZXh0X21vZHVsZXMgdG9wIHF1ZXVlcwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdDaGFuZ2VUZXh0TW9kdWxlJyApIHsKICAgICAgICBteSBATmV3SURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSURzJyApOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZV90ZXh0X21vZHVsZSBXSEVSRSB0ZXh0X21vZHVsZV9pZCA9ICRJRCIKICAgICAgICApOwogICAgICAgIGZvciBteSAkTmV3SUQgKEBOZXdJRHMpIHsKCiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgJE5ld0lEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTmV3SUQsICdJbnRlZ2VyJyApOwogICAgICAgICAgICBteSAkU1FMCiAgICAgICAgICAgICAgICA9ICJJTlNFUlQgSU5UTyBxdWV1ZV90ZXh0X21vZHVsZSAocXVldWVfaWQsIHRleHRfbW9kdWxlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCAiCiAgICAgICAgICAgICAgICAuICIgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkiCiAgICAgICAgICAgICAgICAuICIgVkFMVUVTICIKICAgICAgICAgICAgICAgIC4gIiAoJE5ld0lELCAkSUQsIGN1cnJlbnRfdGltZXN0YW1wLCAkVXNlcklELCBjdXJyZW50X3RpbWVzdGFtcCwgJFVzZXJJRCkiOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbiIgKTsKICAgIH0KCiAgICAjIGVsc2UgISBwcmludCBmb3JtCiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoIFR5cGUgPT4gJ0FkbWluJyApOwoKICAgICAgICAjIGdldCBUZXh0TW9kdWxlcyBkYXRhCiAgICAgICAgbXkgJVRleHRNb2R1bGVzRGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICd0ZXh0X21vZHVsZScsCiAgICAgICAgICAgIFdoYXQgID0+ICdpZCwgbmFtZScsCiAgICAgICAgICAgIFZhbGlkID0+IDEKICAgICAgICApOwoKICAgICAgICAjIGdldCBxdWV1ZSBkYXRhCiAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoIFZhbGlkID0+IDEgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0Zyb20oCiAgICAgICAgICAgIEZpcnN0RGF0YSAgPT4gXCVUZXh0TW9kdWxlc0RhdGEsCiAgICAgICAgICAgIFNlY29uZERhdGEgPT4gXCVRdWV1ZURhdGEKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmlyc3REYXRhICAgICA9ICRQYXJhbXtGaXJzdERhdGF9OwogICAgbXkgJUZpcnN0RGF0YVRtcCAgPSAlJEZpcnN0RGF0YTsKICAgIG15ICRTZWNvbmREYXRhICAgID0gJFBhcmFte1NlY29uZERhdGF9OwogICAgbXkgJVNlY29uZERhdGFUbXAgPSAlJFNlY29uZERhdGE7CiAgICBteSAkRGF0YSAgICAgICAgICA9ICRQYXJhbXtEYXRhfTsKICAgIG15ICVEYXRhVG1wICAgICAgID0gJSREYXRhOwogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRQYXJhbXtUeXBlfSA9ICdUZXh0TW9kdWxlJzsKICAgIH0KICAgIG15ICROYW1lVHlwZSAgID0gKCAkUGFyYW17VHlwZX0gZXEgJ1RleHRNb2R1bGUnICkgPyAnVGV4dCBtb2R1bGUnIDogJ1F1ZXVlJzsKICAgIG15ICRUYXJnZXRUeXBlID0gKCAkUGFyYW17VHlwZX0gZXEgJ1RleHRNb2R1bGUnICkgPyAnUXVldWUnICAgICAgIDogJ1RleHQgbW9kdWxlJzsKCiAgICBmb3IgKCBzb3J0IGtleXMgJUZpcnN0RGF0YVRtcCApIHsKICAgICAgICAkRmlyc3REYXRhVG1weyRffSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgICAgICA9PiAkRmlyc3REYXRhVG1weyRffSwKICAgICAgICAgICAgSFRNTFF1b3RlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKSB8fCAnJzsKICAgICAgICAkUGFyYW17T3B0aW9uU3RyZzB9CiAgICAgICAgICAgIC49ICI8Qj5cJFRleHR7XCIkTmFtZVR5cGVcIn06PC9CPiA8QSBIUkVGPVwiJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9QWN0aW9uPUFkbWluJFBhcmFte1R5cGV9JlN1YmFjdGlvbj1DaGFuZ2UmSUQ9JF9cIj4iCiAgICAgICAgICAgIC4gIiRGaXJzdERhdGFUbXB7JF99PC9BPiAoaWQ9JF8pPEJSLz4iOwogICAgICAgICRQYXJhbXtPcHRpb25TdHJnMH0gLj0gIjxJTlBVVCBUWVBFPVwiaGlkZGVuXCIgTkFNRT1cIklEXCIgVkFMVUU9XCIkX1wiPjxCUi8+XG4iOwogICAgfQogICAgJFBhcmFte09wdGlvblN0cmcwfSAuPQogICAgICAgICI8Qj5cJFRleHR7XCIkVGFyZ2V0VHlwZVwifTo8L0I+PEJSLz4gPFNFTEVDVCBOQU1FPVwiSURzXCIgU0laRT0xMCBtdWx0aXBsZT5cbiI7CiAgICBmb3IgbXkgJElEICggc29ydCB7ICRTZWNvbmREYXRhVG1weyRifSBjbXAgJFNlY29uZERhdGFUbXB7JGF9IH0ga2V5cyAlU2Vjb25kRGF0YVRtcCApIHsKICAgICAgICAkU2Vjb25kRGF0YVRtcHskSUR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICAgICAgID0+ICRTZWNvbmREYXRhVG1weyRJRH0sCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICkgfHwgJyc7CiAgICAgICAgJFBhcmFte09wdGlvblN0cmcwfSAuPSAiPE9QVElPTiAiOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlRGF0YVRtcCApIHsKICAgICAgICAgICAgaWYgKCAkXyBlcSAkSUQgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZzB9IC49ICdzZWxlY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte09wdGlvblN0cmcwfSAuPSAiIFZBTFVFPVwiJElEXCI+JFNlY29uZERhdGFUbXB7JElEfSAoaWQ9JElEKTwvT1BUSU9OPlxuIjsKICAgIH0KICAgICRQYXJhbXtPcHRpb25TdHJnMH0gLj0gIjwvU0VMRUNUPlxuIjsKCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblF1ZXVlVGV4dE1vZHVsZXNDaGFuZ2VGb3JtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIF9NYXNrRnJvbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRVc2VyRGF0YSAgICAgPSAkUGFyYW17Rmlyc3REYXRhfTsKICAgIG15ICVVc2VyRGF0YVRtcCAgPSAlJFVzZXJEYXRhOwogICAgbXkgJEdyb3VwRGF0YSAgICA9ICRQYXJhbXtTZWNvbmREYXRhfTsKICAgIG15ICVHcm91cERhdGFUbXAgPSAlJEdyb3VwRGF0YTsKICAgIG15ICRCYXNlTGluayAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30gLiAiQWN0aW9uPUFkbWluUXVldWVUZXh0TW9kdWxlcyYiOwogICAgZm9yICggc29ydCB7ICRVc2VyRGF0YVRtcHskYX0gY21wICRVc2VyRGF0YVRtcHskYn0gfSBrZXlzICVVc2VyRGF0YVRtcCApIHsKICAgICAgICAkVXNlckRhdGFUbXB7JF99ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICAgICAgID0+ICRVc2VyRGF0YVRtcHskX30sCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1RleHRNb2R1bGVRdWV1ZVN0cmd9CiAgICAgICAgICAgIC49ICI8YSBocmVmPVwiJEJhc2VMaW5rIiAuICJTdWJhY3Rpb249VGV4dE1vZHVsZSZJRD0kX1wiPiRVc2VyRGF0YVRtcHskX308L2E+PGJyLz4iOwogICAgfQogICAgZm9yICggc29ydCB7ICRHcm91cERhdGFUbXB7JGF9IGNtcCAkR3JvdXBEYXRhVG1weyRifSB9IGtleXMgJUdyb3VwRGF0YVRtcCApIHsKICAgICAgICAkR3JvdXBEYXRhVG1weyRffSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgICAgICA9PiAkR3JvdXBEYXRhVG1weyRffSwKICAgICAgICAgICAgSFRNTFF1b3RlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UXVldWVUZXh0TW9kdWxlU3RyZ30KICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkQmFzZUxpbmsiIC4gIlN1YmFjdGlvbj1RdWV1ZSZJRD0kX1wiPiRHcm91cERhdGFUbXB7JF99PC9hPjxici8+IjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblF1ZXVlVGV4dE1vZHVsZXMnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluVGV4dE1vZHVsZXMucG0gLSB1c2VyIGZyb250ZW5kIHRvIG1hbmFnZSB0ZXh0IG1vZHVsZXMKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMgICBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQuZGUKIwojIC0tCiMgJElkOiBBZG1pblRleHRNb2R1bGVzLnBtLHYgMS4xMSAyMDEwLTA2LTE1IDE0OjA3OjQ5IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5UZXh0TW9kdWxlczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpUZW1wIHF3KCB0ZW1wZmlsZSB0ZW1wZGlyICk7CnVzZSBGaWxlOjpCYXNlbmFtZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGV4dE1vZHVsZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUeXBlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UXVldWVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRUeXBlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlRleHRNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREZWZhdWx0TGltaXQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGV4dE1vZHVsZTo6TGltaXRTaG93bkVudHJpZXMnKSB8fCAwOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciAoCiAgICAgICAgcXcoIElEIE5hbWUgS2V5d29yZHMgQ29tbWVudCBWYWxpZElEIFRleHRNb2R1bGUgTGFuZ3VhZ2UgTGltaXQgRm9ybUlECiAgICAgICAgU2hvdyBEb3dubG9hZCBYTUxVcGxvYWREb05vdEFkZCBYTUxSZXN1bHRGaWxlSUQgWE1MUmVzdWx0RmlsZU5hbWUKICAgICAgICBMYW5ndWFnZUVkaXQgQWdlbnQgQ3VzdG9tZXIgUHVibGljKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApIHx8ICcnOwogICAgfQogICAgbXkgQE5ld1F1ZXVlSURzICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBc3NpZ25lZFF1ZXVlSURzJyApOwogICAgbXkgQE5ld1RpY2tldFR5cGVJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBc3NpZ25lZFRpY2tldFR5cGVJRHMnICk7CgogICAgJEdldFBhcmFte1hNTFVwbG9hZERvTm90QWRkfSA9IDA7CiAgICAkR2V0UGFyYW17WE1MVXBsb2FkRG9Ob3RBZGR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RleHRNb2R1bGU6OlhNTFVwbG9hZERvTm90QWRkJyk7CgogICAgbXkgJVZhbGlkSGFzaCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICRWYWxpZEhhc2h7Jyd9ID0gJy0nOwoKICAgIG15ICRMYW5ndWFnZXNSZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXMnKTsKICAgIG15ICVMYW5ndWFnZUhhc2ggPSAleyRMYW5ndWFnZXNSZWZ9OwogICAgJExhbmd1YWdlSGFzaHsnJ30gPSAnLSc7CgogICAgbXkgJVF1ZXVlRGF0YSAgICAgICAgID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwogICAgbXkgJVNlbGVjdGVkUXVldWVEYXRhID0gKCk7CiAgICBteSBAU2VsZWN0ZWRRdWV1ZUlEcyAgPSBxd3t9OwoKICAgIG15ICVUaWNrZXRUeXBlRGF0YSAgICAgICAgID0gJFNlbGYtPntUaWNrZXRUeXBlT2JqZWN0fS0+VHlwZUxpc3QoIFZhbGlkID0+IDEgKTsKICAgIG15ICVTZWxlY3RlZFRpY2tldFR5cGVEYXRhID0gKCk7CiAgICBteSBAU2VsZWN0ZWRUaWNrZXRUeXBlSURzICA9IHF3e307CgogICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRIYXNoLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9LAogICAgKTsKCiAgICAkUGFyYW17J0xhbmd1YWdlT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICA9PiBcJUxhbmd1YWdlSGFzaCwKICAgICAgICBOYW1lICAgICAgPT4gJ0xhbmd1YWdlJywKICAgICAgICBIVE1MUXVvdGUgPT4gMCwKCiAgICAgICAgI1NlbGVjdGVkSUQgPT4gJEdldFBhcmFte0xhbmd1YWdlfSB8fCAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gfHwKICAgICAgICAjICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nLAogICAgKTsKCiAgICAkUGFyYW17J1F1ZXVlVGV4dE1vZHVsZVN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgPT4gXCVRdWV1ZURhdGEsCiAgICAgICAgTmFtZSAgICAgPT4gJ0Fzc2lnbmVkUXVldWVJRHMnLAogICAgICAgIE11bHRpcGxlID0+IDEsCiAgICAgICAgU2l6ZSAgICAgPT4gMTMsCiAgICApOwoKICAgICRQYXJhbXsnVGlja2V0VHlwZVRleHRNb2R1bGVTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgID0+IFwlVGlja2V0VHlwZURhdGEsCiAgICAgICAgTmFtZSAgICAgPT4gJ0Fzc2lnbmVkVGlja2V0VHlwZUlEcycsCiAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICBTaXplICAgICA9PiAxMywKICAgICk7CgogICAgJFBhcmFte1NlbFF1ZXVlc0FycmF5fSA9ICd2YXIgYXJyU2VsUXVldWVzID0gbmV3IEFycmF5KCk7JzsKICAgICRQYXJhbXtBbGxRdWV1ZXNBcnJheX0gPSAndmFyIGFyclF1ZXVlcyA9IG5ldyBBcnJheSgpOyc7CiAgICBteSAkSW5kZXggPSAwOwogICAgZm9yZWFjaCBteSAkUXVldWVJRCAoIGtleXMoJVF1ZXVlRGF0YSkgKSB7CiAgICAgICAgJFBhcmFte0FsbFF1ZXVlc0FycmF5fSAuPSAnYXJyUXVldWVzWycKICAgICAgICAgICAgLiAkSW5kZXgKICAgICAgICAgICAgLiAnXSA9ICInCiAgICAgICAgICAgIC4gJFF1ZXVlSUQKICAgICAgICAgICAgLiAiOjo6OjoiCiAgICAgICAgICAgIC4gJFF1ZXVlRGF0YXskUXVldWVJRH0KICAgICAgICAgICAgLiAnIjsnOwogICAgICAgICRJbmRleCsrOwogICAgfQoKICAgIG15ICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gfHwgJycsCiAgICApOwoKICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IFF1ZXVlTGlzdAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdRdWV1ZUxpc3QnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICRQYXJhbXtGb3JtSUR9ID0gJFNlbGYtPntGb3JtSUR9OwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgJiYgJEdldFBhcmFte0lEfSApIHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTmV3JyApIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJVRleHRNb2R1bGVEYXRhID0gKCk7CiAgICAgICAgZGVsZXRlKCAkVmFsaWRIYXNoeycnfSApOwoKICAgICAgICAkUGFyYW17J1ZhbGlkT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRIYXNoLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0JyApIHsKICAgICAgICAgICAgJVRleHRNb2R1bGVEYXRhID0gJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fS0+VGV4dE1vZHVsZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXsnQWdlbnRDaGVja2VkJ30gICAgPSAiY2hlY2tlZCIgaWYgKCAkVGV4dE1vZHVsZURhdGF7J0FnZW50J30gKTsKICAgICAgICAgICAgJFBhcmFteydDdXN0b21lckNoZWNrZWQnfSA9ICJjaGVja2VkIiBpZiAoICRUZXh0TW9kdWxlRGF0YXsnQ3VzdG9tZXInfSApOwogICAgICAgICAgICAkUGFyYW17J1B1YmxpY0NoZWNrZWQnfSAgID0gImNoZWNrZWQiIGlmICggJFRleHRNb2R1bGVEYXRheydQdWJsaWMnfSApOwoKICAgICAgICAgICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZEhhc2gsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFRleHRNb2R1bGVEYXRhe1ZhbGlkSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFNlbGVjdGVkUXVldWVEYXRhUmVmID0gJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fS0+VGV4dE1vZHVsZVF1ZXVlTGlua0dldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgQFNlbGVjdGVkUXVldWVJRHMgPSBAeyRTZWxlY3RlZFF1ZXVlRGF0YVJlZn07CiAgICAgICAgICAgICRQYXJhbXsnUXVldWVUZXh0TW9kdWxlU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTZWxlY3RlZFF1ZXVlRGF0YSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Fzc2lnbmVkUXVldWVJRHMnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gXEBTZWxlY3RlZFF1ZXVlSURzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU2VsZWN0ZWRUaWNrZXRUeXBlRGF0YVJlZiA9ICRTZWxmLT57VGV4dE1vZHVsZU9iamVjdH0tPlRleHRNb2R1bGVUaWNrZXRUeXBlTGlua0dldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICAgICAgICAgQFNlbGVjdGVkVGlja2V0VHlwZUlEcyA9IEB7JFNlbGVjdGVkVGlja2V0VHlwZURhdGFSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQFNlbGVjdGVkVGlja2V0VHlwZUlEcyA9IGtleXMoJVRpY2tldFR5cGVEYXRhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFteydUaWNrZXRUeXBlVGV4dE1vZHVsZVN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVGlja2V0VHlwZURhdGEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdBc3NpZ25lZFRpY2tldFR5cGVJRHMnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gXEBTZWxlY3RlZFRpY2tldFR5cGVJRHMsCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgID0+ICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJyksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUXVldWVJbmRleCA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFF1ZXVlSUQgKEBTZWxlY3RlZFF1ZXVlSURzKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U2VsUXVldWVzQXJyYXl9IC49ICdhcnJTZWxRdWV1ZXNbJyAuICRRdWV1ZUluZGV4IC4gJ10gPSAiJyAuICRRdWV1ZUlEIC4gJyI7JzsKICAgICAgICAgICAgICAgICRRdWV1ZUluZGV4Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBteSAlSlNjcmlwdENhbGwgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZXh0TW9kdWxlOjpMYW5ndWFnZVF1ZXVlTWF0Y2hpbmcnKSApIHsKICAgICAgICAgICAgJEpTY3JpcHRDYWxse09uQ2hhbmdlfSA9ICd1cGRhdGVRdWV1ZUxpc3QoKSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIExhbmd1YWdlIHN0cmluZwogICAgICAgICRQYXJhbXsnTGFuZ3VhZ2VFZGl0T3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTGFuZ3VhZ2VIYXNoLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdMYW5ndWFnZUVkaXQnLAogICAgICAgICAgICBIVE1MUXVvdGUgID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFRleHRNb2R1bGVEYXRhe0xhbmd1YWdlfSB8fAogICAgICAgICAgICAgICAgJEdldFBhcmFte0xhbmd1YWdlfSB8fAogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyTGFuZ3VhZ2V9IHx8CgogICAgICAgICAgICAgICAgIyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICVKU2NyaXB0Q2FsbAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGFkZAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FkZCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZG93bmxvYWQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb3dubG9hZCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdXBsb2FkCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBsb2FkJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBlZGl0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJVRleHRNb2R1bGVEYXRhLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFZGl0VGlja2V0VHlwZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICVUZXh0TW9kdWxlRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBFZGl0Tm90ZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXROb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluVGV4dE1vZHVsZXMnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CiAgICAgICAgbXkgJEVycm9yTWVzc2FnZSA9IDA7CgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgIG15ICVVcGRhdGVEYXRhID0gKCk7CiAgICAgICAgbXkgQFVwZGF0ZVBhcmFtcyA9CiAgICAgICAgICAgIHF3KElEIE5hbWUgS2V5d29yZHMgQ29tbWVudDEgQ29tbWVudDIgVmFsaWRJRCBUZXh0TW9kdWxlIExhbmd1YWdlRWRpdCBBZ2VudCBDdXN0b21lciBQdWJsaWMpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KE5hbWUgVmFsaWRJRCk7CgogICAgICAgIGZvciBteSAkS2V5IChAVXBkYXRlUGFyYW1zKSB7CiAgICAgICAgICAgICRVcGRhdGVEYXRheyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgfQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjcmVuYW1lIExhbmd1YWdlIHBhcmFtLi4uCiAgICAgICAgJFVwZGF0ZURhdGF7TGFuZ3VhZ2V9ID0gJFVwZGF0ZURhdGF7TGFuZ3VhZ2VFZGl0fTsKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgI2NoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMuLi4KICAgICAgICBmb3IgbXkgJEtleSAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgIGlmICggISRVcGRhdGVEYXRheyRLZXl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICJObyB2YWx1ZSBzZWxlY3RlZCBmb3IgJEtleSEiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjYXR0ZW1wdCB0aGUgdXBkYXRlLi4uCiAgICAgICAgaWYgKCAhJEVycm9yTWVzc2FnZSApIHsKCiAgICAgICAgICAgIGlmICggISRVcGRhdGVEYXRhe0lEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtJRH0gPSAkU2VsZi0+e1RleHRNb2R1bGVPYmplY3R9LT5UZXh0TW9kdWxlQWRkKAogICAgICAgICAgICAgICAgICAgICVVcGRhdGVEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVXBkYXRlUmVzdWx0ID0gJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fS0+VGV4dE1vZHVsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlVXBkYXRlRGF0YSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRVcGRhdGVEYXRhe0lEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cGRhdGUgdGlja2V0IHR5cGUgbGlua3MuLi4KCiAgICAgICAgICAgIGlmICggJFBhcmFte0lEfSApIHsKCiAgICAgICAgICAgICAgICAjZGVsZXRlIGV4aXN0aW5nIGxpbmtzLi4uCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RleHRNb2R1bGVPYmplY3R9LT5UZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtEZWxldGUoJVBhcmFtKTsKCiAgICAgICAgICAgICAgICAjIGFzc2lnbiBBTEwgdGlja2V0IHR5cGVzIGlmIFRpY2tldFR5cGUtZmVhdHVyZSBpcyBkaXNhYmxlZC4uLgogICAgICAgICAgICAgICAgaWYgKCAhQE5ld1RpY2tldFR5cGVJRHMgKSB7CiAgICAgICAgICAgICAgICAgICAgQE5ld1RpY2tldFR5cGVJRHMgPSBrZXlzKCVUaWNrZXRUeXBlRGF0YSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2NyZWF0ZSBuZXcgbGlua3MuLi4KICAgICAgICAgICAgICAgIGZvciBteSAkTmV3VGlja2V0VHlwZUlEIChATmV3VGlja2V0VHlwZUlEcykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGV4dE1vZHVsZU9iamVjdH0tPlRleHRNb2R1bGVUaWNrZXRUeXBlTGlua0NyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VHlwZUlEID0+ICROZXdUaWNrZXRUeXBlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHRNb2R1bGVJRCA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIHF1ZXVlIGxpbmtzLi4uCiAgICAgICAgICAgIGlmICggJFBhcmFte0lEfSAmJiBATmV3UXVldWVJRHMgKSB7CgogICAgICAgICAgICAgICAgI2RlbGV0ZSBleGlzdGluZyBsaW5rcy4uLgogICAgICAgICAgICAgICAgJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fS0+VGV4dE1vZHVsZVF1ZXVlTGlua0RlbGV0ZSglUGFyYW0pOwoKICAgICAgICAgICAgICAgICNjcmVhdGUgbmV3IGxpbmtzLi4uCiAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld1F1ZXVlSUQgKEBOZXdRdWV1ZUlEcykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGV4dE1vZHVsZU9iamVjdH0tPlRleHRNb2R1bGVRdWV1ZUxpbmtDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dE1vZHVsZUlEID0+ICRQYXJhbXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte0lEfSAmJiAhQE5ld1F1ZXVlSURzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZG1pblF1ZXVlVGV4dE1vZHVsZXMmU3ViYWN0aW9uPVRleHRNb2R1bGUmSUQ9JFBhcmFte0lEfSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjc29tZSBzb3J0IG9mIGVycm9yIGhhbmRsaW5nLi4uCiAgICAgICAgaWYgKCRFcnJvck1lc3NhZ2UpIHsKICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9ID0gJEVycm9yTWVzc2FnZTsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZWRpdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRWRpdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJUdldFBhcmFtLCAlUGFyYW0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZXh0TW9kdWxlcycsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CgogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZJRD0kUGFyYW17SUR9IgogICAgICAgICk7CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgJiYgKCAkR2V0UGFyYW17SUR9ICkgKSB7CgogICAgICAgIG15ICREZWxldGVSZXN1bHQgPSAkU2VsZi0+e1RleHRNb2R1bGVPYmplY3R9LT5UZXh0TW9kdWxlRGVsZXRlKAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17SUR9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCREZWxldGVSZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHVwbG9hZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBsb2FkJyApICYmICggJEdldFBhcmFte0Zvcm1JRH0gKSApIHsKCiAgICAgICAgI2luaXQgcmVzdWx0Li4uCiAgICAgICAgbXkgJVVwbG9hZFJlc3VsdCA9ICgpOwogICAgICAgICRQYXJhbXtDb3VudFVwbG9hZGVkfSAgICAgPSAwOwogICAgICAgICRQYXJhbXtDb3VudFVwZGF0ZUZhaWxlZH0gPSAwOwogICAgICAgICRQYXJhbXtDb3VudFVwZGF0ZWR9ICAgICAgPSAwOwogICAgICAgICRQYXJhbXtDb3VudEluc2VydEZhaWxlZH0gPSAwOwogICAgICAgICRQYXJhbXtDb3VudEFkZGVkfSAgICAgICAgPSAwOwoKICAgICAgICAjZ2V0IHVwbG9hZGVkIGRhdGEuLi4KICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gImZpbGVfdXBsb2FkIiwKICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICk7CgogICAgICAgIG15IEBGaWxlTGlzdCA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CgogICAgICAgICAgICBteSAkVXBsb2FkRmlsZU5hbWUgPSAkVXBsb2FkU3R1ZmZ7RmlsZW5hbWV9OwoKICAgICAgICAgICAgaWYgKCAoICRVcGxvYWRTdHVmZntDb250ZW50VHlwZX0gIX4gL3htbC8gKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVcGxvYWRNZXNzYWdlfSA9ICJXcm9uZyBjb250ZW50IHR5cGUgKCIKICAgICAgICAgICAgICAgICAgICAuICRVcGxvYWRTdHVmZntDb250ZW50VHlwZX0KICAgICAgICAgICAgICAgICAgICAuICIpISI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzdGFydCB0aGUgdXBkYXRlIHByb2Nlc3MuLi4KICAgICAgICAgICAgaWYgKCAhJFBhcmFte1VwbG9hZE1lc3NhZ2V9ICYmICRVcGxvYWRTdHVmZntDb250ZW50fSApIHsKICAgICAgICAgICAgICAgICVVcGxvYWRSZXN1bHQgPSAlewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGV4dE1vZHVsZU9iamVjdH0tPlRleHRNb2R1bGVzVXBkYXRlQnlYTUxTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmluZyA9PiAkVXBsb2FkU3R1ZmZ7Q29udGVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERvTm90QWRkICA9PiAkR2V0UGFyYW17WE1MVXBsb2FkRG9Ob3RBZGR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAoICRVcGxvYWRSZXN1bHR7WE1MUmVzdWx0U3RyaW5nfSApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERvd25sb2FkRmlsZU5hbWUgPSAkVXBsb2FkRmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVTdHJpbmcgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGltZVN0cmluZyAgICAgICA9fiBzL1xzL1xfL2c7CiAgICAgICAgICAgICAgICAgICAgJERvd25sb2FkRmlsZU5hbWUgPX4gcy9cLiguKikkL19JbXBvcnRSZXN1bHRfJFRpbWVTdHJpbmdcLiQxL2c7CgogICAgICAgICAgICAgICAgICAgIG15ICRGaWxlSUQgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICREb3dubG9hZEZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkVXBsb2FkUmVzdWx0e1hNTFJlc3VsdFN0cmluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3htbCcsCgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1hNTFJlc3VsdEZpbGVJRH0gICA9ICRGaWxlSUQ7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1hNTFJlc3VsdEZpbGVOYW1lfSA9ICREb3dubG9hZEZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtYTUxSZXN1bHRGaWxlU2l6ZX0gPSBsZW5ndGgoICRVcGxvYWRTdHVmZntDb250ZW50fSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJFVwbG9hZFJlc3VsdHtVcGxvYWRNZXNzYWdlfSApIHsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkUmVzdWx0e1VwbG9hZE1lc3NhZ2V9ID0gJFVwbG9hZFN0dWZme0ZpbGVuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VXBsb2FkTWVzc2FnZX0gPSAiSW1wb3J0IGZhaWxlZCAtIE5vIGZpbGUgdXBsb2FkZWQvcmVjZWl2ZWQiOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZG93bmxvYWQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb3dubG9hZCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgYWRkCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB1cGxvYWQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGxvYWQnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGxvYWRSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsgJUdldFBhcmFtLCAlUGFyYW0sICVVcGxvYWRSZXN1bHQgfSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZXh0TW9kdWxlcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBEb3dubG9hZFJlc3VsdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRSZXN1bHQnICkgJiYgKCAkR2V0UGFyYW17WE1MUmVzdWx0RmlsZUlEfSApICkgewoKICAgICAgICBteSBARGF0YSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEVudHJ5IChARGF0YSkgewogICAgICAgICAgICBpZiAoICRFbnRyeS0+e0ZpbGVJRH0gZXEgJEdldFBhcmFte1hNTFJlc3VsdEZpbGVJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRW50cnktPntGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJEVudHJ5LT57Q29udGVudFR5cGV9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRFbnRyeS0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRvd25sb2FkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWQnICkgewoKICAgICAgICBteSAkQ29udGVudCAgICA9ICRTZWxmLT57VGV4dE1vZHVsZU9iamVjdH0tPlRleHRNb2R1bGVHZXRMaXN0WE1MU3RyaW5nKCk7CiAgICAgICAgbXkgJFRpbWVTdHJpbmcgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgICAgICAkVGltZVN0cmluZyA9fiBzL1xzL1xfL2c7CiAgICAgICAgbXkgJEZpbGVOYW1lID0gIlRleHRNb2R1bGVzXyIgLiAkVGltZVN0cmluZyAuICIueG1sIjsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZU5hbWUsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi94bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgbXkgJFRleHRNb2R1bGVEYXRhUmVmID0gJFNlbGYtPntUZXh0TW9kdWxlT2JqZWN0fS0+VGV4dE1vZHVsZUdldExpc3QoCiAgICAgICAgVmFsaWRJRCAgPT4gJEdldFBhcmFte1ZhbGlkSUR9ICB8fCAnJywKICAgICAgICBMYW5ndWFnZSA9PiAkR2V0UGFyYW17TGFuZ3VhZ2V9IHx8ICcnLAogICAgICAgIE5hbWUgICAgID0+ICRHZXRQYXJhbXtOYW1lfSAgICAgfHwgJycsCiAgICAgICAgTGltaXQgICAgPT4gJEdldFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sIExpbWl0ID0+ICREZWZhdWx0TGltaXQgfSwKICAgICk7CgogICAgIyBvdXRwdXQgZG93bmxvYWQKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG93bmxvYWQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgb3V0cHV0IGFkZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBZGQnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICApOwoKICAgICMgb3V0cHV0IHVwbG9hZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdVcGxvYWQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgIGlmICggJFRleHRNb2R1bGVEYXRhUmVmICYmIHJlZigkVGV4dE1vZHVsZURhdGFSZWYpIGVxICdIQVNIJyApIHsKICAgICAgICAkUGFyYW17Q291bnR9ID0ga2V5cyggJXskVGV4dE1vZHVsZURhdGFSZWZ9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtMaW1pdH0gJiYgJFBhcmFte0NvdW50fSAmJiAkUGFyYW17Q291bnR9ID09ICRHZXRQYXJhbXtMaW1pdH0gKSB7CiAgICAgICAgJFBhcmFte0NvdW50Tm90ZX0gPSAnKGxpbWl0ZWQpJzsKICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17Q291bnR9ICkgewogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwoKICAgICAgICBmb3IgbXkgJEN1cnJIYXNoSUQgKAogICAgICAgICAgICBzb3J0IHsgJFRleHRNb2R1bGVEYXRhUmVmLT57JGF9LT57TmFtZX0gY21wICRUZXh0TW9kdWxlRGF0YVJlZi0+eyRifS0+e05hbWV9IH0KICAgICAgICAgICAga2V5cyAleyRUZXh0TW9kdWxlRGF0YVJlZn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEN1cnJIYXNoUmVmID0gJFRleHRNb2R1bGVEYXRhUmVmLT57JEN1cnJIYXNoSUR9OwoKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAkQ3Vyckhhc2hSZWYtPntDc3NDbGFzc30gPSAkQ3NzQ2xhc3M7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQ3Vyckhhc2hSZWYsCiAgICAgICAgICAgICk7CgogICAgICAgIH0KICAgIH0KCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluVGV4dE1vZHVsZXMnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKCn0KCjE7Cg==
IyAtLQojIEFkbWluUXVldWVUZXh0TW9kdWxlcy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluUXVldWVUZXh0TW9kdWxlcwojIGJhc2VkIHVwb24gQWRtaW5RdWV1ZVJlc3BvbnNlLmR0bCwgdiAxLjE1CiMgT3JpZ2luYWwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IGMuYS5wLmUuIElUIEdtYkggPGh0dHA6Ly93d3cuY2FwZS1pdC5kZT4KIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMKIyAtLQojICRJZDogQWRtaW5RdWV1ZVRleHRNb2R1bGVzLmR0bCx2IDEuMSAyMDA5LTA3LTIxIDE0OjQ2OjExIHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8IS0tIHN0YXJ0IGZvcm0gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGV4dCBtb2R1bGVzIDwtPiBRdWV1ZSBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIj4kVGV4dHsiVGV4dCBtb2R1bGUifTokVGV4dHsiUXVldWUifSAoMTpuKTwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSI+JFRleHR7IlRleHQgbW9kdWxlIn06JFRleHR7IlF1ZXVlIn0gKG46MSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICREYXRheyJUZXh0TW9kdWxlUXVldWVTdHJnIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICREYXRheyJRdWV1ZVRleHRNb2R1bGVTdHJnIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEFkbWluUXVldWVUZXh0TW9kdWxlc0NoYW5nZUZvcm0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pblF1ZXVlVGV4dE1vZHVsZXMKIyBiYXNlZCB1cG9uIEFkbWluUXVldWVSZXNwb25zZXNDaGFuZ2VGb3JtLmR0bCwgdiAxLjE1CiMgT3JpZ2luYWwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IGMuYS5wLmUuIElUIEdtYkggPGh0dHA6Ly93d3cuY2FwZS1pdC5kZT4KIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMKIyAtLQojICRJZDogQWRtaW5RdWV1ZVRleHRNb2R1bGVzQ2hhbmdlRm9ybS5kdGwsdiAxLjEgMjAwOS0wNy0yMiAxNTo0MToxMyB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBzdGFydCBmb3JtIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRleHQgbW9kdWxlcyA8LT4gUXVldWUgTWFuYWdlbWVudCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxici8+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDaGFuZ2UkRGF0YXsiVHlwZSJ9Ii8+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI3MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlIFRleHQgbW9kdWxlIHNldHRpbmdzIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICREYXRheyJPcHRpb25TdHJnMCJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iLz48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxici8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SUFDUENvbmZpZ0hlbHBUZXh0LnBtIC0gYWRtaW4gZnJvbnRlbmQgZm9yIElBQ1AgaGVscCB0ZXh0IGNvbmZpZ3VyYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIyAtLQojICRJZDogQWRtaW5UZXh0TW9kdWxlcy5kdGwsdiAxLjkgMjAxMC0wNi0xNSAxNDowNzo0OSB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGV4dCBNb2R1bGVzIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iTGlzdEhlbHBUZXh0cyIgLz4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IjIiPiRUZXh0eyJGaWx0ZXIgT3ZlcnZpZXcifTogPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiIHdpZHRoPSIzMCUiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJERhdGF7Ik5hbWUifSIgLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JFRleHR7Ikxhbmd1YWdlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJMYW5ndWFnZU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiVmFsaWRPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kVGV4dHsiTGltaXQgUmVzdWx0cyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTGltaXQiIHZhbHVlPSIkRGF0YXsiTGltaXQifSIgLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTaG93IiB2YWx1ZT0iJFRleHR7IlZpZXcifSIgLz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6QWRkIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD48cD48YnIvPjwvcD4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxmb3JtIG5hbWU9ImZvcm0iIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIgLz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJOZXciIC8+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIyIj4kVGV4dHsiQWRkIGEgbmV3IHRleHQgbW9kdWxlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5IiB3aWR0aD0iMzAlIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiREYXRheyJOYW1lIn0iIC8+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiTGFuZ3VhZ2VPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iIC8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDx0ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBZGQgLS0+Cgo8IS0tIGR0bDpibG9jazpEb3dubG9hZCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PHA+PGJyLz48L3A+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRG93bmxvYWQiIC8+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIyIj4kVGV4dHsiRG93bmxvYWQgYWxsIHRleHQgbW9kdWxlcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRvd25sb2FkIn0iIC8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIDx0ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpEb3dubG9hZCAtLT4KCjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PHA+PGJyLz48L3A+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8Zm9ybSBuYW1lPSJVcGxvYWRGb3JtIiBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiID4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IjIiPiRUZXh0eyJVcGxvYWQgdGV4dCBtb2R1bGVzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVXBsb2FkIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiREYXRheyJGb3JtSUQifSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjIwIiAvPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlVwbG9hZCJ9IiAvPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgPHRkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KCiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpVcGxvYWRSZXN1bHQgLS0+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3VsdCBvZiB0aGUgdXBsb2FkIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjQiPiRUZXh0eyIkRGF0YXsiVXBsb2FkTWVzc2FnZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPiRUZXh0eyJEb3dubG9hZCBjb21wbGV0ZSByZXN1bHQgb2YgeW91ciB1cGxvYWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZFJlc3VsdCZYTUxSZXN1bHRGaWxlSUQ9JFFEYXRheyJYTUxSZXN1bHRGaWxlSUQifSZGb3JtSUQ9JFFEYXRheyJGb3JtSUQifSIgdGl0bGU9IiRUZXh0eyJEb3dubG9hZCBjb21wbGV0ZSByZXN1bHQgb2YgeW91ciB1cGxvYWQifSIgPgogICAgICAgICAgICAgICRRRGF0YXsiWE1MUmVzdWx0RmlsZU5hbWUiLCI0MCJ9Jm5ic3A7PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kaXNrLXMucG5nIiBhbHQ9IiRRRGF0YXsiWE1MUmVzdWx0RmlsZU5hbWUifSI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgCiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiPjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdW1tYXJ5In06PC90ZD4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7ImVudHJpZXMgdXBsb2FkZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDb3VudFVwbG9hZGVkIn08L3RkPgogICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsidXBkYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNvdW50VXBkYXRlZCJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsidXBkYXRlIGZhaWxlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNvdW50VXBkYXRlRmFpbGVkIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7ImFkZGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ291bnRBZGRlZCJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiaW5zZXJ0IGZhaWxlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNvdW50SW5zZXJ0RmFpbGVkIn08L3RkPgogICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZFJlc3VsdCAtLT4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgICREYXRheyJNZXNzYWdlIn0KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In0gLSAKICAgICAgICAgICAgJFFEYXRheyJDb3VudCJ9ICRUZXh0eyJlbnRyaWVzIHNob3duIn0gJFRleHR7IiRRRGF0YXsiQ291bnROb3RlIn0ifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI1MCUiPiRUZXh0eyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAlIiB0aXRsZT0iJFRleHR7IkE6IGFnZW50IGZyb250ZW5kOyBDOiBjdXN0b21lciBmcm9udGVuZCwgUDogcHVibGljIGZyb250ZW5kIn0iPiRUZXh0eyJGcm9udGVuZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwJSI+JFRleHR7Ikxhbmd1YWdlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiVmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI1JSI+JFRleHR7IkRlbGV0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjUlIj4kVGV4dHsiRWRpdCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiTmFtZSIsIjMwIn08L3RkPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgdGl0bGU9IiRUZXh0eyJBOiBhZ2VudCBmcm9udGVuZDsgQzogY3VzdG9tZXIgZnJvbnRlbmQsIFA6IHB1YmxpYyBmcm9udGVuZCJ9Ij4kUURhdGF7IkZyb250ZW5kSW5mb1N0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7Ikxhbmd1YWdlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249ImNlbnRlciI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJklEPSRRRGF0YXsiSUQifSI+CiAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifW5vdHJlYWR5LnBuZyIgYWx0PSIkVGV4dHsiZGVsZXRlIn0iPgogICAgICAgICAgICAgICAgPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249ImNlbnRlciI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RWRpdCZJRD0kUURhdGF7IklEIn0iPgogICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1lZGl0LnBuZyIgYWx0PSIkVGV4dHsiZWRpdCJ9Ij4KICAgICAgICAgICAgICAgIDwvYT48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpFZGl0IC0tPgogICAgICA8Zm9ybSBuYW1lPSJmb3JtMSIgYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IiRRRGF0YXsiSUQifSIvPiAgICAgICAgCgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7Ik1lc3NhZ2UifSJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KCiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTAiLz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF2YWlsYWJsZSBpbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJBZ2VudCIgdmFsdWU9IjEiICRRRGF0YXsiQWdlbnRDaGVja2VkIn0+ICRUZXh0eyJBZ2VudCBGcm9udGVuZCJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IkN1c3RvbWVyIiB2YWx1ZT0iMSIgJFFEYXRheyJDdXN0b21lckNoZWNrZWQifT4gJFRleHR7IkN1c3RvbWVyIEZyb250ZW5kIn08YnIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iUHVibGljIiB2YWx1ZT0iMSIgJFFEYXRheyJQdWJsaWNDaGVja2VkIn0+ICRUZXh0eyJQdWJsaWMgRnJvbnRlbmQifTxici8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IktleXdvcmRzIiB2YWx1ZT0iJFFEYXRheyJLZXl3b3JkcyJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQgbW9kdWxlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KCQkJCQk8ZGl2IGNsYXNzPSJ5dWktc2tpbi1zYW0iPgogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgcm93cz0iMTAiIGNvbHM9IjYwIiBuYW1lPSJUZXh0TW9kdWxlIj4kUURhdGF7IlRleHRNb2R1bGUifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ikxhbmd1YWdlRWRpdE9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFzc2lnZW5kIFRvIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUXVldWUifTogPC90ZD4gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlF1ZXVlVGV4dE1vZHVsZVN0cmcifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkVkaXRUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaWNrZXQgVHlwZSJ9OiA8L3RkPiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0VHlwZVRleHRNb2R1bGVTdHJnIn08L3RkPgo8IS0tIGR0bDpibG9jazpFZGl0VGlja2V0VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPiAKICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4gICAgICAgICAgICAKICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIiBhbGlnbj0icmlnaHQiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ii8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6RWRpdCAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjwhLS0gZHRsOmJsb2NrOkVkaXROb3RlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik5vdGUifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8cD4KICAgICAgICAkVGV4dHsiQSB0ZXh0IG1vZHVsZSBpcyBkZWZhdWx0IHRleHQgdG8gd3JpdGUgZmFzdGVyIGFuc3dlciAod2l0aCBkZWZhdWx0IHRleHQpIHRvIGN1c3RvbWVycy4ifQogICAgICA8L3A+CiAgICAgIDxwPgogICAgICAgICRUZXh0eyJBdHRlbnRpb24ifTogPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZG1pblF1ZXVlVGV4dE1vZHVsZXMiPiRUZXh0eyJEb24ndCBmb3JnZXQgdG8gYWRkIGEgbmV3IHRleHQgbW9kdWxlIGEgcXVldWUhIn08L2E+CiAgICAgIDwvcD4KICAgICAgPGhyPgogICAgICA8cD4KICAgICAgICAkVGV4dHsiVXNlYWJsZSBvcHRpb25zIn06CiAgICAgICAgPHRhYmxlPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZsdDtPVFJTX09XTkVSXyomZ3Q7PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyJUaWNrZXQgb3duZXIgb3B0aW9ucyAoZS4gZy4gPE9UUlNfT1dORVJfVXNlckZpcnN0bmFtZT4pLiJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jmx0O09UUlNfUkVTUE9OU0lCTEVfKiZndDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpY2tldCByZXNwb25zaWJsZSBvcHRpb25zIChlLiBnLiA8T1RSU19SRVNQT05TSUJMRV9Vc2VyRmlyc3RuYW1lPikuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbHQ7T1RSU19DVVJSRU5UXyomZ3Q7PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyJPcHRpb25zIG9mIHRoZSBjdXJyZW50IHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIGFjdGlvbiAoZS4gZy4gPE9UUlNfQ1VSUkVOVF9Vc2VyRmlyc3RuYW1lPikuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbHQ7T1RSU19USUNLRVRfKiZndDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7Ik9wdGlvbnMgb2YgdGhlIHRpY2tldCBkYXRhIChlLiBnLiA8T1RSU19USUNLRVRfVGlja2V0TnVtYmVyPiwgPE9UUlNfVElDS0VUX1RpY2tldElEPiwgPE9UUlNfVElDS0VUX1F1ZXVlPiwgPE9UUlNfVElDS0VUX1N0YXRlPikuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbHQ7T1RSU19DVVNUT01FUl9EQVRBXyomZ3Q7PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyJPcHRpb25zIG9mIHRoZSBjdXJyZW50IGN1c3RvbWVyIHVzZXIgZGF0YSAoZS4gZy4gPE9UUlNfQ1VTVE9NRVJfREFUQV9Vc2VyRmlyc3RuYW1lPikuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbHQ7T1RSU19DT05GSUdfKiZndDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IkNvbmZpZyBvcHRpb25zIChlLiBnLiA8T1RSU19DT05GSUdfSHR0cFR5cGU+KS4ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvcD4KICAgICAgPGhyPgogICAgICA8cD4KICAgICAgICAkVGV4dHsiRXhhbXBsZSJ9OgogICAgICAgIDxmb3JtIGFjdGlvbj0iLyI+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0IG1vZHVsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjUiIGNvbHM9IjcwIiBuYW1lPSJUZXh0IG1vZHVsZSIgcmVhZG9ubHkgPgokVGV4dHsiVGhlIGN1cnJlbnQgdGlja2V0IHN0YXRlIGlzIn06ICImbHQ7T1RSU19USUNLRVRfU3RhdGUmZ3Q7IgokVGV4dHsiRGVhciBjdXN0b21lciwgeW91ciBlbWFpbCBhZGRyZXNzIGlzIn06ICImbHQ7T1RSU19DVVNUT01FUl9Vc2VyRW1haWwmZ3Q7IgokVGV4dHsiVGhlIGN1cnJlbnQgdGlja2V0IG93bmVyIGlzIn06ICImbHQ7T1RSU19PV05FUl9OYW1lJmd0OyIKICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxocj4KICAgICAgPC9wPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpFZGl0Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCjwhLS0gZHRsOmJsb2NrOlF1ZXVlTGlzdCAtLT4KICAgICREYXRheyJBbGxRdWV1ZXNBcnJheSJ9CjwhLS0gZHRsOmJsb2NrOlF1ZXVlTGlzdCAtLT4KICAgICREYXRheyJTZWxRdWV1ZXNBcnJheSJ9CgogICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgdXBkYXRlUXVldWVMaXN0LCBmYWxzZSk7CiAgICBlbHNlIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpCiAgICAgICAgd2luZG93LmF0dGFjaEV2ZW50KCJvbmxvYWQiLCB1cGRhdGVRdWV1ZUxpc3QpOwogICAgZWxzZSB3aW5kb3cub25sb2FkID0gdXBkYXRlUXVldWVMaXN0OwoKICAgIGZ1bmN0aW9uIGRlbGV0ZUhlbHB0ZXh0KCkgewogICAgICAgIGRvY3VtZW50LmZvcm0xLlN1YmFjdGlvbi52YWx1ZT0nRGVsZXRlJzsgCiAgICAgICAgZG9jdW1lbnQuZm9ybTEuc3VibWl0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlzdEhlbHB0ZXh0KCkgewogICAgICAgIGRvY3VtZW50LmZvcm0xLlN1YmFjdGlvbi52YWx1ZT0nTGlzdEhlbHBUZXh0cyc7IAogICAgICAgIGRvY3VtZW50LmZvcm0xLnN1Ym1pdCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVF1ZXVlTGlzdCgpIHsKICAgICAgICB2YXIgc2VsZWN0ZWRMYW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIkxhbmd1YWdlRWRpdCIpWzBdLnZhbHVlOwogICAgICAgIHZhciBxdWV1ZVNlbGVjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJBc3NpZ25lZFF1ZXVlSURzIilbMF07CgogICAgICAgIHdoaWxlIChxdWV1ZVNlbGVjdGlvbi5vcHRpb25zLmxlbmd0aCA+IDApIHsgCiAgICAgICAgICAgIHF1ZXVlU2VsZWN0aW9uLm9wdGlvbnNbcXVldWVTZWxlY3Rpb24ub3B0aW9ucy5sZW5ndGggLSAxXSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBqPTA7IGogPCBhcnJRdWV1ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIGN1cnJRdWV1ZSA9IGFyclF1ZXVlc1tqXS5zcGxpdCgiOjo6OjoiKTsKICAgICAgICAgICAgdmFyIG1hdGNoUmVnRXhwID0gbmV3IFJlZ0V4cCggIi4qJCIgKTsKICAgICAgICAgICAgdmFyIGxhbmdNYXRjaGVkID0gbWF0Y2hSZWdFeHAudGVzdCggY3VyclF1ZXVlWzFdICk7CgogICAgICAgICAgICBpZiAoIHNlbGVjdGVkTGFuZyAmJiAkQ29uZmlneyJUZXh0TW9kdWxlOjpMYW5ndWFnZVF1ZXVlTWF0Y2hpbmcifSApIHsKICAgICAgICAgICAgICAgIG1hdGNoUmVnRXhwID0gbmV3IFJlZ0V4cCggIi4qOjoiICsgc2VsZWN0ZWRMYW5nICsgIjo6LiokIiApOwogICAgICAgICAgICAgICAgbGFuZ01hdGNoZWQgPSBtYXRjaFJlZ0V4cC50ZXN0KCBjdXJyUXVldWVbMV0gKTsKCiAgICAgICAgICAgICAgICBpZiggIWxhbmdNYXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hSZWdFeHAgPSBuZXcgUmVnRXhwKCAiLio6OiIgKyBzZWxlY3RlZExhbmcgKyAiJCIpOwogICAgICAgICAgICAgICAgICAgIGxhbmdNYXRjaGVkID0gbWF0Y2hSZWdFeHAudGVzdCggY3VyclF1ZXVlWzFdICk7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiggY3VyclF1ZXVlWzBdICYmIGN1cnJRdWV1ZVsxXSAmJiBsYW5nTWF0Y2hlZCApIHsKICAgICAgICAgICAgICAgIHZhciBpc1NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IodmFyIGs9MDsgazxhcnJTZWxRdWV1ZXMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiggYXJyU2VsUXVldWVzW2tdID09IGN1cnJRdWV1ZVswXSApIGlzU2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5ld09wdGlvbiA9IG5ldyBPcHRpb24oY3VyclF1ZXVlWzFdLCBjdXJyUXVldWVbMF0sIGZhbHNlLCBpc1NlbGVjdGVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBxdWV1ZVNlbGVjdGlvbi5vcHRpb25zW3F1ZXVlU2VsZWN0aW9uLm9wdGlvbnMubGVuZ3RoXSA9IG5ld09wdGlvbjsKICAgICAgICB9IAogICAgICAgIHNvcnRPcHRpb25zKCBxdWV1ZVNlbGVjdGlvbiApOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBjb21wYXJlT3B0aW9uVGV4dChhLGIpIHsKICAgICAgICByZXR1cm4gYS50ZXh0IT1iLnRleHQgPyBhLnRleHQ8Yi50ZXh0ID8gLTEgOiAxIDogMDsKICAgICAgICAvLyByZXR1cm4gYS50ZXh0IC0gYi50ZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNvcnRPcHRpb25zKGxpc3QpIHsKICAgICAgICB2YXIgaXRlbXMgPSBsaXN0Lm9wdGlvbnMubGVuZ3RoOwogICAgICAgIHZhciB0bXBBcnJheSA9IG5ldyBBcnJheShpdGVtcyk7CiAgICAgICAgZm9yICggaT0wOyBpPGl0ZW1zOyBpKysgKSB7CiAgICAgICAgICAgIHRtcEFycmF5W2ldID0gbmV3IE9wdGlvbihsaXN0Lm9wdGlvbnNbaV0udGV4dCxsaXN0Lm9wdGlvbnNbaV0udmFsdWUsIGZhbHNlLCBsaXN0Lm9wdGlvbnNbaV0uc2VsZWN0ZWQpOwogICAgICAgIH0KICAgICAgICB0bXBBcnJheS5zb3J0KGNvbXBhcmVPcHRpb25UZXh0KTsKICAgICAgICBmb3IgKCBpPTA7IGk8aXRlbXM7IGkrKyApIHsKICAgICAgICAgICAgbGlzdC5vcHRpb25zW2ldID0gbmV3IE9wdGlvbih0bXBBcnJheVtpXS50ZXh0LHRtcEFycmF5W2ldLnZhbHVlLCBmYWxzZSwgdG1wQXJyYXlbaV0uc2VsZWN0ZWQpOwogICAgICAgIH0KICAgIH0KLy8tLT4KPC9zY3JpcHQ+Cg==
IyAtLQojIFRleHRNb2R1bGVzU2VsZWN0aW9uLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGV4dCBtb2R1bGVzIHNlbGVjdGlvbgojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgICBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQuZGUKIyAgIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IFRleHRNb2R1bGVzU2VsZWN0aW9uLmR0bCx2IDEuMTMgMjAxMC0wNi0xNCAxMDozMjozNiBtYWJhIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIHN0YXJ0IGZvcm0gLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KICBzdG9yZV90ZXh0bW9kdWxlPW5ldyBBcnJheSgpOwogIHN0b3JlX3RleHRtb2R1bGVbMF09Jyc7CgogIGZ1bmN0aW9uIHVwZGF0ZVRleHRtb2R1bGUoaW5kZXgpIHsKICAgIC8vIHNhdmUgbGFzdCBCb2R5CiAgICBzdG9yZV90ZXh0bW9kdWxlLnB1c2goZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlKTsKICAgIHZhciBUZXh0RmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbmRleCsiX1RleHQiKTsKCiAgICAvLyBhZGQgdGV4dCBtb2R1bGUgdG8gV1lTSVdZRyBlZGl0b3IgaW4gb3BlbmVyIHdpbmRvdwogICAgaWYgKCB3aW5kb3cuRkNLZWRpdG9yQVBJICYmIHdpbmRvdy5GQ0tlZGl0b3JBUEkuR2V0SW5zdGFuY2UoJ1JpY2hUZXh0JykgKSB7CiAgICAgIHdpbmRvdy5GQ0tlZGl0b3JBUEkuR2V0SW5zdGFuY2UoJ1JpY2hUZXh0JykuSW5zZXJ0SHRtbChUZXh0RmllbGQudmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gY3JlYXRlIHNob3J0IGFsaWFzCiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jb21wb3NlLkJvZHk7CgogICAgLy8gZm9jdXMgb3JpZyBpbnB1dCBmaWVsZAogICAgaW5wdXQuZm9jdXMoKTsKCiAgICAvLyBJRQogICAgaWYgKHR5cGVvZiBkb2N1bWVudC5zZWxlY3Rpb24gIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgIHZhciBpbnNUZXh0ID0gcmFuZ2UudGV4dDsKICAgICAgcmFuZ2UudGV4dCA9IFRleHRGaWVsZC52YWx1ZSArIGluc1RleHQ7CiAgICAgIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZS5sZW5ndGggKyBpbnNUZXh0Lmxlbmd0aCk7CiAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfQogICAgLy8gZ2Vja28KICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dC5zZWxlY3Rpb25TdGFydCAhPSAndW5kZWZpbmVkJykgewogICAgICB2YXIgU3RhcnQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydDsKICAgICAgdmFyIEVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDsKICAgICAgLy8gc2V0IGZvY3VzIHRvIHN0YXJ0LCBpZiBjdXJzZXIgaXQgbm90IGRlZGljYXRlZCBzZXQgdG8gdGhlIGVuZCAob25seSBkb25lIGF1dG9tYXRpY2FseSBpZiBtb3JlIHRoZW4gNDAwIGNoYXJzIGF2YWlsKQogICAgICBpZiAoaW5wdXQudmFsdWUubGVuZ3RoID4gNDAwICYmIEVuZCA9PSBpbnB1dC52YWx1ZS5sZW5ndGggJiYgU3RhcnQgPT0gaW5wdXQudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgU3RhcnQgPSAwOwogICAgICAgIEVuZCA9IDA7CiAgICAgIH0KCiAgICAgIHZhciBpbnNUZXh0ID0gaW5wdXQudmFsdWUuc3Vic3RyaW5nKFN0YXJ0LCBFbmQpOwogICAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnN1YnN0cigwLCBTdGFydCkgKyBUZXh0RmllbGQudmFsdWUgKyBpbnNUZXh0ICsgaW5wdXQudmFsdWUuc3Vic3RyKEVuZCk7CiAgICAgIHZhciBwb3M7CgogICAgICBpZiAoaW5zVGV4dC5sZW5ndGggPT0gMCkgcG9zID0gU3RhcnQgKyBUZXh0RmllbGQudmFsdWUubGVuZ3RoOwogICAgICBlbHNlIHBvcyA9IFN0YXJ0ICsgVGV4dEZpZWxkLnZhbHVlLmxlbmd0aCArIGluc1RleHQubGVuZ3RoOwoKICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBwb3M7CiAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IHBvczsKICAgIH0KICAgIC8vIG90aGVyLCBpbnNlcnQgb24gdG9wCiAgICBlbHNlIGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9IFRleHRGaWVsZC52YWx1ZSArIGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICB9CgogIGZ1bmN0aW9uIHNob3dUZXh0bW9kdWxlKGluZGV4KSB7CiAgICB2YXIgVGV4dEZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5kZXgrIl9UZXh0Iik7CiAgICAvKmRvY3VtZW50LmNvbXBvc2UuVGV4dE1vZHVsZUNvbnRlbnQudmFsdWUgPSBUZXh0RmllbGQudmFsdWU7Ki8KICAgIAogICAgaWYoIFRleHRGaWVsZC52YWx1ZS5sZW5ndGggPiAyNTApIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1RleHRNb2R1bGVDb250ZW50VEQnKS5pbm5lckhUTUwgPSBUZXh0RmllbGQudmFsdWUuc3Vic3RyKDAsMjUwKSArICJbLi4uXSI7CiAgICB9CiAgICBlbHNlIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdUZXh0TW9kdWxlQ29udGVudFREJykuaW5uZXJIVE1MID0gVGV4dEZpZWxkLnZhbHVlOwogIH0KCiAgZnVuY3Rpb24gdW5kb1RleHRtb2R1bGUodGFnKSB7CiAgICBzdG9yZV90ZXh0bW9kdWxlX2xlbmd0aCA9IHN0b3JlX3RleHRtb2R1bGUubGVuZ3RoOwogICAgLy8gcmVzdG9yZSBsYXN0IGNvbnRlbnQKICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9IHN0b3JlX3RleHRtb2R1bGVbc3RvcmVfdGV4dG1vZHVsZV9sZW5ndGgtMV07CiAgICAvLyBrZWVwIGF0IGxlYXN0IHRoZSBlbXB0eSBjb250ZW50IHZhbHVlCiAgICBpZiAoIHN0b3JlX3RleHRtb2R1bGVfbGVuZ3RoID4gMSkgc3RvcmVfdGV4dG1vZHVsZS5wb3AoKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUJsb2NrKEVsZW1lbnROYW1lKSB7CiAgICBpZiggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWxlbWVudE5hbWUgKyAnT3BlbicpLnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVsZW1lbnROYW1lICsgJ09wZW4nKS5zdHlsZS5kaXNwbGF5ICA9ICJibG9jayI7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVsZW1lbnROYW1lICsgJ0Nsb3NlJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWxlbWVudE5hbWUpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgfQogICAgZWxzZSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVsZW1lbnROYW1lICsgJ09wZW4nKS5zdHlsZS5kaXNwbGF5ICA9ICJub25lIjsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWxlbWVudE5hbWUgKyAnQ2xvc2UnKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWxlbWVudE5hbWUpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICB9CiAgfQogICAgCi8vLS0+Cjwvc2NyaXB0PgoKPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jazsiIGlkPSJUZXh0TW9kdWxlc0Jsb2NrQ2xvc2UiPgogIDx0YWJsZSBjbGFzcz0idGFiUGFnZUNvbnRhaW5lckNvbXBvc2UiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMjIwcHgiID4KICAgIDx0ciBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSJ0b2dnbGVCbG9jaygnVGV4dE1vZHVsZXNCbG9jaycpIiB0aXRsZT0iJFRleHR7IkV4cGFuZCJ9Ij4KICAgICAgPHRkPgogICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifVRNZXhwYW5kRG93bi5wbmciIGFsdD0iJFRleHR7IkV4cGFuZCJ9Ii8+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQ2Ij4KICAgICAgICAkVGV4dHsiVGV4dCBtb2R1bGVzIHNlbGVjdGlvbiJ9CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwvZGl2Pgo8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBpZD0iVGV4dE1vZHVsZXNCbG9ja09wZW4iPgogIDx0YWJsZSBjbGFzcz0idGFiUGFnZUNvbnRhaW5lckNvbXBvc2UiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMjIwcHgiID4KICAgIDx0ciBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSJ0b2dnbGVCbG9jaygnVGV4dE1vZHVsZXNCbG9jaycpIiB0aXRsZT0iJFRleHR7IkNvbGxhcHNlIn0iPgogICAgICA8dGQ+CiAgICAgICAgPGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9VE1leHBhbmRVcC5wbmciIGFsdD0iJFRleHR7IkNvbGxhcHNlIn0iLz4KICAgICAgPC90ZD4KICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZDYiPgogICAgICAgICRUZXh0eyJUZXh0IG1vZHVsZXMgc2VsZWN0aW9uIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBpZD0iVGV4dE1vZHVsZXNCbG9jayI+CjwhLS0gZHRsOmJsb2NrOlRleHRNb2R1bGVDb250ZW50IC0tPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IiREYXRheyJJRCJ9X1RleHQiIHZhbHVlPSIkUURhdGF7IlRleHQifSIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IiREYXRheyJJRCJ9X0tleXdvcmRzIiB2YWx1ZT0iJFFEYXRheyJLZXl3b3JkcyJ9Ii8+CjwhLS0gZHRsOmJsb2NrOlRleHRNb2R1bGVDb250ZW50IC0tPgogICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAkRGF0YXsiVGV4dE1vZHVsZVNlbGVjdGlvbiJ9CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dXBkYXRlVGV4dG1vZHVsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnVGV4dE1vZHVsZXMnKVtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnVGV4dE1vZHVsZXMnKS5zZWxlY3RlZEluZGV4XS52YWx1ZSk7IiBzdHlsZT0ibGluZS1oZWlnaHQ6MmVtIj4KICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yZWFkeS5wbmciIGFsdD0iJFRleHR7IlBhc3RlIn0iPiRUZXh0eyJQYXN0ZSJ9CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp1bmRvVGV4dG1vZHVsZShkb2N1bWVudC5jb21wb3NlLkJvZHkpOyI+CiMgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifW5vdHJlYWR5LXN3LnBuZyIgYWx0PSIkVGV4dHsiVW5kbyJ9Ij4kVGV4dHsiVW5kbyJ9CiMgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkNCIgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAkVGV4dHsiUHJldmlldyJ9OgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRleHRNb2R1bGVDb250ZW50VEQiPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwvZGl2Pgo8IS0tIGVuZCBmb3JtIC0tPg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGV4dE1vZHVsZS5wbSAtIGxpYiBmb3IgdGV4dCBtb2R1bGVzCiMgYmFzZWQgdXBvbiBTdGRSZXNwb25zZS5wbSwgdiAxLjIzLjIuMQojCiMgU29tZSBtZXRob2RzIGNvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMgICBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQuZGUKIwojIC0tCiMgJElkOiBUZXh0TW9kdWxlLnBtLHYgMS4yMSAyMDEwLTA3LTA5IDEwOjExOjU1IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUZXh0TW9kdWxlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlF1ZXVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlR5cGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIxICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6VGV4dE1vZHVsZSAtIFRleHRNb2R1bGUgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBUZXh0TW9kdWxlIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgICMuLi51c2UgYW5kIGluc3RhbnRpYXRlIGxvdHMgb2Ygb2JqZWN0cy4uLgoKICAgIG15ICRUaWNrZXRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgICA9PiAkVXNlck9iamVjdCwKICAgICAgICBDdXN0b21lclVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IE1haW5PYmplY3QpKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwogICAgfQogICAgaWYgKCAhJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgIH0KICAgIGlmICggISRTZWxmLT57VXNlck9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CgogICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRTZWxmLT57TWFpbk9iamVjdH0sCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkU2VsZi0+e0VuY29kZU9iamVjdH0sCiAgICAgICAgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtVc2VyTGFuZ3VhZ2V9IHx8ICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJywKICAgICk7CiAgICAkU2VsZi0+e1F1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57WE1MT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZXh0ZW5zaW9uIG1vZHVsZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RleHRNb2R1bGU6OkN1c3RvbU1vZHVsZXMnKSApIHsKICAgICAgICBteSBAQ3VzdG9tTW9kdWxlcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZXh0TW9kdWxlOjpDdXN0b21Nb2R1bGVzJykgfTsKICAgICAgICBmb3IgbXkgJEN1c3RNb2QgKEBDdXN0b21Nb2R1bGVzKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEN1c3RNb2QpICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBUZXh0TW9kdWxlIGN1c3RvbSBtb2R1bGUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRDdXN0TW9kIC4gIiAoJEApISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdW5zaGlmdCggQElTQSwgJEN1c3RNb2QgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRleHRNb2R1bGVBZGQoKQoKQWRkcyBhbiBleGlzdGluZyBUZXh0TW9kdWxlCgogICAgbXkgJEhhc2hSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUFkZCgKICAgICAgICBOYW1lICAgICAgID0+ICdzb21lIHNob3J0IG5hbWUnLCAgI3JlcXVpcmVkCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICNyZXF1aXJlZAogICAgICAgIFRleHRNb2R1bGUgPT4gJ3NvbWUgYmxhYmxhLi4uJywgICAjcmVxdWlyZWQKICAgICAgICBVc2VySUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgI3JlcXVpcmVkCiAgICAgICAgTGFuZ3VhZ2UgICA9PiAnZGUnLCAgICAgICAgICAgICAgICNvcHRpb25hbAogICAgICAgIEtleXdvcmRzICAgPT4gJ2tleTEsIGtleTIsIGtleTMnLCAjb3B0aW9uYWwgCiAgICAgICAgQ29tbWVudDEgICA9PiAnJywgICAgICAgICAgICAgICAgICNvcHRpb25hbAogICAgICAgIENvbW1lbnQyICAgPT4gJycsICAgICAgICAgICAgICAgICAjb3B0aW9uYWwKICAgICAgICBBZ2VudCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgI29wdGlvbmFsLCBzZXQgYXV0b20uIGlmIG5laXRoZXIgQ3VzdG9tZXIgbm9yIFB1YmxpYyBpcyBzZXQKICAgICAgICBDdXN0b21lciAgID0+IDEsICAgICAgICAgICAgICAgICAgI29wdGlvbmFsCiAgICAgICAgUHVibGljICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICNvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGZvciAocXcoTmFtZSBWYWxpZElEIFRleHRNb2R1bGUgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmYXVsdCBsYW5ndWFnZS4uLgogICAgaWYgKCAhJFBhcmFte0xhbmd1YWdlfSApIHsKICAgICAgICAkUGFyYW17TGFuZ3VhZ2V9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CiAgICB9CgogICAgIyBzZXQgZnJvbnRlbmQgZGlzcGxheSBmbGFncy4uLgogICAgZm9yIG15ICRDdXJyS2V5IChxdyhBZ2VudCBDdXN0b21lciBQdWJsaWMgKSkgewogICAgICAgIGlmICggJFBhcmFteyRDdXJyS2V5fSApIHsKICAgICAgICAgICAgJFBhcmFteyRDdXJyS2V5fSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17JEN1cnJLZXl9ID0gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17J0FnZW50J30gJiYgISRQYXJhbXsnQ3VzdG9tZXInfSAmJiAhJFBhcmFteydQdWJsaWMnfSApIHsKICAgICAgICAkUGFyYW17J0FnZW50J30gPSAxOwogICAgfQoKICAgICMgYnVpbGQgc3FsLi4uCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIHRleHRfbW9kdWxlICIKICAgICAgICAuICIobmFtZSwgdmFsaWRfaWQsIGtleXdvcmRzLCBjb21tZW50MSwgY29tbWVudDIsIHRleHQsIGxhbmd1YWdlLCAiCiAgICAgICAgLiAiYWdlbnQsIGN1c3RvbWVyLCBwdWJsaWMsICIKICAgICAgICAuICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAiCiAgICAgICAgLiAiVkFMVUVTICIKICAgICAgICAuICIoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywiCiAgICAgICAgLiAiIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPykgIjsKCiAgICAjIGRvIHRoZSBkYiBpbnNlcnQuLi4KICAgIG15ICREQkluc2VydCA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17S2V5d29yZHN9LCBcJFBhcmFte0NvbW1lbnQxfSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50Mn0sIFwkUGFyYW17VGV4dE1vZHVsZX0sIFwkUGFyYW17TGFuZ3VhZ2V9LAogICAgICAgICAgICBcJFBhcmFte0FnZW50fSwgICAgXCRQYXJhbXtDdXN0b21lcn0sICAgXCRQYXJhbXtQdWJsaWN9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICAgXCRQYXJhbXtVc2VySUR9CiAgICAgICAgXSwKICAgICk7CgogICAgI2hhbmRsZSB0aGUgaW5zZXJ0IHJlc3VsdC4uLgogICAgaWYgKCREQkluc2VydCkgewogICAgICAgIG15ICRJZCA9IDA7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIG1heChpZCkgRlJPTSB0ZXh0X21vZHVsZSAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBuYW1lID0gJyRQYXJhbXtOYW1lfScgIgogICAgICAgICAgICAgICAgLiAiQU5EIGxhbmd1YWdlID0gJyRQYXJhbXtMYW5ndWFnZX0nICIKICAgICAgICAgICAgICAgIC4gIkFORCBjcmVhdGVfYnkgPSAkUGFyYW17VXNlcklEfSAiCiAgICAgICAgICAgICAgICAuICJBTkQgdGV4dCA9ICckUGFyYW17VGV4dE1vZHVsZX0nICIsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkSWQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRJZDsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlc3RNb2R1bGVzOjpEQiBpbnNlcnQgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CgogICAgfQoKfQoKPWl0ZW0gVGV4dE1vZHVsZUdldCgpCgpSZXR1cm5zIGFuIGV4aXN0aW5nIFRleHRNb2R1bGUuCgogICAgbXkgJURhdGEgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUdldCgKICAgICAgICBJRCA9PiAxMjMsICAjcmVxdWlyZWQKICAgICk7Cgo9Y3V0CgpzdWIgVGV4dE1vZHVsZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIElEISIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkYiBxdW90ZQogICAgZm9yIChxdyhJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIHNxbAogICAgbXkgJFNRTAogICAgICAgID0gIlNFTEVDVCBuYW1lLCB2YWxpZF9pZCwga2V5d29yZHMsIGNvbW1lbnQxLCBjb21tZW50MiwgdGV4dCwgIgogICAgICAgIC4gIiBsYW5ndWFnZSwgYWdlbnQsIGN1c3RvbWVyLCBwdWJsaWMgIgogICAgICAgIC4gIiBGUk9NICIKICAgICAgICAuICIgIHRleHRfbW9kdWxlICIKICAgICAgICAuICIgV0hFUkUgIgogICAgICAgIC4gIiAgaWQgPSAkUGFyYW17SUR9IjsKCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgSUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREYXRhWzBdLAogICAgICAgICAgICBWYWxpZElEICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBLZXl3b3JkcyAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBDb21tZW50MSAgID0+ICREYXRhWzNdLAogICAgICAgICAgICBDb21tZW50MiAgID0+ICREYXRhWzRdLAogICAgICAgICAgICBUZXh0TW9kdWxlID0+ICREYXRhWzVdLAogICAgICAgICAgICBMYW5ndWFnZSAgID0+ICREYXRhWzZdLAogICAgICAgICAgICBBZ2VudCAgICAgID0+ICREYXRhWzddLAogICAgICAgICAgICBDdXN0b21lciAgID0+ICREYXRhWzhdLAogICAgICAgICAgICBQdWJsaWMgICAgID0+ICREYXRhWzldLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICVEYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBUZXh0TW9kdWxlRGVsZXRlKCkKCkRlbGV0ZXMgYSBUZXh0TW9kdWxlLgoKICAgIG15ICRIYXNoUmVmID0gJFRleHRNb2R1bGVPYmplY3QtPlRleHRNb2R1bGVEZWxldGUoCiAgICAgICAgSUQgICAgICA9PiAxMjM0LCAgI3JlcXVpcmVkCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIHF1ZXVlPC0+dGV4dCBtb2R1bGUgcmVsYXRpb24KICAgICRTZWxmLT5UZXh0TW9kdWxlUXVldWVMaW5rRGVsZXRlKCVQYXJhbSk7CgogICAgIyBkZWxldGUgdGV4dCBtb2R1bGUuLi4KICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gdGV4dF9tb2R1bGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7Cgp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJFR0lOIFFVRVVFLVJFTEFURUQgRlVOQ1RJT05TCgo9aXRlbSBUZXh0TW9kdWxlUXVldWVMaW5rR2V0KCkKClJldHVybnMgYWxsIGxpbmtlZCBxdWV1ZXMgZm9yIGEgVGV4dE1vZHVsZS4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5UZXh0TW9kdWxlUXVldWVMaW5rR2V0KAogICAgICAgIElEICAgICAgPT4gMTIzNCwgICNyZXF1aXJlZAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlUXVldWVMaW5rR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSBAUmVzdWx0ID0gcXd7fTsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyhJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRiIHF1b3RlLi4uCiAgICBmb3IgKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApIHx8ICcnOwogICAgfQoKICAgIG15ICRTUUwgPSAiU0VMRUNUIHF1ZXVlX2lkIEZST00gcXVldWVfdGV4dF9tb2R1bGUgIgogICAgICAgIC4gIldIRVJFIHRleHRfbW9kdWxlX2lkID0gJFBhcmFte0lEfSI7CgogICAgaWYgKCAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICkgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2goIEBSZXN1bHQsICREYXRhWzBdICk7CiAgICB9CgogICAgcmV0dXJuIFxAUmVzdWx0OwoKfQoKPWl0ZW0gVGV4dE1vZHVsZUdldEJ5UXVldWVJRCgpCgpSZXR1cm5zIGFsbCBsaW5rZWQgdGV4dCBtb2R1bGVzIGZvciBhIGdpdmVuIHF1ZXVlLgogICAgUmVzdWx0ID0+ICdIQVNIJzogcmV0dXJucyBhbGwgZGF0YSBpbiBIQVNILVJlZiwgCiAgICBSZXN1bHQgPT4gIHVuZGVmOiByZXR1cm5zIFRleHRtb2R1bGUtSURzIGluIEFSUkFZLVJlZiwgCiAgICBSZXN1bHQgPT4gJ0hBU0hTaG9ydCc6IHJldHVybnMgc2hvcnQgSEFTSC1SZWYgd2l0aCBUZXh0TW9kdWxlSURzIGFzIGtleSwKCiAgICBteSAkSGFzaE9yQXJyYXlSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUdldEJ5UXVldWVJRCgKICAgICAgICBRdWV1ZUlEICAgICAgPT4gMTIzNCwgICAjcmVxdWlyZWQKICAgICAgICBUaWNrZXRUeXBlSUQgPT4gMTIzNCwgICAjb3B0aW9uYWwKICAgICAgICBWYWxpZElEICAgICAgPT4gMSwgICAgICAjb3B0aW9uYWw6IDEgaXMgYXNzdW1lZCBhcyBkZWZhdWx0CiAgICAgICAgTGFuZ3VhZ2UgICAgID0+ICdkZScsICAgI29wdGlvbmFsCiAgICAgICAgUmVzdWx0ICAgICAgID0+ICdIQVNIJywgI29wdGlvbmFsOiBIQVNIIHJldHVybnMgYWxsIGRhdGEsIElEcyBpbiBBUlJBWSBvdGhlcndpc2UKICAgICAgICBBZ2VudCAgICAgICAgPT4gMSwgICAgICAjb3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgYXNzdW1lZCBpZiBuZWl0aGVyIEFnZW50LCBub3IgQ3VzdG9tZXIsIG5vciBQdWJsaWMgcGFyYW0gc3BlY2lmaWVkCiAgICAgICAgQ3VzdG9tZXIgICAgID0+IDEgICAgICAgI29wdGlvbmFsCiAgICAgICAgUHVibGljICAgICAgID0+IDEsICAgICAgI29wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVHZXRCeVF1ZXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBSZXN1bHRBcnIgICAgICA9IHF3e307CiAgICBteSAlUmVzdWx0SGFzaCAgICAgPSAoKTsKICAgIG15ICRXSEVSRUNsYXVzZUV4dCA9ICIiOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBmb3IgKHF3KCBRdWV1ZUlEICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFBhcmFte1RpY2tldFR5cGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RpY2tldFR5cGVJRH0gPSAnJzsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRQYXJhbXtUaWNrZXRUeXBlSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+VGV4dE1vZHVsZUdldEJ5UXVldWVBbmRUaWNrZXRUeXBlSUQoJVBhcmFtKTsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkSUR9ID0gMTsKICAgIH0KCiAgICAjIHNldCBmcm9udGVuZCBkaXNwbGF5IGZsYWdzLi4uCiAgICBpZiAoICRQYXJhbXsnQ3VzdG9tZXInfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQuY3VzdG9tZXIgPSAxIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFteydQdWJsaWMnfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQucHVibGljID0gMSI7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFdIRVJFQ2xhdXNlRXh0ID0gIkFORCB0LmFnZW50ID0gMSI7CiAgICB9CgogICAgIyBkYiBxdW90ZS4uLgogICAgZm9yIChxdyggUXVldWVJRCBWYWxpZElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApIHx8ICcnOwogICAgfQogICAgZm9yIChxdyggTGFuZ3VhZ2UpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0xhbmd1YWdlfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgLj0gIiBBTkQgdC5sYW5ndWFnZT0nIiAuICRQYXJhbXtMYW5ndWFnZX0gLiAiJyAiOwogICAgfQoKICAgIG15ICRTUUwgPSAiU0VMRUNUIHQuaWQsIHQubmFtZSwgdC52YWxpZF9pZCwgdC5rZXl3b3JkcywgdC5jb21tZW50MSwgIgogICAgICAgIC4gInQuY29tbWVudDIsIHQudGV4dCwgdC5sYW5ndWFnZSwgdC5hZ2VudCwgdC5jdXN0b21lciwgdC5wdWJsaWMgIgogICAgICAgIC4gIkZST00gcXVldWVfdGV4dF9tb2R1bGUgcXQsIHRleHRfbW9kdWxlIHQgIgogICAgICAgIC4gIldIRVJFIHQuaWQ9cXQudGV4dF9tb2R1bGVfaWQgIgogICAgICAgIC4gIkFORCB0LnZhbGlkX2lkID0gJFBhcmFte1ZhbGlkSUR9ICIKICAgICAgICAuICJBTkQgcXQucXVldWVfaWQgPSAkUGFyYW17UXVldWVJRH0gIjsKCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgLiAkV0hFUkVDbGF1c2VFeHQgKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKCBteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCggQFJlc3VsdEFyciwgJERhdGFbMF0gKTsKCiAgICAgICAgaWYgKCAkUGFyYW17UmVzdWx0fSAmJiAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSFNob3J0JyApIHsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0gPSAkRGF0YVsxXSAuICIgKCIgLiAkRGF0YVs3XSAuICIpIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57SUR9ICAgICAgICAgPSAkRGF0YVswXTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntOYW1lfSAgICAgICA9ICREYXRhWzFdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e1ZhbGlkSUR9ICAgID0gJERhdGFbMl07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57S2V5d29yZHN9ICAgPSAkRGF0YVszXTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntDb21tZW50MX0gICA9ICREYXRhWzRdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0NvbW1lbnQyfSAgID0gJERhdGFbNV07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57VGV4dE1vZHVsZX0gPSAkRGF0YVs2XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntMYW5ndWFnZX0gICA9ICREYXRhWzddOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0FnZW50fSAgICAgID0gJERhdGFbOF07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57Q3VzdG9tZXJ9ICAgPSAkRGF0YVs5XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntQdWJsaWN9ICAgICA9ICREYXRhWzEwXTsKICAgICAgICB9CgogICAgfQoKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gPX4gL15IQVNILyApIHsKICAgICAgICByZXR1cm4gXCVSZXN1bHRIYXNoOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIFxAUmVzdWx0QXJyOwogICAgfQoKfQoKPWl0ZW0gVGV4dE1vZHVsZVF1ZXVlTGlua0RlbGV0ZSgpCgpEZWxldGVzIGFsbCBxdWV1ZS1saW5rcyBmb3IgYSBUZXh0TW9kdWxlLgoKICAgIG15ICRIYXNoUmVmID0gJFRleHRNb2R1bGVPYmplY3QtPlRleHRNb2R1bGVRdWV1ZUxpbmtEZWxldGUoCiAgICAgICAgSUQgICAgICA9PiAxMjM0LCAgI3JlcXVpcmVkCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVRdWV1ZUxpbmtEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIHF1ZXVlPC0+dGV4dCBtb2R1bGUgcmVsYXRpb24KICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gcXVldWVfdGV4dF9tb2R1bGUgV0hFUkUgdGV4dF9tb2R1bGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7Cgp9Cgo9aXRlbSBUZXh0TW9kdWxlUXVldWVMaW5rQ3JlYXRlKCkKCkNyZWF0ZXMgYSBsaW5rIGJldHdlZW4gYSB0ZXh0IG1vZHVsZSBhbmQgYSBxdWV1ZSwgdGh1cyBtYWtpbmcgdGhlIHRleHQgbW9kdWxlIAphdmFpbGFibGUgaW4gdGhpcyBxdWV1ZS4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5UZXh0TW9kdWxlUXVldWVMaW5rQ3JlYXRlKAogICAgICAgIFF1ZXVlSUQgICAgICA9PiAxMjM0LCAgI3JlcXVpcmVkCiAgICAgICAgVGV4dE1vZHVsZUlEID0+IDU2NzgsICAjcmVxdWlyZWQKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICNyZXF1aXJlZAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlUXVldWVMaW5rQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGZvciAocXcoUXVldWVJRCBUZXh0TW9kdWxlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gcXVldWVfdGV4dF9tb2R1bGUgIgogICAgICAgIC4gIiAocXVldWVfaWQsIHRleHRfbW9kdWxlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSIKICAgICAgICAuICIgVkFMVUVTICAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KSI7CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtUZXh0TW9kdWxlSUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSBdLAogICAgKTsKCn0KCiMgRU5EIFFVRVVFLVJFTEFURUQgRlVOQ1RJT05TCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBUZXh0TW9kdWxlR2V0QnlRdWV1ZUFuZFRpY2tldFR5cGVJRCgpCgpSZXR1cm5zIGFsbCBsaW5rZWQgdGV4dCBtb2R1bGVzIGZvciBhIGdpdmVuIFRpY2tldFR5cGVJRCBhbmQgUWV1ZXVJRC4KICAgIFJlc3VsdCA9PiAnSEFTSCc6IHJldHVybnMgYWxsIGRhdGEgaW4gSEFTSC1SZWYsIAogICAgUmVzdWx0ID0+ICB1bmRlZjogcmV0dXJucyBUZXh0bW9kdWxlLUlEcyBpbiBBUlJBWS1SZWYsIAogICAgUmVzdWx0ID0+ICdIQVNIU2hvcnQnOiByZXR1cm5zIHNob3J0IEhBU0gtUmVmIHdpdGggVGV4dE1vZHVsZUlEcyBhcyBrZXksCgogICAgbXkgJEhhc2hPckFycmF5UmVmID0gJFRleHRNb2R1bGVPYmplY3QtPlRleHRNb2R1bGVHZXRCeVF1ZXVlQW5kVGlja2V0VHlwZUlEKAogICAgICAgIFRpY2tldFR5cGVJRCAgPT4gMTIzNCwgICAjcmVxdWlyZWQKICAgICAgICBRdWV1ZUlEICAgICAgID0+IDEyMzQsICAgI3JlcXVpcmVkCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLCAgICAgICNvcHRpb25hbDogMSBpcyBhc3N1bWVkIGFzIGRlZmF1bHQKICAgICAgICBMYW5ndWFnZSAgICAgID0+ICdkZScsICAgI29wdGlvbmFsCiAgICAgICAgUmVzdWx0ICAgICAgICA9PiAnSEFTSCcsICNvcHRpb25hbDogSEFTSCByZXR1cm5zIGFsbCBkYXRhLCBJRHMgaW4gQVJSQVkgb3RoZXJ3aXNlCiAgICAgICAgQWdlbnQgICAgICAgICA9PiAxLCAgICAgICNvcHRpb25hbCwgYXV0b21hdGljYWxseSBhc3N1bWVkIGlmIG5laXRoZXIgQWdlbnQsIG5vciBDdXN0b21lciwgbm9yIFB1YmxpYyBwYXJhbSBzcGVjaWZpZWQKICAgICAgICBDdXN0b21lciAgICAgID0+IDEgICAgICAgI29wdGlvbmFsCiAgICAgICAgUHVibGljICAgICAgICA9PiAxLCAgICAgICNvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlR2V0QnlRdWV1ZUFuZFRpY2tldFR5cGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgQFJlc3VsdEFyciAgICAgID0gcXd7fTsKICAgIG15ICVSZXN1bHRIYXNoICAgICA9ICgpOwogICAgbXkgJFdIRVJFQ2xhdXNlRXh0ID0gIiI7CgogICAgIyBSZWRpcmVjdCB0byBvdGhlciBtZXRob2QgaWYgZmVhdHVyZSBUaWNrZXQ6OlR5cGUgaXMgZGlzYWJsZWQuLi4KICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlRleHRNb2R1bGVHZXRCeVF1ZXVlSUQoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyggVGlja2V0VHlwZUlEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZXh0TW9kdWxlOjpUZXh0TW9kdWxlR2V0QnlRdWV1ZUFuZFRpY2tldFR5cGVJRDoiCiAgICAgICAgICAgICAgICAgICAgLiAiIE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYWxsIG9mIFRleHRNb2R1bGVHZXRCeVF1ZXVlQW5kVGlja2V0VHlwZUlELCBidXQgIgogICAgICAgICAgICAgICAgLiAiIFRpY2tldDo6VHlwZSBpcyBub3QgZW5hYmxlZCEiCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkSUR9ID0gMTsKICAgIH0KCiAgICAjIHNldCBmcm9udGVuZCBkaXNwbGF5IGZsYWdzLi4uCiAgICBpZiAoICRQYXJhbXsnQ3VzdG9tZXInfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQuY3VzdG9tZXIgPSAxIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFteydQdWJsaWMnfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQucHVibGljID0gMSI7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFdIRVJFQ2xhdXNlRXh0ID0gIkFORCB0LmFnZW50ID0gMSI7CiAgICB9CgogICAgIyBkYiBxdW90ZS4uLgogICAgZm9yIChxdyggUXVldWVJRCBUaWNrZXRUeXBlSUQgVmFsaWRJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKSB8fCAnJzsKICAgIH0KICAgIGZvciAocXcoIExhbmd1YWdlKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtMYW5ndWFnZX0gKSB7CiAgICAgICAgJFdIRVJFQ2xhdXNlRXh0IC49ICIgQU5EIHQubGFuZ3VhZ2U9JyIgLiAkUGFyYW17TGFuZ3VhZ2V9IC4gIicgIjsKICAgIH0KCiAgICBteSAkU1FMID0gIlNFTEVDVCB0LmlkLCB0Lm5hbWUsIHQudmFsaWRfaWQsIHQua2V5d29yZHMsIHQuY29tbWVudDEsICIKICAgICAgICAuICJ0LmNvbW1lbnQyLCB0LnRleHQsIHQubGFuZ3VhZ2UsIHQuYWdlbnQsIHQuY3VzdG9tZXIsIHQucHVibGljICIKICAgICAgICAuICJGUk9NIHRpY2tldF90eXBlX3RleHRfbW9kdWxlIHR0LCBxdWV1ZV90ZXh0X21vZHVsZSBxdCwgdGV4dF9tb2R1bGUgdCAiCiAgICAgICAgLiAiV0hFUkUgdC5pZCA9IHF0LnRleHRfbW9kdWxlX2lkICIKICAgICAgICAuICJBTkQgdC5pZCA9IHR0LnRleHRfbW9kdWxlX2lkICIKICAgICAgICAuICJBTkQgdC52YWxpZF9pZCA9ICRQYXJhbXtWYWxpZElEfSAiCiAgICAgICAgLiAiQU5EIHF0LnF1ZXVlX2lkID0gJFBhcmFte1F1ZXVlSUR9ICIKICAgICAgICAuICJBTkQgdHQudGlja2V0X3R5cGVfaWQgPSAkUGFyYW17VGlja2V0VHlwZUlEfSAiOwoKICAgIGlmICggISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCAuICRXSEVSRUNsYXVzZUV4dCApICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB3aGlsZSAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoKCBAUmVzdWx0QXJyLCAkRGF0YVswXSApOwoKICAgICAgICBpZiAoICRQYXJhbXtSZXN1bHR9ICYmICRQYXJhbXtSZXN1bHR9IGVxICdIQVNIU2hvcnQnICkgewogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfSA9ICREYXRhWzFdIC4gIiAoIiAuICREYXRhWzddIC4gIikiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntJRH0gICAgICAgICA9ICREYXRhWzBdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e05hbWV9ICAgICAgID0gJERhdGFbMV07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57VmFsaWRJRH0gICAgPSAkRGF0YVsyXTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntLZXl3b3Jkc30gICA9ICREYXRhWzNdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0NvbW1lbnQxfSAgID0gJERhdGFbNF07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57Q29tbWVudDJ9ICAgPSAkRGF0YVs1XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntUZXh0TW9kdWxlfSA9ICREYXRhWzZdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0xhbmd1YWdlfSAgID0gJERhdGFbN107CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57QWdlbnR9ICAgICAgPSAkRGF0YVs4XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntDdXN0b21lcn0gICA9ICREYXRhWzldOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e1B1YmxpY30gICAgID0gJERhdGFbMTBdOwogICAgICAgIH0KCiAgICB9CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSA9fiAvXkhBU0gvICkgewogICAgICAgIHJldHVybiBcJVJlc3VsdEhhc2g7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gXEBSZXN1bHRBcnI7CiAgICB9Cgp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJFR0lOIFRJQ0tFVC1UWVBFLVJFTEFURUQgRlVOQ1RJT05TCgo9aXRlbSBUZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtHZXQoKQoKUmV0dXJucyBhbGwgbGlua2VkIFRpY2tldFR5cGVzIGZvciBhIFRleHRNb2R1bGUuCgogICAgbXkgJEhhc2hSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rR2V0KAogICAgICAgIElEICAgICAgPT4gMTIzNCwgICNyZXF1aXJlZAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBSZXN1bHQgPSBxd3t9OwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBmb3IgKHF3KElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGIgcXVvdGUuLi4KICAgIGZvciAocXcoSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSwgJ0ludGVnZXInICkgfHwgJyc7CiAgICB9CgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgdGlja2V0X3R5cGVfaWQgRlJPTSB0aWNrZXRfdHlwZV90ZXh0X21vZHVsZSAiCiAgICAgICAgLiAiV0hFUkUgdGV4dF9tb2R1bGVfaWQgPSAkUGFyYW17SUR9IjsKCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKCBteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCggQFJlc3VsdCwgJERhdGFbMF0gKTsKICAgIH0KCiAgICByZXR1cm4gXEBSZXN1bHQ7Cgp9Cgo9aXRlbSBUZXh0TW9kdWxlR2V0QnlUaWNrZXRUeXBlSUQoKQoKUmV0dXJucyBhbGwgbGlua2VkIHRleHQgbW9kdWxlcyBmb3IgYSBnaXZlbiBUaWNrZXRUeXBlLgogICAgUmVzdWx0ID0+ICdIQVNIJzogcmV0dXJucyBhbGwgZGF0YSBpbiBIQVNILVJlZiwgCiAgICBSZXN1bHQgPT4gIHVuZGVmOiByZXR1cm5zIFRleHRtb2R1bGUtSURzIGluIEFSUkFZLVJlZiwgCiAgICBSZXN1bHQgPT4gJ0hBU0hTaG9ydCc6IHJldHVybnMgc2hvcnQgSEFTSC1SZWYgd2l0aCBUZXh0TW9kdWxlSURzIGFzIGtleSwKCiAgICBteSAkSGFzaE9yQXJyYXlSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUdldEJ5VGlja2V0VHlwZUlEKAogICAgICAgIFRpY2tldFR5cGVJRCA9PiAxMjM0LCAgICNyZXF1aXJlZAogICAgICAgIFF1ZXVlSUQgICAgICA9PiAxMjM0LCAgICNvcHRpb25hbAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLCAgICAgICNvcHRpb25hbDogMSBpcyBhc3N1bWVkIGFzIGRlZmF1bHQKICAgICAgICBMYW5ndWFnZSAgICAgPT4gJ2RlJywgICAjb3B0aW9uYWwKICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0hBU0gnLCAjb3B0aW9uYWw6IEhBU0ggcmV0dXJucyBhbGwgZGF0YSwgSURzIGluIEFSUkFZIG90aGVyd2lzZQogICAgICAgIEFnZW50ICAgICAgICA9PiAxLCAgICAgICNvcHRpb25hbCwgYXV0b21hdGljYWxseSBhc3N1bWVkIGlmIG5laXRoZXIgQWdlbnQsIG5vciBDdXN0b21lciwgbm9yIFB1YmxpYyBwYXJhbSBzcGVjaWZpZWQKICAgICAgICBDdXN0b21lciAgICAgPT4gMSAgICAgICAjb3B0aW9uYWwKICAgICAgICBQdWJsaWMgICAgICAgPT4gMSwgICAgICAjb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgVGV4dE1vZHVsZUdldEJ5VGlja2V0VHlwZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSBAUmVzdWx0QXJyICAgICAgPSBxd3t9OwogICAgbXkgJVJlc3VsdEhhc2ggICAgID0gKCk7CiAgICBteSAkV0hFUkVDbGF1c2VFeHQgPSAiIjsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyggVGlja2V0VHlwZUlEICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbGwgb2YgVGV4dE1vZHVsZUdldEJ5VGlja2V0VHlwZUlELCBidXQgVGlja2V0OjpUeXBlIgogICAgICAgICAgICAgICAgLiAiIGlzIG5vdCBlbmFibGVkISIKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+VGV4dE1vZHVsZUdldEJ5UXVldWVBbmRUaWNrZXRUeXBlSUQoJVBhcmFtKTsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkSUR9ID0gMTsKICAgIH0KCiAgICAjIHNldCBmcm9udGVuZCBkaXNwbGF5IGZsYWdzLi4uCiAgICBpZiAoICRQYXJhbXsnQ3VzdG9tZXInfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQuY3VzdG9tZXIgPSAxIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFteydQdWJsaWMnfSApIHsKICAgICAgICAkV0hFUkVDbGF1c2VFeHQgPSAiQU5EIHQucHVibGljID0gMSI7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFdIRVJFQ2xhdXNlRXh0ID0gIkFORCB0LmFnZW50ID0gMSI7CiAgICB9CgogICAgIyBkYiBxdW90ZS4uLgogICAgZm9yIChxdyggUXVldWVJRCBUaWNrZXRUeXBlSUQgVmFsaWRJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKSB8fCAnJzsKICAgIH0KICAgIGZvciAocXcoIExhbmd1YWdlKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtMYW5ndWFnZX0gKSB7CiAgICAgICAgJFdIRVJFQ2xhdXNlRXh0IC49ICIgQU5EIHQubGFuZ3VhZ2U9JyIgLiAkUGFyYW17TGFuZ3VhZ2V9IC4gIicgIjsKICAgIH0KCiAgICBteSAkU1FMID0gIlNFTEVDVCB0LmlkLCB0Lm5hbWUsIHQudmFsaWRfaWQsIHQua2V5d29yZHMsIHQuY29tbWVudDEsICIKICAgICAgICAuICJ0LmNvbW1lbnQyLCB0LnRleHQsIHQubGFuZ3VhZ2UsIHQuYWdlbnQsIHQuY3VzdG9tZXIsIHQucHVibGljICIKICAgICAgICAuICJGUk9NIHRpY2tldF90eXBlX3RleHRfbW9kdWxlIHR0LCB0ZXh0X21vZHVsZSB0ICIKICAgICAgICAuICJXSEVSRSB0LmlkPXR0LnRleHRfbW9kdWxlX2lkICIKICAgICAgICAuICJBTkQgdC52YWxpZF9pZCA9ICRQYXJhbXtWYWxpZElEfSAiCiAgICAgICAgLiAiQU5EIHR0LnRpY2tldF90eXBlX2lkID0gJFBhcmFte1RpY2tldFR5cGVJRH0gIjsKCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgLiAkV0hFUkVDbGF1c2VFeHQgKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKCBteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCggQFJlc3VsdEFyciwgJERhdGFbMF0gKTsKCiAgICAgICAgaWYgKCAkUGFyYW17UmVzdWx0fSAmJiAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSFNob3J0JyApIHsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0gPSAkRGF0YVsxXSAuICIgKCIgLiAkRGF0YVs3XSAuICIpIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57SUR9ICAgICAgICAgPSAkRGF0YVswXTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntOYW1lfSAgICAgICA9ICREYXRhWzFdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e1ZhbGlkSUR9ICAgID0gJERhdGFbMl07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57S2V5d29yZHN9ICAgPSAkRGF0YVszXTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntDb21tZW50MX0gICA9ICREYXRhWzRdOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0NvbW1lbnQyfSAgID0gJERhdGFbNV07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57VGV4dE1vZHVsZX0gPSAkRGF0YVs2XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntMYW5ndWFnZX0gICA9ICREYXRhWzddOwogICAgICAgICAgICAkUmVzdWx0SGFzaHsgJERhdGFbMF0gfS0+e0FnZW50fSAgICAgID0gJERhdGFbOF07CiAgICAgICAgICAgICRSZXN1bHRIYXNoeyAkRGF0YVswXSB9LT57Q3VzdG9tZXJ9ICAgPSAkRGF0YVs5XTsKICAgICAgICAgICAgJFJlc3VsdEhhc2h7ICREYXRhWzBdIH0tPntQdWJsaWN9ICAgICA9ICREYXRhWzEwXTsKICAgICAgICB9CgogICAgfQoKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gPX4gL15IQVNILyApIHsKICAgICAgICByZXR1cm4gXCVSZXN1bHRIYXNoOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIFxAUmVzdWx0QXJyOwogICAgfQoKfQoKPWl0ZW0gVGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rRGVsZXRlKCkKCkRlbGV0ZXMgYWxsIFRpY2tldFR5cGUtbGlua3MgZm9yIGEgVGV4dE1vZHVsZS4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5UZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtEZWxldGUoCiAgICAgICAgSUQgICAgICA9PiAxMjM0LCAgI3JlcXVpcmVkCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVUaWNrZXRUeXBlTGlua0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIElEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgVGlja2V0VHlwZTwtPnRleHQgbW9kdWxlIHJlbGF0aW9uCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHRpY2tldF90eXBlX3RleHRfbW9kdWxlIFdIRVJFIHRleHRfbW9kdWxlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICApOwoKfQoKPWl0ZW0gVGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rQ3JlYXRlKCkKCkNyZWF0ZXMgYSBsaW5rIGJldHdlZW4gYSB0ZXh0IG1vZHVsZSBhbmQgYSBUaWNrZXRUeXBlLCB0aHVzIG1ha2luZyB0aGUgdGV4dCBtb2R1bGUgCmF2YWlsYWJsZSBpbiB0aGlzIFRpY2tldFR5cGUuCgogICAgbXkgJEhhc2hSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rQ3JlYXRlKAogICAgICAgIFRpY2tldFR5cGVJRCA9PiAxMjM0LCAgI3JlcXVpcmVkCiAgICAgICAgVGV4dE1vZHVsZUlEID0+IDU2NzgsICAjcmVxdWlyZWQKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICNyZXF1aXJlZAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyhUaWNrZXRUeXBlSUQgVGV4dE1vZHVsZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIHRpY2tldF90eXBlX3RleHRfbW9kdWxlICIKICAgICAgICAuICIgKHRpY2tldF90eXBlX2lkLCB0ZXh0X21vZHVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkiCiAgICAgICAgLiAiIFZBTFVFUyAgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPykiOwoKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0VHlwZUlEfSwgXCRQYXJhbXtUZXh0TW9kdWxlSUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSBdCiAgICAgICAgLAogICAgKTsKCn0KCiMgRU5EIFRJQ0tFVC1UWVBFLVJFTEFURUQgRlVOQ1RJT05TCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBUZXh0TW9kdWxlVXBkYXRlKCkKClVwZGF0ZXMgYW4gZXhpc3RpbmcgVGV4dE1vZHVsZQoKICAgIG15ICRIYXNoUmVmID0gJFRleHRNb2R1bGVPYmplY3QtPlRleHRNb2R1bGVVcGRhdGUoCiAgICAgICAgSUQgICAgICAgICA9PiAxMjM0LCAgICAgICAgICAgICAgICNyZXF1aXJlZAogICAgICAgIE5hbWUgICAgICAgPT4gJ3NvbWUgc2hvcnQgbmFtZScsICAjcmVxdWlyZWQKICAgICAgICBWYWxpZElEICAgID0+IDEsICAgICAgICAgICAgICAgICAgI3JlcXVpcmVkCiAgICAgICAgVGV4dE1vZHVsZSA9PiAnc29tZSBibGFibGEuLi4nLCAgICNyZXF1aXJlZAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAjcmVxdWlyZWQKICAgICAgICBMYW5ndWFnZSAgID0+ICdkZScsICAgICAgICAgICAgICAgI29wdGlvbmFsCiAgICAgICAgS2V5d29yZHMgICA9PiAna2V5MSwga2V5Miwga2V5MycsICNvcHRpb25hbCAKICAgICAgICBDb21tZW50MSAgID0+ICcnLCAgICAgICAgICAgICAgICAgI29wdGlvbmFsCiAgICAgICAgQ29tbWVudDIgICA9PiAnJywgICAgICAgICAgICAgICAgICNvcHRpb25hbAogICAgICAgIEFnZW50ICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAjb3B0aW9uYWwsIHNldCBhdXRvbS4gaWYgbmVpdGhlciBDdXN0b21lciBub3IgUHVibGljIGlzIHNldAogICAgICAgIEN1c3RvbWVyICAgPT4gMSwgICAgICAgICAgICAgICAgICAjb3B0aW9uYWwKICAgICAgICBQdWJsaWMgICAgID0+IDEsICAgICAgICAgICAgICAgICAgI29wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyhJRCBOYW1lIFZhbGlkSUQgVGV4dE1vZHVsZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWZhdWx0IGxhbmd1YWdlLi4uCiAgICBpZiAoICEkUGFyYW17TGFuZ3VhZ2V9ICkgewogICAgICAgICRQYXJhbXtMYW5ndWFnZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKICAgIH0KCiAgICAjIHNldCBmcm9udGVuZCBkaXNwbGF5IGZsYWdzLi4uCiAgICBmb3IgbXkgJEN1cnJLZXkgKHF3KEFnZW50IEN1c3RvbWVyIFB1YmxpYyApKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JEN1cnJLZXl9ICkgewogICAgICAgICAgICAkUGFyYW17JEN1cnJLZXl9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXskQ3VycktleX0gPSAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXsnQWdlbnQnfSAmJiAhJFBhcmFteydDdXN0b21lcid9ICYmICEkUGFyYW17J1B1YmxpYyd9ICkgewogICAgICAgICRQYXJhbXsnQWdlbnQnfSA9IDE7CiAgICB9CgogICAgIyBidWlsZCBzcWwuLi4KICAgIG15ICRTUUwgPSAiVVBEQVRFIHRleHRfbW9kdWxlIFNFVCAiCiAgICAgICAgLiAiIG5hbWUgPSA/LCAiCiAgICAgICAgLiAiIHRleHQgPSA/LCAiCiAgICAgICAgLiAiIGtleXdvcmRzID0gPywgIgogICAgICAgIC4gIiBsYW5ndWFnZSA9ID8sICIKICAgICAgICAuICIgY29tbWVudDEgPSA/LCAiCiAgICAgICAgLiAiIGNvbW1lbnQyID0gPywgIgogICAgICAgIC4gIiB2YWxpZF9pZCA9ID8sICIKICAgICAgICAuICIgYWdlbnQgICAgPSA/LCAiCiAgICAgICAgLiAiIGN1c3RvbWVyID0gPywgIgogICAgICAgIC4gIiBwdWJsaWMgICA9ID8sICIKICAgICAgICAuICIgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgIgogICAgICAgIC4gIiBjaGFuZ2VfYnkgPSA/ICIKICAgICAgICAuICIgV0hFUkUgIgogICAgICAgIC4gIiBpZCA9ICRQYXJhbXtJRH0iOwoKICAgICMgZG8gdGhlIGRiIGluc2VydC4uLgogICAgbXkgJERCVXBkYXRlID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgIFwkUGFyYW17VGV4dE1vZHVsZX0sIFwkUGFyYW17S2V5d29yZHN9LAogICAgICAgICAgICBcJFBhcmFte0xhbmd1YWdlfSwgXCRQYXJhbXtDb21tZW50MX0sICAgXCRQYXJhbXtDb21tZW50Mn0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sICBcJFBhcmFte0FnZW50fSwgICAgICBcJFBhcmFte0N1c3RvbWVyfSwKICAgICAgICAgICAgXCRQYXJhbXtQdWJsaWN9LCAgIFwkUGFyYW17VXNlcklEfQogICAgICAgIF0sCiAgICApOwoKICAgICNoYW5kbGUgdXBkYXRlIHJlc3VsdC4uLgogICAgaWYgKCREQlVwZGF0ZSkgewogICAgICAgIHJldHVybiAkUGFyYW17SUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZXN0TW9kdWxlczo6REIgdXBkYXRlIG9mICRQYXJhbXtJRH0gZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9Cgp9Cgo9aXRlbSBUZXh0TW9kdWxlTG9va3VwKCkKCkZJWE1FOiBkZXNjcmliZSB3aGF0IEkgZG8uCgogICAgbXkgJEhhc2hSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUxvb2t1cCgKICAgICAgICBUZXh0TW9kdWxlICAgPT4gMTIzLCAgICAgI2VpdGhlciB0aGlzIG9yLi4uCiAgICAgICAgVGV4dE1vZHVsZUlEID0+IDQ1NiwgICAgICMuLi5pcyByZXF1aXJlZAogICAgKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGlmICggISRQYXJhbXtUZXh0TW9kdWxlfSAmJiAhJFBhcmFte1RleHRNb2R1bGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHb3Qgbm8gVGV4dE1vZHVsZSBvciBUZXh0TW9kdWxlSUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgd2UgYXNrIHRoZSBzYW1lIHJlcXVlc3Q/CiAgICBpZiAoICRQYXJhbXtUZXh0TW9kdWxlSUR9ICYmICRTZWxmLT57IlRleHRNb2R1bGVMb29rdXAkUGFyYW17VGV4dE1vZHVsZUlEfSJ9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+eyJUZXh0TW9kdWxlTG9va3VwJFBhcmFte1RleHRNb2R1bGVJRH0ifTsKICAgIH0KICAgIGlmICggJFBhcmFte1RleHRNb2R1bGV9ICYmICRTZWxmLT57IlRleHRNb2R1bGVMb29rdXAkUGFyYW17VGV4dE1vZHVsZX0ifSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsiVGV4dE1vZHVsZUxvb2t1cCRQYXJhbXtUZXh0TW9kdWxlfSJ9OwogICAgfQoKICAgICMgZ2V0IGRhdGEKICAgIG15ICRTUUwgICAgPSAnJzsKICAgIG15ICRTdWZmaXggPSAnJzsKICAgIGlmICggJFBhcmFte1RleHRNb2R1bGV9ICkgewogICAgICAgICRTdWZmaXggPSAnVGV4dE1vZHVsZUlEJzsKICAgICAgICAkU1FMICAgID0gIlNFTEVDVCBpZCBGUk9NIHRleHRfbW9kdWxlIFdIRVJFIG5hbWUgPSAnIgogICAgICAgICAgICAuICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1RleHRNb2R1bGV9ICkgLiAiJyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3VmZml4ID0gJ1RleHRNb2R1bGUnOwogICAgICAgICRTUUwgICAgPSAiU0VMRUNUIG5hbWUgRlJPTSB0ZXh0X21vZHVsZSBXSEVSRSBpZCA9ICIKICAgICAgICAgICAgLiAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtUZXh0TW9kdWxlSUR9LCAnSW50ZWdlcicgKSAuICIiOwogICAgfQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHN0b3JlIHJlc3VsdAogICAgICAgICRTZWxmLT57IlRleHRNb2R1bGUkU3VmZml4In0gPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgaWYgZGF0YSBleGlzdHMKICAgIGlmICggIWV4aXN0cyAkU2VsZi0+eyJUZXh0TW9kdWxlJFN1ZmZpeCJ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJGb3VuZCBubyBcJCRTdWZmaXghIiApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPnsiVGV4dE1vZHVsZSRTdWZmaXgifTsKfQoKPWl0ZW0gR2V0QWxsVGV4dE1vZHVsZXMoKQoKUmV0dXJucyBJRCBhbmQgTmFtZSBvZiBhbGwgdGV4dCBtb2R1bGVzIC0gREVQUkVDQVRFRC4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5HZXRBbGxUZXh0TW9kdWxlcygpOwoKPWN1dAoKc3ViIEdldEFsbFRleHRNb2R1bGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgcmV0dXJuIGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgIFRhYmxlID0+ICd0ZXh0X21vZHVsZScsCiAgICAgICAgV2hhdCAgPT4gJ2lkLCBuYW1lJywKICAgICAgICBWYWxpZCA9PiAkUGFyYW17VmFsaWR9LAogICAgKTsKfQoKPWl0ZW0gVGV4dE1vZHVsZUdldExpc3QoKQoKUmV0dXJucyBhbGwgdGV4dG1vZHVsZXMgd2hpY2ggbWF0Y2hlZCB0aGUgc2VhcmNoIHBhcmFtcy4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5UZXh0TW9kdWxlR2V0TGlzdCgKICAgICAgICBMYW5ndWFnZSA9PiAnZW4nLCAgICAgICAgICNvcHRpb25hbAogICAgICAgIE5hbWUgICAgID0+ICclc29tZW5hbWUqJywgI29wdGlvbmFsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwgICAgICAgICAgICAjb3B0aW9uYWwKICAgICAgICBBZ2VudCAgICA9PiAxLCAgICAgICAgICAgICNvcHRpb25hbAogICAgICAgIEN1c3RvbWVyID0+IDEsICAgICAgICAgICAgI29wdGlvbmFsCiAgICAgICAgUHVibGljICAgPT4gMSwgICAgICAgICAgICAjb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgVGV4dE1vZHVsZUdldExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRTUUxXaGVyZUNsYXVzZSA9ICIiOwogICAgbXkgJURhdGEgICAgICAgICAgID0gKCk7CiAgICBteSAlVmFsaWRIYXNoICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgIyBkYiBxdW90ZQogICAgZm9yIChxdyggTGFuZ3VhZ2UgTmFtZSApKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSB8fCAnJyApOwogICAgfQogICAgZm9yIChxdyggVmFsaWRJRCApKSB7CiAgICAgICAgbmV4dCBpZiAoICEkUGFyYW17JF99ICk7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSwgJ0ludGVnZXInICkgfHwgMDsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkUGFyYW17TmFtZX0gPX4gcy9cKi9cJS9nOwogICAgfQoKICAgIGlmICggJFBhcmFte1ZhbGlkSUR9ICkgewogICAgICAgICRTUUxXaGVyZUNsYXVzZSA9ICJ2YWxpZF9pZCA9ICRQYXJhbXtWYWxpZElEfSAiOwogICAgfQogICAgaWYgKCAkUGFyYW17TGFuZ3VhZ2V9ICYmICRTUUxXaGVyZUNsYXVzZSApIHsKICAgICAgICAkU1FMV2hlcmVDbGF1c2UgLj0gIkFORCBsYW5ndWFnZSA9ICckUGFyYW17TGFuZ3VhZ2V9JyAiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TGFuZ3VhZ2V9ICkgewogICAgICAgICRTUUxXaGVyZUNsYXVzZSA9ICJsYW5ndWFnZSA9ICckUGFyYW17TGFuZ3VhZ2V9JyAiOwogICAgfQogICAgaWYgKCAkUGFyYW17TmFtZX0gJiYgKCAkUGFyYW17TmFtZX0gPX4gLyUvICkgJiYgJFNRTFdoZXJlQ2xhdXNlICkgewogICAgICAgICRTUUxXaGVyZUNsYXVzZSAuPSAiQU5EIG5hbWUgTElLRSAnJFBhcmFte05hbWV9JyAiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gJiYgKCAkUGFyYW17TmFtZX0gPX4gLyUvICkgKSB7CiAgICAgICAgJFNRTFdoZXJlQ2xhdXNlID0gIm5hbWUgTElLRSAnJFBhcmFte05hbWV9JyAiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gJiYgJFNRTFdoZXJlQ2xhdXNlICkgewogICAgICAgICRTUUxXaGVyZUNsYXVzZSAuPSAiQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyAiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNRTFdoZXJlQ2xhdXNlID0gIm5hbWUgPSAnJFBhcmFte05hbWV9JyAiOwogICAgfQoKICAgIGlmICggJFBhcmFte0FnZW50fSApIHsKICAgICAgICAkU1FMV2hlcmVDbGF1c2UgPSAiIEFORCBhZ2VudCA9IDEgIjsKICAgIH0KICAgIGlmICggJFBhcmFte0N1c3RvbWVyfSApIHsKICAgICAgICAkU1FMV2hlcmVDbGF1c2UgPSAiIEFORCBjdXN0b21lciA9IDEgIjsKICAgIH0KICAgIGlmICggJFBhcmFte1B1YmxpY30gKSB7CiAgICAgICAgJFNRTFdoZXJlQ2xhdXNlID0gIiBBTkQgcHVibGljID0gMSAiOwogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQsIGtleXdvcmRzLCBjb21tZW50MSwgY29tbWVudDIsIHRleHQsICIKICAgICAgICAuICIgbGFuZ3VhZ2UsIGFnZW50LCBjdXN0b21lciwgcHVibGljICIKICAgICAgICAuICIgRlJPTSB0ZXh0X21vZHVsZSAiOwogICAgaWYgKCRTUUxXaGVyZUNsYXVzZSkgewogICAgICAgICRTUUwgLj0gIldIRVJFICIgLiAkU1FMV2hlcmVDbGF1c2U7CiAgICB9CiAgICAkU1FMIC49ICIgT1JERVIgQlkgaWQiOwoKICAgIGlmICggISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICRDb3VudCA9IDA7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBsYXN0IGlmICggJFBhcmFte0xpbWl0fSAmJiAoICRDb3VudCA+PSAkUGFyYW17TGltaXR9ICkgKTsKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgaWYgKCAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdTZWFyY2hSZXN1bHRTaG9ydCcgKSB7CiAgICAgICAgICAgICREYXRheyAkRGF0YVswXSB9ID0gJERhdGFbMV0gLiAiICgiIC4gJERhdGFbN10gLiAiIC8gIiAuICREYXRhWzBdIC4gIikiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7ICREYXRhWzBdIH0tPntJRH0gICAgICAgICA9ICREYXRhWzBdOwogICAgICAgICAgICAkRGF0YXsgJERhdGFbMF0gfS0+e05hbWV9ICAgICAgID0gJERhdGFbMV07CiAgICAgICAgICAgICREYXRheyAkRGF0YVswXSB9LT57VmFsaWRJRH0gICAgPSAkRGF0YVsyXTsKICAgICAgICAgICAgJERhdGF7ICREYXRhWzBdIH0tPntLZXl3b3Jkc30gICA9ICREYXRhWzNdOwogICAgICAgICAgICAkRGF0YXsgJERhdGFbMF0gfS0+e0NvbW1lbnQxfSAgID0gJERhdGFbNF07CiAgICAgICAgICAgICREYXRheyAkRGF0YVswXSB9LT57Q29tbWVudDJ9ICAgPSAkRGF0YVs1XTsKICAgICAgICAgICAgJERhdGF7ICREYXRhWzBdIH0tPntUZXh0TW9kdWxlfSA9ICREYXRhWzZdOwogICAgICAgICAgICAkRGF0YXsgJERhdGFbMF0gfS0+e0xhbmd1YWdlfSAgID0gJERhdGFbN107CiAgICAgICAgICAgICREYXRheyAkRGF0YVswXSB9LT57QWdlbnR9ICAgICAgPSAkRGF0YVs4XTsKICAgICAgICAgICAgJERhdGF7ICREYXRhWzBdIH0tPntDdXN0b21lcn0gICA9ICREYXRhWzldOwogICAgICAgICAgICAkRGF0YXsgJERhdGFbMF0gfS0+e1B1YmxpY30gICAgID0gJERhdGFbMTBdOwogICAgICAgICAgICAkRGF0YXsgJERhdGFbMF0gfS0+e1ZhbGlkfSAgICAgID0gJFZhbGlkSGFzaHsgJERhdGFbMl0gfTsKICAgICAgICB9CiAgICAgICAgbXkgQEZyb250ZW5kSW5mb0FycmF5ID0gcXd7fTsKICAgICAgICBwdXNoKCBARnJvbnRlbmRJbmZvQXJyYXksICJBIiApIGlmICggJERhdGF7ICREYXRhWzBdIH0tPntBZ2VudH0gKTsKICAgICAgICBwdXNoKCBARnJvbnRlbmRJbmZvQXJyYXksICJDIiApIGlmICggJERhdGF7ICREYXRhWzBdIH0tPntDdXN0b21lcn0gKTsKICAgICAgICBwdXNoKCBARnJvbnRlbmRJbmZvQXJyYXksICJQIiApIGlmICggJERhdGF7ICREYXRhWzBdIH0tPntQdWJsaWN9ICk7CiAgICAgICAgJERhdGF7ICREYXRhWzBdIH0tPntGcm9udGVuZEluZm9TdHJnfSA9IGpvaW4oICIvIiwgQEZyb250ZW5kSW5mb0FycmF5ICk7CgogICAgfQoKICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIFRleHRNb2R1bGVHZXRMaXN0WE1MU3RyaW5nKCkKClJldHVybnMgYWxsIFRleHRtb2R1bGVzIGluIGFuIFhNTC1Eb2N1bWVudCBzdWl0YWJsZSBmb3IgdXBsb2FkLgoKICAgIG15ICRTdHJpbmcgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZUdldExpc3RYTUxTdHJpbmcoKTsKCj1jdXQKCnN1YiBUZXh0TW9kdWxlR2V0TGlzdFhNTFN0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFJlc3VsdCA9ICIiOwoKICAgIG15ICRUZXh0TW9kdWxlRGF0YVJlZiA9ICRTZWxmLT5UZXh0TW9kdWxlR2V0TGlzdCglUGFyYW0pOwogICAgbXkgQEV4cG9ydERhdGFBcnJheSAgID0gcXd7fTsKICAgIHB1c2goIEBFeHBvcnREYXRhQXJyYXksIHVuZGVmICk7CgogICAgZm9yIG15ICRDdXJySGFzaElEICggc29ydCgga2V5cyggJXskVGV4dE1vZHVsZURhdGFSZWZ9ICkgKSApIHsKCiAgICAgICAgbXkgJEN1cnJIYXNoUmVmID0gJFRleHRNb2R1bGVEYXRhUmVmLT57JEN1cnJIYXNoSUR9OwoKICAgICAgICBteSAlQ3VyclRNID0gKCk7CiAgICAgICAgZm9yIG15ICRDdXJyS2V5ICgga2V5cyggJXskQ3Vyckhhc2hSZWZ9ICkgKSB7CiAgICAgICAgICAgICRDdXJyVE17JEN1cnJLZXl9LT5bMF0gPSB1bmRlZjsKICAgICAgICAgICAgJEN1cnJUTXskQ3VycktleX0tPlsxXS0+e0NvbnRlbnR9ID0gJEN1cnJIYXNoUmVmLT57JEN1cnJLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGxpbmtlZCBxdWV1ZXMuLi4uCiAgICAgICAgbXkgJFNlbGVjdGVkUXVldWVSZWYgPSAkU2VsZi0+VGV4dE1vZHVsZVF1ZXVlTGlua0dldCgKICAgICAgICAgICAgSUQgPT4gJEN1cnJIYXNoSUQKICAgICAgICApOwoKICAgICAgICBteSAkUXVldWVJbmRleCA9IDE7CiAgICAgICAgJEN1cnJUTXtRdWV1ZUxpc3R9LT5bMF0gPSB1bmRlZjsKICAgICAgICBmb3IgbXkgJEN1cnJRdWV1ZUlEICggQHskU2VsZWN0ZWRRdWV1ZVJlZn0gKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZSA9ICgpOwogICAgICAgICAgICAkUXVldWV7SUR9ICAgICAgPSAkQ3VyclF1ZXVlSUQ7CiAgICAgICAgICAgICRRdWV1ZXtDb250ZW50fSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJEN1cnJRdWV1ZUlECiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDdXJyVE17UXVldWVMaXN0fS0+WzFdLT57UXVldWV9LT5bMF0gPSB1bmRlZjsKICAgICAgICAgICAgJEN1cnJUTXtRdWV1ZUxpc3R9LT5bMV0tPntRdWV1ZX0tPlskUXVldWVJbmRleF0gPSBcJVF1ZXVlOwogICAgICAgICAgICAkUXVldWVJbmRleCsrOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGxpbmtlZCB0aWNrZXQgdHlwZXMuLi4uCiAgICAgICAgbXkgJFNlbGVjdGVkVGlja2V0VHlwZVJlZiA9ICRTZWxmLT5UZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtHZXQoCiAgICAgICAgICAgIElEID0+ICRDdXJySGFzaElECiAgICAgICAgKTsKCiAgICAgICAgbXkgJFRpY2tldFR5cGVJbmRleCA9IDE7CiAgICAgICAgJEN1cnJUTXtUaWNrZXRUeXBlTGlzdH0tPlswXSA9IHVuZGVmOwogICAgICAgIGZvciBteSAkQ3VyclRpY2tldFR5cGVJRCAoIEB7JFNlbGVjdGVkVGlja2V0VHlwZVJlZn0gKSB7CiAgICAgICAgICAgIG15ICVUaWNrZXRUeXBlID0gKCk7CiAgICAgICAgICAgICRUaWNrZXRUeXBle0lEfSAgICAgID0gJEN1cnJUaWNrZXRUeXBlSUQ7CiAgICAgICAgICAgICRUaWNrZXRUeXBle0NvbnRlbnR9ID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgIFR5cGVJRCA9PiAkQ3VyclRpY2tldFR5cGVJRAogICAgICAgICAgICApOwogICAgICAgICAgICAkQ3VyclRNe1RpY2tldFR5cGVMaXN0fS0+WzFdLT57VGlja2V0VHlwZX0tPlswXSA9IHVuZGVmOwogICAgICAgICAgICAkQ3VyclRNe1RpY2tldFR5cGVMaXN0fS0+WzFdLT57VGlja2V0VHlwZX0tPlskVGlja2V0VHlwZUluZGV4XSA9IFwlVGlja2V0VHlwZTsKICAgICAgICAgICAgJFRpY2tldFR5cGVJbmRleCsrOwogICAgICAgIH0KCiAgICAgICAgIyBleHBvcnQgKi1saXN0cy4uLgogICAgICAgIHB1c2goIEBFeHBvcnREYXRhQXJyYXksIFwlQ3VyclRNICk7CgogICAgfQoKICAgIG15IEBYTUxIYXNoQXJyYXkgPSBxd3t9OwogICAgcHVzaCggQFhNTEhhc2hBcnJheSwgdW5kZWYgKTsKCiAgICBteSAlWE1MSGFzaFRleHRNb2R1bGUgPSAoKTsKICAgICRYTUxIYXNoVGV4dE1vZHVsZXsnVGV4dE1vZHVsZUxpc3QnfS0+WzBdID0gdW5kZWY7CiAgICAkWE1MSGFzaFRleHRNb2R1bGV7J1RleHRNb2R1bGVMaXN0J30tPlsxXS0+eydUZXh0TW9kdWxlRW50cnknfSA9IFxARXhwb3J0RGF0YUFycmF5OwoKICAgIHB1c2goIEBYTUxIYXNoQXJyYXksIFwlWE1MSGFzaFRleHRNb2R1bGUgKTsKCiAgICAkUmVzdWx0ID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoMlhNTChAWE1MSGFzaEFycmF5KTsKCiAgICByZXR1cm4gJFJlc3VsdDsKCn0KCj1pdGVtIFRleHRNb2R1bGVzVXBkYXRlQnlYTUxTdHJpbmcoKQoKUmV0dXJucyBhbGwgVGV4dG1vZHVsZXMgaW4gYW4gWE1MLURvY3VtZW50IHN1aXRhYmxlIGZvciB1cGxvYWQuCgogICAgbXkgJEhhc2hSZWYgPSAkVGV4dE1vZHVsZU9iamVjdC0+VGV4dE1vZHVsZXNVcGRhdGVCeVhNTFN0cmluZygKICAgICAgICBYTUxTdHJpbmcgPT4gJzx4bWw+PHRhZz4uLi48L3RhZz4nLCAjcmVxdWlyZWQKICAgICAgICBEb05vdEFkZCA9PiAwfDEsICNETyBOT1QgY3JlYXRlIG5ldyBlbnRyeSBpZiBubyBleGlzdGluZyBpZCBnaXZlbgogICAgICAgIFVzZXJJRCAgID0+IDEyMywgI3JlcXVpcmVkCiAgICApOwoKPWN1dAoKc3ViIFRleHRNb2R1bGVzVXBkYXRlQnlYTUxTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICVSZXN1bHQgPSAoKTsKCiAgICAjZ2V0IGRlZmF1bHQgY29uZmlnLi4uCiAgICBteSAkQ29uZmlnUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluUmVzcG9uc2VzVXBsb2Fkczo6VGV4dE1vZHVsZURlZmF1bHRzJyk7CiAgICBteSAlQ29uZmlnICAgID0gKCk7CiAgICBpZiAoICRDb25maWdSZWYgJiYgcmVmKCRDb25maWdSZWYpIGVxICdIQVNIJyApIHsKICAgICAgICAlQ29uZmlnID0gJXskQ29uZmlnUmVmfTsKICAgIH0KCiAgICAjaW5pdCBjb3VudGVycy4uLgogICAgJFJlc3VsdHtDb3VudFVwbG9hZGVkfSAgICAgPSAwOwogICAgJFJlc3VsdHtDb3VudFVwZGF0ZUZhaWxlZH0gPSAwOwogICAgJFJlc3VsdHtDb3VudFVwZGF0ZWR9ICAgICAgPSAwOwogICAgJFJlc3VsdHtDb3VudEluc2VydEZhaWxlZH0gPSAwOwogICAgJFJlc3VsdHtDb3VudEFkZGVkfSAgICAgICAgPSAwOwogICAgJFJlc3VsdHtVcGxvYWRNZXNzYWdlfSAgICAgPSAnJzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIChxdyggWE1MU3RyaW5nIFVzZXJJRCApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtYTUxTdHJpbmd9CiAgICApOwogICAgbXkgQFVwZGF0ZUFycmF5ID0gcXd7fTsKCiAgICBpZiAoCiAgICAgICAgJFhNTEhhc2hbMV0KICAgICAgICAmJgogICAgICAgIHJlZiggJFhNTEhhc2hbMV0gKSBlcSAnSEFTSCcKICAgICAgICAmJiAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9CiAgICAgICAgJiYgcmVmKCAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9ICkgZXEgJ0FSUkFZJwogICAgICAgICYmICRYTUxIYXNoWzFdLT57J1RleHRNb2R1bGVMaXN0J30tPlsxXQogICAgICAgICYmIHJlZiggJFhNTEhhc2hbMV0tPnsnVGV4dE1vZHVsZUxpc3QnfS0+WzFdICkgZXEgJ0hBU0gnCiAgICAgICAgJiYgJFhNTEhhc2hbMV0tPnsnVGV4dE1vZHVsZUxpc3QnfS0+WzFdLT57J1RleHRNb2R1bGVFbnRyeSd9CiAgICAgICAgJiYgcmVmKCAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9LT5bMV0tPnsnVGV4dE1vZHVsZUVudHJ5J30gKSBlcSAnQVJSQVknCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRUTUFyckluZGV4ID0gMDsKICAgICAgICBmb3IgbXkgJFRNQXJyUmVmICggQHsgJFhNTEhhc2hbMV0tPnsnVGV4dE1vZHVsZUxpc3QnfS0+WzFdLT57J1RleHRNb2R1bGVFbnRyeSd9IH0gKSB7CiAgICAgICAgICAgIG5leHQgaWYgKCAhZGVmaW5lZCgkVE1BcnJSZWYpIHx8IHJlZigkVE1BcnJSZWYpIG5lICdIQVNIJyApOwoKICAgICAgICAgICAgJFRNQXJySW5kZXgrKzsKICAgICAgICAgICAgbXkgJVVwZGF0ZURhdGEgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCAleyRUTUFyclJlZn0gKSB7CiAgICAgICAgICAgICAgICBteSAlUXVldWVMaXN0ICAgICAgPSAoKTsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXRUeXBlTGlzdCA9ICgpOwoKICAgICAgICAgICAgICAgIGlmICggJEtleSBlcSAnUXVldWVMaXN0JyApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAoIHJlZiggJFRNQXJyUmVmLT57JEtleX0gKSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkVE1BcnJSZWYtPnskS2V5fS0+WzFdICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCByZWYoICRUTUFyclJlZi0+eyRLZXl9LT5bMV0gKSBlcSAnSEFTSCcgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRUTUFyclJlZi0+eyRLZXl9LT5bMV0tPntRdWV1ZX0gKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoIHJlZiggJFRNQXJyUmVmLT57JEtleX0tPlsxXS0+e1F1ZXVlfSApIGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkSW5kZXggPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFN1YkNvbnRlbnQgKCBAeyAkVE1BcnJSZWYtPnskS2V5fS0+WzFdLT57UXVldWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICggIWRlZmluZWQoJFN1YkNvbnRlbnQpICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUXVldWVMaXN0eyRJbmRleH0tPntJRH0gICA9ICRTdWJDb250ZW50LT57SUR9ICAgICAgfHwgJzAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFF1ZXVlTGlzdHskSW5kZXh9LT57TmFtZX0gPSAkU3ViQ29udGVudC0+e0NvbnRlbnR9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZURhdGF7JEtleX0gPSBcJVF1ZXVlTGlzdAogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWxzaWYgKCAkS2V5IGVxICdUaWNrZXRUeXBlTGlzdCcgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgKCByZWYoICRUTUFyclJlZi0+eyRLZXl9ICkgZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJFRNQXJyUmVmLT57JEtleX0tPlsxXSApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggcmVmKCAkVE1BcnJSZWYtPnskS2V5fS0+WzFdICkgZXEgJ0hBU0gnICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkVE1BcnJSZWYtPnskS2V5fS0+WzFdLT57VGlja2V0VHlwZX0gKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoIHJlZiggJFRNQXJyUmVmLT57JEtleX0tPlsxXS0+e1RpY2tldFR5cGV9ICkgZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRJbmRleCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkU3ViQ29udGVudCAoIEB7ICRUTUFyclJlZi0+eyRLZXl9LT5bMV0tPntUaWNrZXRUeXBlfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAoICFkZWZpbmVkKCRTdWJDb250ZW50KSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFR5cGVMaXN0eyRJbmRleH0tPntJRH0gICA9ICRTdWJDb250ZW50LT57SUR9ICAgICAgfHwgJzAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFR5cGVMaXN0eyRJbmRleH0tPntOYW1lfSA9ICRTdWJDb250ZW50LT57Q29udGVudH0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRGF0YXskS2V5fSA9IFwlVGlja2V0VHlwZUxpc3QKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNlbHNpZiggJEtleSA9fiAvXkN1c3RvbS8gKSB7CiAgICAgICAgICAgICAgICAjIC4uLnBsYWNlaG9sZGVyIGZvciBjdXN0b20gZm9ybWF0Li4uCiAgICAgICAgICAgICAgICAjfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgIHJlZiggJFRNQXJyUmVmLT57JEtleX0gKSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgJiYgJFRNQXJyUmVmLT57JEtleX0tPlsxXQogICAgICAgICAgICAgICAgICAgICYmIHJlZiggJFRNQXJyUmVmLT57JEtleX0tPlsxXSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRGF0YXskS2V5fSA9ICRUTUFyclJlZi0+eyRLZXl9LT5bMV0tPntDb250ZW50fSB8fCAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXN1bHR7Q291bnRVcGxvYWRlZH0rKzsKCiAgICAgICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzLi4uCiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyglQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRVcGRhdGVEYXRheyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICRVcGRhdGVEYXRheyRLZXl9ID0gJENvbmZpZ3skS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgI2NoZWNrIGZvciBJRCBhbmQgdXBkYXRlLi4uCiAgICAgICAgICAgIGlmICggJFVwZGF0ZURhdGF7SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFVwZGF0ZVJlc3VsdCA9IDA7CiAgICAgICAgICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gIiI7CiAgICAgICAgICAgICAgICBteSAkU3RhdHVzICAgICAgID0gIiI7CgogICAgICAgICAgICAgICAgbXkgJVRleHRNb2R1bGUyVSA9ICRTZWxmLT5UZXh0TW9kdWxlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRVcGRhdGVEYXRhe0lEfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISgga2V5cyglVGV4dE1vZHVsZTJVKSApICkgewogICAgICAgICAgICAgICAgICAgICRVcGRhdGVEYXRhe0lEfSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICJTcGVjaWZpZWQgdGV4dCBtb2R1bGUgSUQgKCIgLiAkVXBkYXRlRGF0YXtJRH0KICAgICAgICAgICAgICAgICAgICAgICAgLiAiKSBkb2VzIG5vdCBleGlzdCAtIGF0dGVtcHRpbmcgaW5zZXJ0LiAiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICN1cGRhdGUgdGV4dCBtb2R1bGUuLi4KICAgICAgICAgICAgICAgIGlmICggJFVwZGF0ZURhdGF7SUR9ICYmICRVcGRhdGVEYXRhe05hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRVcGRhdGVSZXN1bHQgPSAkU2VsZi0+VGV4dE1vZHVsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICA9PiAkVXBkYXRlRGF0YXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFVwZGF0ZURhdGF7VmFsaWRJRH0gfHwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dE1vZHVsZSA9PiAkVXBkYXRlRGF0YXtUZXh0TW9kdWxlfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5d29yZHMgICA9PiAkVXBkYXRlRGF0YXtLZXl3b3Jkc30gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlICAgPT4gJFVwZGF0ZURhdGF7TGFuZ3VhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRVcGRhdGVEYXRhe05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50MSAgID0+ICRVcGRhdGVEYXRhe0NvbW1lbnQxfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudDIgICA9PiAkVXBkYXRlRGF0YXtDb21tZW50Mn0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFnZW50ICAgICAgPT4gJFVwZGF0ZURhdGF7QWdlbnR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lciAgID0+ICRVcGRhdGVEYXRhe0N1c3RvbWVyfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljICAgICA9PiAkVXBkYXRlRGF0YXtQdWJsaWN9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRVcGRhdGVEYXRhe05hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRVcGRhdGVSZXN1bHQgPSAkU2VsZi0+VGV4dE1vZHVsZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkVXBkYXRlRGF0YXtWYWxpZElEfSAgICB8fCAxLAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0TW9kdWxlID0+ICRVcGRhdGVEYXRhe1RleHRNb2R1bGV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkcyAgID0+ICRVcGRhdGVEYXRhe0tleXdvcmRzfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSAgID0+ICRVcGRhdGVEYXRhe0xhbmd1YWdlfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRVcGRhdGVEYXRhe05hbWV9ICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50MSAgID0+ICRVcGRhdGVEYXRhe0NvbW1lbnQxfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50MiAgID0+ICRVcGRhdGVEYXRhe0NvbW1lbnQyfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBBZ2VudCAgICAgID0+ICRVcGRhdGVEYXRhe0FnZW50fSAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lciAgID0+ICRVcGRhdGVEYXRhe0N1c3RvbWVyfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgICAgID0+ICRVcGRhdGVEYXRhe1B1YmxpY30gICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZURhdGF7SUR9ID0gJFVwZGF0ZVJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgLj0gIk5hbWUgbm90IGdpdmVuISI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRVcGRhdGVSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAkUmVzdWx0e0NvdW50VXBkYXRlZH0rKzsKICAgICAgICAgICAgICAgICAgICAkU3RhdHVzID0gJ1VwZGF0ZSBPSyc7CgogICAgICAgICAgICAgICAgICAgICNkZWxldGUgZXhpc3RpbmcgcXVldWUgbGlua3MuLi4KICAgICAgICAgICAgICAgICAgICBpZiAoIHNjYWxhcigga2V5cyAleyAkVXBkYXRlRGF0YXtRdWV1ZUxpc3R9IH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRleHRNb2R1bGVRdWV1ZUxpbmtEZWxldGUoIElEID0+ICRVcGRhdGVEYXRhe0lEfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICJFeGlzdGluZyBxdWV1ZSBsaW5rcyBkZWxldGVkLiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHF1ZXVlLWxpbmtzLi4uCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDdXJySW5kZXggKCBrZXlzICV7ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEdpdmVuTmFtZSA9ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0tPnskQ3VyckluZGV4fS0+e05hbWV9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmROYW1lID0gJEdpdmVuTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEdpdmVuUUlEICA9ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0tPnskQ3VyckluZGV4fS0+e0lEfSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmRRSUQgID0gJEdpdmVuUUlEOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRHaXZlbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRGb3VuZFFJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkR2l2ZW5OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEdpdmVuUUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmROYW1lID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJEdpdmVuUUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAkR2l2ZW5OYW1lICYmICggJEdpdmVuTmFtZSBuZSAkRm91bmROYW1lICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEdpdmVuUUlEICYmICggJEdpdmVuUUlEICE9ICRGb3VuZFFJRCApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSAuPSAiIE5vIGxpbmsgY3JlYXRlZDogYW1iaWdvdXMgcXVldWUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBzcGVjaWZpY2F0aW9uIC0gIGdpdmVuIElEICgkR2l2ZW5RSUQpIGRvZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBub3QgbWF0Y2ggZ2l2ZW4gbmFtZSAoJEdpdmVuTmFtZSkuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkRm91bmRRSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICIgTm8gbGluayBjcmVhdGVkOiBmb3VuZCBubyBxdWV1ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiSUQgZm9yIGdpdmVuIG5hbWUgKCRHaXZlbk5hbWUpLiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VGV4dE1vZHVsZVF1ZXVlTGlua0NyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJEZvdW5kUUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRNb2R1bGVJRCA9PiAkVXBkYXRlRGF0YXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9ICAgICNFTyB1cGRhdGUgcXVldWUtbGlua3MKCiAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSBleGlzdGluZyB0aWNrZXQgdHlwZSBsaW5rcy4uLgogICAgICAgICAgICAgICAgICAgIGlmICggc2NhbGFyKCBrZXlzICV7ICRVcGRhdGVEYXRhe1RpY2tldFR5cGVMaXN0fSB9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5UZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtEZWxldGUoIElEID0+ICRVcGRhdGVEYXRhe0lEfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICJFeGlzdGluZyB0aWNrZXQgdHlwZSBsaW5rcyBkZWxldGVkLiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHRpY2tldCB0eXBlIGxpbmtzLi4uCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDdXJySW5kZXggKCBrZXlzICV7ICRVcGRhdGVEYXRhe1RpY2tldFR5cGVMaXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkR2l2ZW5OYW1lID0gJFVwZGF0ZURhdGF7VGlja2V0VHlwZUxpc3R9LT57JEN1cnJJbmRleH0tPntOYW1lfSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEZvdW5kTmFtZSA9ICRHaXZlbk5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHaXZlblRUSUQgPSAkVXBkYXRlRGF0YXtUaWNrZXRUeXBlTGlzdH0tPnskQ3VyckluZGV4fS0+e0lEfSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmRUVElEID0gJEdpdmVuVFRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkR2l2ZW5OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmRUVElEID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRHaXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkR2l2ZW5UVElEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmROYW1lID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgPT4gJEdpdmVuVFRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEdpdmVuTmFtZSAmJiAoICRHaXZlbk5hbWUgbmUgJEZvdW5kTmFtZSApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRHaXZlblRUSUQgJiYgKCAkR2l2ZW5UVElEICE9ICRGb3VuZFRUSUQgKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgLj0gIiBObyBsaW5rIGNyZWF0ZWQ6IGFtYmlnb3VzIHRpY2tldCB0eXBlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgc3BlY2lmaWNhdGlvbiAtICBnaXZlbiBJRCAoJEdpdmVuVFRJRCkgZG9lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG5vdCBtYXRjaCBnaXZlbiBuYW1lICgkR2l2ZW5OYW1lKS4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRGb3VuZFRUSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICIgTm8gbGluayBjcmVhdGVkOiBmb3VuZCBubyB0aWNrZXQgdHlwZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiSUQgZm9yIGdpdmVuIG5hbWUgKCRHaXZlbk5hbWUpLiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFR5cGVJRCA9PiAkRm91bmRUVElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRNb2R1bGVJRCA9PiAkVXBkYXRlRGF0YXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9ICAgICNFTyB1cGRhdGUgdGlja2V0IHR5cGUgbGlua3MKCiAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZSBzb21lIHN0YXR1cy9tZXNzYWdlIGZvciBmZWVkYmFjay4uLgogICAgICAgICAgICAgICAgICAgICRYTUxIYXNoWzFdLT57J1RleHRNb2R1bGVMaXN0J30tPlsxXS0+eydUZXh0TW9kdWxlRW50cnknfQogICAgICAgICAgICAgICAgICAgICAgICAtPlskVE1BcnJJbmRleF0tPntJbXBvcnRSZXN1bHRTdGF0dXN9ID0gJFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9LT5bMV0tPnsnVGV4dE1vZHVsZUVudHJ5J30KICAgICAgICAgICAgICAgICAgICAgICAgLT5bJFRNQXJySW5kZXhdLT57SW1wb3J0UmVzdWx0TWVzc2FnZX0gPSAkRXJyb3JNZXNzYWdlOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXN1bHR7Q291bnRVcGRhdGVGYWlsZWR9Kys7CiAgICAgICAgICAgICAgICAgICAgJFN0YXR1cyA9ICdVcGRhdGUgRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9LT5bMV0tPnsnVGV4dE1vZHVsZUVudHJ5J30KICAgICAgICAgICAgICAgICAgICAgICAgLT5bJFRNQXJySW5kZXhdLT57SW1wb3J0UmVzdWx0U3RhdHVzfSA9ICRTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgJFhNTEhhc2hbMV0tPnsnVGV4dE1vZHVsZUxpc3QnfS0+WzFdLT57J1RleHRNb2R1bGVFbnRyeSd9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+WyRUTUFyckluZGV4XS0+e0ltcG9ydFJlc3VsdE1lc3NhZ2V9ID0gJEVycm9yTWVzc2FnZTsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAjbm8gSUQgPT4gaW5zZXJ0L2FkZC4uLgogICAgICAgICAgICBlbHNpZiAoICEkUGFyYW17RG9Ob3RBZGR9ICkgewogICAgICAgICAgICAgICAgbXkgJE5ld0lEICAgICAgICA9IDA7CiAgICAgICAgICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gIiI7CiAgICAgICAgICAgICAgICBteSAkU3RhdHVzICAgICAgID0gIiI7CgogICAgICAgICAgICAgICAgI2luc2VydCBuZXcgdGV4dG1vZHVsZS4uLgogICAgICAgICAgICAgICAgaWYgKCAkVXBkYXRlRGF0YXtOYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkTmV3SUQgPSAkU2VsZi0+VGV4dE1vZHVsZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkVXBkYXRlRGF0YXtWYWxpZElEfSAgICB8fCAxLAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0TW9kdWxlID0+ICRVcGRhdGVEYXRhe1RleHRNb2R1bGV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkcyAgID0+ICRVcGRhdGVEYXRhe0tleXdvcmRzfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSAgID0+ICRVcGRhdGVEYXRhe0xhbmd1YWdlfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRVcGRhdGVEYXRhe05hbWV9ICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50MSAgID0+ICRVcGRhdGVEYXRhe0NvbW1lbnQxfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50MiAgID0+ICRVcGRhdGVEYXRhe0NvbW1lbnQyfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gIk5hbWUgbm90IGdpdmVuISI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCROZXdJRCkgewogICAgICAgICAgICAgICAgICAgICRSZXN1bHR7Q291bnRBZGRlZH0rKzsKICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRGF0YXtJRH0gPSAkTmV3SUQ7CiAgICAgICAgICAgICAgICAgICAgJFN0YXR1cyA9ICdJbnNlcnQgT0snOwoKICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHF1ZXVlLWxpbmtzLi4uCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDdXJySW5kZXggKCBrZXlzICV7ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEdpdmVuTmFtZSA9ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0tPnskQ3VyckluZGV4fS0+e05hbWV9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmROYW1lID0gJEdpdmVuTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEdpdmVuUUlEICA9ICRVcGRhdGVEYXRhe1F1ZXVlTGlzdH0tPnskQ3VyckluZGV4fS0+e0lEfSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmRRSUQgID0gJEdpdmVuUUlEOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRHaXZlbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRGb3VuZFFJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkR2l2ZW5OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEdpdmVuUUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmROYW1lID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJEdpdmVuUUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAkR2l2ZW5OYW1lICYmICggJEdpdmVuTmFtZSBuZSAkRm91bmROYW1lICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEdpdmVuUUlEICYmICggJEdpdmVuUUlEICE9ICRGb3VuZFFJRCApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSAuPSAiIE5vIGxpbmsgY3JlYXRlZDogYW1iaWdvdXMgcXVldWUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBzcGVjaWZpY2F0aW9uIC0gIGdpdmVuIElEICgkR2l2ZW5RSUQpIGRvZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBub3QgbWF0Y2ggZ2l2ZW4gbmFtZSAoJEdpdmVuTmFtZSkuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkRm91bmRRSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICIgTm8gbGluayBjcmVhdGVkOiBmb3VuZCBubyBxdWV1ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiSUQgZm9yIGdpdmVuIG5hbWUgKCRHaXZlbk5hbWUpLiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VGV4dE1vZHVsZVF1ZXVlTGlua0NyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJEZvdW5kUUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRNb2R1bGVJRCA9PiAkVXBkYXRlRGF0YXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9ICAgICNFTyB1cGRhdGUgcXVldWUtbGlua3MKCiAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSBleGlzdGluZyB0aWNrZXQgdHlwZSBsaW5rcy4uLgogICAgICAgICAgICAgICAgICAgIGlmICggc2NhbGFyKCBrZXlzICV7ICRVcGRhdGVEYXRhe1RpY2tldFR5cGVMaXN0fSB9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5UZXh0TW9kdWxlVGlja2V0VHlwZUxpbmtEZWxldGUoIElEID0+ICRVcGRhdGVEYXRhe0lEfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICJFeGlzdGluZyB0aWNrZXQgdHlwZSBsaW5rcyBkZWxldGVkLiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHRpY2tldCB0eXBlIGxpbmtzLi4uCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDdXJySW5kZXggKCBrZXlzICV7ICRVcGRhdGVEYXRhe1RpY2tldFR5cGVMaXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkR2l2ZW5OYW1lID0gJFVwZGF0ZURhdGF7VGlja2V0VHlwZUxpc3R9LT57JEN1cnJJbmRleH0tPntOYW1lfSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEZvdW5kTmFtZSA9ICRHaXZlbk5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHaXZlblRUSUQgPSAkVXBkYXRlRGF0YXtUaWNrZXRUeXBlTGlzdH0tPnskQ3VyckluZGV4fS0+e0lEfSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkRm91bmRUVElEID0gJEdpdmVuVFRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkR2l2ZW5OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmRUVElEID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRHaXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkR2l2ZW5UVElEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmROYW1lID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgPT4gJEdpdmVuVFRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEdpdmVuTmFtZSAmJiAoICRHaXZlbk5hbWUgbmUgJEZvdW5kTmFtZSApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRHaXZlblRUSUQgJiYgKCAkR2l2ZW5UVElEICE9ICRGb3VuZFRUSUQgKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgLj0gIiBObyBsaW5rIGNyZWF0ZWQ6IGFtYmlnb3VzIHRpY2tldCB0eXBlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgc3BlY2lmaWNhdGlvbiAtICBnaXZlbiBJRCAoJEdpdmVuVFRJRCkgZG9lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG5vdCBtYXRjaCBnaXZlbiBuYW1lICgkR2l2ZW5OYW1lKS4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRGb3VuZFRUSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlIC49ICIgTm8gbGluayBjcmVhdGVkOiBmb3VuZCBubyB0aWNrZXQgdHlwZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiSUQgZm9yIGdpdmVuIG5hbWUgKCRHaXZlbk5hbWUpLiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VGV4dE1vZHVsZVRpY2tldFR5cGVMaW5rQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFR5cGVJRCA9PiAkRm91bmRUVElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRNb2R1bGVJRCA9PiAkVXBkYXRlRGF0YXtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9ICAgICNFTyB1cGRhdGUgdGlja2V0IHR5cGUgbGlua3MKCiAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZSBzb21lIHN0YXR1cy9tZXNzYWdlIGZvciBmZWVkYmFjay4uLgogICAgICAgICAgICAgICAgICAgICRYTUxIYXNoWzFdLT57J1RleHRNb2R1bGVMaXN0J30tPlsxXS0+eydUZXh0TW9kdWxlRW50cnknfQogICAgICAgICAgICAgICAgICAgICAgICAtPlskVE1BcnJJbmRleF0tPntJbXBvcnRSZXN1bHRTdGF0dXN9ID0gJFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9LT5bMV0tPnsnVGV4dE1vZHVsZUVudHJ5J30KICAgICAgICAgICAgICAgICAgICAgICAgLT5bJFRNQXJySW5kZXhdLT57SW1wb3J0UmVzdWx0TWVzc2FnZX0gPSAkRXJyb3JNZXNzYWdlOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXN1bHR7Q291bnRJbnNlcnRGYWlsZWR9Kys7CiAgICAgICAgICAgICAgICAgICAgJFN0YXR1cyA9ICdJbnNlcnQgRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICAkWE1MSGFzaFsxXS0+eydUZXh0TW9kdWxlTGlzdCd9LT5bMV0tPnsnVGV4dE1vZHVsZUVudHJ5J30KICAgICAgICAgICAgICAgICAgICAgICAgLT5bJFRNQXJySW5kZXhdLT57SW1wb3J0UmVzdWx0U3RhdHVzfSA9ICRTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgJFhNTEhhc2hbMV0tPnsnVGV4dE1vZHVsZUxpc3QnfS0+WzFdLT57J1RleHRNb2R1bGVFbnRyeSd9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+WyRUTUFyckluZGV4XS0+e0ltcG9ydFJlc3VsdE1lc3NhZ2V9ID0gJEVycm9yTWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkUmVzdWx0e1hNTFJlc3VsdFN0cmluZ30gPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyWE1MKEBYTUxIYXNoKTsKCiAgICByZXR1cm4gXCVSZXN1bHQ7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQkVHSU4gRlJPTlRFTkQtT1VUUFVULVJFTEFURUQgRlVOQ1RJT05TCgo9aXRlbSBTaG93QWxsVGV4dE1vZHVsZXMoKQoKUmV0dXJucyBIVE1MLW91dHB1dCBmb3IgYWxsIHRleHRtb2R1bGVzIGZvciBhIHNwZWNpZmllZCBxdWV1ZS4KCiAgICBteSAkSGFzaFJlZiA9ICRUZXh0TW9kdWxlT2JqZWN0LT5TaG93QWxsVGV4dE1vZHVsZXMoCiAgICAgICAgUXVldWVJRCA9PiAxMjMsICAgICAjcmVxdWlyZWQKICAgICAgICAlVGlja2V0RGF0YSwgICAgICAgICNvcHRpb25hbAogICAgICAgICVDdXN0b21lclVzZXJEYXRhLAogICAgICAgIEFnZW50ICAgICAgPT4gMSwgICAgI29wdGlvbmFsLCBzZXQgYXV0b20uIGlmIG5laXRoZXIgQ3VzdG9tZXIgbm9yIFB1YmxpYyBpcyBzZXQKICAgICAgICBDdXN0b21lciAgID0+IDEsICAgICNvcHRpb25hbAogICAgICAgIFB1YmxpYyAgICAgPT4gMSwgICAgI29wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFNob3dBbGxUZXh0TW9kdWxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICByZXR1cm4gaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICk7CgogICAgIyBnZXQgYXZhaWxhYmxlIHRleHQgbW9kdWxlcwogICAgbXkgJEF2YWlsYWJsZVRleHRNb2RSZWYgPSAkU2VsZi0+VGV4dE1vZHVsZUdldEJ5UXVldWVJRCgKICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBhbnkgYXZhaWxpYmxlIHRleHQgbW9kdWxlLi4uCiAgICByZXR1cm4gaWYgKCAhJEF2YWlsYWJsZVRleHRNb2RSZWYgfHwgIXNjYWxhcigga2V5cyggJXskQXZhaWxhYmxlVGV4dE1vZFJlZn0gKSApICk7CgogICAgIyBnZXQgdGV4dCBtb2R1bGVzIGNvbnRlbnQKICAgIG15ICVUZXh0TW9kdWxlU2hvd0RhdGEgICAgPSAoKTsKICAgIG15ICVUZXh0TW9kdWxlQ29udGVudERhdGEgPSAleyRBdmFpbGFibGVUZXh0TW9kUmVmfTsKCiAgICAjIHJlcGxhY2Ugc29tZSB0ZXh0IG1vZHVsZSBwbGFjZWhvbGRlcgogICAgZm9yIG15ICRJZCAoIGtleXMgJVRleHRNb2R1bGVDb250ZW50RGF0YSApIHsKICAgICAgICBteSAkVGFnICAgPSAnJzsKICAgICAgICBteSAkVGFnMiAgPSAnJzsKICAgICAgICBteSAkU3RhcnQgPSAnPCc7CiAgICAgICAgbXkgJEVuZCAgID0gJz4nOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgICAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gcy8oXG58XHIpLy9nOwogICAgICAgIH0KCiAgICAgICAgJFRleHRNb2R1bGVTaG93RGF0YXskSWR9ID0gJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57TmFtZX0KICAgICAgICAgICAgLiAiICgiCiAgICAgICAgICAgIC4gJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57TGFuZ3VhZ2V9CiAgICAgICAgICAgIC4gIikiOwoKICAgICAgICBuZXh0IGlmICRQYXJhbXtOb1JlcGxhY2V9OwoKICAgICAgICAkVGFnID0gJ09UUlNfQ1VTVE9NRVJfUkVBTE5BTUUnOwogICAgICAgIGlmICggJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gLyRTdGFydCRUYWckRW5kLyApIHsKICAgICAgICAgICAgbXkgJEZyb20gPSAnJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgJEZyb20gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkRnJvbSApIHsKICAgICAgICAgICAgICAgICRGcm9tID0gJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gfHwgJyc7CiAgICAgICAgICAgICAgICAkRnJvbSA9fiBzLyRTdGFydC4qJEVuZHxcKC4qXCl8XCJ8O3wsLy9nOwogICAgICAgICAgICAgICAgJEZyb20gPX4gcy8oICQpfCggICQpLy9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+IHMvJFN0YXJ0JFRhZyRFbmQvJEZyb20vZzsKICAgICAgICB9CgogICAgICAgICMgY3VycmVudCB1c2VyCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgICRUYWcgID0gJ09UUlNfQWdlbnRfJzsKICAgICAgICAkVGFnMiA9ICdPVFJTX0NVUlJFTlRfJzsKICAgICAgICBmb3IgbXkgJFVzZXJLZXkgKCBrZXlzICVVc2VyICkgewogICAgICAgICAgICBpZiAoICRVc2VyeyRVc2VyS2V5fSApIHsKICAgICAgICAgICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+CiAgICAgICAgICAgICAgICAgICAgcy8kU3RhcnQkVGFnJFVzZXJLZXkkRW5kLyRVc2VyeyRVc2VyS2V5fS9naTsKICAgICAgICAgICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+CiAgICAgICAgICAgICAgICAgICAgcy8kU3RhcnQkVGFnMiRVc2VyS2V5JEVuZC8kVXNlcnskVXNlcktleX0vZ2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+IHMvJFN0YXJ0JFRhZy4rPyRFbmQvLS9naTsKICAgICAgICAkVGV4dE1vZHVsZUNvbnRlbnREYXRheyRJZH0tPntUZXh0TW9kdWxlfSA9fiBzLyRTdGFydCRUYWcyLis/JEVuZC8tL2dpOwoKICAgICAgICAjIHJlcGxhY2Ugb3RoZXIgbmVlZGVkIHN0dWZmCiAgICAgICAgJFRhZyAgPSAnT1RSU19GSVJTVF9OQU1FJzsKICAgICAgICAkVGFnMiA9ICdPVFJTX0xBU1RfTkFNRSc7CiAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4KICAgICAgICAgICAgcy8kU3RhcnQkVGFnJEVuZC8kUGFyYW17VXNlckZpcnN0bmFtZX0vZzsKICAgICAgICAkVGV4dE1vZHVsZUNvbnRlbnREYXRheyRJZH0tPntUZXh0TW9kdWxlfSA9fiBzLyRTdGFydCRUYWcyJEVuZC8kUGFyYW17VXNlckxhc3RuYW1lfS9nOwoKICAgICAgICAjIG93bmVyIHVzZXIKICAgICAgICAkVGFnID0gJ09UUlNfT1dORVJfJzsKICAgICAgICBpZiAoICRQYXJhbXtPd25lcklEfSApIHsKICAgICAgICAgICAgbXkgJU93bmVyVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtPd25lcklEfSwKICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJLZXkgKCBrZXlzICVPd25lclVzZXIgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRPd25lclVzZXJ7JFVzZXJLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+CiAgICAgICAgICAgICAgICAgICAgICAgIHMvJFN0YXJ0JFRhZyRVc2VyS2V5JEVuZC8kT3duZXJVc2VyeyRVc2VyS2V5fS9naTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gcy8kU3RhcnQkVGFnLis/JEVuZC8tL2dpOwoKICAgICAgICAjIHJlc3BvbnNpYmxlIHVzZXIKICAgICAgICAkVGFnID0gJ09UUlNfUkVTUE9OU0lCTEVfJzsKICAgICAgICBpZiAoICRQYXJhbXtSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgbXkgJVJlc3BvbnNpYmxlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJLZXkgKCBrZXlzICVSZXNwb25zaWJsZVVzZXIgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRSZXNwb25zaWJsZVVzZXJ7JFVzZXJLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+CiAgICAgICAgICAgICAgICAgICAgICAgIHMvJFN0YXJ0JFRhZyRVc2VyS2V5JEVuZC8kUmVzcG9uc2libGVVc2VyeyRVc2VyS2V5fS9naTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gcy8kU3RhcnQkVGFnLis/JEVuZC8tL2dpOwoKICAgICAgICAjIHJlcGxhY2UgdGlja2V0IGRhdGEKICAgICAgICAkVGFnID0gJ09UUlNfVElDS0VUXyc7CiAgICAgICAgZm9yIG15ICRUaWNrZXRLZXkgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17JFRpY2tldEtleX0gKSB7CiAgICAgICAgICAgICAgICAkVGV4dE1vZHVsZUNvbnRlbnREYXRheyRJZH0tPntUZXh0TW9kdWxlfSA9fgogICAgICAgICAgICAgICAgICAgIHMvJFN0YXJ0JFRhZyRUaWNrZXRLZXkkRW5kLyRQYXJhbXskVGlja2V0S2V5fS9naTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwIGFsbCBub3QgbmVlZGVkIDxPVFJTX1RJQ0tFVF8gdGFncwogICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+IHMvJFN0YXJ0JFRhZy4rPyRFbmQvLS9naTsKCiAgICAgICAgIyBjdXN0b21lciBkYXRhCiAgICAgICAgbXkgJUN1c3RvbWVyID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJEYXRhfSAmJiByZWYoICRQYXJhbXtDdXN0b21lckRhdGF9ICkgZXEgIkhBU0giICkgewogICAgICAgICAgICAlQ3VzdG9tZXIgPSAleyAkUGFyYW17Q3VzdG9tZXJEYXRhfSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGN1c3RvbWVyIGRhdGEKICAgICAgICAkVGFnICA9ICdPVFJTX0NVU1RPTUVSXyc7CiAgICAgICAgJFRhZzIgPSAnT1RSU19DVVNUT01FUl9EQVRBXyc7CiAgICAgICAgZm9yIG15ICRDdXN0b21lcktleSAoIGtleXMgJUN1c3RvbWVyICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lcnskQ3VzdG9tZXJLZXl9ICkgewogICAgICAgICAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4KICAgICAgICAgICAgICAgICAgICBzLyRTdGFydCRUYWckQ3VzdG9tZXJLZXkkRW5kLyRDdXN0b21lcnskQ3VzdG9tZXJLZXl9L2dpOwogICAgICAgICAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4KICAgICAgICAgICAgICAgICAgICBzLyRTdGFydCRUYWcyJEN1c3RvbWVyS2V5JEVuZC8kQ3VzdG9tZXJ7JEN1c3RvbWVyS2V5fS9naTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwIGFsbCBub3QgbmVlZGVkIDxPVFJTX0NVU1RPTUVSXyB0YWdzCiAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gcy8kU3RhcnQkVGFnLis/JEVuZC8tL2dpOwogICAgICAgICRUZXh0TW9kdWxlQ29udGVudERhdGF7JElkfS0+e1RleHRNb2R1bGV9ID1+IHMvJFN0YXJ0JFRhZzIuKz8kRW5kLy0vZ2k7CgogICAgICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgICAgICRUYWcgPSAnT1RSU19DT05GSUdfJzsKICAgICAgICAkVGV4dE1vZHVsZUNvbnRlbnREYXRheyRJZH0tPntUZXh0TW9kdWxlfSA9fgogICAgICAgICAgICBzeyRTdGFydCRUYWcoLis/KSRFbmR9eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CiAgICAgICAgJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0gPX4gcy8kU3RhcnQkVGFnLis/JEVuZC8tL2dpOwogICAgfQoKICAgICMgb3V0cHV0IHRleHQgbW9kdWxlIGNvbnRlbnQgZGF0YQogICAgZm9yIG15ICRJZCAoIGtleXMgJVRleHRNb2R1bGVDb250ZW50RGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZXh0TW9kdWxlQ29udGVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSUQgICAgICAgPT4gJElkLAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFRleHRNb2R1bGVDb250ZW50RGF0YXskSWR9LT57VGV4dE1vZHVsZX0sCiAgICAgICAgICAgICAgICBLZXl3b3JkcyA9PiAkVGV4dE1vZHVsZUNvbnRlbnREYXRheyRJZH0tPntLZXl3b3Jkc30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17J1RleHRNb2R1bGVTZWxlY3Rpb24nfSA9ICRQYXJhbXsnVGV4dE1vZHVsZVNlbGVjdGlvbid9OwogICAgfQoKICAgICMgb3V0cHV0IHRleHQgbW9kdWxlIHNlbGVjdGlvbiBsaXN0CiAgICAkUGFyYW17J1RleHRNb2R1bGVTZWxlY3Rpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVRleHRNb2R1bGVTaG93RGF0YSwKICAgICAgICBOYW1lICAgICAgID0+ICdUZXh0TW9kdWxlcycsCiAgICAgICAgU2l6ZSAgICAgICA9PiAxNSwKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgT25DbGljayAgICA9PiAnc2hvd1RleHRtb2R1bGUodGhpc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKScsCiAgICAgICAgT25EYmxDbGljayA9PiAndXBkYXRlVGV4dG1vZHVsZSh0aGlzW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywKICAgICAgICBTb3J0ICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVGl0bGUgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAtPkdldCgnRG91YmxlIGNsaWNrIG9uIHRoZSB0ZXh0IG1vZHVsZSwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBib2R5JyksCiAgICAgICAgIyMjQWpheFVwZGF0ZQogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdUZXh0TW9kdWxlc1NlbGVjdGlvbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cgp9CgojIEVORCBGUk9OVEVORC1PVVRQVVQtUkVMQVRFRCBGVU5DVElPTlMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjE7Cg==
IyAtLQojIFRleHRNb2R1bGVzLnBtIC0gY29kZSBydW4gZHVyaW5nIHBhY2thZ2UgZGUtL2luc3RhbGxhdGlvbgojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgICBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUtaXQuZGUKIwojIC0tCiMgJElkOiBUZXh0TW9kdWxlcy5wbSx2IDEuNSAyMDEwLTA2LTE1IDE0OjA3OjQ5IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpUZXh0TW9kdWxlczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpPVFJTX0NpQ1MucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6Ok9UUlMtQ2lDUy1JVFNNLnBtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBFbmNvZGVPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRUeXBlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e1RpY2tldFR5cGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9TZXRGcm9udGVuZERlZmF1bHRzKCk7CiAgICAkU2VsZi0+X1NldFRpY2tldFR5cGVEZWZhdWx0cygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9TZXRGcm9udGVuZERlZmF1bHRzKCk7CiAgICAkU2VsZi0+X1NldFRpY2tldFR5cGVEZWZhdWx0cygpOwoKICAgICMgZGVsZXRlIGNhY2hlIGZvciBpbnN0YWxsZWQgQ2lDUy12ZXJzaW9uCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdEYXNoYm9hcmRDaUNTTm90aWZ5JywKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUgZm9yIGluc3RhbGxlZCBDaUNTLXZlcnNpb24KICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZENpQ1NOb3RpZnknLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgY2FjaGUgZm9yIGluc3RhbGxlZCBDaUNTLXZlcnNpb24KICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZENpQ1NOb3RpZnknLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9TZXRGcm9udGVuZERlZmF1bHRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhc3NpZ24gYWxsIHRleHRfbW9kdWxlcyB3aGljaCBhcmUgbm90IGFzc2lnbmVkIHRvIG9uZSBvZiB0aGUKICAgICMgZnJvbnRlbmRzIHRvIGFnZW50IGZyb250ZW5kLi4uCiAgICBteSAkU1FMX1N0cmluZyA9ICJVUERBVEUgdGV4dF9tb2R1bGUgIjsKICAgICRTUUxfU3RyaW5nIC49ICJTRVQgYWdlbnQgPSAxICAiOwogICAgJFNRTF9TdHJpbmcgLj0gIldIRVJFIChhZ2VudCBJUyBOVUxMIE9SIGFnZW50ID0gMCkgIgogICAgICAgIC4gIkFORCAoY3VzdG9tZXIgSVMgTlVMTCBPUiBjdXN0b21lciA9IDApICIKICAgICAgICAuICJBTkQgKHB1YmxpYyBJUyBOVUxMIE9SIHB1YmxpYyA9IDApOyAiOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTF9TdHJpbmcgKTsKCiAgICByZXR1cm4gMDsKfQoKc3ViIF9TZXRUaWNrZXRUeXBlRGVmYXVsdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFzc2lnbiBhbGwgdGV4dCBtb2R1bGVzIHdpdGhvdXQgYW55IHRpY2tldCB0eXBlIGFzc2lnbm1lbnQgdG8KICAgICMgYWxsIHZhbGlkIHRpY2tldHR5cGVzLi4uCiAgICBteSAlVGlja2V0VHlwZURhdGEgPSAkU2VsZi0+e1RpY2tldFR5cGVPYmplY3R9LT5UeXBlTGlzdCggVmFsaWQgPT4gMSApOwogICAgbXkgQFRleHRNb2R1bGVJRHMgPSBxd3t9OwoKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gdGV4dF9tb2R1bGUgdG0gV0hFUkUgdG0uaWQgIgogICAgICAgIC4gIk5PVCBJTiggU0VMRUNUIHR0LnRleHRfbW9kdWxlX2lkIEZST00gdGlja2V0X3R5cGVfdGV4dF9tb2R1bGUgdHQpIjsKCiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKCBteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCggQFRleHRNb2R1bGVJRHMsICREYXRhWzBdICk7CiAgICB9CgogICAgZm9yIG15ICRUTUlEIChAVGV4dE1vZHVsZUlEcykgewogICAgICAgIGZvciBteSAkVFRJRCAoIGtleXMoJVRpY2tldFR5cGVEYXRhKSApIHsKICAgICAgICAgICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyB0aWNrZXRfdHlwZV90ZXh0X21vZHVsZSAiCiAgICAgICAgICAgICAgICAuICIgKHRpY2tldF90eXBlX2lkLCB0ZXh0X21vZHVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkiCiAgICAgICAgICAgICAgICAuICIgVkFMVUVTICAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KSI7CgogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJFNRTCwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRUSUQsIFwkVE1JRCwgXDEsIFwxIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDEwLTA2LTE1IDE0OjA3OjQ5ICQKPWN1dAo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAOCAYAAAArMezNAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kGBRcrAsBsy2UAAADXSURBVDjLxZKxCoMwEIb/aIQsbg6+QBcnQXycPrEgAcGlm4sOJoMG4mC4DtWOaqul33LcwX3D3c+apiHP8+D7Pq7COQceBAHiOMaVdF0HDz/if2LnHIjo3RMR5nk+J7bWoqoqaK1BRCAiaK1RliXGcfxezBjDMAyQUkIpBaUUpJSw1u6miLVtS1upmKYJRVGg73sAQBRFyPMcQojNVPC9WwkhkKYp6roGACRJsild4Uc+HIYhsix7LfBDK8fEnwh/nmO+fv5KGGPgxpi7Mea2zIqTznypjyeIultnPNDWLQAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAABYAAAAOCAYAAAArMezNAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kHBww7G2nf3F4AAADgSURBVDjLtZKrboVAEEAPBcEKEPwCqUFhkPxJfxhqUJjiELsCR7KQZR8VbZrU3NJ7ucdMJpk5mZlMNE3TG/DKF+88RvMdPyKlVBBCcCXbtpGEEMjz/FKx1poXnsRpsbUWa+1pcXKmaF1XxnEEoKoqsix7XLzvO8MwsCwLAMYYmqYhTdP7T6G1pus6jDG0bUvbthhj6Puefd/vn9g5hxCCsiwpigKAuq6Z55kQwu1VpZThFsdxBO/9T+69D9bamz1SyvDnjZPkd0kURcRxfN27Pe2P/0vinEMpdZnQOYf3nk/2bKfnxDeK+QAAAABJRU5ErkJggg==
IyAtLQojIENIQU5HRVNfVGV4dE1vZHVsZXMgLSBjaGFuZ2UgbG9nIG9mIFRleHRNb2R1bGVzCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlLwojIC0tCiMgJElkOiBDSEFOR0VTX1RleHRNb2R1bGVzLHYgMS4yOCAyMDEwLTA3LTA5IDEwOjExOjU1IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjIuMSAoMjAxMC8wNy8wOSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMC8wNy8wOSkgLSBCdWdmaXg6IGNoZWNrIGZvciB2YWx1ZSBhbmQgbm90IGRlZmluZWQgVGlja2V0VHlwZUlEIGluIEtlcm5lbDo6U3lzdGVtOjpUZXh0TW9kdWxlOjpUZXh0TW9kdWxlR2V0QnlUaWNrZXRUeXBlSUQKIyAqICgyMDEwLzA2LzIxKSAtIEJ1Z2ZpeDogc2V0IG1lc3NhZ2UgdHlwZSBub3RlIFRleHRNb2R1bGVHZXRCeVF1ZXVlQW5kVGlja2V0VHlwZUlEIGlmIG5vIFRpY2tldFR5cGVJRCBnaXZlbgojIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS4yLjAgKDIwMTAvMDYvMTgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTAvMDYvMTUpIC0gQ1I6IGFkZGVkIHRpY2tldCB0eXBlIGFzc2lnbm1lbnQgb2YgdGV4dCBtb2R1bGVzCiMgKiAoMjAxMC8wNi8xMCkgLSBDUjogYWRkZWQgdGV4dG1vZHVsZSBhdHRyaWJ1dGUgZm9yIHVzZSBpbiBDdXN0b21lckZyb250ZW5kCiMgKiAoMjAxMC8wNi8xMCkgLSBDUjogaW1wcm92ZWQgbGF5b3V0IGZvciBUZXh0TW9kdWxlc1NlbGVjdGlvbgojICogKDIwMTAvMDYvMTApIC0gQ1I6IHJlbW92ZWQgc3VwcG9ydCBmb3IgT1RSUyBmcmFtZXdvcmsgMi4zLngKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS4xLjQgKDIwMTAvMDQvMTYpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTAvMDQvMTYpIC0gQ1I6IGltcHJvdmVkIHBsYWNlaG9sZGVyLWhhbmRsZSAoZXNwZWNpYWxseSBSaWNodGV4dCkKIyAqICgyMDEwLzA0LzE2KSAtIEZSOiBhZGRlZCBvcHRpb24gdG8gTk9UIHJlcGxhY2UgcGxhY2Vob2xkZXIKIyAqICgyMDEwLzA0LzEzKSAtIEJ1Z2ZpeDogbmV3IFJlcXVpcmVtZW50IGZvciBDaUNTLCBjYXVzZSBvZiBlcnJvcnMgb24gSlNPTi1VcGRhdGVzCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMS4zICgyMDEwLzA0LzA3KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDEwLzAzLzE1KSAtIEJ1Z2ZpeDogYWRkZWQgbWlzc2luZyBkZXBlbmRlbmN5IChFbmNvZGVPYmplY3QpCiMgKiAoMjAxMC8wMy8wMykgLSBCdWdmaXg6IHdyb25nIHRpdGxlcyBpbiBxdWV1ZS10ZXh0IG1vZHVsZS1zZWxlY3Rpb24KIyAqICgyMDEwLzAxLzI2KSAtIENSOiBhZGRlZCBzb3J0IG9wdGlvbiBmb3IgIFRleHRNb2R1bGUuCiMgKiAoMjAwOS8xMS8yNykgLSBCdWdmaXg6IGVtcHR5IHF1ZXVlIHNlbGVjdGlvbiBpbiBBZG1pblRleHRNb2R1bGVzCiMgKiAoMjAwOS8xMS8yNykgLSBCdWdmaXg6IEphdmFzY3JpcHQgZm9yIHBhc3RlIGFjdGlvbiBkb2VzIG5vdCB3b3JrIGluIGV2ZXJ5IGZvcm0gCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMS4yICgyMDA5LzEwLzE0KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzEwLzE0KSAtIEJ1Z2ZpeDogcGxhY2Vob2xkZXIuCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMS4xIC0tLS0tLS0tICgyMDA5LzEwLzE0KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzEwLzEzKSAtIGFkZGVkIFJpY2hUZXh0RWRpdG9yIGluIEFkbWluVGV4dE1vZHVsZXMKIyAqICgyMDA5LzEwLzEzKSAtIEFkZGVkIGNvbmZpZyBvcHRpb24gZm9yIGRlZmF1bHQgdmFsdWVzIGZvciBUZXh0TW9kdWxlIHVwbG9hZAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjEuMCAoMjAwOS8wOS8yOCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAwOS8wOS8xMCkgLSBCdWdmaXg6IEpTLWJ1ZyBpbiBBZGQtVE0gd2hlbiBubyBsYW5ndWFnZSBzZWxlY3RlZAojICogKDIwMDkvMDgvMTcpIC0gYWRkZWQgbW9kaWZpY2F0aW9ucyBmb3IgT1RSUy1mcmFtZXdvcmsgMi40LnguCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4wIC0oMjAwOS8wOS8xMCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzA5LzEwKSAtIEZpcnN0IHZlcnNpb24gZm9yIHByb2R1Y3RpdmUgdXNlLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjIuMyAoMjAwOS8wOC8wNSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAwOS8wOC8wNSkgLSBCdWdmaXg6IGFkZGVkIG1pc3NpbmcgaW1hZ2VzIHRvIHBhY2thZ2UKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC4yLjIgKDIwMDkvMDgvMDUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMDgvMDUpIC0gQ1I6IGltcHJvdmVkIGRpc3BsYXkgb2YgdGV4dG1vZHVsZSBzZWxlY3Rpb24KIyAqICgyMDA5LzA3LzMwKSAtIENSOiBxdWV1ZSBzZWxlY3Rpb24gbWF5IGJlIGxpbWl0ZWQgYnkgTGFuZ3VhZ2VRdWV1ZU1hdGNoaW5nCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuMi4xICgyMDA5LzA3LzIyKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzA3LzIyKSAtIEJ1Z2ZpeDogYWRkZWQgbWlzc2luZyBmaWxlIEFkbWluUXVldWVUZXh0TW9kdWxlc0NoYW5nZUZvcm0uZHRsCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuMi4wICgyMDA5LzA3LzIyKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzA3LzIyKSAtIEZpcnN0IHZlcnNpb24gb2YgbmV3IHBhY2thZ2UgKHByZXByb2R1Y3RpdmUpIAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCg==