GeneralCatalog
2.1.5
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.5.
Build for OTRS::ITSM 2.1.4.
Build for OTRS::ITSM 2.1.3.
Build for OTRS::ITSM 2.1.2.
Build for OTRS::ITSM 2.1.1.
Build for OTRS::ITSM 2.1.0 beta4.
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 general catalog package.
Das General Catalog 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 this table 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 = 'CodeUpgrade';
# 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."
);
}
}
2012-08-20 19:17:55
opms.otrs.com
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NLR//etfT1VIw+FwPp9Xq9VisfjOaQEAAABel/VHf7FYLGazWdYQzf60WCwevXg+nz9VD9VqtbeMCQAAAPB+tro/Go/Hk8lkOp3O5/OsM3pqNVYcx6VSqfinbGJRPp9/58AAAAAA72+r+6Orq6vb29sHNxYKheI3VEUAAADA1trY/mg+n5+cnMzn8//zf/7PU9dUKpUoih5URUumYgMAAABsofXrjxaLxXw+z3aclcvlarX66GW5XG48HkdRlCRJLpd79JpOp/OGQQEAAAA2wor2R2ma3pVEDz5IkuTusna7vaQ/Oj4+LpVKT5VHAAAAADxH4P4oTdPspLMHJdF8Pl9yr3w+n00pKpfLSy5rNBqvnRcAAABg6wTuj0aj0efPnx/9UhzHWUlUKBQefGBEEQAAAMC7edv+6OzsrNfrHR0dNZvNx5++UMjn84+WRI48AwAAAFgFz+2PkiSZz+d3s6vvPk7T9Oeff15+38Vi8dSXSqXSP//5zxfkBQAAAHgv2RaoNE2f+fFz7vvSa1bBf/qjpxqi7IP7U6ufr9PpdDqdQmFFp3QDAAAALJGm6aNTdJ66/e7GBzXQ/eufc82qKURR9OnTp9Fo9N1Lc7lctt2s8Kfs4yV3KRaLr5YUAAAA4H3FcfyiBUFPXXz/cVZzhdFyheje/rKnGqLsg1wuFzQqAAAAwHt7tEL6gYVC362iVnbxURRFcZqm4/E4G2IdOgwAAAAAK+dlq7AAAAAA2Db/HxAa4LKakOaJAAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjQgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkdlbmVyYWxDYXRhbG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluR2VuZXJhbENhdGFsb2cgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkdlbmVyYWwgQ2F0YWxvZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGVuIEJlaXNwaWVsLUtvbW1lbnRhciAyIGRlciBHZW5lcmFsQ2F0YWxvZy1BdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBxdWV1ZSBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QYXJhbWV0ZXIgZvxyIGRpZSB6dWdyaWZmc2JlcmVjaHRpZ3RlIEdydXBwZSBkZXIgR2VuZXJhbENhdGFsb2ctQXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiPkRlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlBlcm1pc3Npb25zPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfO8e3u4uXtIOrg8uDr7uMnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIO7x7e7i7ej/IOrg8uDr7uMnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICfK6+Dx7uLlIOIg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ugg7e7iIOrr4PEg4iDq4PLg6+7j4C4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfE7uHg4ugg5evl7OXt8iDq+uwg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4ugg6uvg8SDiIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAn1PPt6vbo7u3g6+3u8fInOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfR2VuZXJhbENhdGFsb2cucG0sdiAxLjMgMjAwOS8wNS8xOCAwOTo0MDo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXTgbGVnIGdlbmVyYWwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZGVsIGNhdOBsZWcgZ2VuZXJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBjYXThbGVnJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWZlZ2lyIHVuYSBub3ZhIGNsYXNzZSBkZSBjYXTgbGVnJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ0FmZWdpciBjbGFzc2UgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyBDb3B5cmlnaHQgKEMpIDIwMTAgTzJCUy5jb20sIHMgci5vLiBKYWt1YiBIYW51cwojIC0tCiMgJElkOiBjel9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMTEgMjAxMC8wMi8yMiAxMjowMTo1MiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnSGxhdm7tIEthdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdTcHLhdmEgSGxhdm7taG8gS2F0YWxvZ3UnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdU+O1keSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ1D4aWRhdCBOb3ZvdSBU+O1kdSBLYXRhbG9ndS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdQ+GlkYXQgUG9sb75rdSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ1D4aWRhdCBU+O1kdSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHByb3ZpZGVzIGRhIChEYW5pc2gpIGxhbmd1YWdlIHRyYW5zbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkYV9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDEwLzA2LzI1IDA4OjU0OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0dlbmVyYWwgS2F0YWxvZyc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnS2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdUaWxm+Gogbnkga2F0YWxvZyBrbGFzc2UuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnVGlsZvhqIGthdGFsb2cgcG9zdCc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ1RpbGb4aiBLYXRhbG9nIGtsYXNzZSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xNCAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0thdGFsb2cgS2xhc3NlJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnRWluZSBuZXVlIEthdGFsb2cgS2xhc3NlIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnS2F0YWxvZyBFaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdLYXRhbG9nIEtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua3Rpb25hbGl05HQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAwOS8wNy8yMCAwOTo1OTozNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAn2YHZh9ix2LPYqiDaqdmE2KfYs9uMJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDZgdmH2LHYs9iqINqp2YTYp9iz24wuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDbjNqpINmC2YTZhSDZgdmH2LHYs9iqJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDaqdmE2KfYsyDZgdmH2LHYs9iq24wnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICfaqdin2LHaqdix2K/bjCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjI5OjAxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2d1ZSBH6W7pcmFsJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbiBkdSBDYXRhbG9ndWUgR+lu6XJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBDYXRhbG9ndWUnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdBam91dGVyIHVuZSBub3V2ZWxsZSBjbGFzc2VzIGRlIENhdGFsb2d1ZS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdBam91dGVyIHVuIEVsZW1lbnQgYXUgQ2F0YWxvZ3VlJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWpvdXRlciB1bmUgQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0ZvbmN0aW9ubmFsaXTpJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnQ2F0YWxvZ28gR2VuZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rp824gZGVsIENhdGFsb2dvIEdlbmVyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzZSBkZSBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ0HxYWRpciB1bmEgbnVldmEgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdB8WFkaXIgRWxlbWVudG8gYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdB8WFkaXIgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjM3OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWdnaXVuZ2kgdW5hIG51b3ZhIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0FnZ2l1bmdpIEVsZW1lbnRvIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWdnaXVuZ2kgQ2xhc3NlIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuemlvbmFsaXTgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzo0ODozMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgQmVoZWVyJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdFZW4gbmlldXdlIENhdGFsb2cgS2xhc3NlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0NhdGFsb2cgSXRlbSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdDYXRhbG9nIEtsYXNzZSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jdGlvbmFsaXRlaXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnS2F0YWxvZyBns/N3bnknOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdaYXJ6sWR6YW5pZSBrYXRhbG9naWVtIGez83dueW0nOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICcnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua2Nqb25hbG5vtuYnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwdF9CUiB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ3Jpc3RpYW5vIEtvcm5k9nJmZXIsIGh0dHA6Ly93d3cuZG9yZmVyLmNvbS5ici8KIyAtLQojICRJZDogcHRfQlJfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAxMC8wMy8wMSAwOTo0MTo0MiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXThbG9nbyBHZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F04WxvZ28gR2VyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzc2UgZG8gQ2F04WxvZ28nOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdBZGljaW9uYSB1bWEgbm92YSBjbGFzc2UgYW8gY2F04WxvZ28uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWRpY2lvbmFyIEl0ZW0gYW8gQ2F04WxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdOFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuY2lvbmFsaWRhZGUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnzuH56Okg6uDy4Ovu4yc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Pv8ODi6+Xt6OUg7uH56Owg6uDy4Ovu4+7sJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnyuvg8fEg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ujy/CDt7uL76SDq6+Dx8SDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ8Tu4eDi6+Xt6OUg/evl7OXt8uAg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4uvl7ejlIOrr4PHx4CDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ9Tz7er26O7t4Ov87e7x8vwnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBDaGluZXNlIHNpbXBsZSB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogemhfQ05fR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8xMC8xNCAyMDo0MzoyMiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfX3MS/wrwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfX3MS/wry53MDtJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnxL/CvLfWvLYnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfU9rzT0ru49tDCxL/CvLfWvLYnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfU9rzTxL/CvM/uxL8nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfU9rzT0MLEv8K8t9a8tic7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ7mmxNzTw82+JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjMgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0YWxvZyBpdGVtIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJdGVtTGlzdCcgKSB7CiAgICAgICAgbXkgJENsYXNzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQ2xhc3MiICkgfHwgJyc7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkQ2xhc3M7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzcywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgIGlmICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH07CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkSXRlbUlEICggc29ydCB7ICRJdGVtSURMaXN0LT57JGF9IGNtcCAkSXRlbUlETGlzdC0+eyRifSB9IGtleXMgJXskSXRlbUlETGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGl0ZW0gbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSUQiICk7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhe0NsYXNzfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhUmVmOwoKICAgICAgICAgICAgJUl0ZW1EYXRhID0gJXskSXRlbURhdGFSZWZ9OwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgICAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgICAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVmFsaWRPcHRpb25TdHJnID0+ICRWYWxpZE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgIyBza2lwIGl0ZW1zIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBjbGFzcwogICAgICAgICAgICBuZXh0IGlmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30KICAgICAgICAgICAgICAgICAgICAmJiAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9IG5lICRJdGVtRGF0YXtDbGFzc307CgogICAgICAgICAgICAjIGZpbmQgb3V0cHV0IG1vZHVsZQogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QgZm9yIHRoaXMgcHJlZmVyZW5jZXMgaXRlbQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggR2VuZXJhbENhdGFsb2dEYXRhID0+IHsgJUl0ZW1EYXRhLCAlUGFyYW0gfSApOwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgIHx8IHJlZiggJFByZWZlcmVuY2VzeyRJdGVtfS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPnsnT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NBZGQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NBZGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXRDbGFzc0V4aXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzRXhpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkSXRlbURhdGF7JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgIGlmICEkSXRlbURhdGF7Q2xhc3N9IHx8ICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVyc7CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIG15ICRJdGVtSUQgPSAkSXRlbURhdGF7SXRlbUlEfTsKICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEl0ZW1JRCA9ICRTdWNjZXNzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIG15ICRHQ0RhdGEgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KCBJdGVtSUQgPT4gJEl0ZW1JRCApOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIG15ICROb3RlICAgICAgICA9ICcnOwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSXRlbSAoIGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiAkR0NEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICA9PiAkR0NEYXRhLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKSBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249SXRlbUxpc3QmQ2xhc3M9JEl0ZW1EYXRhe0NsYXNzfSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklECiAgICAgICAgUGFyYW1PYmplY3QgQ29uZmlnSXRlbSBHZW5lcmFsQ2F0YWxvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgZGllICJHb3Qgbm8gJE9iamVjdCEiIGlmICggISRTZWxmLT57JE9iamVjdH0gKTsKICAgIH0KCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gKTsKCiAgICBpZiAoICFkZWZpbmVkKCRHZXRQYXJhbSkgKSB7CiAgICAgICAgJEdldFBhcmFtCiAgICAgICAgICAgID0gZGVmaW5lZCggJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0gKQogICAgICAgICAgICA/ICRQYXJhbXtHZW5lcmFsQ2F0YWxvZ0RhdGF9LT57ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSB9CiAgICAgICAgICAgIDogJFNlbGYtPntDb25maWdJdGVtfS0+e0RhdGFTZWxlY3RlZH07CiAgICB9CgogICAgaWYgKCAhKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gJiYgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSApICkgewogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gPSAnVGV4dCc7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9IGVxICdQZXJtaXNzaW9uJyApIHsKICAgICAgICAkUGFyYW17RGF0YX0gICAgICAgICA9IHsgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApIH07CiAgICAgICAgJFBhcmFte1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgICAgICRQYXJhbXtCbG9ja30gICAgICAgID0gJ09wdGlvbic7CiAgICB9CgogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0dldFBhcmFtfSB9ICkgewogICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXtHZXRQYXJhbX0tPnskS2V5fSB9OwogICAgICAgIGZvciBteSAkVmFsdWUgKEBBcnJheSkgewoKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9ICdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuOCAyMDA5LzEwLzA3IDEzOjE4OjE4IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBDYXRhbG9nIEl0ZW0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgQ2F0YWxvZyBDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtTGlzdCZDbGFzcz0kTFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDbGFzcyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJWYWxpZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtRWRpdCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1TYXZlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikl0ZW0ifSAkVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgo8IS0tIGR0bDpibG9jazpUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IkRlc2MifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHJvd3M9IiRRRGF0YXsiUm93cyJ9IiBjb2xzPSIkUURhdGF7IkNvbHMifSI+JFFEYXRheyJTZWxlY3RlZElEIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIGNsYXNzPSJmaXhlZCIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiPiRRRGF0YXsiRmlsZW5hbWUifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iIiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGFzc3dvcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbGlkT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ2FjaGVJbnRlcm5hbC5wbSAtIGFsbCBjYWNoZSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENhY2hlSW50ZXJuYWwucG0sdiAxLjQuMi4xIDIwMTEvMDQvMDcgMjA6MTU6NTYgdWIgRXhwICQKIyAkT2xkSWQ6IENhY2hlSW50ZXJuYWwucG0sdiAxLjkgMjAxMC8xMS8zMCAxMzoxMToxMSBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40LjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwgLSBjYWNoZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNhY2hlIGZ1bmN0aW9ucyBmb3IgaW50ZXJuYWwgY2FjaGUgbWFuYWdlbWVudC4KCk5vdGljZToKVGhpcyBtb2R1bGUgaXMgc3RvcmluZyB0aGUgY2FjaGUgaW5mb3JtYXRpb24gaW4gbWVtb3J5IGFuZCBhbHNvIHBlcm1hbmVudGx5IChlLiBnLiBpbiBmaWxlIHN5c3RlbSkuClNvIHlvdSBuZWVkIHRvIHRha2UgY2FyZSwgdGhhdCB5b3UgaGF2ZSBub3Qgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgdGhlIENhY2hlSW50ZXJuYWxPYmplY3QgYXQgb25lCnJ1bnRpbWUsIGJlY2F1c2UgdGhlIGluIG1lbW9yeSBjYWNoZSB3aWxsIGZhaWwgdGhlbi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJENhY2hlSW50ZXJuYWxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ09iamVjdE5hbWUnLCAjIG9ubHkgQS16IGNoYXJzIHVzYWJsZQogICAgICAgIFRUTCAgICAgICAgICA9PiA2MCAqIDYwICogMjQsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIDA9b2ZmOyAxPXNldCtnZXRfY2FjaGU7IDI9K2RlbGV0ZStnZXRfcmVxdWVzdDsKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoTWFpbk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICBmb3IgKHF3KFR5cGUgVFRMKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57VHlwZX0gPSAnQ2FjaGVJbnRlcm5hbCcgLiAkU2VsZi0+e1R5cGV9OwoKICAgIG15ICRDYWNoZVBlcm1hbmVudCA9IDE7CgogICAgIyAgICAkQ2FjaGVQZXJtYW5lbnQgPSAwOwoKICAgIGlmICgkQ2FjaGVQZXJtYW5lbnQpIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTZXQoKQoKc2V0IGEgbmV3IGNhY2hlCgogICAgJENhY2hlSW50ZXJuYWxPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnU29tZUtleScsCiAgICAgICAgVmFsdWUgPT4gJ1NvbWUgVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgcnVudGltZSBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPnsgJFBhcmFte0tleX0gfSA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBzZXQgcGVybWFuZW50IGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57VHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e1RUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0KCkKCnJldHVybiBhIGNhY2hlCgogICAgbXkgJFZhbHVlID0gJENhY2hlSW50ZXJuYWxPYmplY3QtPkdldCgKICAgICAgICBLZXkgID0+ICdTb21lS2V5JywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoS2V5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHJ1bnRpbWUgY2FjaGUKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9IGlmIGV4aXN0cyAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9OwoKICAgICMgY2hlY2sgcGVybWFuZW50IGNhY2hlCiAgICBteSAkQ2FjaGU7CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17S2V5fSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIGlmICFkZWZpbmVkICRDYWNoZTsKCiAgICAjIHNldCBydW50aW1lIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9ID0gJENhY2hlOwoKICAgIHJldHVybiAkQ2FjaGU7Cn0KCj1pdGVtIERlbGV0ZSgpCgpkZWxldGUgYSBjYWNoZQoKICAgICRDYWNoZUludGVybmFsT2JqZWN0LT5EZWxldGUoCiAgICAgICAgS2V5ICA9PiAnU29tZUtleScsCiAgICApOwoKPWN1dAoKc3ViIERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgcnVudGltZSBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57ICRQYXJhbXtLZXl9IH07CgogICAgIyBjaGVjayBwZXJtYW5lbnQgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e1R5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENsZWFuVXAoKQoKZGVsZXRlIGFsbCBjYWNoZXMKCiAgICAkQ2FjaGVJbnRlcm5hbE9iamVjdC0+Q2xlYW5VcCgpOwoKSWYgYW5vdGhlciBjYWNoZSB0eXBlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIHlvdSBjYW4KdXNlIHRoZSBwYXJhbWV0ZXIgJ090aGVyVHlwZScuCgogICAgJENhY2hlSW50ZXJuYWxPYmplY3QtPkNsZWFuVXAoT3RoZXJUeXBlID0+ICdTb21lVHlwZScpOwoKVGhpcyBpcyB1c2VmdWwgZm9yIGNsZWFuaW5nIHVwIGRlcGVuZGVudCBjYWNoZSBlbnRyaWVzIGFmdGVyCnRoZSBtb2RpZmljYXRpb24gb2Ygb2JqZWN0cyAoZm9yIGV4YW1wbGUsIGNsZWFuaW5nIHVwIHRoZSBncm91cApjYWNoZSBhZnRlciBtb2RpZnlpbmcgYWdlbnRzKS4KCk5PVEU6IFRoaXMgJ090aGVyVHlwZSctY2xlYW51cCBvbmx5IGFmZmVjdHMgcGVybWFuZW50IGNhY2hlcy4KSW4tbWVtb3J5LWNhY2hlcyBpbiBvdGhlciBDYWNoZUludGVybmFsIG9iamVjdHMgY2Fubm90IGJlIGNsZWFuZWQKdXAgcHJlc2VudGx5LCB0aGVyZWZvcmUgYSByZWZhY3RvcmluZyBvZiB0aGUgZW50aXJlIGNhY2hpbmcgYXJjaGl0ZWN0dXJlCndpbGwgYmUgbmVjY2Vzc2FyeS4KCj1jdXQKCnN1YiBDbGVhblVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgYWxsIHJ1bnRpbWUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGV9ID0gdW5kZWY7CgogICAgIyBkZWxldGUgcGVybWFuZW50IGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBpZiAoICRQYXJhbXtPdGhlclR5cGV9ICkgewogICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2FjaGVJbnRlcm5hbCcgLiAkUGFyYW17T3RoZXJUeXBlfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntUeXBlfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNC4yLjEgJCAkRGF0ZTogMjAxMS8wNC8wNyAyMDoxNTo1NiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjUyLjIuMSAyMDExLzA1LzE2IDExOjU0OjAwIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUyLjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nIC0gZ2VuZXJhbCBjYXRhbG9nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc01vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBDYWNoZUludGVybmFsIG9iamVjdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDYWNoZUludGVybmFsLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgIFRUTCAgPT4gNjAgKiA2MCAqIDMsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ2xhc3NMaXN0KCkKCnJldHVybiBhbiBhcnJheSByZWZlcmVuY2Ugb2YgYWxsIGdlbmVyYWwgY2F0YWxvZyBjbGFzc2VzCgogICAgbXkgJEFycmF5UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc0xpc3QoKTsKCj1jdXQKCnN1YiBDbGFzc0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QoZ2VuZXJhbF9jYXRhbG9nX2NsYXNzKSAnCiAgICAgICAgICAgIC4gJ0ZST00gZ2VuZXJhbF9jYXRhbG9nIE9SREVSIEJZIGdlbmVyYWxfY2F0YWxvZ19jbGFzcycsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENsYXNzTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ2xhc3NMaXN0LCAkUm93WzBdOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgbXkgJENhY2hlS2V5ID0gJ0NsYXNzTGlzdCc7CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAQ2xhc3NMaXN0LAogICAgKTsKCiAgICByZXR1cm4gXEBDbGFzc0xpc3Q7Cn0KCj1pdGVtIENsYXNzUmVuYW1lKCkKCnJlbmFtZSBhIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6U3RhdGUnLAogICAgICAgIENsYXNzTmV3ID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCj1jdXQKCnN1YiBDbGFzc1JlbmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte0NsYXNzTmV3fSBlcSAkUGFyYW17Q2xhc3NPbGR9OwoKICAgICMgY2hlY2sgaWYgbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJEFscmVhZHlFeGlzdHMgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxyZWFkeUV4aXN0cyA9IDE7CiAgICB9CgogICAgaWYgKCRBbHJlYWR5RXhpc3RzKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZW5hbWUgY2xhc3MgJFBhcmFte0NsYXNzT2xkfSEgTmV3IGNsYXNzbmFtZSBhbHJlYWR5IGV4aXN0cy4iCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+Q2xlYW5VcCgpOwoKICAgICMgcmVuYW1lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc05ld30sIFwkUGFyYW17Q2xhc3NPbGR9IF0sCiAgICApOwp9Cgo9aXRlbSBJdGVtTGlzdCgpCgpyZXR1cm4gYSBsaXN0IGFzIGhhc2ggcmVmZXJlbmNlIG9mIG9uZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkSGFzaFJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgUHJlZmVyZW5jZXMgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCB7fQogICAgICAgICAgICBQZXJtaXNzaW9uID0+IDIsICAgICAgICAgICAgICAgICAgICAgIyBvciB3aGF0ZXZlciBwcmVmZXJlbmNlcyBjYW4gYmUgdXNlZAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgbXkgJFByZWZlcmVuY2VzQ2FjaGVLZXkgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1RhYmxlICAgID0gJyc7CiAgICBteSAkUHJlZmVyZW5jZXNXaGVyZSAgICA9ICcnOwogICAgbXkgQFByZWZlcmVuY2VzQmluZDsKCiAgICAjIGhhbmRsZSBnaXZlbiBwcmVmZXJlbmNlcwogICAgaWYgKCBleGlzdHMgJFBhcmFte1ByZWZlcmVuY2VzfSAmJiByZWYgJFBhcmFte1ByZWZlcmVuY2VzfSBlcSAnSEFTSCcgKSB7CgogICAgICAgICRQcmVmZXJlbmNlc1RhYmxlID0gJywgZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzJzsKICAgICAgICBteSBAV2hlcmVzOwoKICAgICAgICAjIGFkZCBhbGwgcHJlZmVyZW5jZXMgZ2l2ZW4gdG8gd2hlcmUtY2xhdXNlCiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRQYXJhbXtQcmVmZXJlbmNlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggcmVmKCAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gKSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ID0gWyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAV2hlcmVzLCAnKHByZWZfa2V5ID0gPyBBTkQgcHJlZl92YWx1ZSBJTiAoJwogICAgICAgICAgICAgICAgLiBqb2luKCAnLCAnLCBtYXAgeyc/J30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH0gKQogICAgICAgICAgICAgICAgLiAnKSknOwoKICAgICAgICAgICAgcHVzaCBAUHJlZmVyZW5jZXNCaW5kLCBcJEtleSwgbWFwIHsgXCRfIH0gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CgogICAgICAgICAgICAjIGFkZCBmdW5jdGlvbmFsaXR5IGxpc3QgdG8gY2FjaGUga2V5CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49ICcjIyMjJyBpZiAkUHJlZmVyZW5jZXNDYWNoZUtleTsKICAgICAgICAgICAgJFByZWZlcmVuY2VzQ2FjaGVLZXkgLj0gam9pbiBxeyMjIyN9LCAkS2V5LCBtYXAgeyRffSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICRQcmVmZXJlbmNlc1doZXJlCiAgICAgICAgICAgID0gJ0FORCBnZW5lcmFsX2NhdGFsb2cuaWQgPSBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMuZ2VuZXJhbF9jYXRhbG9nX2lkJzsKICAgICAgICAkUHJlZmVyZW5jZXNXaGVyZSAuPSAnIEFORCAnIC4gam9pbiAnIEFORCAnLCBAV2hlcmVzOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBuYW1lIEZST00gZ2VuZXJhbF9jYXRhbG9nICRQcmVmZXJlbmNlc1RhYmxlICIKICAgICAgICAuICJXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/ICRQcmVmZXJlbmNlc1doZXJlICI7CiAgICBteSBAQklORCA9ICggXCRQYXJhbXtDbGFzc30sIEBQcmVmZXJlbmNlc0JpbmQgKTsKCiAgICAjIGFkZCB2YWxpZCBzdHJpbmcgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRTUUwgLj0gJ0FORCB2YWxpZF9pZCA9IDEgJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBrZXkKICAgIG15ICRDYWNoZUtleQogICAgICAgID0gJ0l0ZW1MaXN0OjonIC4gJFBhcmFte0NsYXNzfSAuICcjIyMjJyAuICRQYXJhbXtWYWxpZH0gLiAnIyMjIycgLiAkUHJlZmVyZW5jZXNDYWNoZUtleTsKCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGl0ZW0KICAgIGlmICggISVEYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2xhc3Mgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gSXRlbUdldCgpCgpnZXQgYSBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKUmV0dXJuCiAgICAkSXRlbURhdGF7SXRlbUlEfQogICAgJEl0ZW1EYXRhe0NsYXNzfQogICAgJEl0ZW1EYXRhe05hbWV9CiAgICAkSXRlbURhdGF7VmFsaWRJRH0KICAgICRJdGVtRGF0YXtDb21tZW50fQogICAgJEl0ZW1EYXRhe0NyZWF0ZVRpbWV9CiAgICAkSXRlbURhdGF7Q3JlYXRlQnl9CiAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0KICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+IDMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICA9PiAnSXRlbSBOYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbUlEfSAmJiAoICEkUGFyYW17Q2xhc3N9IHx8ICEkUGFyYW17TmFtZX0gKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbUlEIE9SIENsYXNzIGFuZCBOYW1lIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFICc7CiAgICBteSBAQklORDsKCiAgICAjIGFkZCBvcHRpb25zIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0l0ZW1HZXQ6OkNsYXNzOjonIC4gJFBhcmFte0NsYXNzfSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGNsYXNzIGFuZCBuYW1lIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICdnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgKCBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0l0ZW1HZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICAjIGFkZCBpdGVtIGlkIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICdpZCA9ID8nOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17SXRlbUlEfTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJJTkQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlSXRlbURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ICAgICA9ICRSb3dbMF07CiAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkSXRlbURhdGF7TmFtZX0gICAgICAgPSAkUm93WzJdOwogICAgICAgICRJdGVtRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbM107CiAgICAgICAgJEl0ZW1EYXRhe0NvbW1lbnR9ICAgID0gJFJvd1s0XSB8fCAnJzsKICAgICAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzVdOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbNl07CiAgICAgICAgJEl0ZW1EYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s3XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzhdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJEl0ZW1EYXRhe0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJdGVtIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoIEl0ZW1JRCA9PiAkSXRlbURhdGF7SXRlbUlEfSApOwoKICAgICMgbWVyZ2UgaGFzaAogICAgaWYgKCVQcmVmZXJlbmNlcykgewogICAgICAgICVJdGVtRGF0YSA9ICggJUl0ZW1EYXRhLCAlUHJlZmVyZW5jZXMgKTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnSXRlbUdldDo6Q2xhc3M6OicgLiAkSXRlbURhdGF7Q2xhc3N9IC4gJzo6JyAuICRJdGVtRGF0YXtOYW1lfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnSXRlbUdldDo6SXRlbUlEOjonIC4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgVmFsdWUgPT4gXCVJdGVtRGF0YSwKICAgICk7CgogICAgcmV0dXJuIFwlSXRlbURhdGE7Cn0KCj1pdGVtIEl0ZW1BZGQoKQoKYWRkIGEgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJEl0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgaXRlbSwgaWYgaXRlbSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnKGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSAnJzsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBvZiBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ2xhc3M7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDbGFzcyA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIG5vdCBmb3VuZCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJENsYXNzLCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17SXRlbUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+Q2xlYW5VcCgpOwoKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCAnCiAgICAgICAgICAgIC4gJ25hbWUgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKCnNldCBHZW5lcmFsQ2F0YWxvZyBwcmVmZXJlbmNlcwoKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgICAgIEtleSAgICA9PiAnVXNlckNvbW1lbnQnLAogICAgICAgIFZhbHVlICA9PiAnc29tZSBjb21tZW50JywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KEBfKTsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgpCgpnZXQgR2VuZXJhbENhdGFsb2cgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkUXVldWVPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldChAXyk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNTIuMi4xICQgJERhdGU6IDIwMTEvMDUvMTYgMTE6NTQ6MDAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFByZWZlcmVuY2VzREIucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODowNSByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQiAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBTWU5PUFNJUwoKc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgID0gJ2dlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgPSAncHJlZl9rZXknOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ID0gJ3ByZWZfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gID0gJ2dlbmVyYWxfY2F0YWxvZ19pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKClNldCBwcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzNCwKICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgIFZhbHVlICA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQgS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAiCiAgICAgICAgICAgIC4gIiRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gKCRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWx1ZX0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKR2V0IGFsbCBQcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBxdWV1ZSBwcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTg6MDUgJAoKPWN1dAo=
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjIyLjIuMSAyMDExLzA1LzE2IDExOjU0OjAwIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0dlbmVyYWxDYXRhbG9nJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwpteSAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnOwppZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpLT57UGVybWlzc2lvbnN9Owp9CgojIGVuYWJsZSBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nIHdpdGggYSBkdW1teSB0cnVlIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnV29ybGQnLAogICAgICAgICAgICBDb2xvciA9PiAnUmVkJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ1JlZCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdOZXdXb3JsZCcsCiAgICAgICAgICAgIENvbG9yID0+ICdCbHVlJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ05ld1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ0JsdWUnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDPoCDQryBUZXN0IENvbW1lbnQg0awg0aAgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ8+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW1QcmVmZXJlbmNlcycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBUZXN0ICA9PiAnaGVsbG8gd29ybGQnLAogICAgICAgICAgICBHcm91cCA9PiAzMywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBUZXN0ID0+ICdoZWxsbycsCiAgICAgICAgICAgIFNpemUgPT4gMzgsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15ICRMYXN0QWRkZWRJdGVtSUQ7Cm15ICVBZGRlZEl0ZW1Db3VudGVyOwoKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewoKICAgIGlmICggJEl0ZW0tPntBZGR9ICkgewoKICAgICAgICAjIGFkZCBuZXcgaXRlbQogICAgICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICAgICAgJXsgJEl0ZW0tPntBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkgLSBJdGVtS2V5OiAkSXRlbUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXRlbUlEKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBpdGVtIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkSXRlbUlEID0gJEl0ZW1JRDsKCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgYWRkZWQgaXRlbSBjb3VudGVyCiAgICAgICAgICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJEl0ZW1JRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1BZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtIHVzaW5nIEl0ZW1JZCBhbmQgVXNlcklECiAgICAgICAgbXkgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtIFVzaW5nIEl0ZW1JRCBhbmQgVXNlcklEIC0gJEl0ZW1BdHRyaWJ1dGUgIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0gdXNpbmcgQ2xhc3MgYW5kIE5hbWUKICAgICAgICAkSXRlbUdldCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30sCiAgICAgICAgICAgIE5hbWUgID0+ICRJdGVtLT57QWRkR2V0fS0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtIFVzaW5nIENsYXNzIGFuZCBOYW1lIC0gJEl0ZW1BdHRyaWJ1dGUgIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBpdGVtIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJExhc3RBZGRlZEl0ZW1JRCApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgaXRlbQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSAtIEl0ZW1LZXk6ICRMYXN0QWRkZWRJdGVtSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJEl0ZW1HZXQyID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldDItPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSAkSXRlbUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gKSB7CgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9LT57JEtleX0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc1NldCgpIC0gJEtleSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcHJlZmVyZW5jZXMKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gKSB7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fSB9ICkgewogICAgICAgICAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9LT57JEtleX0gZXEgJFByZWZlcmVuY2VzeyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgYXJyYXlzCm15ICVFeGlzdGluZ0NsYXNzZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9OwogICAgJEV4aXN0aW5nQ2xhc3Nlc1RtcHsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0NsYXNzZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKCm15ICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfHw9ICcnOwogICAgJEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1weyAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB9ID0gMTsKfQpteSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwoKbXkgQE5vbkV4aXN0aW5nQ2xhc3NlcyA9ICggJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MxJywgJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MyJyApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJENsYXNzTGlzdDEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJENsYXNzQ291bnQgPSAwOwogICAgaWYgKCAkQ2xhc3NMaXN0MSAmJiByZWYgJENsYXNzTGlzdDEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAkQ2xhc3NDb3VudCA9IGdyZXAgeyAkXyBlcSAkQ2xhc3MgfSBAeyRDbGFzc0xpc3QxfTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENsYXNzQ291bnQsCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc0xpc3QoKSAtICRDbGFzcyBsaXN0ZWQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQE5vbkV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJdGVtTGlzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIG5vdCBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyRDbGFzc30sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMyAtIEl0ZW0gTGlzdCB3aXRoIHByZWZlcmVuY2VzIChzaW5nbGUgaGFzaCBlbnRyeSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICRDbGFzcyAgICA9ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF07CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnV29ybGQnLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgcHJlZmVyZW5jZXMgKHNpbmdsZSBoYXNoIGVudHJ5KSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgNCAtIEl0ZW0gTGlzdCB3aXRoIHByZWZlcmVuY2VzIChhcnJheSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICRDbGFzcyAgICA9ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF07CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDb2xvciA9PiBbICdSZWQnLCAnQmx1ZScgXSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgMiwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIHByZWZlcmVuY2VzIChhcnJheSkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBQcmVmZXJlbmNlcyB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgPT4gJENsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgIEtleSAgICA9PiAnVW5pdFRlc3RQcmVmJywKICAgICAgICBWYWx1ZSAgPT4gJzEnLAogICAgKTsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgVW5pdFRlc3RQcmVmID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRJdGVtTGlzdC0+eyRJdGVtSUR9LAogICAgICAgICdJdGVtIFByZWZlcmVuY2VzJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gQ2xhc3MgJENsYXNzIFByZWZlcmVuY2VzIG1hdGNoIiwKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMicsCiAgICApOwoKICAgICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbm90IG1hdGNoIGFmdGVyIFByZWZlcmVuY2VzU2V0IENoYW5nZSIKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgo9cG9kCgpteSAlRnVuY3Rpb25hbGl0eUxpc3QxOwptYXAgeyAkRnVuY3Rpb25hbGl0eUxpc3QxeyRffSA9IDEgfSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXM7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEZ1bmN0aW9uYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKPWN1dAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIENsYXNzTmV3ID0+ICcgJyAuICRDbGFzcyAuICJSRSBOQSBNRSAyIFxuIFxyIFx0ICIsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbnVwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnLAopOwoKMTsK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4xIDIwMDkvMTAvMDcgMTM6MTY6MjMgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpHZW5lcmFsQ2F0YWxvZy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1pZ3JhdGUgJ2Z1bmN0aW9uYWxpdHknIHRvIGV4dGVybmFsIHRhYmxlCiAgICAkU2VsZi0+X01pZ3JhdGVGdW5jdGlvbmFsaXR5KCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkoKQoKPWN1dAoKc3ViIF9NaWdyYXRlRnVuY3Rpb25hbGl0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgU0VMRUNUIGFsbCBmdW5jdGlvbmFsaXR5IHZhbHVlcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZ1bmN0aW9uYWxpdHkgRlJPTSBnZW5lcmFsX2NhdGFsb2cnLAogICAgKTsKCiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgISRSb3dbMV07CgogICAgICAgIHB1c2ggQExpc3QsIFxAUm93OwogICAgfQoKICAgICMgc2F2ZSBlbnRyaWVzIGluIG5ldyB0YWJsZQogICAgZm9yIG15ICRFbnRyeSAoQExpc3QpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyggZ2VuZXJhbF9jYXRhbG9nX2lkLCBwcmVmX2tleSwgcHJlZl92YWx1ZSApJwogICAgICAgICAgICAgICAgLiAnIFZBTFVFUyggPywgXCdGdW5jdGlvbmFsaXR5XCcsID8gKScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEVudHJ5LT5bMF0sIFwkRW50cnktPlsxXSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkcm9wIGNvbHVtbiBpbgogICAgbXkgKCREcm9wKSA9ICRTZWxmLT57REJPYmplY3R9LT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTY6MjMgJAoKPWN1dAo=