ImportExport
2.0.93
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.0 beta3.
Build for OTRS::ITSM 2.1.0 beta2.
Build for OTRS::ITSM 2.1.0 beta1.
Build for OTRS::ITSM 2.1.0 alpha1.
The ImportExport package.
Das ImportExport Paket.
2.4.x
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
((enjoy))<br>
<br>
# define function name
my $FunctionName = 'CodeUpgradeFromBefore_2_0_3';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2010-09-07 16:22:30
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBJbXBvcnRFeHBvcnQucGwgLSBpbXBvcnQvZXhwb3J0IHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBsLHYgMS4xNCAyMDEwLzAyLzIzIDEyOjA4OjQ2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OICRSZWFsQmluKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTQgJCkgWzFdOwoKIyBnZXQgb3B0aW9ucwpteSAlT3B0czsKZ2V0b3B0cyggJ2huOmE6aTpvOicsIFwlT3B0cyApOwoKaWYgKCAkT3B0c3tofSApIHsKCiAgICBwcmludCBTVERPVVQgIkltcG9ydEV4cG9ydC5wbCA8UmV2aXNpb24gJFZFUlNJT04+IC0gYW4gaW1wb3J0L2V4cG9ydCB0b29sXG4iOwogICAgcHJpbnQgU1RET1VUICJDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvXG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgInVzYWdlOkltcG9ydEV4cG9ydC5wbCAtbiA8VGVtcGxhdGVOdW1iZXI+IC1hIGltcG9ydHxleHBvcnQgIjsKICAgIHByaW50IFNURE9VVCAiWy1pIDxTb3VyY2VGaWxlPl0gWy1vIDxEZXN0aW5hdGlvbkZpbGU+XVxuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICIgICBleGFtcGxlczpcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBJbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgaW1wb3J0IC1pIC90bXAvaW1wb3J0LmNzdlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgICAgIEltcG9ydEV4cG9ydC5wbCAtbiAwMDAwNCAtYSBleHBvcnQgLW8gL3RtcC9leHBvcnQuY3N2XG4iOwoKICAgIGV4aXQgMTsKfQoKIyBjaGVjayB0ZW1wYWx0ZSBudW1iZXIKaWYgKCAhJE9wdHN7bn0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1uIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9CmlmICggJE9wdHN7bn0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBJbnZhbGlkIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9Cm15ICRUZW1wbGF0ZUlEID0gaW50ICRPcHRze259OwoKIyBjaGVjayBhY3Rpb24gbW9kZQppZiAoICEkT3B0c3thfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IE5lZWQgLWEgaW1wb3J0fGV4cG9ydFxuIjsKICAgIGV4aXQgMTsKfQppZiAoIGxjICRPcHRze2F9IG5lICdpbXBvcnQnICYmIGxjICRPcHRze2F9IG5lICdleHBvcnQnICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBhY3Rpb25cbiI7CiAgICBleGl0IDE7Cn0KCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3Q7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgTG9nUHJlZml4ID0+ICdPVFJTLUltcG9ydEV4cG9ydCcsCiAgICAlQ29tbW9uT2JqZWN0LAopOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIGdldCB0ZW1wbGF0ZSBkYXRhCm15ICRUZW1wbGF0ZURhdGEgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCmlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IFRlbXBsYXRlICRPcHRze259IG5vdCBmb3VuZCFcbiI7CiAgICBwcmludCBTVERFUlIgIkV4cG9ydCBhYm9ydGVkLlxuIjsKICAgIGV4aXQgMTsKfQoKIyB0aW1lIHRvIHN0YXJ0CmlmICggbGMgJE9wdHN7YX0gZXEgJ2ltcG9ydCcgKSB7CgogICAgbXkgJFNvdXJjZUNvbnRlbnQgPSBcZG8geycnfTsKICAgIGlmICggJE9wdHN7aX0gKSB7CgogICAgICAgIHByaW50IFNURE9VVCAiUmVhZCBGaWxlICRPcHRze2l9LlxuIjsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgJFNvdXJjZUNvbnRlbnQgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJE9wdHN7aX0sCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgZGllICJDYW4ndCByZWFkIGZpbGUgJE9wdHN7aX0uXG5JbXBvcnQgYWJvcnRlZC5cbiIgaWYgISRTb3VyY2VDb250ZW50OwogICAgfQoKICAgIHByaW50IFNURE9VVCAiSW1wb3J0IGluIHByb2Nlc3MuLi5cbiI7CgogICAgIyBpbXBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+SW1wb3J0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU291cmNlQ29udGVudCwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKICAgIGRpZSAiXG5FcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSB0aGUgT1RSUyBsb2cgZm9yIGRldGFpbHMuXG4iIGlmICFkZWZpbmVkICRSZXN1bHQ7CgogICAgIyBQcmludCByZXN1bHQKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUCiAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0LT57Q291bnRlcn0gJFJlc3VsdC0+e09iamVjdH0gcmVjb3JkczogIgogICAgICAgIC4gIiRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZCwgJFJlc3VsdC0+e1N1Y2Nlc3N9IHN1Y2NlZWRlZFxuIjsKICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0LT57UmV0Q29kZX0gfSApIHsKICAgICAgICBteSAkQ291bnQgPSAkUmVzdWx0LT57UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICBwcmludCBTVERPVVQKICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0LT57Q291bnRlcn0gJFJlc3VsdC0+e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlXG4iLAogICAgfQogICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICBwcmludCBTVERPVVQKICAgICAgICAgICAgIkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlOiAkUmVzdWx0LT57Q291bnRlcn1cbiI7CiAgICB9Cn0KZWxzaWYgKCBsYyAkT3B0c3thfSBlcSAnZXhwb3J0JyApIHsKCiAgICBwcmludCBTVERPVVQgIkV4cG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgZXhwb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgZGllICJcbkVycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy5cbiIgaWYgIWRlZmluZWQgJFJlc3VsdDsKCiAgICBwcmludCBTVERPVVQKICAgICAgICAiXG4iLAogICAgICAgICJTdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc31cbiIsCiAgICAgICAgIkZhaWxlZCA6ICRSZXN1bHQtPntGYWlsZWR9XG4iLAogICAgICAgICJcbiI7CgogICAgaWYgKCAkT3B0c3tvfSApIHsKCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICAjIHNhdmUgZGVzdGluYXRpb24gY29udGVudCB0byBmaWxlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlV3JpdGUoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze299LAogICAgICAgICAgICBDb250ZW50ICA9PiBcJEZpbGVDb250ZW50LAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3Qgd3JpdGUgZmlsZSAkT3B0c3tvfS5cbkV4cG9ydCBhYm9ydGVkLlxuIiBpZiAhJFN1Y2Nlc3M7CgogICAgICAgIHByaW50IFNURE9VVCAiRmlsZSAkT3B0c3tvfSBzYXZlZC5cbiI7CiAgICB9CgogICAgcHJpbnQgU1RET1VUICJFeHBvcnQgY29tcGxldGUuXG4iOwp9CgpleGl0IDA7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTQgJCAkRGF0ZTogMjAxMC8wMi8yMyAxMjowODo0NiAkCgo9Y3V0Cg==
iVBORw0KGgoAAAANSUhEUgAABh8AAAP7CAIAAADERAgkAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAfQAAAH0AG5i+efAAAgAElEQVR4nOzdX4wl2X0X8Kp7u6e7Z3pmZ3Zm/zmeXduJCZjECAGSZR4QCITkBAnCQ7SCpzzkAclRUKRISFgxEciYiBcUlKC8YF4SIT8goQQFlAeQoxjlL0piK7Hs2JrN7qzdO7sz0zM9/efe4qHWd2rqX9e9Xf/r83lY3a5b95xfVe9U3/rec84NoygKAAAAAGAjW10XAAC98+d//ufL5fKVV17Z2mr7D+VisfjmN78ZhuFHPvKRlrsGAIDNSJcAIO17vud7uuo6iqLlchmGYVcFAADAumZdFwAAPBXPWJcuAQAwINIlAOgR6RIAAIMjXQKAHpEuAQAwONIlAOgR6RIAAIMjXQKAHpEuAQAwONIlAOgR6RIAAIMjXQKAHpEuAQAwONIlAOgR6RIAAIOz1XUBANAvZ2dnd+/enc/nr7zySvu9b21t7e/vX7p0qf2uAQBgM9IlAHjGYrE4Ojqaz+ed9L67u9tJqgUAABszMw4AcpibBgAAFUmXAOAZ8cpHAABARdIlAHiGdbUBAGAt0iUAeIZ0CQAA1iJdAoAc0iUAAKhIugQAzzB2CQAA1iJdAoBnWNUbAADWIl0CgGcYuwQAAGvZ6roAAOijrtKlt99++9GjRzdv3nzuuec6KQAAANZl7BIAPKPbsUvL5XKxWJidBwDAgBi7BADP6DZdeuGFF55//vmtLX+gAQAYDG9eAeAZ3Y4b2traEi0BADAsZsYBQA6regMAQEXSJQB4hu+MAwCAtUiXAOAZ0iUAAFiLdAkAnuH72gAAYC3SJQB4hrFLAACwFukSADxDugQAAGuRLgFADukSAABUFFpdAgCSFovF2dnZfD7f2tpqv/f79+8HQXD16tXZzCdAAAAMQwfvmwGgz+bz+Xw+76r373znO1EUXblyRboEAMBQeOcKAD1i1ScAAAZHugQAfbGari5dAgBgQKRLANAX0iUAAIZIugQAfSFdAgBgiKRLANAXFl0CAGCIpEsA0BfSJQAAhki6BAB9IV0CAGCItrouAAD65fDwcLFYXLlyZWur7b+S0iUAAIbI2CUAeMa9e/e+/e1vHx8ft9+1dAkAgCEydgkAnrG3t7e1tdX+wKVA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Xm87X7OYj+ty6HVcsSYAAACAEwwJa66ZEP3CZBwAAAAAcdIlAAAAAOLu1osFAAAAwJn0LgEAAAAQJ10CAAAAIE66BAAAAECcdAkAAACAOOkSAAAAAHHSJQAAAADipEsAAAAAxEmXAAAAAIiTLgEAAAAQJ10CAAAAIE66BAAAAECcdAkAAACAOOkSAAAAAHHSJQAAAICIlFJKqf1zy7N711yBdAkAAAAgIue863r6b2N9y5qreY8uAAAAAOBPSintCn02Uqdy68op0id6lwAAAACCPk20ddnnxz1Psy9jAwAAAIA5vUsAAAAAxP0D4kEJd/HGTQkAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBJbXBvcnRFeHBvcnQueG1sLHYgMS4zIDIwMDgvMDEvMjQgMTY6MzM6NTYgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkltcG9ydEV4cG9ydCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSW1wb3J0RXhwb3J0IGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JbXBvcnQvRXhwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkltcG9ydC9FeHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZvcm1hdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS45IDIwMTAvMDUvMTcgMTM6NDk6MTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJyc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY2F0YWxhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IFNpc3RlbWVzIE9USUMgKGlic2FsdXQpIC0gQW50b25pbyBMaW5kZQojIC0tCiMgJElkOiBjdF9JbXBvcnRFeHBvcnQucG0sdiAxLjQgMjAxMC8wNS8xNyAxMzo0OToxNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdHZXN0afIgZGUgSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdBZmVnaXIgcGxhbnRpbGxhIGRlIG1hcGF0Z2UnOwogICAgJExhbmctPnsnU3RhcnQgSW1wb3J0J30gICAgICAgICAgICAgICA9ICdDb21lbudhciBpbXBvcnRhY2nzJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnQ29tZW7nYXIgZXhwb3J0YWNp8yc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Bhcyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGNvbXVuYSc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGRcJ29iamVjdGUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBmb3JtYXQnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBtYXBhdGdlJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWFjafMgZGUgcmVjZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyIGluZm9ybWFjafMnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nzIHBlciByZWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnRml0eGVyIGZvbnQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdTZXBhcmFkb3IgZGUgY29sdW1uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYWRvciAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnQgaSBjb21hICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcyBwdW50cyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW50ICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0Nvbmp1bnQgZGUgY2Fy4GN0ZXJzJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAxMCBPMkJTLmNvbSwgcyByLm8uIEpha3ViIEhhbnVzCiMgLS0KIyAkSWQ6IGN6X0ltcG9ydEV4cG9ydC5wbSx2IDEuOSAyMDEwLzA1LzE3IDEzOjQ5OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnQvRXhwb3J0JzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnSW1wb3J0L0V4cG9ydCBTcHLhdmEnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdOb3bhILlhYmxvbmEgem9icmF6ZW7tJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnWmFo4WppdCBJbXBvcnQnOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdaYWjhaml0IEV4cG9ydCc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0tyb2snOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YWNlIG9iZWNu/WNoIGluZm9ybWFj7Sc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhY2UgaW5mb3JtYWPtIG8gb2JqZWt0dSc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhY2UgZm9ybeF0dSc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ0VkaXRhY2UgbWFwb3bhbu0nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YWNlIHZ5aGxlZOF24W7tJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAnSW5mb3JtYWNlIG8gSW1wb3J0dSc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ1Nsb3VwZWMnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdPbWV6aXQgRXhwb3J0IHZ5aGxlZOF24W7tbSc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ1pkcm9qb3b9IFNvdWJvcic7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ09kZOxsb3Zh6CBTbG91cGP5JzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWzhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnU3T4ZWRu7WsgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRHZvanRl6GthICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1Rl6GthICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ1puYWtvduEgc2FkYSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBkYSAoRGFuaXNoKSBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGFfSW1wb3J0RXhwb3J0LnBtLHYgMS4xIDIwMTAvMDYvMjUgMDg6NTI6NTEgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9Fa3BvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdJbXBvcnQvRWtwb3J0IHN0eXJpbmcnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdUaWxm+GogTWFwcGluZy1UZW1wbGF0ZSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ1N0YXJ0IGltcG9ydCc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ1N0YXJ0IGVrcG9ydCc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RyaW4nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdSZXQgZuZsbGVzIGluZm9ybWF0aW9uJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnUmV0IG9iamVrdCBpbmZvcm1hdGlvbic7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ1JldCBmb3JtYXQgaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdSZXQgbWFwcGluZyBpbmZvcm1hdGlvbic7CiAgICAkTGFuZy0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ICAgID0gJ1JldCBz+GdlaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQgaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb2xvbm5lJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVncuZucyBla3BvcnQgcHIuIHP4Z25pbmcnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICdLaWxkZSBmaWwnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdLb2xvbm5lIGFkc2tpbGxlbHNlJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0tvbG9uICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bmt0dW0gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnVGVnbnPmdCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4yMCAyMDEwLzA1LzE3IDEzOjQ5OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjAgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ01hcHBpbmctVGVtcGxhdGUgaGluenVm/Gdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTY2hyaXR0JzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICdPYmpla3QtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01hcHBpbmctSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnU3VjaC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQgSW5mb3JtYXRpb25lbic7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NwYWx0ZSc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBwZXIgU3VjaGUgZWluc2NocuRua2VuJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnUXVlbGwtRGF0ZWknOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdTcGFsdGVudHJlbm5lcic7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1NlbWljb2xvbiAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEb3BwZWxwdW5rdCAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW5rdCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdaZWljaGVuc2F0eic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JbXBvcnRFeHBvcnQucG0gLSB0aGUgc3BhbmlzaCB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEFxdWlsZXMgQ29oZW4KIyAtLQojICRJZDogZXNfSW1wb3J0RXhwb3J0LnBtLHYgMS42IDIwMTAvMDUvMTcgMTM6NDk6MTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydGFyL0V4cG9ydGFyJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnR2VzdGnzbiBkZSBJbXBvcnRhY2nzbi9FeHBvcnRhY2nzbic7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0HxYWRpciBtYXBlYWRvIGRlIHBsYW50aWxsYSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0luaWNpYXIgSW1wb3J0YWNp824nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdJbmljaWFyIEV4cG9ydGFjafNuJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzbyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBjb236bic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBkZSBvYmpldG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgZm9ybWF0byBkZSBpbmZvcm1hY2nzbic7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ0VkaXRhciBtYXBlYWRvIGRlIGluZm9ybWFjafNuJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWFjafNuIGRlIGJ1c3F1ZWRhJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAnSW1wb3J0YXIgaW5mb3JtYWNp824nOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nzbiBwb3IgY29uc3VsdGEnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICdBcmNoaXZvIG9yaWdlbic7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYWRvciBkZSBDb2x1bW5hJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhZG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnUHVudG8geSBDb21hICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcyBwdW50b3MgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVudG8gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcGVyc2lhbiAoZmFyc2kpIHRyYW5zbGF0aW9uIG9mIGZhX0ltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBBZnNoYXIgTW9oZWJiaSA8YWZzaGFyLm1vaGViYmkgYXQgZ21haWwuY29tPgojIC0tCiMgJElkOiBmYV9JbXBvcnRFeHBvcnQucG0sdiAxLjIgMjAxMC8wNS8xNyAxMzo0OToxNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAn2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICfZhdiv24zYsduM2Kog2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2YLYp9mE2Kgg2Ybar9in2LTYqic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDZiNix2YjYryc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDYtdiv2YjYsSc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9qv2KfZhSc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINii2KjYrNqp2KrbjCc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDZgtin2YTYqOKAjNio2YbYr9uMJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINmG2q/Yp9i02KonOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ9mI2LHZiNivINin2LfZhNin2LnYp9iqJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2LPYqtmI2YYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfZhdit2K/ZiNiv2LPYp9iy24wg2LnZhdmE24zYp9iqINi12K/ZiNixINio2Ycg2KfYstin24wg2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ9mB2KfbjNmEINmF2YbYqNi5JzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAn2KzYr9in2qnZhtmG2K/ZhyDYs9iq2YjZhuKAjNmH2KcnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICfYrNiv2YjZhCDYs9in2LIgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICfYs9mF24wg2qnYp9mE2YYgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAn2K/ZiNmG2YLYt9mHICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ9mG2YLYt9mHICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ9qp2K/YqNmG2K/bjCDYp9i32YTYp9i52KfYqic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZnJlbmNoIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9saXZpZXIgU2FsbG91IDxvbGl2aWVyLnNhbGxvdSBhdCBpcmlzYS5mcj4KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGZyX0ltcG9ydEV4cG9ydC5wbSx2IDEuMyAyMDEwLzA1LzE3IDEzOjQ5OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnRlci9FeHBvcnRlcic7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0dlc3Rpb24gZGUgbFwnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0Fqb3V0ZXIgdW4gdGVtcGxhdGUgZGUgbWFwcGFnZSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0TpbWFycmVyIEltcG9ydCc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ0TpbWFycmVyIEV4cG9ydCc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YXBlJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgY29tbXVuZXMnOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBsXCdvYmpldCc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIGZvcm1hdCc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIG1hcHBhZ2UnOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSByZWNoZXJjaGUnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbmZvcm1hdGlvbnMgZFwnaW1wb3J0JzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ29sb25uZSc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyZWluZHJlIGxcJ2V4cG9ydCBwYXIgcmVjaGVyY2hlJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnRmljaGllciBTb3VyY2UnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdT6XBhcmF0ZXVyIGRlIGNvbG9ubmUnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGF0aW9uIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnUG9pbnQgdmlyZ3VsZSAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEZXV4IHBvaW50cyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQb2ludCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdKZXUgZGUgY2FyYWN06HJlcyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgaXRhbGlhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGl0X0ltcG9ydEV4cG9ydC5wbSx2IDEuMiAyMDEwLzA1LzE3IDEzOjQ5OjQzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnRhcmUvRXNwb3J0YXJlJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnR2VzdGlvbmUgSW1wb3J0YXppb25lL0VzcG9ydGF6aW9uZSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0FnZ2l1bmdpIG1hcHBhdHVyYSBtb2RlbGxvJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgSW1wb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgRXNwb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzc28nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgY29tdW5pJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnTW9kaWZpY2EgaW5mb3JtYXppb25pIG9nZ2V0dG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBmb3JtYXRvIGluZm9ybWF6aW9uZSc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01vZGlmaWNhIG1hcHBhdHVyYSBpbmZvcm1hemlvbmknOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgZGkgcmljZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyZSBpbmZvcm1hemlvbmUnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2xvbm5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdlcmUgZXNwb3J0YXppb25lIHBlciByaWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQXJjaGl2aW8gb3JpZ2luZSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvcmUgZGkgY29sb25uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYXRvcmUgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQdW50byBlIHZpcmdvbGEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRHVlIHB1bnRpICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bnRvICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0NoYXJzZXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgRHV0Y2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hpZWwgQmVpamVuIDxtaWNoaWVsICdhdCcgYmVlZnJlZWl0Lm5sPgojIC0tCiMgJElkOiBubF9JbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAxMC8wNS8xNyAxMzo0OTo0MyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgYmVoZWVyJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnTWFwcGluZ3RlbXBsYXRlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGFwJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxnZW1lbmUgaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVjdC1pbmZvcm1hdGllIGJld2Vya2VuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LWluZm9ybWF0aW9uZW4gYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdNYXBwaW5nLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdab2VrLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQtaW5mb3JtYXRpZSc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ0tvbG9tJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVwZXJrIGV4cG9ydCB0b3Qgem9la29wZHJhY2h0JzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQnJvbmJlc3RhbmQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdLb2xvbXNjaGVpZGluZ3N0ZWtlbic7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYic7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnRrb21tYSAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEdWJiZWxlIHB1bnQgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVudCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdLYXJha3RlcnNldCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcG9saXNoIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggTWFjaWVqIExvc3phamMKIyAtLQojICRJZDogcGxfSW1wb3J0RXhwb3J0LnBtLHYgMS41IDIwMTAvMDUvMTcgMTM6NDk6NDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9FeHBvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdaYXJ6MWR6YW5pZSBJbXBvcnRlbS9FeHBvcnRlbSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ1JvenBvY3puaWogSW1wb3J0JzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnUm96cG9jem5paiBFeHBvcnQnOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnUGxpayBZcvNkM293eSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvciBrb2x1bW55JzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnT3JlZG5payAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEd3Vrcm9wZWsgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnS3JvcGthICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0tvZG93YW5pZSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgQnJhemlsaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ3Jpc3RpYW5vIEtvcm5k9nJmZXIsIGh0dHA6Ly93d3cuZG9yZmVyLmNvbS5ici8KIyAtLQojICRJZDogcHRfQlJfSW1wb3J0RXhwb3J0LnBtLHYgMS4yIDIwMTAvMDUvMTcgMTM6NDk6NDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydGHn428vRXhwb3J0Yefjbyc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0dlcmVuY2lhbWVudG8gZGUgSW1wb3J0Yefjby9FeHBvcnRh5+NvJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnQWRpY2lvbmFyIE1vZGVsbyBkZSBNYXBlYW1lbnRvJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pY2lhciBJbXBvcnRh5+NvJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pY2lhciBFeHBvcnRh5+NvJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzc28nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYef1ZXMgY29tdW5zJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWHn9WVzIGRvIG9iamV0byc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1h5/VlcyBkbyBmb3JtYXRvJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnRWRpdGFyIGluZm9ybWHn9WVzIGRvIG1hcGVhbWVudG8nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYef1ZXMgZGUgcGVzcXVpc2EnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbmZvcm1h5/VlcyBkZSBpbXBvcnRh5+NvJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ29sdW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRh5+NvIHBvciBwZXNxdWlzYSc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ0FycXVpdm8gZGUgT3JpZ2VtJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnU2VwYXJhZG9yIGRlIENvbHVuYXMnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGHn428gKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQb250byBlIFbtcmd1bGEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9pcyBQb250b3MgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUG9udG8gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnQ29kaWZpY2Hn428gZGUgQ2FyYWN0ZXJlcyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcnVzc2lhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEVnb3IgVHNpbGVua28gPGJnOHMgYXQgc3ltbGluay5ydT4KIyAtLQojICRJZDogcnVfSW1wb3J0RXhwb3J0LnBtLHYgMS4zIDIwMTAvMDUvMTcgMTM6NDk6NDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ8js7+7w8i/d6vHv7vDyJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAn0+/w4OLr5e3o5SDI7O/u8PLu7C/d6vHv7vDy7uwnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfE7uHg4uvl7ejlIPjg4evu7eAg8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnzeD34PL8IOjs7+7w8ic7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ83g9+Dy/CD96vHv7vDyJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2ODjJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDu4fnz/iDo7fTu8Ozg9uj+JzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDo7fTu8Ozg9uj+IO7hIO7h+uXq8uUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICfQ5eTg6vLo8O7i4PL8IPTu8Ozg8iDk4O3t+/UnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICfQ5eTg6vLo8O7i4PL8IOjt9O7w7OD26P4g8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDv7ujx6u7i8/4g6O307vDs4Pbo/ic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ8jt9O7w7OD26P8g6Ozv7vDy4Cc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ9Hy7uvh5fYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfO4/Dg7ej36PL8IP3q8e/u8PIg7+7o8eru7Cc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ8jx9e7k7fvpIPTg6esnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICfQ4Ofk5evo8uXr/Cc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ9Lg4fPr//bo/yAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ9Lu9+rgIPEg5+Dv//Lu6SAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICfE4u7l8u736OUgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAn0u736uAgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnyu7k6PDu4urgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgQ2hpbmVzZSBzaW1wbGUgdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiB6aF9DTl9JbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAxMC8wNS8xNyAxMzo0OTo0MyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAntbzI6y+1vLP2JzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAntbzI6y+1vLP2udzA7Sc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ9T2vNPTs8nkxKOw5ic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ7+qyry1vMjrJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnv6rKvLW8s/YnOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICeyvdboJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbmy08PQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbbUz/HQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbjxyr3Qxc+iJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnseC8rdOzyeTQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnseC8rcvRy/fQxc+iJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAntbzI69DFz6InOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICfB0Cc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ8/e1sa1vLP2w7+49svR0bAnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICfUtM7EvP4nOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICfB0LfWuPS3+yc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ9bGse28/CAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ7fWusUgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnw7C6xSAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICe+5LrFICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ9fWt/u8ryc7CiMgYWRkIGJ5IE5ldmVyCiAgICAkTGFuZy0+eydUZW1wbGF0ZSd9ICAgICAgICAgICAgICAgICAgID0gJ8SjsOYnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4yMCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoY29tbW9uKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDEnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CiAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIGdldCBuZWVkZWQgZGF0YQogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09iamVjdCcgKTsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtYXQnICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKQogICAgICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSAgICAgID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmUxJyApIHsKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KFRlbXBsYXRlSUQgT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+eyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0MicsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGlmICggJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiQ2FuJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEiICkKICAgICAgICAgICAgaWYgISRTdWNjZXNzOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3IG9iamVjdCBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VGVtcGxhdGVFZGl0MiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG9iamVjdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQyJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgZGF0YQogICAgICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MlJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByZXF1aXJlZCBub3RpY2UKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAob2JqZWN0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTInICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRTdWJtaXRLZXkgKCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskT2JqZWN0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChmb3JtYXQpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MycgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgICAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRm9ybWF0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcmVxdWlyZWQgbm90aWNlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKGZvcm1hdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmUzJyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIG15ICVTdWJtaXQgPSAoCiAgICAgICAgICAgIFN1Ym1pdE5leHQgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAobWFwcGluZykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ0JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdPYmplY3Q6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgID0+ICRNYXBwaW5nT2JqZWN0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93T2JqZWN0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ0Zvcm1hdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3dGb3JtYXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTQnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgTWFwcGluZ0FkZCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gICAgPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgbXkgJFN1Ym1pdEJ1dHRvbiA9ICcnOwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uICAgID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgJFN1Ym1pdEJ1dHRvbiA9ICRTdWJtaXRLZXk7CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgTUFQUElOR0lEOgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZVZhbHVlczsKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IG9iamVjdCBmb3JtIGRhdGEKICAgICAgICAgICAgICAgICRPYmplY3RBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ09iamVjdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gXCVPYmplY3RBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlRm9ybWF0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZm9ybWF0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJEZvcm1hdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiBcJUZvcm1hdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGlzIG1hcHBpbmcgcm93CiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ0RlbGV0ZTo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IHVwCiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ1VwOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nVXAoCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vdmUgbWFwcGluZyBkYXRhIHJvdyBkb3duCiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ0Rvd246OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdEb3duKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICBpZiAoICRTdWJtaXRCdXR0b24gZXEgJ01hcHBpbmdBZGQnICkgewogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ1JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBkYXRhCiAgICAgICAgbXkgJFNlYXJjaERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSByZXNjcmljdCBleHBvcnQgc3RyaW5nCiAgICAgICAgbXkgJFJlc3RyaWN0RXhwb3J0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICBJdGVtID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdSZXN0cmljdEV4cG9ydCcsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmFsdWUgPT4gc2NhbGFyIGtleXMgJXskU2VhcmNoRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBSZXN0cmljdEV4cG9ydFN0cmcgPT4gJFJlc3RyaWN0RXhwb3J0U3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWFyY2hEYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmU1JyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIG15ICVTdWJtaXQgPSAoCiAgICAgICAgICAgIFN1Ym1pdE5leHQgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggcmVzdHJpY3Rpb25zCiAgICAgICAgaWYgKCAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzdHJpY3RFeHBvcnQnICkgKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmb3JtCiAgICAgICAgbXkgJUF0dHJpYnV0ZVZhbHVlczsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgc2VhcmNoIGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZGVsZXRlIHRlbXBsYXRlIGZyb20gZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW1wb3J0IGluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSW1wb3J0SW5mb3JtYXRpb24nICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydEluZm9ybWF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW1wb3J0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSW1wb3J0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZXQgc291cmNlIGZpbGUKICAgICAgICBteSAlU291cmNlRmlsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAkU291cmNlRmlsZXtDb250ZW50fSB8fD0gJyc7CgogICAgICAgICMgaW1wb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5JbXBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFwkU291cmNlRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgKSBpZiAhJFJlc3VsdDsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249T3ZlcnZpZXcmVGVtcGxhdGVJRD0kVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGV4cG9ydCBkYXRhCiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+RXhwb3J0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgKSBpZiAhJFJlc3VsdDsKCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdFeHBvcnQuY3N2JywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvY3N2JywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpbGVDb250ZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICBteSAkRW1wdHlEYXRhYmFzZSA9IDE7CgogICAgICAgIENMQVNTOgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7ICRPYmplY3RMaXN0LT57JGF9IGNtcCAkT2JqZWN0TGlzdC0+eyRifSB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0xBU1MgaWYgISRUZW1wbGF0ZUxpc3Q7CiAgICAgICAgICAgIG5leHQgQ0xBU1MgaWYgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0FSUkFZJzsKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiAhQHskVGVtcGxhdGVMaXN0fTsKCiAgICAgICAgICAgICRFbXB0eURhdGFiYXNlID0gMDsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7JFRlbXBsYXRlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgb3V0cHV0IG9iamVjdAogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gJFZhbGlkTGlzdHsgJFRlbXBsYXRlRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFuIGVtcHR5IGxpc3QKICAgICAgICBpZiAoJEVtcHR5RGF0YWJhc2UpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gucG0sdiAxLjUgMjAxMC8wMi8yNCAxMjo1NjozNyBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3ggLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIGNoZWNrYm94IGVsZW1lbnRzIGluIGltcG9ydC9leHBvcnQuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRDaGVja2VkID0gJFBhcmFte1ZhbHVlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKCiAgICByZXR1cm4gcXF7PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSIkUGFyYW17UHJlZml4fSRQYXJhbXtJdGVtfS0+e0tleX0iICRDaGVja2VkPn07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAxMC8wMi8yNCAxMjo1NjozNyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dERUTC5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIGRpc3BsYXkgRFRMIGNvZGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0RFRMLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi5wbSx2IDEuOCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHNlbGVjdGlvbiBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24tPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKICAgICRQYXJhbXtWYWx1ZX0gIHx8PSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiAkUGFyYW17VmFsdWV9ID1+IG17ICMjIyMjIH14bXMgKSB7CiAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9IFxAVmFsdWVzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3B0aW9uIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57RGF0YX0gfHwge30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UG9zc2libGVOb25lfSwKICAgICAgICBNdWx0aXBsZSAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TXVsdGlwbGV9LAogICAgICAgIFNpemUgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQEZvcm1EYXRhcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIG15ICRGb3JtRGF0YSA9IGpvaW4gJyMjIyMjJywgQEZvcm1EYXRhczsKCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS44ICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtLHYgMS43IDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRUZXh0IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciB0ZXh0IGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICBteSAkU2l6ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDQwOwogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9XCIgc2l6ZT1cIiRTaXplXCIgIjsKCiAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZyAuPSAidmFsdWU9XCIkVmFsdWVcIiAiOwogICAgfQoKICAgICMgYWRkIG1heGltdW0gbGVuZ3RoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAibWF4bGVuZ3RoPVwiJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofVwiICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAiPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgICMgcmVnZXggY2hlY2sKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnZXh9ICYmICRGb3JtRGF0YSAhfiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gKSB7CgogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwogICAgICAgIHJldHVybiAkRm9ybURhdGE7CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA5LzA1LzE4IDA5OjQyOjUyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEltcG9ydEV4cG9ydC5wbSx2IDEuNiAyMDEwLzAyLzI0IDEyOjU3OjM5IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1pdGVtIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgpCgpyZXR1cm5zIGEgaW5wdXQgZmllbGQgaHRtbCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+ICdWYWx1ZScsICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaHRtbCBmb3JtIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aXRlbSBfSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgogICAgbXkgJEJhY2tlbmQgPSAkTGF5b3V0T2JqZWN0LT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICk7CgpBbiBpbnN0YW5jZSBvZiB0aGUgbG9hZGVkIGJhY2tlbmQgbW9kdWxlIGlzIHJldHVybmVkLgoKPWN1dAoKc3ViIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsK
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LmR0bCx2IDEuMTYgMjAwOS8wNS8xOCAwOTo0Mjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZUVkaXQxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgbWFwcGluZyB0ZW1wbGF0ZSJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwMCI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9iamVjdE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGb3JtYXRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJFFEYXRheyJPYmplY3ROYW1lIn0ifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik51bWJlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iOTAiPiRUZXh0eyJEZWxldGUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI5MCI+JFRleHR7IlN0YXJ0IEltcG9ydCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjkwIj4kVGV4dHsiU3RhcnQgRXhwb3J0In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVRlbXBsYXRlRWRpdDEmVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTnVtYmVyIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiRm9ybWF0TmFtZSJ9In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVRlbXBsYXRlRGVsZXRlJlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUltcG9ydEluZm9ybWF0aW9uJlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cG9ydCZUZW1wbGF0ZUlEPSRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IngifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MSAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmUxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSAxICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBjb21tb24gaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJPYmplY3ROYW1lIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPYmplY3QiIHZhbHVlPSIkUURhdGF7Ik9iamVjdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGb3JtYXROYW1lIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtYXQiIHZhbHVlPSIkUURhdGF7IkZvcm1hdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDEgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDIgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlMiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gMiAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgb2JqZWN0IGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJPYmplY3ROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDJSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IiRUZXh0eyIuLi5CYWNrIn0iPiZuYnNwOwogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIkVGV4dHsiTmV4dC4uLiJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyIC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDMgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRm9ybWF0TmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzUm93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MyAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSA0ICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJPYmplY3ROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiRm9ybWF0TmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPjxociB3aWR0aD0iMTAwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93T2JqZWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dPYmplY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dGb3JtYXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nVXA6OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiVXAifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0Rvd246OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiRG93biJ9Ij4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRGVsZXRlOjokUURhdGF7Ik1hcHBpbmdJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj48aHIgd2lkdGg9IjEwMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0FkZCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDQgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDUgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gNSAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgc2VhcmNoIGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzdHJpY3RFeHBvcnRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDVSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NVJvdyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJGaW5pc2gifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KPCEtLSBkdGw6YmxvY2s6SW1wb3J0SW5mb3JtYXRpb24gLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkltcG9ydCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJJbXBvcnQgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiU291cmNlIEZpbGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJTb3VyY2VGaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdGFydCBJbXBvcnQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SW1wb3J0SW5mb3JtYXRpb24gLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBtLHYgMS4zOSAyMDEwLzAyLzI0IDA5OjQ2OjMzIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjM5ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0IC0gaW1wb3J0LCBleHBvcnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBpbXBvcnQgYW5kIGV4cG9ydCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUZW1wbGF0ZUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiB0ZW1wbGF0ZXMgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsICAjIChvcHRpb25hbCkKICAgICAgICBGb3JtYXQgPT4gJ0NTVicgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIDE9MSAnOwogICAgbXkgQEJJTkQ7CgogICAgaWYgKCAkUGFyYW17T2JqZWN0fSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgaW1leHBvcnRfb2JqZWN0ID0gPyAnOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17T2JqZWN0fTsKICAgIH0KICAgIGlmICggJFBhcmFte0Zvcm1hdH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGltZXhwb3J0X2Zvcm1hdCA9ID8gJzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte0Zvcm1hdH07CiAgICB9CgogICAgIyBhZGQgb3JkZXIgb3B0aW9uCiAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCc7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVGVtcGxhdGVMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBUZW1wbGF0ZUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAVGVtcGxhdGVMaXN0Owp9Cgo9aXRlbSBUZW1wbGF0ZUdldCgpCgpnZXQgYSBpbXBvcnQgZXhwb3J0IHRlbXBsYXRlCgpSZXR1cm4KICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0KICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfQogICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9CiAgICAkVGVtcGxhdGVEYXRhe0Zvcm1hdH0KICAgICRUZW1wbGF0ZURhdGF7TmFtZX0KICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0KICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fQoKICAgIG15ICRUZW1wbGF0ZURhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVUZW1wbGF0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0gPSAkUm93WzBdOwogICAgICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fSAgICAgPSAkUm93WzFdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Rm9ybWF0fSAgICAgPSAkUm93WzJdOwogICAgICAgICRUZW1wbGF0ZURhdGF7TmFtZX0gICAgICAgPSAkUm93WzNdOwogICAgICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzRdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzVdIHx8ICcnOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzddOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzhdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzldOwoKICAgICAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0gPSBzcHJpbnRmICIlMDZkIiwgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ID0gXCVUZW1wbGF0ZURhdGE7CgogICAgcmV0dXJuIFwlVGVtcGxhdGVEYXRhOwp9Cgo9aXRlbSBUZW1wbGF0ZUFkZCgpCgphZGQgYSBuZXcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZQoKICAgIG15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgT2JqZWN0ICA9PiAnVGlja2V0JywKICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgIE5hbWUgICAgPT4gJ1RlbXBsYXRlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBDb21tZW50ID0+ICdDb21tZW50JywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyB0ZW1wbGF0ZSwgaWYgdGVtcGxhdGUgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyB0ZW1wbGF0ZSEgVGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBvYmplY3QuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluc2VydCBuZXcgdGVtcGxhdGUKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfdGVtcGxhdGUgJwogICAgICAgICAgICAuICcoaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtGb3JtYXR9LCBcJFBhcmFte05hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IHRlbXBsYXRlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVGVtcGxhdGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWl0ZW0gVGVtcGxhdGVVcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgb2JqZWN0IG9mIHRoaXMgdGVtcGxhdGUgaWQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaW1leHBvcnRfb2JqZWN0IEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRPYmplY3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPYmplY3QgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICggISRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIEkgY2FuJ3QgZmluZCB0aGUgdGVtcGxhdGUuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkT2JqZWN0LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X3RlbXBsYXRlIFNFVCBuYW1lID0gPywnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIFRlbXBsYXRlRGVsZXRlKCkKCmRlbGV0ZSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlcwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIGRhdGEKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRTZWxmLT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEKICAgICRTZWxmLT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBPYmplY3RMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9iamVjdHMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCj1jdXQKCnN1YiBPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnCiAgICBteSAkTW9kdWxlTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgdGhlIG9iamVjdCBsaXN0CiAgICBteSAkT2JqZWN0TGlzdCA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlTGlzdH0gKSB7CiAgICAgICAgJE9iamVjdExpc3QtPnskTW9kdWxlfSA9ICRNb2R1bGVMaXN0LT57JE1vZHVsZX0tPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gJE9iamVjdExpc3Q7Cn0KCj1pdGVtIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBPYmplY3REYXRhR2V0KCkKCmdldCB0aGUgb2JqZWN0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aXRlbSBPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ09iamVjdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17T2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgJwogICAgICAgICAgICAgICAgLiAnKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gRm9ybWF0TGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7Cgo9Y3V0CgpzdWIgRm9ybWF0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBmb3JtYXQgbGlzdAogICAgbXkgJEZvcm1hdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRGb3JtYXRMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRGb3JtYXRMaXN0Owp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhIGZvcm1hdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBGb3JtYXREYXRhR2V0KCkKCmdldCB0aGUgZm9ybWF0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJEZvcm1hdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRm9ybWF0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtYXREYXRhOwp9Cgo9aXRlbSBGb3JtYXREYXRhU2F2ZSgpCgpzYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBGb3JtYXREYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBGb3JtYXREYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte0Zvcm1hdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Zvcm1hdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17Rm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtGb3JtYXREYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBGb3JtYXREYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X2Zvcm1hdCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gTWFwcGluZ0xpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBtYXBwaW5nIGRhdGEgaWRzIHNvcnRlZCBieSBwb3NpdGlvbiBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkTWFwcGluZ0xpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gT1JERVIgQlkgcG9zaXRpb24nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQE1hcHBpbmdMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBNYXBwaW5nTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBNYXBwaW5nTGlzdDsKfQoKPWl0ZW0gTWFwcGluZ0FkZCgpCgphZGQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwoKICAgIG15ICRNYXBwaW5nSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBmaW5kIG1heGltdW0gcG9zaXRpb24KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbWF4KHBvc2l0aW9uKSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROZXdQb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBpZiAoIGRlZmluZWQgJFJvd1swXSApIHsKICAgICAgICAgICAgJE5ld1Bvc2l0aW9uID0gJFJvd1swXTsKICAgICAgICAgICAgJE5ld1Bvc2l0aW9uKys7CiAgICAgICAgfQogICAgfQoKICAgICMgaW5zZXJ0IGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZyAodGVtcGxhdGVfaWQsIHBvc2l0aW9uKSBWQUxVRVMgKD8sID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCROZXdQb3NpdGlvbiBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPyBBTkQgcG9zaXRpb24gPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkTmV3UG9zaXRpb24gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRNYXBwaW5nSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkTWFwcGluZ0lEOwp9Cgo9aXRlbSBNYXBwaW5nRGVsZXRlKCkKCmRlbGV0ZSBleGlzdGluZyBtYXBwaW5nIGRhdGEgcm93cwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtNYXBwaW5nSUR9ICkgewoKICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBvbmUgbWFwcGluZyByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgICAgICk7CgogICAgICAgICMgcmVidWlsZCBtYXBwaW5nIHBvc2l0aW9ucwogICAgICAgICRTZWxmLT5NYXBwaW5nUG9zaXRpb25SZWJ1aWxkKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBtYXBwaW5nIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhbGwgbWFwcGluZyByb3dzIG9mIHRoaXMgdGVtcGxhdGUKICAgICAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gTWFwcGluZ1VwKCkKCm1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyB1cAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1VwKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ1VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TWFwcGluZ0lEfSA9PSAkTWFwcGluZ0xpc3QtPlswXTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHBvc2l0aW9uIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUG9zaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRQb3NpdGlvbjsKCiAgICBteSAkUG9zaXRpb25VcHBlciA9ICRQb3NpdGlvbiAtIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIHRlbXBsYXRlX2lkID0gPyBBTkQgcG9zaXRpb24gPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvbiwgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCRQb3NpdGlvblVwcGVyIF0sCiAgICApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uVXBwZXIsIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ0Rvd24oKQoKbW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IGRvd24KCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEb3duKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Rvd24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+Wy0xXTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHBvc2l0aW9uIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUG9zaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgbXkgJFBvc2l0aW9uRG93biA9ICRQb3NpdGlvbiArIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIHRlbXBsYXRlX2lkID0gPyBBTkQgcG9zaXRpb24gPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvbiwgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCRQb3NpdGlvbkRvd24gXSwKICAgICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb25Eb3duLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQoKQoKcmVidWlsZCB0aGUgcG9zaXRpb25zIG9mIGEgbWFwcGluZyBsaXN0CgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nUG9zaXRpb25SZWJ1aWxkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbgogICAgbXkgJENvdW50ZXIgPSAwOwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ291bnRlciwgXCRNYXBwaW5nSUQgXSwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtNYXBwaW5nSUR9ICkgewogICAgICAgICRQYXJhbXtNYXBwaW5nSUR9ID0gWyAkUGFyYW17TWFwcGluZ0lEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte01hcHBpbmdJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ09iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdPYmplY3REYXRhIG11c3QgYmUgYW4gaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte01hcHBpbmdPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgbWFwcGluZyBvYmplY3Qgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0ICcKICAgICAgICAgICAgICAgIC4gJyhtYXBwaW5nX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YUdldCgpCgpnZXQgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0IFdIRVJFIG1hcHBpbmdfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ09iamVjdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ09iamVjdERhdGE7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBkZWxldGUgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSgpCgpzYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ0Zvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0Zvcm1hdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17TWFwcGluZ0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17TWFwcGluZ0Zvcm1hdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSBtYXBwaW5nIGZvcm1hdCByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKG1hcHBpbmdfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhR2V0KCkKCmdldCB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgbWFwcGluZ19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlTWFwcGluZ0Zvcm1hdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nRm9ybWF0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVNYXBwaW5nRm9ybWF0RGF0YTsKfQoKPWl0ZW0gU2VhcmNoQXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzIG9mIGEgb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBub3QgY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIHNlYXJjaCBhdHRyaWJ1dGUgbGlzdCBvZiBhbiBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBTZWFyY2hEYXRhR2V0KCkKCmdldCB0aGUgc2VhcmNoIGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJFNlYXJjaERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9zZWFyY2ggV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZWFyY2hEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VhcmNoRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hEYXRhOwp9Cgo9aXRlbSBTZWFyY2hEYXRhU2F2ZSgpCgpzYXZlIHRoZSBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBTZWFyY2hEYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBTZWFyY2hEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte1NlYXJjaERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17U2VhcmNoRGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17U2VhcmNoRGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X3NlYXJjaCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTZWFyY2hEYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gRXhwb3J0KCkKCmV4cG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCnJldHVybnMgc29tZXRoaW5nIGxpa2UKCiAgICAkUmVzdWx0UmVmID0gewogICAgICAgIFN1Y2Nlc3MgICA9PiAyLAogICAgICAgIEZhaWxlZCAgICA9PiAwLAogICAgICAgIERlc3RpbmF0aW9uQ29udGVudCA9PiBbCiAgICAgICAgICAgIFsgJ0F0dHJfMWEnLCAnQXR0cl8xYicsICdBdHRyXzFjJywgXSwKICAgICAgICAgICAgWyAnQXR0cl8yYScsICdBdHRyXzJiJywgJ0F0dHJfM2MnLCBdLAogICAgICAgIF0sCiAgICB9OwoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgU3VjY2VzcyAgICAgICAgICAgID0+IDAsCiAgICAgICAgRmFpbGVkICAgICAgICAgICAgID0+IDAsCiAgICAgICAgRGVzdGluYXRpb25Db250ZW50ID0+IFtdLAogICAgKTsKCiAgICBFWFBPUlREQVRBUk9XOgogICAgZm9yIG15ICRFeHBvcnREYXRhUm93ICggQHskRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXhwb3J0IG9uZSByb3cKICAgICAgICBteSAkRGVzdGluYXRpb25Db250ZW50Um93ID0gJEZvcm1hdEJhY2tlbmQtPkV4cG9ydERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAkRXhwb3J0RGF0YVJvdywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFkZWZpbmVkICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgKSB7CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgICAgICBuZXh0IEVYUE9SVERBVEFST1c7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCByb3cgdG8gZGVzdGluYXRpb24gY29udGVudAogICAgICAgIHB1c2ggQHsgJFJlc3VsdHtEZXN0aW5hdGlvbkNvbnRlbnR9IH0sICREZXN0aW5hdGlvbkNvbnRlbnRSb3c7CiAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgfQoKICAgICMgbG9nIHJlc3VsdAogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e0ZhaWxlZH0gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBmYWlsZWQhIiwKICAgICk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7U3VjY2Vzc30gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBzdWNjZXNzISIsCiAgICApOwoKICAgIHJldHVybiBcJVJlc3VsdDsKfQoKPWl0ZW0gSW1wb3J0KCkKCmltcG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBub3QgY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgb2JqZWN0IGJhY2tlbmQKICAgIG15ICRPYmplY3RCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkRm9ybWF0QmFja2VuZDsKCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRQYXJhbXtTb3VyY2VDb250ZW50fSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbXBvcnREYXRhOwoKICAgICMgTnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbmQgbm90IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZCByb3dzCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIE9iamVjdCAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEZhaWxlZCAgPT4gMCwKICAgICAgICBSZXRDb2RlID0+IHt9LAogICAgICAgIENvdW50ZXIgPT4gMCwKICAgICk7CiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRSZXN1bHR7Q291bnRlcn0rKzsKCiAgICAgICAgIyBpbXBvcnQgYSBzaW5nbGUgcm93CiAgICAgICAgbXkgKCAkSUQsICRSZXRDb2RlICkgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRJbXBvcnREYXRhUm93LAogICAgICAgICAgICBDb3VudGVyICAgICAgID0+ICRSZXN1bHR7Q291bnRlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJElEICkgewogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvZyByZXN1bHQKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0e0NvdW50ZXJ9ICRSZXN1bHR7T2JqZWN0fSByZWNvcmRzOiAiCiAgICAgICAgICAgIC4gIiRSZXN1bHR7RmFpbGVkfSBmYWlsZWQsICRSZXN1bHR7U3VjY2Vzc30gc3VjY2VlZGVkIiwKICAgICk7CiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdHtSZXRDb2RlfSB9ICkgewogICAgICAgIG15ICRDb3VudCA9ICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdHtDb3VudGVyfSAkUmVzdWx0e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlIiwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUmVzdWx0e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGU6ICRSZXN1bHR7Q291bnRlcn0iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCcsCiAgICApOwoKQW4gaW5zdGFuY2Ugb2YgdGhlIGxvYWRlZCBiYWNrZW5kIG1vZHVsZSBpcyByZXR1cm5lZC4KCj1jdXQKCnN1YiBfTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtNb2R1bGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFBhcmFte01vZHVsZX0tPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zOSAkICREYXRlOiAyMDEwLzAyLzI0IDA5OjQ2OjMzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMjggMjAxMC8wNC8xMyAxMjoxODoyOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI4ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGFyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICAgICAgQ29tbWEgICAgID0+ICcsJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRGb3JtYXRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgICAgIE5hbWUgID0+ICdDb2x1bW4gU2VwYXJhdG9yJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiAnQ29sb24gKDopJywKICAgICAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiAnQ29tbWEgKCwpJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBtYXBwaW5nIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEltcG9ydERhdGFHZXQoKQoKZ2V0IGltcG9ydCBkYXRhIGFzIDJELWFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW10gaWYgIWRlZmluZWQgJFBhcmFte1NvdXJjZUNvbnRlbnR9OwoKICAgICMgY2hlY2sgc291cmNlIGNvbnRlbnQKICAgIGlmICggcmVmICRQYXJhbXtTb3VyY2VDb250ZW50fSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvdXJjZUNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgIyBjcmVhdGUgYW4gaW4gbWVtb3J5IHRlbXAgZmlsZSBhbmQgb3BlbiBpdAogICAgbXkgJEZpbGVDb250ZW50ID0gJyc7CiAgICBvcGVuIG15ICRGSCwgJys8JywgXCRGaWxlQ29udGVudDsKCiAgICAjIHdyaXRlIHNvdXJjZSBjb250ZW50CiAgICBwcmludCAkRkggJHsgJFBhcmFte1NvdXJjZUNvbnRlbnR9IH07CgogICAgIyByZXdpbmQgZmlsZSBoYW5kbGUKICAgIHNlZWsgJEZILCAwLCAwOwoKICAgICMgcGFyc2UgdGhlIGNvbnRlbnQKICAgIG15ICRMaW5lQ291bnQgPSAxOwogICAgbXkgQEltcG9ydERhdGE7CiAgICB3aGlsZSAoIG15ICRDb2x1bW4gPSAkUGFyc2VPYmplY3QtPmdldGxpbmUoJEZIKSApIHsKICAgICAgICBwdXNoIEBJbXBvcnREYXRhLCAkQ29sdW1uOwogICAgICAgICRMaW5lQ291bnQrKzsKICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBteSAoICRQYXJzZUVycm9yQ29kZSwgJFBhcnNlRXJyb3JTdHJpbmcgKSA9ICRQYXJzZU9iamVjdC0+ZXJyb3JfZGlhZygpOwogICAgaWYgKCRQYXJzZUVycm9yQ29kZSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RXJyb3IgYXQgbGluZSAkTGluZUNvdW50LCAiCiAgICAgICAgICAgICAgICAuICJFcnJvckNvZGU6ICRQYXJzZUVycm9yQ29kZSAnJFBhcnNlRXJyb3JTdHJpbmcnICIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNsb3NlIHRoZSBpbiBtZW1vcnkgZmlsZSBoYW5kbGUKICAgIGNsb3NlICRGSDsKCiAgICByZXR1cm4gXEBJbXBvcnREYXRhIGlmICRDaGFyc2V0IG5lICdVVEYtOCc7CgogICAgIyBzZXQgdXRmOCBmbGFnCiAgICBmb3IgbXkgJFJvdyAoQEltcG9ydERhdGEpIHsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRSb3d9ICkgewogICAgICAgICAgICBFbmNvZGU6Ol91dGY4X29uKCRDZWxsKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASW1wb3J0RGF0YTsKfQoKPWl0ZW0gRXhwb3J0RGF0YVNhdmUoKQoKZXhwb3J0IG9uZSByb3cgb2YgdGhlIGV4cG9ydCBkYXRhCgogICAgbXkgJERlc3RpbmF0aW9uQ29udGVudCA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRXhwb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZXhwb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17RXhwb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4cG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IHx8PSAnJzsKICAgIG15ICRTZXBhcmF0b3IgPSAkU2VsZi0+e0F2YWlsYWJsZVNlcGFyYXRvcnN9LT57ICRGb3JtYXREYXRhLT57Q29sdW1uU2VwYXJhdG9yfSB9IHx8ICcnOwoKICAgICMgY2hlY2sgdGhlIHNlcGFyYXRvcgogICAgaWYgKCAhJFNlcGFyYXRvciApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBzZXBhcmF0b3IgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgb2JqZWN0CiAgICBteSAkUGFyc2VPYmplY3QgPSBUZXh0OjpDU1YtPm5ldygKICAgICAgICB7CiAgICAgICAgICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICAgICAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAkU2VwYXJhdG9yLAogICAgICAgICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDEsCiAgICAgICAgICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICAgICAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgICAgICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgICAgICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggISRQYXJzZU9iamVjdC0+Y29tYmluZSggQHsgJFBhcmFte0V4cG9ydERhdGFSb3d9IH0gKSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjb21iaW5lIHRoZSBleHBvcnQgZGF0YSB0byBhIHN0cmluZyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBDU1Ygc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFBhcnNlT2JqZWN0LT5zdHJpbmc7CgogICAgcmV0dXJuICRTdHJpbmcgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIEVuY29kZTo6X3V0Zjhfb24oJFN0cmluZyk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI4ICQgJERhdGU6IDIwMTAvMDQvMTMgMTI6MTg6MjggJAoKPWN1dAo=
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnQsdiAxLjE1IDIwMDkvMDUvMTggMDk6NDI6NTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ltcG9ydEV4cG9ydCcgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSB0ZW1wbGF0ZSBuYW1lcwpteSBAVGVtcGxhdGVOYW1lOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiA1ICkgewoKICAgIHB1c2ggQFRlbXBsYXRlTmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBvYmplY3QgbmFtZXMKbXkgQE9iamVjdE5hbWU7CnB1c2ggQE9iamVjdE5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGNyZWF0ZSBuZWVkZWQgZm9ybWF0IG5hbWVzCm15IEBGb3JtYXROYW1lID0gKCdDU1YnKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MUFsbCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFPYmplY3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gIiBcdCBcbiBcciAiIC4gJE9iamVjdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gIiBcdCBcbiBcciAiIC4gJEZvcm1hdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICJVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJyDGlSDGmCAnIC4gJE9iamVjdE5hbWVbMF0gLiAnIMa1IMa7ICcsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJyDHkyDHoyAnIC4gJEZvcm1hdE5hbWVbMF0gLiAnIMelIMeuICcsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDHtyDInCAnIC4gJFRlbXBsYXRlTmFtZVszXSAuICcgyJ4gyKAgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICfGlcaYJyAuICRPYmplY3ROYW1lWzBdIC4gJ8a1xrsnLAogICAgICAgICAgICBGb3JtYXQgICA9PiAnx5PHoycgLiAkRm9ybWF0TmFtZVswXSAuICfHpceuJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8e3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqknLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSBAQWRkZWRUZW1wbGF0ZUlEczsKClRFTVBMQVRFOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgYWRkIG5ldyB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgIHB1c2ggQEFkZGVkVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSAtIFRlbXBsYXRlS2V5OiAkVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSggJFRlbXBsYXRlSUQsICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkiICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGVtcGxhdGUgd2FzIGFkZGVkCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIHRlbXBsYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUdldC0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVHZXQoKSAtICRUZW1wbGF0ZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgdGVtcGxhdGUgaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkQWRkZWRUZW1wbGF0ZUlEc1stMV0gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4uIFBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBmaXJzdC4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGxhc3QgVEVNUExBVEU7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGVtcGxhdGUKICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGVtcGxhdGUgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIC0gVGVtcGxhdGVLZXk6ICRBZGRlZFRlbXBsYXRlSURzWy0xXSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUdldCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewoKICAgICMgaW5jcmVtZW50IHRoZSBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAxIChjaGVjayBhcnJheSByZWZlcmVuY2VzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDFBbGwgZXEgJ0FSUkFZJyAmJiByZWYgJFRlbXBsYXRlTGlzdDFPYmplY3QgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAobGlzdCBtdXN0IGJlIGVtcHR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBsaXN0CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFPYmplY3R9IGVxIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGVtcHR5IGxpc3QiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVMaXN0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDIgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlIiwKKTsKCm15ICRUZW1wbGF0ZUxpc3RDb3VudCA9IHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QyfSAtIHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QxQWxsfTsKCiMgY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlTGlzdENvdW50IGVxIHNjYWxhciBAQWRkZWRUZW1wbGF0ZUlEcywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZURlbGV0ZSB0ZXN0IDEgKGFkZCBvbmUgdGVtcGxhdGUgYW5kIGRlbGV0ZSBpdCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBhZGQgYSB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzRdLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSBvbmUgbW9yZSBlbGVtZW50CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSAoIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0Mn0gKSAtIDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgojIGRlbGV0ZSB0aGUgbmV3IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZTEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEZWxldGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGJlIHN1Y2Nlc3NmdWxsCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlRGVsZXRlMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkiLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGVsZW1lbnRzCiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDN9LAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlRGVsZXRlIHRlc3QgMiAoZGVsZXRlIGFsbCB1bml0dGVzdCB0ZW1wbGF0ZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkVGVtcGxhdGVJRCAoQEFkZGVkVGVtcGxhdGVJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgdGVtcGxhdGUKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBzdWNjZXNzCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIFRlbXBsYXRlSUQgJFRlbXBsYXRlSUQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJE9iamVjdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdE9yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJE9iamVjdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIGtleXMgJXskT2JqZWN0TGlzdDF9ICkgewoKICAgIGlmICggISRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJE9iamVjdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRPYmplY3RMaXN0MS0+eyRLZXl9IG5lICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskT2JqZWN0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBvYmplY3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRGb3JtYXRMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3RPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgojIHNldCB0ZXN0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBrZXlzICV7JEZvcm1hdExpc3QxfSApIHsKCiAgICBpZiAoICEkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkRm9ybWF0TGlzdDEtPnskS2V5fSBuZSAkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JEZvcm1hdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgZm9ybWF0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKJFRlc3RDb3VudCsrOwoKMTsK
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydEZvcm1hdENTVi50LHYgMS4xMCAyMDEwLzA0LzEzIDE3OjIyOjQ3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWOwoKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVi0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGhvbWUgZGlyZWN0b3J5CiRTZWxmLT57SG9tZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKIyBhZGQgc29tZSB0ZXN0IHRlbXBsYXRlcyBmb3IgbGF0ZXIgY2hlY2tzCm15IEBUZW1wbGF0ZUlEczsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGNoZWNrIGZvcm1hdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdExpc3QxICYmIHJlZiAkRm9ybWF0TGlzdDEgZXEgJ0hBU0gnICYmICRGb3JtYXRMaXN0MS0+e0NTVn0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBDU1YgZXhpc3RzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ29sdW1uU2VwYXJhdG9yJywKICAgICAgICBOYW1lICA9PiAnQ29sdW1uIFNlcGFyYXRvcicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgIFNlbWljb2xvbiA9PiAnU2VtaWNvbG9uICg7KScsCiAgICAgICAgICAgICAgICBDb2xvbiAgICAgPT4gJ0NvbG9uICg6KScsCiAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgQ29tbWEgICAgID0+ICdDb21tYSAoLCknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICBOYW1lICA9PiAnQ2hhcnNldCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJ1VURi04JywKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMjAsCiAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICB9LAogICAgfSwKXTsKCiMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAokRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKIyBkdW1wIHRoZSBsaXN0IGZyb20gRm9ybWF0QXR0cmlidXRlc0dldCgpCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDEpOwoKIyBkdW1wIHRoZSByZWZlcmVuY2UgdGFibGUKbXkgJEZvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSk7CgokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJEZvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBmYWxzZSByZXR1cm4iLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICA9PiAnRFRMJywKICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRRRGF0YXsiQ291bnRlciJ9JywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICB9LAogICAgfSwKXTsKCiMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAokRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKIyBkdW1wIHRoZSBsaXN0IGZyb20gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEpOwoKIyBkdW1wIHRoZSByZWZlcmVuY2UgdGFibGUKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlKTsKCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gYXR0cmlidXRlcyBvZiB0aGUgcm93IGFyZSBpZGVudGljYWwiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MiwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBmYWxzZSByZXR1cm4iLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEltcG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEltcG9ydERhdGFUZXN0cyA9IFsKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIHNvdXJjZSBjb250ZW50IGFyZSBnaXZlbiAoZW1wdHkgYXJyYXkgcmVmZXJlbmNlIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFtdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGV4aXN0aW5nIHRlbXBsYXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgYW5kIGNoYXJzZXQgYXJlIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gYnV0IHNvdXJjZSBjb250ZW50IGlzIGVtcHR5IChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1szXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IGlzIG9ubHkgYSBzdHJpbmcgd2l0aCBzcGFjZXMgKG9uZSBjZWxsIGFycmF5IHdpdGggdGhlIHNwYWNlcyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzRdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycgICd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsnICAnXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBUYWJ1bGF0b3IgaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsnUm93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMnXSwKICAgICAgICAgICAgWydSb3cyLUNvbDE7Um93Mi1Db2wyO1JvdzItQ29sMyddLAogICAgICAgICAgICBbJ1JvdzMtQ29sMTtSb3czLUNvbDI7Um93My1Db2wzJ10sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuLCBidXQgU2VtaWNvbG9uIGlzIHVzZWQgYXMgU2VwYXJhdG9yIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbIlJvdzEtQ29sMVx0Um93MS1Db2wyXHRSb3cxLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3cyLUNvbDFcdFJvdzItQ29sMlx0Um93Mi1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93My1Db2wxXHRSb3czLUNvbDJcdFJvdzMtQ29sMyJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICdUZXN0IDEgLSAyJywgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDctT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnMFJvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwOC1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnMFJvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRJbXBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlSW1wb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlSW1wb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBJbXBvcnREYXRhR2V0CiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9ID0ge307CiAgICB9CgogICAgIyBzZXQgc291cmNlIGNvbnRlbnQKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX0KICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9IGVxICdTb3VyY2VGaWxlJwogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgJFNvdXJjZUZpbGUgPSAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX07CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgIG15ICRTb3VyY2VDb250ZW50ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRTZWxmLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvJyAuICRTb3VyY2VGaWxlLAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9ID0gJFNvdXJjZUNvbnRlbnQ7CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIGZvcm1hdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGltcG9ydCBkYXRhCiAgICBteSAkSW1wb3J0RGF0YSA9ICRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0tPkltcG9ydERhdGFHZXQoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9IH0sCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEltcG9ydERhdGEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCByZWYgJEltcG9ydERhdGEgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5IHJlZmVyZW5jZSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgY2hlY2sgbnVtYmVyIG9mIHJvd3MKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskSW1wb3J0RGF0YX0sCiAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSBzYW1lIG51bWJlciBvZiByb3dzIiwKICAgICk7CgogICAgIyBjaGVjayBjb250ZW50IG9mIGltcG9ydCBkYXRhCiAgICBteSAkQ291bnRlclJvdyA9IDA7CiAgICBST1c6CiAgICBmb3IgbXkgJEltcG9ydFJvdyAoIEB7JEltcG9ydERhdGF9ICkgewoKICAgICAgICAjIGV4dHJhY3QgcmVmZXJlbmNlIHJvdwogICAgICAgIG15ICRSZWZlcmVuY2VSb3cgPSAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT5bJENvdW50ZXJSb3ddOwoKICAgICAgICBpZiAoIHJlZiAkSW1wb3J0Um93IG5lICdBUlJBWScgfHwgcmVmICRSZWZlcmVuY2VSb3cgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIGltcG9ydCByb3cgYW5kIHJlZmVyZW5jZSByb3cgbWF0Y2hlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRFU1Q7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBjb2x1bW5zCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskSW1wb3J0Um93fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZVJvd30sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyQ29sdW1uID0gMDsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRJbXBvcnRSb3d9ICkgewoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJENlbGwgKSB7CiAgICAgICAgICAgICAgICAkQ2VsbCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dICkgewogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgY2VsbCBkYXRhCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDZWxsLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXJDb2x1bW4rKzsKICAgICAgICB9CgogICAgICAgICRDb3VudGVyUm93Kys7CiAgICB9Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEV4cG9ydERhdGFUZXN0cyA9IFsKCiAgICAjIEV4cG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNoYXJzZXQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOyIiOyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlwiXHRcIlwiXHRcIlwiIiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOiIiOiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIi4iIi4iIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJzsiIjsnLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcdFwiXCJcdCIsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOiIiOicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJy4iIi4nLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb21tYScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciUm93MS1Db2wxIiwiUm93MS1Db2wyIiwiUm93MS1Db2wzIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlJvdzEtQ29sMVwiXHRcIlJvdzEtQ29sMlwiXHRcIlJvdzEtQ29sM1wiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIuIlJvdzEtQ29sMiIuIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjsiVGVzdCBcbiAyIjsiVGVzdCAzIFxcblxcdFxcclxccyI7IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjoiVGVzdCBcbiAyIjoiVGVzdCAzIFxcblxcdFxcclxccyI6IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiLiJUZXN0IFxuIDIiLiJUZXN0IDMgXFxuXFx0XFxyXFxzIi4iVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgIlwiICBUZXN0ICBcIlx0XCIgICAgXCJcdFwiVGVzdCAgXCJcdFwiICAgIFRlc3RcIlx0XCJcIlx0XCJUZXN0XCJcdFwiXCJcdFwiIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICI6IiAgICAiOiJUZXN0ICAiOiIgICAgVGVzdCI6IiI6IlRlc3QiOiIiOiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI7Ij48QH5cJ317W11cIjsiIjsiIiIiIjs7OjouLi0tX18jIyInCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIj48QH5cJ317W11cXCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiIiIiOzs6Oi4uLS1fXyMjIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0Ii4iPjxAflwnfXtbXVxcIi4iIi4iIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI7ItGvING0ING/Ijsi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIiDRqiDRrCDRslwiXHRcItGvING0ING/XCJcdFwi0oIg0oog0pYgXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIjoi0a8g0bQg0b8iOiLSgiDSiiDSliAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiLiLRryDRtCDRvyIuItKCINKKINKWICInLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRFeHBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBFeHBvcnREYXRhU2F2ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9ID0ge307CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEgcm93CiAgICBteSAkRXhwb3J0U3RyaW5nID0gJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fS0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJEV4cG9ydFN0cmluZyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e0V4cG9ydERhdGFSb3d9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBleHBvcnQgc3RyaW5nCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4cG9ydFN0cmluZywKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNsZWFuIHRoZSBzeXN0ZW0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWxldGUgdGhlIHRlc3QgdGVtcGxhdGVzCiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+IFxAVGVtcGxhdGVJRHMsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgoxOwo=
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
/Pbk3zvc1sQNCt/k9vw7xNbcDQo=
/Pbk3wnc1sQNCt/k9vwJxNbcDQo=
Ivz25N8iOiLc1sQiDQoi3+T2/CI6IsTW3CINCg==
Ivz25N8iOyLc1sQiDQoi3+T2/CI7IsTW3CINCg==
Ivz25N8iCSLc1sQiDQoi3+T2/CIJIsTW3CINCg==
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiMFJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyIwUm93Mi1Db2wyIjsiUm93Mi1Db2wzIg0KIlJvdzMtQ29sMSI7IlJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IyAtLQojIEltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAxMC8wNS8yMCAxOToyNDowMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCkltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgRW5jb2RlT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDIuMC4zLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaXggYSB0eXBvIGluIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPl9GaXhEYXRhYmFzZVR5cG8oKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9GaXhEYXRhYmFzZVR5cG8oKQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpeERhdGFiYXNlVHlwbygpOwoKPWN1dAoKc3ViIF9GaXhEYXRhYmFzZVR5cG8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGZpeCB0aGUgQ29sdW1uU2VwZXJhdG9yIHR5cG8gKGNvcnJlY3QgaXMgQ29sdW1uU2VwYXJhdG9yKQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfZm9ybWF0ICIKICAgICAgICAgICAgLiAiU0VUIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGFyYXRvcicgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRhX2tleSA9ICdDb2x1bW5TZXBlcmF0b3InIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAxMC8wNS8yMCAxOToyNDowMCAkCgo9Y3V0Cg==