ArticleCopyMoveDelete
1.0.0
c.a.p.e. IT GmbH
http://www.cape-it.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
CR: extracted functionality from KIX4OTRS.
ArticleCopyMoveDelete - allows to copy, move or delete articles.
3.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS module ArticleCopyMoveDelete.
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to UNINSTALL the ArticleCopyMoveDelete extensions package for OTRS.<br/>
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the ArticleCopyMoveDelete extensions package for OTRS.<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
my $FunctionName = 'CodeInstall';
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};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUpgrade';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# 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};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUninstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# 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};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeReinstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# 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};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2011-12-28 11:38:01
cvs.intra.cape-it.de
IyAtLQojIENIQU5HRVNfYXJ0aWNsZWNvcHltb3ZlZGVsZXRlIC0gY2hhbmdlIGxvZyBvZiBBcnRpY2xlQ29weU1vdmVEZWxldGUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMiBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCiMgLS0KIyAkSWQ6IENIQU5HRVNfYXJ0aWNsZWNvcHltb3ZlZGVsZXRlLHYgMS4yIDIwMTEtMTItMjggMTA6MzY6NDEgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS4wLjEgKDIwMTIvPz8vPz8pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTIvTU0vREQpIC0gQnVnZml4OiAoTE9HSU4pCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4wICgyMDExLzEyLzI4KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzEyLzI4KSAtIENSOiBleHRyYWN0ZWQgZnVuY3Rpb25hbGl0eSBmcm9tIEtJWDRPVFJTIC0gc2VlIFsxXSAodHRvKQojCiMgWzFdIGh0dHBzOi8vb3Ryc3RlYW0uaWRlYXNjYWxlLmNvbS9hL2R0ZC9Db3B5LU9SLU1lcmdlLVNpbmdsZS1BcnRpY2xlLVRvLU90aGVyLVRpY2tldC8zMjE0NDktMTAzNjkKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX3BhY2thZ2UgdmVyc2lvbj0iMS4wIj4KICAgIDxDVlM+JElkOiBBcnRpY2xlQ29weU1vdmVEZWxldGUuc29wbSx2IDEuMiAyMDExLTEyLTI4IDEwOjM2OjQxIHR0byBFeHAgJDwvQ1ZTPgogICAgPE5hbWU+QXJ0aWNsZUNvcHlNb3ZlRGVsZXRlPC9OYW1lPgogICAgPFZlbmRvcj5jLmEucC5lLiBJVCBHbWJIPC9WZW5kb3I+CiAgICA8VVJMPmh0dHA6Ly93d3cuY2FwZS1pdC5kZS88L1VSTD4KICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QXJ0aWNsZUNvcHlNb3ZlRGVsZXRlIC0gYWxsb3dzIHRvIGNvcHksIG1vdmUgb3IgZGVsZXRlIGFydGljbGVzLjwvRGVzY3JpcHRpb24+CiAgICA8TGljZW5zZT5HTlUgQUZGRVJPIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgVmVyc2lvbiAzLCBOb3ZlbWJlciAyMDA3PC9MaWNlbnNlPgogICAgPFZlcnNpb24+MS4wLjA8L1ZlcnNpb24+CiAgICA8RnJhbWV3b3JrPjMuMC54PC9GcmFtZXdvcms+CiAgICA8QnVpbGREYXRlPj88L0J1aWxkRGF0ZT4KICAgIDxCdWlsZEhvc3Q+PzwvQnVpbGRIb3N0PgogICAgPEZpbGVsaXN0PgogICAgICAgIDxGaWxlIFBlcm1pc3Npb249IjY0NCIgTG9jYXRpb249IkNIQU5HRVNfYXJ0aWNsZWNvcHltb3ZlZGVsZXRlIi8+CiAgICAgICAgPEZpbGUgUGVybWlzc2lvbj0iNjQ0IiBMb2NhdGlvbj0iQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlLnNvcG0iLz4KICAgICAgICA8RmlsZSBQZXJtaXNzaW9uPSI2NDQiIExvY2F0aW9uPSJkb2MvZW4vQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlLnBvZCIvPgogICAgICAgIDxGaWxlIFBlcm1pc3Npb249IjY0NCIgTG9jYXRpb249Iktlcm5lbC9Db25maWcvRmlsZXMvQWdlbnRBcnRpY2xlQ29weU1vdmUueG1sIi8+CiAgICAgICAgPEZpbGUgUGVybWlzc2lvbj0iNjQ0IiBMb2NhdGlvbj0iS2VybmVsL0xhbmd1YWdlL2RlX0FydGljbGVDb3B5TW92ZURlbGV0ZS5wbSIvPgogICAgICAgIDxGaWxlIFBlcm1pc3Npb249IjY0NCIgTG9jYXRpb249Iktlcm5lbC9Nb2R1bGVzL0FnZW50QXJ0aWNsZUNvcHlNb3ZlLnBtIi8+CiAgICAgICAgPEZpbGUgUGVybWlzc2lvbj0iNjQ0IiBMb2NhdGlvbj0iS2VybmVsL091dHB1dC9IVE1ML091dHB1dEZpbHRlckFydGljbGVDb3B5TW92ZURlbGV0ZS5wbSIvPgogICAgICAgIDxGaWxlIFBlcm1pc3Npb249IjY0NCIgTG9jYXRpb249Iktlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudEFydGljbGVDb3B5TW92ZS5kdGwiLz4KICAgICAgICA8RmlsZSBQZXJtaXNzaW9uPSI2NDQiIExvY2F0aW9uPSJLZXJuZWwvU3lzdGVtL1RpY2tldC9UaWNrZXRFeHRlbnNpb25zQXJ0aWNsZUNvcHlNb3ZlLnBtIi8+CiAgICAgICAgPEZpbGUgUGVybWlzc2lvbj0iNjQ0IiBMb2NhdGlvbj0idmFyL3BhY2thZ2VzZXR1cC9BZ2VudEFydGljbGVDb3B5TW92ZS5wbSIvPgogICAgPC9GaWxlbGlzdD4KICAgIDxEYXRhYmFzZUluc3RhbGw+PC9EYXRhYmFzZUluc3RhbGw+CiAgICA8RGF0YWJhc2VSZWluc3RhbGw+PC9EYXRhYmFzZVJlaW5zdGFsbD4KICAgIDxEYXRhYmFzZVVwZ3JhZGU+PC9EYXRhYmFzZVVwZ3JhZGU+CiAgICA8RGF0YWJhc2VVbmluc3RhbGw+PC9EYXRhYmFzZVVuaW5zdGFsbD4KICAgIDxDb2RlSW5zdGFsbCBUeXBlPSJwb3N0Ij4KICAgICAgICBteSAkRnVuY3Rpb25OYW1lID0gJ0NvZGVJbnN0YWxsJzsKICAgICAgICBteSAkQ29kZU1vZHVsZSA9ICd2YXI6OnBhY2thZ2VzZXR1cDo6JyAuICRQYXJhbXtTdHJ1Y3R1cmV9LSZndDt7TmFtZX0tJmd0O3tDb250ZW50fTsKCiAgICAgICAgIyBUaGUgY29kZSBtb2R1bGUgaGFzIGp1c3QgcmVjZW50bHkgYmVlbiBjb3BpZWQgdG8gaXQncyBsb2NhdGlvbiBpbiB0aGUgZmlsZSBzeXN0ZW0uCiAgICAgICAgIyBJbiBhIHBlcnNpc3RlbnQgUGVybCBlbnZpcm9ubWVudCBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIG1pZ2h0IHN0aWxsIGJlIGxvYWRlZCwKICAgICAgICAjIGFzIHdhdGNoZG9ncyBsaWtlIEFwYWNoZTI6OlJlbG9hZCBoYXZlbid0IGhhZCBhIGNoYW5jZSB0byByZWxvYWQgaXQuCiAgICAgICAgIyBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZyBsb2FkZWQuCiAgICAgICAgIyBLZXJuZWw6OlN5c3RlbTo6TWFpbjo6UmVxdWlyZSgpIGNoZWNrcyB0aGUgcmVsYXRpdmUgZmlsZSBwYXRoLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IGZyb20gJUlOQy4KICAgICAgICAjIFRoaXMgaXMgb25seSBuZWVkZWQgaW4gcGVyc2lzdGVudCBQZXJsIGVudmlyb25tZW50LCBidXQgZG9lcyBubyBoYXJtIGluIGEgQ0dJIGVudmlyb25tZW50LgogICAgICAgIG15ICRDb2RlTW9kdWxlUGF0aCA9ICRDb2RlTW9kdWxlOwogICAgICAgICRDb2RlTW9kdWxlUGF0aCA9fiBzLzo6L1wvL2c7CiAgICAgICAgJENvZGVNb2R1bGVQYXRoIC49ICcucG0nOwogICAgICAgIGRlbGV0ZSAkSU5DeyRDb2RlTW9kdWxlUGF0aH07CgogICAgICAgIGlmICggJFNlbGYtJmd0O3tNYWluT2JqZWN0fS0mZ3Q7UmVxdWlyZSgkQ29kZU1vZHVsZSkgKSB7CiAgICAgICAgICAgIG15ICRDb2RlT2JqZWN0ID0gJENvZGVNb2R1bGUtJmd0O25ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgaWYgKCRDb2RlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ29kZU9iamVjdC0mZ3Q7JEZ1bmN0aW9uTmFtZSgleyRTZWxmfSkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtJmd0O3tMb2dPYmplY3R9LSZndDtMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0mZ3Q7ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0mZ3Q7ICZxdW90O0NvdWxkIG5vdCBjYWxsIG1ldGhvZCAkRnVuY3Rpb25OYW1lKCkgb24gJENvZGVNb2R1bGUucG0uJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLSZndDt7TG9nT2JqZWN0fS0mZ3Q7TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0mZ3Q7ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPSZndDsgJnF1b3Q7Q291bGQgbm90IGNhbGwgbWV0aG9kIG5ldygpIG9uICRDb2RlTW9kdWxlLnBtLiZxdW90OwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIDwvQ29kZUluc3RhbGw+CiAgICA8Q29kZVJlaW5zdGFsbCBUeXBlPSJwb3N0Ij4KICAgICAgICBteSAkRnVuY3Rpb25OYW1lID0gJ0NvZGVSZWluc3RhbGwnOwogICAgICAgIG15ICRDb2RlTW9kdWxlID0gJ3Zhcjo6cGFja2FnZXNldHVwOjonIC4gJFBhcmFte1N0cnVjdHVyZX0tJmd0O3tOYW1lfS0mZ3Q7e0NvbnRlbnR9OwoKICAgICAgICAjIFRoZSBjb2RlIG1vZHVsZSBoYXMganVzdCByZWNlbnRseSBiZWVuIGNvcGllZCB0byBpdCdzIGxvY2F0aW9uIGluIHRoZSBmaWxlIHN5c3RlbS4KICAgICAgICAjIEluIGEgcGVyc2lzdGVudCBQZXJsIGVudmlyb25tZW50IGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgbWlnaHQgc3RpbGwgYmUgbG9hZGVkLAogICAgICAgICMgYXMgd2F0Y2hkb2dzIGxpa2UgQXBhY2hlMjo6UmVsb2FkIGhhdmVuJ3QgaGFkIGEgY2hhbmNlIHRvIHJlbG9hZCBpdC4KICAgICAgICAjIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG5ldyB2ZXJzaW9uIGlzIGJlaW5nIGxvYWRlZC4KICAgICAgICAjIEtlcm5lbDo6U3lzdGVtOjpNYWluOjpSZXF1aXJlKCkgY2hlY2tzIHRoZSByZWxhdGl2ZSBmaWxlIHBhdGgsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoYXQgZnJvbSAlSU5DLgogICAgICAgICMgVGhpcyBpcyBvbmx5IG5lZWRlZCBpbiBwZXJzaXN0ZW50IFBlcmwgZW52aXJvbm1lbnQsIGJ1dCBkb2VzIG5vIGhhcm0gaW4gYSBDR0kgZW52aXJvbm1lbnQuCiAgICAgICAgbXkgJENvZGVNb2R1bGVQYXRoID0gJENvZGVNb2R1bGU7CiAgICAgICAgJENvZGVNb2R1bGVQYXRoID1+IHMvOjovXC8vZzsKICAgICAgICAkQ29kZU1vZHVsZVBhdGggLj0gJy5wbSc7CiAgICAgICAgZGVsZXRlICRJTkN7JENvZGVNb2R1bGVQYXRofTsKCiAgICAgICAgaWYgKCAkU2VsZi0mZ3Q7e01haW5PYmplY3R9LSZndDtSZXF1aXJlKCRDb2RlTW9kdWxlKSApIHsKICAgICAgICAgICAgbXkgJENvZGVPYmplY3QgPSAkQ29kZU1vZHVsZS0mZ3Q7bmV3KCAleyRTZWxmfSApOwogICAgICAgICAgICBpZiAoJENvZGVPYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmICggISRDb2RlT2JqZWN0LSZndDskRnVuY3Rpb25OYW1lKCV7JFNlbGZ9KSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0mZ3Q7e0xvZ09iamVjdH0tJmd0O0xvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPSZndDsgJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPSZndDsgJnF1b3Q7Q291bGQgbm90IGNhbGwgbWV0aG9kICRGdW5jdGlvbk5hbWUoKSBvbiAkQ29kZU1vZHVsZS5wbS4mcXVvdDsKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtJmd0O3tMb2dPYmplY3R9LSZndDtMb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPSZndDsgJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9Jmd0OyAmcXVvdDtDb3VsZCBub3QgY2FsbCBtZXRob2QgbmV3KCkgb24gJENvZGVNb2R1bGUucG0uJnF1b3Q7CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgPC9Db2RlUmVpbnN0YWxsPgogICAgPENvZGVVcGdyYWRlIFR5cGU9InBvc3QiPgogICAgICAgIG15ICRGdW5jdGlvbk5hbWUgPSAnQ29kZVVwZ3JhZGUnOwogICAgICAgIG15ICRDb2RlTW9kdWxlID0gJ3Zhcjo6cGFja2FnZXNldHVwOjonIC4gJFBhcmFte1N0cnVjdHVyZX0tJmd0O3tOYW1lfS0mZ3Q7e0NvbnRlbnR9OwoKICAgICAgICAjIFRoZSBjb2RlIG1vZHVsZSBoYXMganVzdCByZWNlbnRseSBiZWVuIGNvcGllZCB0byBpdCdzIGxvY2F0aW9uIGluIHRoZSBmaWxlIHN5c3RlbS4KICAgICAgICAjIEluIGEgcGVyc2lzdGVudCBQZXJsIGVudmlyb25tZW50IGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgbWlnaHQgc3RpbGwgYmUgbG9hZGVkLAogICAgICAgICMgYXMgd2F0Y2hkb2dzIGxpa2UgQXBhY2hlMjo6UmVsb2FkIGhhdmVuJ3QgaGFkIGEgY2hhbmNlIHRvIHJlbG9hZCBpdC4KICAgICAgICAjIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG5ldyB2ZXJzaW9uIGlzIGJlaW5nIGxvYWRlZC4KICAgICAgICAjIEtlcm5lbDo6U3lzdGVtOjpNYWluOjpSZXF1aXJlKCkgY2hlY2tzIHRoZSByZWxhdGl2ZSBmaWxlIHBhdGgsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoYXQgZnJvbSAlSU5DLgogICAgICAgICMgVGhpcyBpcyBvbmx5IG5lZWRlZCBpbiBwZXJzaXN0ZW50IFBlcmwgZW52aXJvbm1lbnQsIGJ1dCBkb2VzIG5vIGhhcm0gaW4gYSBDR0kgZW52aXJvbm1lbnQuCiAgICAgICAgbXkgJENvZGVNb2R1bGVQYXRoID0gJENvZGVNb2R1bGU7CiAgICAgICAgJENvZGVNb2R1bGVQYXRoID1+IHMvOjovXC8vZzsKICAgICAgICAkQ29kZU1vZHVsZVBhdGggLj0gJy5wbSc7CiAgICAgICAgZGVsZXRlICRJTkN7JENvZGVNb2R1bGVQYXRofTsKCiAgICAgICAgaWYgKCAkU2VsZi0mZ3Q7e01haW5PYmplY3R9LSZndDtSZXF1aXJlKCRDb2RlTW9kdWxlKSApIHsKICAgICAgICAgICAgbXkgJENvZGVPYmplY3QgPSAkQ29kZU1vZHVsZS0mZ3Q7bmV3KCAleyRTZWxmfSApOwogICAgICAgICAgICBpZiAoJENvZGVPYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmICggISRDb2RlT2JqZWN0LSZndDskRnVuY3Rpb25OYW1lKCV7JFNlbGZ9KSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0mZ3Q7e0xvZ09iamVjdH0tJmd0O0xvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPSZndDsgJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPSZndDsgJnF1b3Q7Q291bGQgbm90IGNhbGwgbWV0aG9kICRGdW5jdGlvbk5hbWUoKSBvbiAkQ29kZU1vZHVsZS5wbS4mcXVvdDsKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtJmd0O3tMb2dPYmplY3R9LSZndDtMb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPSZndDsgJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9Jmd0OyAmcXVvdDtDb3VsZCBub3QgY2FsbCBtZXRob2QgbmV3KCkgb24gJENvZGVNb2R1bGUucG0uJnF1b3Q7CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgPC9Db2RlVXBncmFkZT4KICAgIDxDb2RlVW5pbnN0YWxsIFR5cGU9InByZSI+CiAgICAgICAgbXkgJEZ1bmN0aW9uTmFtZSA9ICdDb2RlVW5pbnN0YWxsJzsKICAgICAgICBteSAkQ29kZU1vZHVsZSA9ICd2YXI6OnBhY2thZ2VzZXR1cDo6JyAuICRQYXJhbXtTdHJ1Y3R1cmV9LSZndDt7TmFtZX0tJmd0O3tDb250ZW50fTsKCiAgICAgICAgIyBUaGUgY29kZSBtb2R1bGUgaGFzIGp1c3QgcmVjZW50bHkgYmVlbiBjb3BpZWQgdG8gaXQncyBsb2NhdGlvbiBpbiB0aGUgZmlsZSBzeXN0ZW0uCiAgICAgICAgIyBJbiBhIHBlcnNpc3RlbnQgUGVybCBlbnZpcm9ubWVudCBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIG1pZ2h0IHN0aWxsIGJlIGxvYWRlZCwKICAgICAgICAjIGFzIHdhdGNoZG9ncyBsaWtlIEFwYWNoZTI6OlJlbG9hZCBoYXZlbid0IGhhZCBhIGNoYW5jZSB0byByZWxvYWQgaXQuCiAgICAgICAgIyBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZyBsb2FkZWQuCiAgICAgICAgIyBLZXJuZWw6OlN5c3RlbTo6TWFpbjo6UmVxdWlyZSgpIGNoZWNrcyB0aGUgcmVsYXRpdmUgZmlsZSBwYXRoLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IGZyb20gJUlOQy4KICAgICAgICAjIFRoaXMgaXMgb25seSBuZWVkZWQgaW4gcGVyc2lzdGVudCBQZXJsIGVudmlyb25tZW50LCBidXQgZG9lcyBubyBoYXJtIGluIGEgQ0dJIGVudmlyb25tZW50LgogICAgICAgIG15ICRDb2RlTW9kdWxlUGF0aCA9ICRDb2RlTW9kdWxlOwogICAgICAgICRDb2RlTW9kdWxlUGF0aCA9fiBzLzo6L1wvL2c7CiAgICAgICAgJENvZGVNb2R1bGVQYXRoIC49ICcucG0nOwogICAgICAgIGRlbGV0ZSAkSU5DeyRDb2RlTW9kdWxlUGF0aH07CgogICAgICAgIGlmICggJFNlbGYtJmd0O3tNYWluT2JqZWN0fS0mZ3Q7UmVxdWlyZSgkQ29kZU1vZHVsZSkgKSB7CiAgICAgICAgICAgIG15ICRDb2RlT2JqZWN0ID0gJENvZGVNb2R1bGUtJmd0O25ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgaWYgKCRDb2RlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ29kZU9iamVjdC0mZ3Q7JEZ1bmN0aW9uTmFtZSgleyRTZWxmfSkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtJmd0O3tMb2dPYmplY3R9LSZndDtMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0mZ3Q7ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0mZ3Q7ICZxdW90O0NvdWxkIG5vdCBjYWxsIG1ldGhvZCAkRnVuY3Rpb25OYW1lKCkgb24gJENvZGVNb2R1bGUucG0uJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLSZndDt7TG9nT2JqZWN0fS0mZ3Q7TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0mZ3Q7ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPSZndDsgJnF1b3Q7Q291bGQgbm90IGNhbGwgbWV0aG9kIG5ldygpIG9uICRDb2RlTW9kdWxlLnBtLiZxdW90OwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIDwvQ29kZVVuaW5zdGFsbD4KICAgIDxJbnRyb0luc3RhbGwgVHlwZT0icHJlIiBUaXRsZT0iSW5zdGFsbCBJbmZvcm1hdGlvbiIgTGFuZz0iZW4iPjwhW0NEQVRBWwogICAgICAgIDxici8+CiAgICAgICAgPHN0cm9uZz5XRUxDT01FPC9zdHJvbmc+CiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIFlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCB0aGUgT1RSUyBtb2R1bGUgQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlLgogICAgICAgIDxici8+CiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIGMuYS5wLmUuIElUIC4uLmVhc3kuPGJyLz4KICAgICAgICA8YnIvPgogICAgXV0+PC9JbnRyb0luc3RhbGw+CiAgICA8SW50cm9JbnN0YWxsIFR5cGU9InBvc3QiIFRpdGxlPSJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIExhbmc9ImVuIj48IVtDREFUQVsKICAgICAgICA8YnIvPgogICAgICAgIDxici8+CiAgICAgICAgPGJyLz4KICAgICAgICBjLmEucC5lLiBJVCAuLi5lYXN5Ljxici8+CiAgICAgICAgPGJyLz4KICAgIF1dPjwvSW50cm9JbnN0YWxsPgogICAgPEludHJvVXBncmFkZSBUeXBlPSJwcmUiIFRpdGxlPSJVcGdyYWRlIEluZm9ybWF0aW9uIiBMYW5nPSJlbiI+PCFbQ0RBVEFbCiAgICAgICAgPGJyLz4KICAgICAgICA8c3Ryb25nPldFTENPTUU8L3N0cm9uZz4KICAgICAgICA8YnIvPgogICAgICAgIDxici8+CiAgICAgICAgWW91IGFyZSBhYm91dCB0byB1cGdyYWRlIHRoZSBBcnRpY2xlQ29weU1vdmVEZWxldGUgZXh0ZW5zaW9ucyBwYWNrYWdlIGZvciBPVFJTLjxici8+CiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIGMuYS5wLmUuIElUIC4uLmVhc3kuPGJyLz4KICAgICAgICA8YnIvPgogICAgXV0+PC9JbnRyb1VwZ3JhZGU+CiAgICA8SW50cm9VcGdyYWRlIFR5cGU9InBvc3QiIFRpdGxlPSJVcGdyYWRlIEluZm9ybWF0aW9uIiBMYW5nPSJlbiI+PCFbQ0RBVEFbCiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIDxici8+CiAgICAgICAgYy5hLnAuZS4gSVQgLi4uZWFzeS48YnIvPgogICAgICAgIDxici8+CiAgICBdXT48L0ludHJvVXBncmFkZT4KICAgIDxJbnRyb1VuaW5zdGFsbCBUeXBlPSJwcmUiIFRpdGxlPSJVbmluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgTGFuZz0iZW4iPjwhW0NEQVRBWwogICAgICAgIDxici8+CiAgICAgICAgPHN0cm9uZz5XRUxDT01FPC9zdHJvbmc+CiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIFlvdSBhcmUgYWJvdXQgdG8gVU5JTlNUQUxMIHRoZSBBcnRpY2xlQ29weU1vdmVEZWxldGUgZXh0ZW5zaW9ucyBwYWNrYWdlIGZvciBPVFJTLjxici8+CiAgICAgICAgPGJyLz4KICAgICAgICA8YnIvPgogICAgICAgIDxici8+CiAgICAgICAgYy5hLnAuZS4gSVQgLi4uZWFzeS48YnIvPgogICAgICAgIDxici8+CiAgICBdXT48L0ludHJvVW5pbnN0YWxsPgo8L290cnNfcGFja2FnZT4K
IyAkSWQ6IEFydGljbGVDb3B5TW92ZURlbGV0ZS5wb2QsdiAxLjEgMjAxMS0xMi0yOCAxMDozMDo1NiB0dG8gRXhwICQKCj1oZWFkMSBHZW5lcmFsCgpUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBhcnRpY2xlIGFjdGlvbiB3aGljaCBhbGxvd3MgdG8gY29weSwgbW92ZSBmcm9tIG9uZSB0aWNrZXQgdG8gYW5vdGhlci4gSXQgYWxzbyBhbGxvd3MgdG8gZGVsZXRlIGFydGljbGVzIC0gc2VlIGh0dHBzOi8vb3Ryc3RlYW0uaWRlYXNjYWxlLmNvbS9hL2R0ZC9Db3B5LU9SLU1lcmdlLVNpbmdsZS1BcnRpY2xlLVRvLU90aGVyLVRpY2tldC8zMjE0NDktMTAzNjkuCgpUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gT1RSUyBleHRlbnNpb24gcGFja2FnZSBLSVg0T1RSUy4gCgo9aGVhZDEgVXNhZ2UgUmVtYXJrcwoKPW92ZXIgNCAKCj1pdGVtICogVGhlIGZ1bmN0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIG93bmVyIG9mIHRoZSB0aWNrZXQuCgo9aXRlbSAqIElmIHRoZXJlIGlzIG9ubHkgb25lIGFydGljbGUgbGVmdCBpbiB0aGUgdGlja2V0LCBvcHRpb25zIGZvciBtb3ZpbmcgYW5kIGRlbGV0aW5nIGFyZSBub3QgYXZhaWxhYmxlLgoKPWl0ZW0gKiBJZiB0aGVyZSBpcyB0aW1lIGFjY291bnRlZCBpbiBhbiBhcnRpY2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLCB5b3UgbWF5IGRlZmluZSBpZiBhbmQgaG93IHRoaXMgYWNjb3VudGVkIHRpbWUgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiB0aWNrZXQuIAoKPWl0ZW0gKiBEdWUgdG8gdGhlIGxhY2sgb2YgZXh0ZW5zaW9uIG1ldGhvZHMgZm9yIGZyb250ZW5kIG1vZHVsZXMgb2Ygb3RoZXIgZXh0ZW5zaW9ucyAoaS5lLiBPVFJTOjpJVFNNKSBpbiBPVFJTIGFuZCBtaXNzaW5nIGNvbmZpZ3VyYWJpbGl0eSBvZiBhcnRpY2xlIGFjdGlvbnMsIHRoZSBhcnRpY2xlIGNvcHktLCBtb3ZlLSwgZGVsZXRlLSBmdW5jdGlvbiBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGZyb250ZW5kIGJ5IE91dHB1dEZpbHRlcnMuIERpc2FibGluZyBBcnRpY2xlUHJpbnQgd2lsbCBhbHNvIGRpc2FibGUgdGhpcyBmdW5jdGlvbi4KCj1iYWNrCgo9aGVhZDEgVG8gRG8KCj1vdmVyIDQgCgo9aXRlbSAqIG91dHB1dCBmaWx0ZXIgY3JlYXRlcyB0d28gYWN0aW9uIGxpbmtzIGFmdGVyIHJlbG9hZCBvZiBBZ2VudFRpY2tldFpvb20gYWZ0ZXIgYXJ0aWNsZSBjcmVhdGlvbgoKPWl0ZW0gKiBtYWtlIHJlc3RyaWN0aW9uIHRvIG93bmVyIGNvbmZpZ3VyYWJsZQoKCj1iYWNrCgoKPWhlYWQxIENvcHlyaWdodAoKQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCgpBcnRpY2xlQ29weU1vdmVEZWxldGUgd3JpdHRlbi9lZGl0ZWQgYnk6Cgo9b3ZlciA0IAoKPWl0ZW0gKiBSZW5lKGRvdClCb2VobShhdCljYXBlKGRhc2gpaXQoZG90KWRlCgo9aXRlbSAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQoKPWl0ZW0gKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKCj1iYWNrCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZSB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBBZ2VudEFydGljbGVDb3B5TW92ZS54bWwsdiAxLjEgMjAxMS0xMi0yOCAxMDozMDo1NiB0dG8gRXhwICQ8L0NWUz4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCMjI0FydGljbGVDb3B5TW92ZURlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BY3RpdmF0ZXMgdGhlICdBcnRpY2xlQ29weU1vdmVEZWxldGUnIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U2Vzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJBcnRpY2xlQ29weU1vdmVEZWxldGU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXJ0aWNsZUNvcHlNb3ZlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIEFnZW50QXJ0aWNsZUNvcHlNb3ZlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPnVzZXJzPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db3B5LCBtb3ZlIG9yIGRlbGV0ZSBzZWxlY3RlZCBhcnRpY2xlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5Db3B5LCBNb3ZlIG9yIERlbGV0ZSBBcnRpY2xlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpDdXN0b21Nb2R1bGUjIyMwMTAtVGlja2V0RXh0ZW5zaW9uc0FydGljbGVDb3B5TW92ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PdmVybG9hZHMgKHJlZGVmaW5lcykgZXhpc3RpbmcgZnVuY3Rpb25zIGluIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQuIFVzZWQgdG8gZWFzaWx5IGFkZCBjdXN0b21pemF0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OlRpY2tldEV4dGVuc2lvbnNBcnRpY2xlQ29weU1vdmU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cgo8L290cnNfY29uZmlnPg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BcnRpY2xlQ29weU1vdmVEZWxldGUucG0gLSBwcm92aWRlcyBkZSB0cmFuc2xhdGlvbiBmb3IgQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFJlbmUoZG90KUJvZWhtKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BcnRpY2xlQ29weU1vdmVEZWxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CiAgICByZXR1cm4gMCBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICMgJCRTVEFSVCQkCgogICAgIyBBZ2VudEFydGljbGVDb3B5TW92ZQogICAgJExhbmctPnsnQ29weS9Nb3ZlL0RlbGV0ZSd9ICAgICAgICAgICAgID0gJ0tvcGllcmVuL1ZlcnNjaGllYmVuL0z2c2NoZW4nOwogICAgJExhbmctPnsnb2YgZGVzdGluYXRpb24gdGlja2V0J30gICAgICAgID0gJ2RlcyBaaWVsdGlja2V0cyc7CiAgICAkTGFuZy0+eydDb3B5LCBNb3ZlIG9yIERlbGV0ZSBBcnRpY2xlJ30gPSAnS29waWVyZW4sIFZlcnNjaGllYmVuIG9kZXIgTPZzY2hlbiBlaW5lcyBBcnRpa2Vscyc7CiAgICAkTGFuZy0+eydDb3B5LCBtb3ZlIG9yIGRlbGV0ZSBzZWxlY3RlZCBhcnRpY2xlJ30gPQogICAgICAgICdLb3BpZXJlbiwgVmVyc2NoaWViZW4gb2RlciBM9nNjaGVuIGRlcyBhdXNnZXfkaGx0ZW4gQXJ0aWtlbHMnOwogICAgJExhbmctPnsnQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCd9ID0gJ0F1c3p1ZvxocmVuZGUgQWt0aW9uJzsKICAgICRMYW5nLT57J0NvcHknfSAgICAgICAgICAgICAgICAgICA9ICdLb3BpZXJlbic7CiAgICAkTGFuZy0+eydZb3UgY2Fubm90IGFzaWduIG1vcmUgdGltZSB1bml0cyBhcyBpbiB0aGUgc291cmNlIGFydGljbGUhJ30gPQogICAgICAgICdTaWUga/ZubmVuIG5pY2h0IG1laHIgWmVpdGVpbmhlaXRlbiB6dXdlaXNlbiwgYWxzIGltIE9yaWdpbmFsLUFydGlrZWwhJzsKICAgICRMYW5nLT57J09wdGlvbnMgZm9yIENvcHknfSAgICAgICAgICAgID0gJ09wdGlvbmVuIHp1bSBLb3BpZXJlbic7CiAgICAkTGFuZy0+eydPcHRpb25zIGZvciBEZWxldGUnfSAgICAgICAgICA9ICdPcHRpb25lbiB6dW0gTPZzY2hlbic7CiAgICAkTGFuZy0+eydPcHRpb25zIGZvciBNb3ZlJ30gICAgICAgICAgICA9ICdPcHRpb25lbiB6dW0gVmVyc2NoaWViZW4nOwogICAgJExhbmctPnsnUmVhbGx5IGRlbGV0ZSB0aGlzIGFydGljbGU/J30gPSAnRGllc2VuIEFydGlrZWwgd2lya2xpY2ggbPZzY2hlbj8nOwogICAgJExhbmctPnsnQ29waWVkIHRpbWUgdW5pdHMgb2YgdGhlIHNvdXJjZSBhcnRpY2xlJ30gPQogICAgICAgICdadSD8YmVybmVobWVuZGUgWmVpdGVpbmhlaXRlbiBkZXMgT3JpZ2luYWwtQXJ0aWtlbHMnOwogICAgJExhbmctPnsnSGFuZGxpbmcgb2YgYWNjb3VudGVkIHRpbWUgZnJvbSBzb3VyY2UgYXJ0aWNsZT8nfSA9CiAgICAgICAgJ1VtZ2FuZyBtaXQgWmVpdGJ1Y2h1bmcgYW0gT3JpZ2luYWwtQXJ0aWtlbD8nOwogICAgJExhbmctPnsnQ2hhbmdlIHRvIHJlc2lkdWUnfSAgID0gJ0F1ZiBSZXN0IHZlcnJpbmdlcm4nOwogICAgJExhbmctPnsnTGVhdmUgdW5jaGFuZ2VkJ30gICAgID0gJ1VudmVy5G5kZXJ0IGxhc3Nlbic7CiAgICAkTGFuZy0+eydPd25lciAvIFJlc3BvbnNpYmxlJ30gPSAnQmVzaXR6ZXIgLyBWZXJhbnR3b3J0bGljaGVyJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgdGlja2V0IG93bmVyIGFuZCByZXNwb25zaWJsZSEnfSA9CiAgICAgICAgJ8RuZGVybiBkZXMgVGlja2V0LUJlc2l0emVycyB1bmQgLVZlcmFudHdvcnRsaWNoZW4hJzsKICAgICRMYW5nLT57J1BlcmhhcHMsIHlvdSBmb3Jnb3QgdG8gZW50ZXIgYSB0aWNrZXQgbnVtYmVyISd9ID0KICAgICAgICAnQml0dGUgZ2ViZW4gU2llIGVpbmUgVGlja2V0LU51bW1lciBlaW4nOwogICAgJExhbmctPnsnU29ycnksIG5vIHRpY2tldCBmb3VuZCBmb3IgdGlja2V0IG51bWJlcjogJ30gPQogICAgICAgICdFcyBrb25udGUga2VpbiBUaWNrZXQgZ2VmdW5kZW4gd2VyZGVuIGb8ciBUaWNrZXQtTnVtbWVyOiAnOwogICAgJExhbmctPnsnU29ycnksIHlvdSBuZWVkIHRvIGJlIG93bmVyIG9mIHRoZSBuZXcgdGlja2V0IHRvIGRvIHRoaXMgYWN0aW9uISd9ID0KICAgICAgICAnU2llIG38c3NlbiBkZXIgQmVzaXR6ZXIgZGVzIG5ldWVuIFRpY2tldHMgc2VpbiwgdW0gZGllc2UgQWt0aW9uIGF1c3p1ZvxocmVuISc7CiAgICAkTGFuZy0+eydTb3JyeSwgeW91IG5lZWQgdG8gYmUgb3duZXIgb2YgdGhlIHNlbGVjdGVkIHRpY2tldCB0byBkbyB0aGlzIGFjdGlvbiEnfSA9CiAgICAgICAgJ1NpZSBt/HNzZW4gZGVyIEJlc2l0emVyIGRlcyBhdXNnZXfkaGx0ZW4gVGlja2V0cyBzZWluLCB1bSBkaWVzZSBBa3Rpb24gYXVzenVm/GhyZW4hJzsKICAgICRMYW5nLT57J1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJ30gICAgID0gJ0JpdHRlIGtvbnRha3RpZXJlbiBTaWUgSWhyZW4gQWRtaW5pc3RyYXRvci4nOwogICAgJExhbmctPnsnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJ30gPSAnQml0dGUg5G5kZXJuIFNpZSB6dW7kY2hzdCBkZW4gQmVzaXR6ZXIuJzsKICAgICRMYW5nLT57J1NvcnJ5LCB5b3UgYXJlIG5vdCBhIG1lbWJlciBvZiBhbGxvd2VkIGdyb3VwcyEnfSA9CiAgICAgICAgJ0JpdHRlIGVudHNjaHVsZGlnZW4gU2llLCBhYmVyIFNpZSBuaWNodCBNaXRnbGllZCBkZXIgYmVyZWNodGlndGVuIEdydXBwZW4hJzsKCiAgICAjIEVPIEFnZW50QXJ0aWNsZUNvcHlNb3ZlCgogICAgIyAkJFNUT1AkJAoKICAgIHJldHVybiAwOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50QXJ0aWNsZUNvcHlNb3ZlLnBtIC0gdG8gY29weSBvciBtb3ZlIGFydGljbGVzCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFJlbmUoZG90KUJvZWhtKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEFnZW50QXJ0aWNsZUNvcHlNb3ZlLnBtLHYgMS4xIDIwMTEtMTItMjggMTA6MzA6NTcgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcnRpY2xlQ29weU1vdmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAwOwogICAgbXkgJEdyb3VwcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEFydGljbGVDb3B5TW92ZX0tPntHcm91cH0KICAgICAgICB8fCAnJzsKICAgIGlmICggJEdyb3VwcyAmJiByZWYoJEdyb3VwcykgZXEgJ0FSUkFZJyApIHsKICAgICAgICBmb3IgbXkgJEdyb3VwICggQHskR3JvdXBzfSApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgTWVzc2FnZSA9PiAnU29ycnksIHlvdSBhcmUgbm90IGEgbWVtYmVyIG9mIGFsbG93ZWQgZ3JvdXBzIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIChxdyhBcnRpY2xlSUQgVGlja2V0SUQgQXJ0aWNsZUFjdGlvbiBOZXdUaWNrZXROdW1iZXIgVGltZVVuaXRzIFRpbWVVbml0c09yaWdpbmFsKSkgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICkgfHwgJyc7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQXJ0aWNsZUlEIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRHZXRQYXJhbXskX30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQWdlbnRBcnRpY2xlQ29weU1vdmU6IE5lZWQgJF8hIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICBNZXNzYWdlID0+ICdTb3JyeSwgeW91IG5lZWQgdG8gYmUgb3duZXIgb2YgdGhlIHNlbGVjdGVkIHRpY2tldCB0byBkbyB0aGlzIGFjdGlvbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBnZXQgZmlyc3QgYXJ0aWNsZQogICAgbXkgJUZpcnN0QXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZpcnN0QXJ0aWNsZSgKICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvcHkgb3IgbW92ZSBmaXJzdCBhcnRpY2xlCiAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICE9ICRGaXJzdEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAkR2V0UGFyYW17RnVydGhlckFjdGlvbk9wdGlvbnN9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGNvbnRlbnQKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KAogICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBnZXQgYWNjb3VudGluZyB0aW1lCiAgICAkUGFyYW17QWNjb3VudGVkVGltZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICRQYXJhbXtOZWVkQWNjb3VudGVkVGltZX0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgfQoKICAgIGlmICggJFBhcmFte0FjY291bnRlZFRpbWV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaW1lVW5pdHNPcmlnaW5hbCA9PiAkR2V0UGFyYW17VGltZVVuaXRzT3JpZ2luYWx9IHx8ICdEaWZmZXJlbmNlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGUnICkgewogICAgICAgIG15ICROZXdUaWNrZXRJRCA9ICRHZXRQYXJhbXtUaWNrZXRJRH07CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBkZWxldGUgYXJ0aWNsZQogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVBY3Rpb259IGVxICdEZWxldGUnICkgewogICAgICAgICAgICBteSAkRGVsZXRlUmVzdWx0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnVsbERlbGV0ZSgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISREZWxldGVSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkZWxldGUgYXJ0aWNsZSAkR2V0UGFyYW17QXJ0aWNsZUlEfSBmcm9tIHRpY2tldCAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9ISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaGlzdG9yeSB0byBvcmlnaW5hbCB0aWNrZXQKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiRGVsZXRlZCBhcnRpY2xlICRHZXRQYXJhbXtBcnRpY2xlSUR9IGZyb20gdGlja2V0ICRBcnRpY2xle1RpY2tldE51bWJlcn0iLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyYXRpb25zIGZvciBtb3ZlIGFuZCBjb3B5CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17TmV3VGlja2V0TnVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAnUGVyaGFwcywgeW91IGZvcmdvdCB0byBlbnRlciBhIHRpY2tldCBudW1iZXIhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb3JtKAogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBOZXdUaWNrZXROdW1iZXJJbnZhbGlkID0+ICdTZXJ2ZXJFcnJvcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5ldyB0aWNrZXQgaWQKICAgICAgICAgICAgJE5ld1RpY2tldElEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDaGVja051bWJlcigKICAgICAgICAgICAgICAgIFRuID0+ICRHZXRQYXJhbXtOZXdUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkTmV3VGlja2V0SUQgKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIEluZm8gPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0KCdTb3JyeSwgbm8gdGlja2V0IGZvdW5kIGZvciB0aWNrZXQgbnVtYmVyOiAnKQogICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXtOZXdUaWNrZXROdW1iZXJ9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPkZvcm0oCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIE5ld1RpY2tldE51bWJlckludmFsaWQgPT4gJ1NlcnZlckVycm9yJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBvd25lciBvZiBuZXcgdGlja2V0CiAgICAgICAgICAgIG15ICROZXdBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICROZXdUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE5ld0FjY2Vzc09rICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICdTb3JyeSwgeW91IG5lZWQgdG8gYmUgb3duZXIgb2YgdGhlIG5ldyB0aWNrZXQgdG8gZG8gdGhpcyBhY3Rpb24hJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb3JtKAogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvcHkgYXJ0aWNsZQogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVBY3Rpb259IGVxICdDb3B5JyApIHsKICAgICAgICAgICAgbXkgJENvcHlSZXN1bHQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb3B5KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICROZXdUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJENvcHlSZXN1bHQgZXEgJ0NvcHlGYWlsZWQnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY29weSBhcnRpY2xlICRHZXRQYXJhbXtBcnRpY2xlSUR9IHRvIHRpY2tldCAkR2V0UGFyYW17TmV3VGlja2V0TnVtYmVyfSEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ29weVJlc3VsdCBlcSAnVXBkYXRlRmFpbGVkJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHVwZGF0ZSB0aW1lcyBmb3IgYXJ0aWNsZSAkR2V0UGFyYW17QXJ0aWNsZUlEfSEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGFjY291bnRlZCB0aW1lIHRvIG5ldyBhcnRpY2xlCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkTmV3VGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRDb3B5UmVzdWx0LAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZWxldGUgYWNjb3VudGVkIHRpbWUgZnJvbSBvbGQgYXJ0aWNsZQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHNPcmlnaW5hbH0gbmUgJ0tlZXAnICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZURlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgcmVzaWR1YWwgaWYgY2hvb3NlbiB0byBvbGQgYXJ0aWNsZQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHNPcmlnaW5hbH0gZXEgJ0RpZmZlcmVuY2UnICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJEdldFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICggJFBhcmFte0FjY291bnRlZFRpbWV9IC0gJEdldFBhcmFte1RpbWVVbml0c30gKSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaGlzdG9yeSB0byBvcmlnaW5hbCB0aWNrZXQKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiQ29waWVkIGFydGljbGUgJEdldFBhcmFte0FydGljbGVJRH0gZnJvbSAiCiAgICAgICAgICAgICAgICAgICAgLiAidGlja2V0ICRBcnRpY2xle1RpY2tldE51bWJlcn0gdG8gdGlja2V0ICRHZXRQYXJhbXtOZXdUaWNrZXROdW1iZXJ9ICIKICAgICAgICAgICAgICAgICAgICAuICJhcyBhcnRpY2xlICRDb3B5UmVzdWx0IiwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJEdldFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1vdmUgYXJ0aWNsZQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0FydGljbGVBY3Rpb259IGVxICdNb3ZlJyApIHsKICAgICAgICAgICAgbXkgJE1vdmVSZXN1bHQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVNb3ZlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICROZXdUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJE1vdmVSZXN1bHQgZXEgJ01vdmVGYWlsZWQnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbW92ZSBhcnRpY2xlICRHZXRQYXJhbXtBcnRpY2xlSUR9IHRvIHRpY2tldCAkR2V0UGFyYW17TmV3VGlja2V0TnVtYmVyfSEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkTW92ZVJlc3VsdCBlcSAnQWNjb3VudEZhaWxlZCcgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGlja2V0IGlkIGluIHRpbWUgYWNjb3VudGluZyBkYXRhIGZvciBhcnRpY2xlICRHZXRQYXJhbXtBcnRpY2xlSUR9ISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaGlzdG9yeSB0byBuZXcgdGlja2V0CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gIk1vdmVkIGFydGljbGUgJEdldFBhcmFte0FydGljbGVJRH0gZnJvbSB0aWNrZXQiCiAgICAgICAgICAgICAgICAgICAgLiAiICRBcnRpY2xle1RpY2tldE51bWJlcn0gdG8gdGlja2V0ICRHZXRQYXJhbXtOZXdUaWNrZXROdW1iZXJ9ICIsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICROZXdUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBoaXN0b3J5IHRvIG9sZCB0aWNrZXQKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiTW92ZWQgYXJ0aWNsZSAkR2V0UGFyYW17QXJ0aWNsZUlEfSBmcm9tIHRpY2tldCIKICAgICAgICAgICAgICAgICAgICAuICIgJEFydGljbGV7VGlja2V0TnVtYmVyfSB0byB0aWNrZXQgJEdldFBhcmFte05ld1RpY2tldE51bWJlcn0gIiwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJEdldFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSROZXdUaWNrZXRJRCIKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBmb3JtCiAgICAkR2V0UGFyYW17Q29weVR5cGVDaGVja2VkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb3JtKAogICAgICAgICVBcnRpY2xlLAogICAgICAgICVHZXRQYXJhbSwKICAgICk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIEZvcm0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FydGljbGVBY3Rpb25PcHRpb25zJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIGlmICggJFBhcmFte0Z1cnRoZXJBY3Rpb25PcHRpb25zfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGdXJ0aGVyQWN0aW9uT3B0aW9ucycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFydGljbGVDb3B5TW92ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBcnRpY2xlQWN0aW9uID0+ICRQYXJhbXtBcnRpY2xlQWN0aW9ufSB8fCAnQ29weScsCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJBcnRpY2xlQ29weU1vdmVEZWxldGUucG0gLSBPdXRwdXQgZmlsdGVyIHRvIHByb3ZpZGUgYSBsaW5rCiMgdG8gc3dpdGNoIGZyb20gY3VzdG9tZXJzIHRvIGFnZW50cyBmcm9udGVuZCBhbmQgdmljZSB2ZXJzYQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBPdXRwdXRGaWx0ZXJBcnRpY2xlQ29weU1vdmVEZWxldGUucG0sdiAxLjEgMjAxMS0xMi0yOCAxMDozMDo1NyB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckFydGljbGVDb3B5TW92ZURlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRQYXJhbXtVc2VyVHlwZX0gfHwgKCAkUGFyYW17VXNlclR5cGV9IG5lICdVc2VyJyAmJiAkUGFyYW17VXNlclR5cGV9IG5lICdDdXN0b21lcicgKSApIHsKICAgICAgICByZXR1cm4gJFNlbGY7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBMb2dPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBUaW1lT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fQogICAgICAgICAgICB8fCBkaWUgIk91dHB1dEZpbHRlckFydGljbGVDb3B5TW92ZURlbGV0ZTogR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGdldCB1c2VyIGluZm9zCiAgICAkU2VsZi0+e1VzZXJJRH0gICAgPSAkUGFyYW17VXNlcklEfSAgICB8fCAnJzsKICAgICRTZWxmLT57VXNlckxvZ2lufSA9ICRQYXJhbXtVc2VyTG9naW59IHx8ICcnOwogICAgJFNlbGYtPntVc2VyVHlwZX0gID0gJFBhcmFte1VzZXJUeXBlfSAgfHwgJyc7CgogICAgIyBjcmVhdGUgY2FjaGUgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9ICRQYXJhbXtDYWNoZU9iamVjdH0gIHx8IEtlcm5lbDo6U3lzdGVtOjpDYWNoZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gPSAkU2VsZi0+e0dyb3VwT2JqZWN0fSB8fCBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgIG15ICVHcm91cExpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxLCApOwogICAgbXkgJVJldmVyc2VHcm91cExpc3QgPSByZXZlcnNlKCVHcm91cExpc3QpOwogICAgJFNlbGYtPntHcm91cExpc3R9ICAgICAgICA9IFwlR3JvdXBMaXN0OwogICAgJFNlbGYtPntSZXZlcnNlR3JvdXBMaXN0fSA9IFwlUmV2ZXJzZUdyb3VwTGlzdDsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRTZWxmLT57VXNlclR5cGV9IHx8ICggJFNlbGYtPntVc2VyVHlwZX0gbmUgJ1VzZXInICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmOwogICAgfQoKICAgICMgY2hlY2sgZGF0YQogICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtEYXRhfSBuZSAnU0NBTEFSJzsKICAgIHJldHVybiBpZiAhJHsgJFBhcmFte0RhdGF9IH07CgogICAgIyBnZXQgY29uZmlndXJhdGlvbiBmb3IgQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlIGJ1dHRvbi4uLgogICAgbXkgJEFydGljbGVDb3B5TW92ZURlbGV0ZVJlZyA9ICIiOwogICAgaWYgKCAkU2VsZi0+e1VzZXJUeXBlfSAmJiAkU2VsZi0+e1VzZXJUeXBlfSBlcSAnVXNlcicgKSB7CiAgICAgICAgJEFydGljbGVDb3B5TW92ZURlbGV0ZVJlZwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEFydGljbGVDb3B5TW92ZX0gfHwgJyc7CiAgICB9CgogICAgcmV0dXJuIGlmICEkQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlUmVnOwoKICAgIG15ICRBcnRpY2xlQWN0aW9uTGluayA9CiAgICAgICAgJzxsaT48YSBocmVmPSJpbmRleC5wbD9BY3Rpb249QWdlbnRBcnRpY2xlQ29weU1vdmU7VGlja2V0SUQ9JwogICAgICAgIC4gJ09UUlNfVElDS0VUX0lEJwogICAgICAgIC4gJztBcnRpY2xlSUQ9JwogICAgICAgIC4gJ09UUlNfQVJUSUNMRV9JRDtTZXNzaW9uPScKICAgICAgICAuICdPVFJTX1NFU1NJT04iIGNsYXNzPSJBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24iICcKICAgICAgICAuICcgdGl0bGU9IicKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkQXJ0aWNsZUNvcHlNb3ZlRGVsZXRlUmVnLT57RGVzY3JpcHRpb259ICkKICAgICAgICAuICciPicKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDb3B5L01vdmUvRGVsZXRlJykKICAgICAgICAuICc8L2E+PC9saT4nOwogICAgbXkgJEFnZW50UGF0dGVybiA9CiAgICAgICAgJzxsaT4uK0FjdGlvbj1BZ2VudFRpY2tldFByaW50O1RpY2tldElEPShcZCspO0FydGljbGVJRD0oXGQrKTtTZXNzaW9uPShcdyspKC4rKTwvbGk+JzsKCiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ID1+IG17ICRBZ2VudFBhdHRlcm4gfWl4bXMgKSB7CiAgICAgICAgbXkgJEFjY2VzcyAgICA9IDA7CiAgICAgICAgbXkgJFRpY2tldElEICA9ICQxOwogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkMjsKICAgICAgICBteSAkU2Vzc2lvbklEID0gJDM7CiAgICAgICAgJEFydGljbGVBY3Rpb25MaW5rID1+IHMvT1RSU19USUNLRVRfSUQvJFRpY2tldElEL2c7CiAgICAgICAgJEFydGljbGVBY3Rpb25MaW5rID1+IHMvT1RSU19BUlRJQ0xFX0lELyRBcnRpY2xlSUQvZzsKICAgICAgICAkQXJ0aWNsZUFjdGlvbkxpbmsgPX4gcy9PVFJTX1NFU1NJT04vJFNlc3Npb25JRC9nOwoKICAgICAgICAjIGNoZWNrIGdyb3VwIHBlcm1pc3Npb25zLi4uCiAgICAgICAgbXkgJEdyb3VwcyA9ICRBcnRpY2xlQ29weU1vdmVEZWxldGVSZWctPntHcm91cH0gfHwgJyc7CiAgICAgICAgaWYgKCAkR3JvdXBzICYmIHJlZigkR3JvdXBzKSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHskR3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgKCAhJEFjY2VzcyApOwoKICAgICAgICAjIGNoZWNrIG93bmVyLi4uCiAgICAgICAgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICggISRBY2Nlc3MgKTsKCiAgICAgICAgbXkgJFJlcGxhY2UgPSA8PCJFTkQiOwogICAgICAgICAgJEFydGljbGVBY3Rpb25MaW5rCkVORAogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7ICgkQWdlbnRQYXR0ZXJuKSB9eyQxJFJlcGxhY2V9aXhtczsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEFnZW50QXJ0aWNsZUNvcHlNb3ZlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRBcnRpY2xlQ29weU1vdmUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogQWdlbnRBcnRpY2xlQ29weU1vdmUuZHRsLHYgMS4xIDIwMTEtMTItMjggMTA6MzA6NTcgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiIGlkPSJDb21wb3NlIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVXBkYXRlIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iJFFEYXRheyJBcnRpY2xlSUQifSIvPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPiRUZXh0eyJDb3B5L01vdmUvRGVsZXRlIn0gJENvbmZpZ3siVGlja2V0OjpIb29rIn0kUURhdGF7IlRpY2tldE51bWJlciJ9IC0gJFFEYXRheyJUaXRsZSIsICI1MCJ9PC9oMT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiIGhyZWY9IiMiPiRUZXh0eyJDYW5jZWwgJiBjbG9zZSB3aW5kb3cifTwvYT4KICAgICAgICAgICAgPC9wPgoKICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICA8aDI+JFRleHR7Ik9wdGlvbnMifTwvaDI+CgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQXJ0aWNsZSJ9LSRUZXh0eyJTdWJqZWN0In06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICRRRGF0YXsiU3ViamVjdCJ9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCJ9OgogICAgICAgICAgICAgICAgPC9sYWJlbD4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUFjdGlvbk9wdGlvbnMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CgkJCQkgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJBcnRpY2xlQWN0aW9uIiBpZD0iQ29weUNoZWNrYm94IiBjbGFzcz0iQXJ0aWNsZUFjdGlvblJhZGlvIiB2YWx1ZT0iQ29weSIvPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvcHlDaGVja2JveCI+JFRleHR7IkNvcHkifTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJyLz4KCjwhLS0gZHRsOmJsb2NrOkZ1cnRoZXJBY3Rpb25PcHRpb25zIC0tPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iQXJ0aWNsZUFjdGlvbiIgaWQ9Ik1vdmVDaGVja2JveCIgY2xhc3M9IkFydGljbGVBY3Rpb25SYWRpbyIgdmFsdWU9Ik1vdmUiLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJNb3ZlQ2hlY2tib3giPiRUZXh0eyJNb3ZlIn08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxici8+CgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iQXJ0aWNsZUFjdGlvbiIgaWQ9IkRlbGV0ZUNoZWNrYm94IiBjbGFzcz0iQXJ0aWNsZUFjdGlvblJhZGlvIiB2YWx1ZT0iRGVsZXRlIi8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVsZXRlQ2hlY2tib3giPiRUZXh0eyJEZWxldGUifTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJyLz4KPCEtLSBkdGw6YmxvY2s6RnVydGhlckFjdGlvbk9wdGlvbnMgLS0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AgQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQWN0aW9uT3B0aW9ucyAtLT4KICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwgSGlkZGVuIERlbGV0ZU9wdGlvbnMiPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJPcHRpb25zIGZvciBEZWxldGUifQogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlbGV0ZWRDb25maXJtIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUmVhbGx5IGRlbGV0ZSB0aGlzIGFydGljbGU/In0KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJEZWxldGVkQ29uZmlybSIgaWQ9IkRlbGV0ZWRDb25maXJtIiB2YWx1ZT0iRGVsZXRlIiBjbGFzcz0iVmFsaWRhdGVfUmVxdWlyZWQiLz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZWxldGVkQ29uZmlybUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVsZXRlZENvbmZpcm1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIEhpZGRlbiBNb3ZlT3B0aW9ucyBDb3B5T3B0aW9ucyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgaWQ9Ik1vdmVDb3B5VGl0bGUiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJPcHRpb25zIGZvciBDb3B5In0KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOZXdUaWNrZXROdW1iZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ3siVGlja2V0OjpIb29rIn0gJFRleHR7Im9mIGRlc3RpbmF0aW9uIHRpY2tldCJ9OgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmV3VGlja2V0TnVtYmVyIiBpZD0iTmV3VGlja2V0TnVtYmVyIiB2YWx1ZT0iJFFEYXRheyJOZXdUaWNrZXROdW1iZXIifSIgY2xhc3M9IlcyMHBjIFZhbGlkYXRlX1JlcXVpcmVkICRRRGF0YXsiTmV3VGlja2V0TnVtYmVySW52YWxpZCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV3VGlja2V0TnVtYmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdUaWNrZXROdW1iZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJJbnZhbGlkIHRpY2tldCBudW1iZXIhIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9maWVsZHNldD4KCjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBIaWRkZW4gQ29weU9wdGlvbnMiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGltZVVuaXRzIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ29waWVkIHRpbWUgdW5pdHMgb2YgdGhlIHNvdXJjZSBhcnRpY2xlIn0KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiQWNjb3VudGVkVGltZSJ9IiBjbGFzcz0iVzEwcGMgVmFsaWRhdGVfVGltZVVuaXRzIFZhbGlkYXRlX0xvd2VyIFZhbGlkYXRlX0xvd2VyXyRRRGF0YXsiQWNjb3VudGVkVGltZSJ9ICRRRGF0YXsiTmVlZEFjY291bnRlZFRpbWUifSIvPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiSW52YWxpZCB0aW1lISJ9PGJyLz4kVGV4dHsiWW91IGNhbm5vdCBhc2lnbiBtb3JlIHRpbWUgdW5pdHMgYXMgaW4gdGhlIHNvdXJjZSBhcnRpY2xlISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJIYW5kbGluZyBvZiBhY2NvdW50ZWQgdGltZSBmcm9tIHNvdXJjZSBhcnRpY2xlPyJ9CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iVGltZVVuaXRzT3JpZ2luYWwiIGlkPSJUaW1lVW5pdHNPcmlnaW5hbEtlZXAiIGNsYXNzPSJUaW1lVW5pdHNPcmlnaW5hbCIgdmFsdWU9IktlZXAiLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaW1lVW5pdHNPcmlnaW5hbEtlZXAiPiRUZXh0eyJMZWF2ZSB1bmNoYW5nZWQifTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJyLz4KCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJUaW1lVW5pdHNPcmlnaW5hbCIgaWQ9IlRpbWVVbml0c09yaWdpbmFsRGlmZmVyZW5jZSIgY2xhc3M9IlRpbWVVbml0c09yaWdpbmFsIiB2YWx1ZT0iRGlmZmVyZW5jZSIvPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0c09yaWdpbmFsRGlmZmVyZW5jZSI+JFRleHR7IkNoYW5nZSB0byByZXNpZHVlIn08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxici8+CgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iVGltZVVuaXRzT3JpZ2luYWwiIGlkPSJUaW1lVW5pdHNPcmlnaW5hbERlbGV0ZSIgY2xhc3M9IlRpbWVVbml0c09yaWdpbmFsIiB2YWx1ZT0iRGVsZXRlIi8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGltZVVuaXRzT3JpZ2luYWxEZWxldGUiPiRUZXh0eyJEZWxldGUifTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9maWVsZHNldD4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgoKICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IiRUZXh0eyJTdWJtaXQifSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZW5kIG1haWwhIn0iID4kVGV4dHsiU3VibWl0In08L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Zvcm0+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwp2YXIgSW5pdFZhbCA9ICQoJy5BcnRpY2xlQWN0aW9uUmFkaW86Y2hlY2tlZCcpLnZhbCgpLAogICAgJENvcHlPcHRpb25zID0gJCgnLkNvcHlPcHRpb25zJyksCiAgICAkRGVsZXRlT3B0aW9ucyA9ICQoJy5EZWxldGVPcHRpb25zJyksCiAgICAkTW92ZU9wdGlvbnMgPSAkKCcuTW92ZU9wdGlvbnMnKSwKICAgICREZWxldGVDb25maXJtID0gJCgnI0RlbGV0ZWRDb25maXJtJyksCiAgICAkTmV3VGlja2V0TnVtYmVyID0gJCgnI05ld1RpY2tldE51bWJlcicpLAogICAgJE1vdmVDb3B5VGl0bGUgPSAkKCcjTW92ZUNvcHlUaXRsZScpOwoKLy8gc2hvdyBvbmx5IG9wdGlvbnMsIHdoaWNoIGJlbG9uZyB0byBzZWxlY3RlZCBhcnRpY2xlCiQoJy4nICsgSW5pdFZhbCArICdPcHRpb25zJykucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwoKLy8gc2hvdyBvcHRpb25zIGFjY29yZGluZyB0byBzZWxlY3RlZCBhcnRpY2xlIGFjdGlvbgokKCcuQXJ0aWNsZUFjdGlvblJhZGlvJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgdmFyIEN1cnJWYWwgPSAkKHRoaXMpLnZhbCgpOwoKICAgIC8vIGNoYW5nZSByZXF1aXJlZCBmaWVsZHMgYW5kIGxhYmVscyBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgYXJ0aWNsZSBhY3Rpb24KICAgIGlmIChDdXJyVmFsID09ICdEZWxldGUnKSB7CiAgICAgICAgJERlbGV0ZUNvbmZpcm0uYWRkQ2xhc3MoJ1ZhbGlkYXRlX1JlcXVpcmVkJyk7CiAgICAgICAgJE5ld1RpY2tldE51bWJlci5yZW1vdmVDbGFzcygnVmFsaWRhdGVfUmVxdWlyZWQnKTsKCiAgICAgICAgJENvcHlPcHRpb25zLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAkTW92ZU9wdGlvbnMuYWRkQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICREZWxldGVPcHRpb25zLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREZWxldGVDb25maXJtLnJlbW92ZUNsYXNzKCdWYWxpZGF0ZV9SZXF1aXJlZCcpOwogICAgICAgICROZXdUaWNrZXROdW1iZXIuYWRkQ2xhc3MoJ1ZhbGlkYXRlX1JlcXVpcmVkJyk7CgogICAgICAgIGlmIChDdXJyVmFsID09ICdDb3B5JykgewogICAgICAgICAgICAkRGVsZXRlT3B0aW9ucy5hZGRDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICRNb3ZlT3B0aW9ucy5hZGRDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICRDb3B5T3B0aW9ucy5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICRNb3ZlQ29weVRpdGxlLmh0bWwoJyRUZXh0eyJPcHRpb25zIGZvciBDb3B5In0nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQ3VyclZhbCA9PSAnTW92ZScpIHsKICAgICAgICAgICAgJENvcHlPcHRpb25zLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgJERlbGV0ZU9wdGlvbnMuYWRkQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAkTW92ZU9wdGlvbnMucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAkTW92ZUNvcHlUaXRsZS5odG1sKCckVGV4dHsiT3B0aW9ucyBmb3IgTW92ZSJ9Jyk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfSk7CiQoJy5BcnRpY2xlQWN0aW9uUmFkaW8nKS5maWx0ZXIoJ1t2YWx1ZT0kUURhdGF7IkFydGljbGVBY3Rpb24ifV0nKS5hdHRyKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7Cgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KLy8gYWRkIHZhbGlkYXRpb24gZm9yIG1heGltdW0gdGltZSB1bml0cwokLnZhbGlkYXRvci5hZGRNZXRob2QoIlZhbGlkYXRlX0xvd2VyIiwgZnVuY3Rpb24gKFZhbHVlLCBFbGVtZW50KSB7CiAgICB2YXIgQ2xhc3NlcyA9ICQoRWxlbWVudCkuYXR0cignY2xhc3MnKSwKICAgICAgICBNYXhWYWx1ZSA9IDAsCiAgICAgICAgTG93ZXJDbGFzc1ByZWZpeCA9ICdWYWxpZGF0ZV9Mb3dlcl8nLAogICAgICAgIFJlZ0V4TG93ZXIgPSBuZXcgUmVnRXhwKExvd2VyQ2xhc3NQcmVmaXgpOwoKICAgICQuZWFjaChDbGFzc2VzLnNwbGl0KCcgJyksIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICBpZiAoUmVnRXhMb3dlci50ZXN0KFZhbHVlKSkgewogICAgICAgICAgICBNYXhWYWx1ZSA9IFZhbHVlLnJlcGxhY2UoTG93ZXJDbGFzc1ByZWZpeCwgJycpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiAocGFyc2VJbnQoVmFsdWUsIDEwKSA8PSBNYXhWYWx1ZSk7Cn0pOwoKJC52YWxpZGF0b3IuYWRkQ2xhc3NSdWxlcygiVmFsaWRhdGVfTG93ZXIiLCB7CiAgICBWYWxpZGF0ZV9Mb3dlcjogdHJ1ZQp9KTsKCi8vIGRpc2FibGUgdmFsaWRhdGlvbiBvZiB0aW1lIHVuaXRzLCBpZiBpdCBpcyBub3QgYSBjb3B5IGFjdGlvbgokKCcuQXJ0aWNsZUFjdGlvblJhZGlvJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgdmFyICRUaW1lVW5pdHMgPSAkKCcjVGltZVVuaXRzJyk7CiAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAnQ29weScpICRUaW1lVW5pdHMuYWRkQ2xhc3MoJ1ZhbGlkYXRlX0xvd2VyICRRRGF0YXsiTmVlZEFjY291bnRlZFRpbWUifScpOwogICAgZWxzZSAkVGltZVVuaXRzLnJlbW92ZUNsYXNzKCdWYWxpZGF0ZV9Mb3dlciAkUURhdGF7Ik5lZWRBY2NvdW50ZWRUaW1lIn0nKTsKICAgIHJldHVybjsKfSk7CgokKCcuVGltZVVuaXRzT3JpZ2luYWwnKS5maWx0ZXIoJ1t2YWx1ZT0kUURhdGF7IlRpbWVVbml0c09yaWdpbmFsIn1dJykuYXR0cignY2hlY2tlZCcsIHRydWUpLnRyaWdnZXIoJ2NoYW5nZScpOwoKPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L1RpY2tldEV4dGVuc2lvbnNBcnRpY2xlQ29weU1vdmUucG0gLSBBcnRpY2xlQ29weU1vdmVEZWxldGUgdGlja2V0IGNoYW5nZXMKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBSZW5lKGRvdClCb2VobShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIERvcm90aGVhKGRvdClEb2VyZmZlbChhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogVGlja2V0RXh0ZW5zaW9uc0FydGljbGVDb3B5TW92ZS5wbSx2IDEuMSAyMDExLTEyLTI4IDEwOjMwOjU3IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpUaWNrZXRFeHRlbnNpb25zQXJ0aWNsZUNvcHlNb3ZlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWl0ZW0gQXJ0aWNsZU1vdmUoKQoKTW92ZXMgYW4gYXJ0aWNsZSB0byBhbm90aGVyIHRpY2tldAoKICAgIG15ICRSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlTW92ZSgKICAgICAgICBUaWNrZXRJRCAgPT4gMTIzLAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7CgpSZXN1bHQ6CiAgICAxCiAgICBNb3ZlRmFpbGVkCiAgICBBY2NvdW50RmFpbGVkCgpFdmVudHM6CiAgICBBcnRpY2xlTW92ZQoKPWN1dAoKc3ViIEFydGljbGVNb3ZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcnRpY2xlSUQgVGlja2V0SUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkFydGljbGVNb3ZlOiBOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGFydGljbGUgZGF0YQogICAgcmV0dXJuICdNb3ZlRmFpbGVkJyBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGFydGljbGUgU0VUIHRpY2tldF9pZCA9ID8sICIKICAgICAgICAgICAgLiAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RpY2tldElEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0FydGljbGVJRH0gXSwKICAgICk7CgogICAgIyB1cGRhdGUgdGltZSBhY2NvdW50aW5nIGRhdGEKICAgIHJldHVybiAnQWNjb3VudEZhaWxlZCcgaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSB0aW1lX2FjY291bnRpbmcgU0VUIHRpY2tldF9pZCA9ID8sICcKICAgICAgICAgICAgLiAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyBXSEVSRSBhcnRpY2xlX2lkID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17QXJ0aWNsZUlEfSBdLAogICAgKTsKCiAgICAjIGNsZWFyIHRpY2tldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6R2V0VGlja2V0JyAuICRQYXJhbXtUaWNrZXRJRH0gfTsKCiAgICAjIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlTW92ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXJ0aWNsZUNvcHkoKQoKQ29waWVzIGFuIGFydGljbGUgdG8gYW5vdGhlciB0aWNrZXQgaW5jbHVkaW5nIGFsbCBhdHRhY2htZW50cwoKICAgIG15ICRSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ29weSgKICAgICAgICBUaWNrZXRJRCAgPT4gMTIzLAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7CgpSZXN1bHQ6CiAgICBOZXdBcnRpY2xlSUQKICAgICdOb09yaWdpbmFsJwogICAgJ0NvcHlGYWlsZWQnCiAgICAnVXBkYXRlRmFpbGVkJwoKRXZlbnRzOgogICAgQXJ0aWNsZUNvcHkKCj1jdXQKCnN1YiBBcnRpY2xlQ29weSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXJ0aWNsZUlEIFRpY2tldElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJBcnRpY2xlQ29weTogTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvcmlnaW5hbCBhcnRpY2xlIGNvbnRlbnQKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPkFydGljbGVHZXQoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgKTsKICAgIHJldHVybiAnTm9PcmlnaW5hbCcgaWYgISVBcnRpY2xlOwoKICAgICMgY29weSBvcmlnaW5hbCBhcnRpY2xlCiAgICBteSAkQ29weUFydGljbGVJRCA9ICRTZWxmLT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICVBcnRpY2xlLAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJ01pc2MnLAogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICJDb3BpZWQgYXJ0aWNsZSAkUGFyYW17QXJ0aWNsZUlEfSBmcm9tICIKICAgICAgICAgICAgLiAidGlja2V0ICRBcnRpY2xle1RpY2tldElEfSB0byB0aWNrZXQgJFBhcmFte1RpY2tldElEfSIsCiAgICApOwogICAgcmV0dXJuICdDb3B5RmFpbGVkJyBpZiAhJENvcHlBcnRpY2xlSUQ7CgogICAgIyBzZXQgYXJ0aWNsZSB0aW1lcyBmcm9tIG9yaWdpbmFsIGFydGljbGUKICAgIHJldHVybiAnVXBkYXRlRmFpbGVkJyBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnVVBEQVRFIGFydGljbGUgU0VUIGNyZWF0ZV90aW1lID0gPywgY2hhbmdlX3RpbWUgPSA/LCBpbmNvbWluZ190aW1lID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJEFydGljbGV7Q3JlYXRlZH0sICAgICAgXCRBcnRpY2xle0NoYW5nZWR9LAogICAgICAgICAgICBcJEFydGljbGV7SW5jb21pbmdUaW1lfSwgXCRDb3B5QXJ0aWNsZUlECiAgICAgICAgXSwKICAgICk7CgogICAgIyBjb3B5IGF0dGFjaG1lbnRzIGZyb20gb3JpZ2luYWwgYXJ0aWNsZQogICAgbXkgJUFydGljbGVJbmRleCA9ICRTZWxmLT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgZm9yIG15ICRJbmRleCAoIGtleXMgJUFydGljbGVJbmRleCApIHsKICAgICAgICBteSAlQXR0YWNobWVudCA9ICRTZWxmLT5BcnRpY2xlQXR0YWNobWVudCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBGaWxlSUQgICAgPT4gJEluZGV4LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgJUF0dGFjaG1lbnQsCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQ29weUFydGljbGVJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjbGVhciB0aWNrZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OkdldFRpY2tldCcgLiAkUGFyYW17VGlja2V0SUR9IH07CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUNvcHknLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkQ29weUFydGljbGVJRCwKICAgICAgICAgICAgT2xkQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJENvcHlBcnRpY2xlSUQ7Cn0KCj1pdGVtIEFydGljbGVGdWxsRGVsZXRlKCkKCkRlbGV0ZSBhbiBhcnRpY2xlLCBpdHMgaGlzdG9yeSwgaXRzIHBsYWluIG1lc3NhZ2UsIGFuZCBhbGwgYXR0YWNobWVudHMKCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGdWxsRGVsZXRlKAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7CgpBVFRFTlRJT046CiAgICBzdWIgQXJ0aWNsZURlbGV0ZSBpcyB1c2VkIGluIHRoaXMgc3ViLCBidXQgdGhpcyBzdWIgZG9lcyBub3QgZGVsZXRlCiAgICBhcnRpY2xlIGhpc3RvcnkKCkV2ZW50czoKICAgIEFydGljbGVGdWxsRGVsZXRlCgo9Y3V0CgpzdWIgQXJ0aWNsZUZ1bGxEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFydGljbGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0KICAgICAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJBcnRpY2xlRnVsbERlbGV0ZTogTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGNvbnRlbnQKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPkFydGljbGVHZXQoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJUFydGljbGU7CgogICAgIyBjbGVhciB0aWNrZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OkdldFRpY2tldCcgLiAkQXJ0aWNsZXtUaWNrZXRJRH0gfTsKCiAgICAjIGRlbGV0ZSBhcnRpY2xlIGhpc3RvcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHRpY2tldF9oaXN0b3J5IFdIRVJFIGFydGljbGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBcnRpY2xlSUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIGFydGljbGUsIGF0dGFjaG1lbnRzIGFuZCBwbGFpbiBlbWFpbHMKICAgIHJldHVybiBpZiAhJFNlbGYtPkFydGljbGVEZWxldGUoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUZ1bGxEZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXJ0aWNsZUNyZWF0ZURhdGVVcGRhdGUoKQoKTWFuaXB1bGF0ZXMgdGhlIGFydGljbGUgY3JlYXRlIGRhdGUKCiAgICBteSAkUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZURhdGVVcGRhdGUoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMTIzLAogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVVcGRhdGUKCj1jdXQKCnN1YiBBcnRpY2xlQ3JlYXRlRGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgQXJ0aWNsZUlEIFVzZXJJRCBDcmVhdGVkIEluY29taW5nVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkFydGljbGVDcmVhdGVEYXRlVXBkYXRlOiBOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGIgdXBkYXRlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBhcnRpY2xlIFNFVCBpbmNvbWluZ190aW1lID0gPywgY3JlYXRlX3RpbWUgPSA/LCIKICAgICAgICAgICAgLiAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0luY29taW5nVGltZX0sIFwkUGFyYW17Q3JlYXRlZH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtBcnRpY2xlSUR9IF0sCiAgICApOwoKICAgICMgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FydGljbGVVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gMTsKfQoKIyBkaXNhYmxlIHJlZGVmaW5lIHdhcm5pbmdzIGluIHRoaXMgc2NvcGUKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsKCiAgICAjIHJlc2V0IGFsbCB3YXJuaW5ncwp9CgoxOwo=
IyAtLQojIEFnZW50QXJ0aWNsZUNvcHlNb3ZlLnBtIC0gY29kZSBydW4gZHVyaW5nIHBhY2thZ2UgZGUtL2luc3RhbGxhdGlvbgojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBBZ2VudEFydGljbGVDb3B5TW92ZS5wbSx2IDEuMSAyMDExLTEyLTI4IDEwOjMwOjU3IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpBZ2VudEFydGljbGVDb3B5TW92ZTsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgS2VybmVsOjpDb25maWc7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKQWdlbnRBcnRpY2xlQ29weU1vdmUucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OkFnZW50QXJ0aWNsZUNvcHlNb3ZlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgc3lzY29uZmlnIG9iamVjdC4uLgogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9LT5Xcml0ZURlZmF1bHQoKTsKICAgIG15IEBaWlpGaWxlcyA9ICgKICAgICAgICAnWlpaQUF1dG8ucG0nLAogICAgICAgICdaWlpBdXRvLnBtJywKICAgICk7CgogICAgIyByZWxvYWQgdGhlIFpaWiBmaWxlcyAobW9kX3Blcmwgd29ya2Fyb3VuZCkKICAgIGZvciBteSAkWlpaRmlsZSAoQFpaWkZpbGVzKSB7CiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIGlmICggIS1mICRGaWxlICkgewogICAgICAgICAgICAgICAgbmV4dCBQUkVGSVgKICAgICAgICAgICAgfQogICAgICAgICAgICBkbyAkRmlsZTsKICAgICAgICAgICAgbGFzdCBQUkVGSVg7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEludGVybmFsIGZ1bmN0aW9ucwoKIyBFTyBJbnRlcm5hbCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1oZWFkMSBWRVJTSU9OCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTEtMTItMjggMTA6MzA6NTcgJAo9Y3V0Cg==