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("PD9waHANCg0KZGVmaW5lKCJDSEFSIiwiQUJDREVGR0hJSktMTU5PUFFSU1..
Decoded Output download
?>b'<?php
define("CHAR","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_");
define("BBCHAR","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789[]=_\/|+-*.<>()%^$#@!
");
define("NUMBER","0123456789");
class CNeoInject
{
public function Encode(&$str)
{
$str = base64_encode($str);
return $str;
}
public function Decode(&$str)
{
$str = base64_decode($str);
return $str;
}
public function sec_BBString($str)
{
$ret = "";
$aSTR = str_split($str,1);
$aCHAR = str_split(BBCHAR,1);
for( $i = 0 ; $i <= strlen($str) ; $i ++ )
{
for( $l = 0 ; $l <= strlen(BBCHAR) ; $l ++ )
{
if ( $aCHAR[$l] == $aSTR[$i] )
{
$ret = $ret.$aSTR[$i];
}
}
}
return $ret;
}
public function sec_String($str)
{
$ret = "";
$aSTR = str_split($str,1);
$aCHAR = str_split(CHAR,1);
for( $i = 0 ; $i <= strlen($str) ; $i ++ )
{
for( $l = 0 ; $l <= strlen(CHAR) ; $l ++ )
{
if ( $aCHAR[$l] == $aSTR[$i] )
{
$ret = $ret.$aSTR[$i];
}
}
}
return $ret;
}
public function sec_Int($str)
{
$ret = "";
$aSTR = str_split($str,1);
$aCHAR = str_split(NUMBER,1);
for( $i = 0 ; $i <= strlen($str) ; $i ++ )
{
for( $l = 0 ; $l <= strlen(NUMBER) ; $l ++ )
{
if ( $aCHAR[$l] == $aSTR[$i] )
{
$ret = $ret.$aSTR[$i];
}
}
}
return (int)$ret;
}
/*PROTECT BEGIN*/
/**
* @shortdesc url to redirect if an sql inject attempt is detect. if unset, value is FALSE
* @private
* @type mixed
*/
var $urlRedirect;
/**
* @shortdesc does the session must be destroy if an attempt is detect
* @private
* @type bool
*/
var $bdestroy_session;
/**
* @shortdesc the SQL data currently test
* @private
* @type string
*/
var $rq;
/**
* @shortdesc if not FALSE, the url to the log file
* @private
* @type mixed
*/
var $bLog;
/**
* Builder
*
* @param bool bdestroy_session optional. does the session must be destroy if an attempt is detect?
* @param string urlRedirect optional. url to redirect if an sql inject attempt is detect
* @public
* @type void
*/
function sql_inject($mLog=FALSE,$bdestroy_session=FALSE,$urlRedirect=FALSE)
{
$this->bLog = (($mLog!=FALSE)?$mLog:\'\');
$this->urlRedirect = (((trim($urlRedirect)!=\'\') && file_exists($urlRedirect))?$urlRedirect:\'\');
$this->bdestroy_session = $bdestroy_session;
$this->rq = \'\';
}
/**
* @shortdesc test if there is a sql inject attempt detect
* test if there is a sql inject attempt detect
*
* @param string sRQ required. SQL Data to test
* @public
* @type bool
*/
function test($sRQ)
{
$sRQ = strtolower($sRQ);
$this->rq = $sRQ;
$aValues = array();
$aTemp = array(); // temp array
$aWords = array(); //
$aSep = array(\' and \',\' or \'); // separators for detect the
$sConditions = \'(\';
$matches = array();
$sSep = \'\';
// is there an attempt to unused part of the rq?
if (is_int((strpos($sRQ,"#")))&&$this->_in_post(\'#\')) return $this->detect();
// is there a attempt to do a 2nd SQL requete ?
if (is_int(strpos($sRQ,\';\'))){
$aTemp = explode(\';\',$sRQ);
if ($this->_in_post($aTemp[1])) return $this->detect();
}
$aTemp = explode(" where ",$sRQ);
if (count($aTemp)==1) return FALSE;
$sConditions = $aTemp[1];
$aWords = explode(" ",$sConditions);
if(strcasecmp($aWords[0],\'select\')!=0) $aSep[] = \',\';
$sSep = \'(\'.implode(\'|\',$aSep).\')\';
$aValues = preg_split($sSep,$sConditions,-1, PREG_SPLIT_NO_EMPTY);
// test the always true expressions
foreach($aValues as $i => $v)
{
// SQL injection like 1=1 or a=a or \'za\'=\'za\'
if (is_int(strpos($v,\'=\')))
{
$aTemp = explode(\'=\',$v);
if (trim($aTemp[0])==trim($aTemp[1])) return $this->detect();
}
//SQL injection like 1<>2
if (is_int(strpos($v,\'<>\')))
{
$aTemp = explode(\'<>\',$v);
if ((trim($aTemp[0])!=trim($aTemp[1]))&& ($this->_in_post(\'<>\'))) return $this->detect();
}
}
if (strpos($sConditions,\' null\'))
{
if (preg_match("/null +is +null/",$sConditions)) return $this->detect();
if (preg_match("/is +not +null/",$sConditions,$matches))
{
foreach($matches as $i => $v)
{
if ($this->_in_post($v))return $this->detect();
}
}
}
if (preg_match("/[a-z0-9]+ +between +[a-z0-9]+ +and +[a-z0-9]+/",$sConditions,$matches))
{
$Temp = explode(\' between \',$matches[0]);
$Evaluate = $Temp[0];
$Temp = explode(\' and \',$Temp[1]);
if ((strcasecmp($Evaluate,$Temp[0])>0) && (strcasecmp($Evaluate,$Temp[1])<0) && $this->_in_post($matches[0])) return $this->detect();
}
return FALSE;
}
function _in_post($value)
{
foreach($_POST as $i => $v)
{
if (is_int(strpos(strtolower($v),$value))) return TRUE;
}
return FALSE;
}
function detect()
{
// log the attempt to sql inject?
if ($this->bLog)
{
$fp = @fopen($this->bLog,\'a+\');
if ($fp)
{
fputs($fp,"
".date("d-m-Y H:i:s").\' [\'.$this->rq.\'] from \'.$this->sIp = getenv("REMOTE_ADDR"));
fclose($fp);
}
}
// destroy session?
if ($this->bdestroy_session) session_destroy();
// redirect?
if ($this->urlRedirect!=\'\'){
if (!headers_sent()) header("location: $this->urlRedirect");
}
return TRUE;
}
function protect1($protected) { // This Will be the fuction we call to protect the variables.
if ( $protected == "" ) return ;
$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
//$banlist is the list of words you dont want to allow.
if ( eregi ( "[a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
return $protected;
//echo "+";
} else {
return ;
//echo "-";
//echo $protected;
//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {
function protect2($protected) { // This Will be the fuction we call to protect the variables.
if ( $protected == "" ) return ;
$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
//$banlist is the list of words you dont want to allow.
if ( eregi ( "[0-9]+", $protected ) ) { // Makes sure only legitimate Characters are used.
$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
return $protected;
//echo "+";
} else {
return ;
//echo "-";
//echo $protected;
//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {
function protect3($protected) { // This Will be the fuction we call to protect the variables.
if ( $protected == "" ) return ;
$banlist = array ("\'", "\"", "<", "\", "|", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
//$banlist is the list of words you dont want to allow.
if ( eregi ( "[-a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
return $protected;
//echo "+";
} else {
return ;
//echo "-";
//echo $protected;
//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {
/*PROTECT END*/
}
$ip = $_SERVER[\'REMOTE_ADDR\'];
$time = date("l dS of F Y h:i:s A");
$script = $_SERVER[PATH_TRANSLATED];
$fp = fopen ("Injection.txt", "a+");
$sql_inject_1 = array(";","\'","%",\'"\'); #Whoth need replace
$sql_inject_2 = array("", "","","""); #To wont replace
$GET_KEY = array_keys($_GET); #array keys from $_GET
$POST_KEY = array_keys($_POST); #array keys from $_POST
$COOKIE_KEY = array_keys($_COOKIE); #array keys from $_COOKIE
/*begin clear $_GET */
for($i=0;$i<count($GET_KEY);$i++)
{
$real_get[$i] = $_GET[$GET_KEY[$i]];
$_GET[$GET_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_GET[$GET_KEY[$i]]));
if($real_get[$i] != $_GET[$GET_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: GET
");
fwrite ($fp, "Value: $real_get[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}
/*end clear $_GET */
/*begin clear $_POST */
for($i=0;$i<count($POST_KEY);$i++)
{
$real_post[$i] = $_POST[$POST_KEY[$i]];
$_POST[$POST_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_POST[$POST_KEY[$i]]));
if($real_post[$i] != $_POST[$POST_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: POST
");
fwrite ($fp, "Value: $real_post[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}
/*end clear $_POST */
/*begin clear $_COOKIE */
for($i=0;$i<count($COOKIE_KEY);$i++)
{
$real_cookie[$i] = $_COOKIE[$COOKIE_KEY[$i]];
$_COOKIE[$COOKIE_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_COOKIE[$COOKIE_KEY[$i]]));
if($real_cookie[$i] != $_COOKIE[$COOKIE_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: COOKIE
");
fwrite ($fp, "Value: $real_cookie[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}
/*end clear $_COOKIE */
fclose ($fp);
$xa = getenv(\'REMOTE_ADDR\');
$badwords = array(";","\'","\"","*","union","del","DEL","insert","update","drop","sele","memb","set","$","res3t","wareh","%");
foreach($_POST as $value)
foreach($badwords as $word)
if(substr_count($value, $word) > 0)
die("Error IP: $xa ");
class sql_inject
{
/**
* @shortdesc url to redirect if an sql inject attempt is detect. if unset, value is FALSE
* @private
* @type mixed
*/
var $urlRedirect;
/**
* @shortdesc does the session must be destroy if an attempt is detect
* @private
* @type bool
*/
var $bdestroy_session;
/**
* @shortdesc the SQL data currently test
* @private
* @type string
*/
var $rq;
/**
* @shortdesc if not FALSE, the url to the log file
* @private
* @type mixed
*/
var $bLog;
/**
* Builder
*
* @param bool bdestroy_session optional. does the session must be destroy if an attempt is detect?
* @param string urlRedirect optional. url to redirect if an sql inject attempt is detect
* @public
* @type void
*/
function sql_inject($mLog=FALSE,$bdestroy_session=FALSE,$urlRedirect=FALSE)
{
$this->bLog = (($mLog!=FALSE)?$mLog:\'\');
$this->urlRedirect = (((trim($urlRedirect)!=\'\') && file_exists($urlRedirect))?$urlRedirect:\'\');
$this->bdestroy_session = $bdestroy_session;
$this->rq = \'\';
}
/**
* @shortdesc test if there is a sql inject attempt detect
* test if there is a sql inject attempt detect
*
* @param string sRQ required. SQL Data to test
* @public
* @type bool
*/
function test($sRQ)
{
$sRQ = strtolower($sRQ);
$this->rq = $sRQ;
$aValues = array();
$aTemp = array(); // temp array
$aWords = array(); //
$aSep = array(\' and \',\' or \'); // separators for detect the
$sConditions = \'(\';
$matches = array();
$sSep = \'\';
// is there an attempt to unused part of the rq?
if (is_int((strpos($sRQ,"#")))&&$this->_in_post(\'#\')) return $this->detect();
// is there a attempt to do a 2nd SQL requete ?
if (is_int(strpos($sRQ,\';\'))){
$aTemp = explode(\';\',$sRQ);
if ($this->_in_post($aTemp[1])) return $this->detect();
}
$aTemp = explode(" where ",$sRQ);
if (count($aTemp)==1) return FALSE;
$sConditions = $aTemp[1];
$aWords = explode(" ",$sConditions);
if(strcasecmp($aWords[0],\'select\')!=0) $aSep[] = \',\';
$sSep = \'(\'.implode(\'|\',$aSep).\')\';
$aValues = preg_split($sSep,$sConditions,-1, PREG_SPLIT_NO_EMPTY);
// test the always true expressions
foreach($aValues as $i => $v)
{
// SQL injection like 1=1 or a=a or \'za\'=\'za\'
if (is_int(strpos($v,\'=\')))
{
$aTemp = explode(\'=\',$v);
if (trim($aTemp[0])==trim($aTemp[1])) return $this->detect();
}
//SQL injection like 1<>2
if (is_int(strpos($v,\'<>\')))
{
$aTemp = explode(\'<>\',$v);
if ((trim($aTemp[0])!=trim($aTemp[1]))&& ($this->_in_post(\'<>\'))) return $this->detect();
}
}
if (strpos($sConditions,\' null\'))
{
if (preg_match("/null +is +null/",$sConditions)) return $this->detect();
if (preg_match("/is +not +null/",$sConditions,$matches))
{
foreach($matches as $i => $v)
{
if ($this->_in_post($v))return $this->detect();
}
}
}
if (preg_match("/[a-z0-9]+ +between +[a-z0-9]+ +and +[a-z0-9]+/",$sConditions,$matches))
{
$Temp = explode(\' between \',$matches[0]);
$Evaluate = $Temp[0];
$Temp = explode(\' and \',$Temp[1]);
if ((strcasecmp($Evaluate,$Temp[0])>0) && (strcasecmp($Evaluate,$Temp[1])<0) && $this->_in_post($matches[0])) return $this->detect();
}
return FALSE;
}
function _in_post($value)
{
foreach($_POST as $i => $v)
{
if (is_int(strpos(strtolower($v),$value))) return TRUE;
}
return FALSE;
}
function detect()
{
// log the attempt to sql inject?
if ($this->bLog)
{
$fp = @fopen($this->bLog,\'a+\');
if ($fp)
{
fputs($fp,"
".date("d-m-Y H:i:s").\' [\'.$this->rq.\'] from \'.$this->sIp = getenv("REMOTE_ADDR"));
fclose($fp);
}
}
// destroy session?
if ($this->bdestroy_session) session_destroy();
// redirect?
if ($this->urlRedirect!=\'\'){
if (!headers_sent()) header("location: $this->urlRedirect");
}
return TRUE;
}
function protect1($protected) { // This Will be the fuction we call to protect the variables.
$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
//$banlist is the list of words you dont want to allow.
if ( eregi ( "[a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
return $protected;
//echo "+";
} else {
//echo "-";
echo $protected;
die ( \' .\' ); // Message if thier is any characters not in [a-zA-Z0-9].
} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {
function protect2($protected) { // This Will be the fuction we call to protect the variables.
$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
//$banlist is the list of words you dont want to allow.
if ( eregi ( "[0-9]+", $protected ) ) { // Makes sure only legitimate Characters are used.
$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
return $protected;
//echo "+";
} else {
//echo "-";
echo $protected;
die ( \' . \' ); // Message if thier is any characters not in [a-zA-Z0-9].
} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {
}
?>'
Did this file decode correctly?
Original Code
<?php @eval("?>".base64_decode("PD9waHANCg0KZGVmaW5lKCJDSEFSIiwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIik7DQpkZWZpbmUoIkJCQ0hBUiIsIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5W109X1wvfCstKi48PigpJV4kI0AhDQoJIik7DQpkZWZpbmUoIk5VTUJFUiIsIjAxMjM0NTY3ODkiKTsNCmNsYXNzIENOZW9JbmplY3QNCnsNCglwdWJsaWMgZnVuY3Rpb24gRW5jb2RlKCYkc3RyKQ0KCXsNCgkJJHN0ciA9IGJhc2U2NF9lbmNvZGUoJHN0cik7DQoJCXJldHVybiAkc3RyOw0KCX0NCglwdWJsaWMgZnVuY3Rpb24gRGVjb2RlKCYkc3RyKQ0KCXsNCgkJJHN0ciA9IGJhc2U2NF9kZWNvZGUoJHN0cik7DQoJCXJldHVybiAkc3RyOw0KCX0NCglwdWJsaWMgZnVuY3Rpb24gc2VjX0JCU3RyaW5nKCRzdHIpDQoJew0KCQkkcmV0ID0gIiI7DQoJCSRhU1RSID0gc3RyX3NwbGl0KCRzdHIsMSk7DQoJCSRhQ0hBUiA9IHN0cl9zcGxpdChCQkNIQVIsMSk7DQoJCWZvciggJGkgPSAwIDsgJGkgPD0gc3RybGVuKCRzdHIpIDsgJGkgKysgKQ0KCQl7DQoJCQlmb3IoICRsID0gMCA7ICRsIDw9IHN0cmxlbihCQkNIQVIpIDsgJGwgKysgKQ0KCQkJew0KCQkJCWlmICggJGFDSEFSWyRsXSA9PSAkYVNUUlskaV0gKQ0KCQkJCXsNCgkJCQkJJHJldCA9ICRyZXQuJGFTVFJbJGldOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHJldDsNCgl9DQoJcHVibGljIGZ1bmN0aW9uIHNlY19TdHJpbmcoJHN0cikNCgl7DQoJCSRyZXQgPSAiIjsNCgkJJGFTVFIgPSBzdHJfc3BsaXQoJHN0ciwxKTsNCgkJJGFDSEFSID0gc3RyX3NwbGl0KENIQVIsMSk7DQoJCWZvciggJGkgPSAwIDsgJGkgPD0gc3RybGVuKCRzdHIpIDsgJGkgKysgKQ0KCQl7DQoJCQlmb3IoICRsID0gMCA7ICRsIDw9IHN0cmxlbihDSEFSKSA7ICRsICsrICkNCgkJCXsNCgkJCQlpZiAoICRhQ0hBUlskbF0gPT0gJGFTVFJbJGldICkNCgkJCQl7DQoJCQkJCSRyZXQgPSAkcmV0LiRhU1RSWyRpXTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRyZXQ7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIHNlY19JbnQoJHN0cikNCgl7DQoJCSRyZXQgPSAiIjsNCgkJJGFTVFIgPSBzdHJfc3BsaXQoJHN0ciwxKTsNCgkJJGFDSEFSID0gc3RyX3NwbGl0KE5VTUJFUiwxKTsNCgkJZm9yKCAkaSA9IDAgOyAkaSA8PSBzdHJsZW4oJHN0cikgOyAkaSArKyApDQoJCXsNCgkJCWZvciggJGwgPSAwIDsgJGwgPD0gc3RybGVuKE5VTUJFUikgOyAkbCArKyApDQoJCQl7DQoJCQkJaWYgKCAkYUNIQVJbJGxdID09ICRhU1RSWyRpXSApDQoJCQkJew0KCQkJCQkkcmV0ID0gJHJldC4kYVNUUlskaV07DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAoaW50KSRyZXQ7DQoJfQ0KDQoJLypQUk9URUNUIEJFR0lOKi8NCgkvKioNCgkgKiBAc2hvcnRkZXNjIHVybCB0byByZWRpcmVjdCBpZiBhbiBzcWwgaW5qZWN0IGF0dGVtcHQgaXMgZGV0ZWN0LiBpZiB1bnNldCwgdmFsdWUgaXMgRkFMU0UNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIG1peGVkDQoJICovDQogICAgdmFyICR1cmxSZWRpcmVjdDsNCiAgICAvKioNCgkgKiBAc2hvcnRkZXNjIGRvZXMgdGhlIHNlc3Npb24gbXVzdCBiZSBkZXN0cm95IGlmIGFuIGF0dGVtcHQgaXMgZGV0ZWN0DQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBib29sDQoJICovDQogICAgdmFyICRiZGVzdHJveV9zZXNzaW9uOw0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdGhlIFNRTCBkYXRhIGN1cnJlbnRseSB0ZXN0DQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBzdHJpbmcNCgkgKi8NCiAgICB2YXIgJHJxOw0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgaWYgbm90IEZBTFNFLCB0aGUgdXJsIHRvIHRoZSBsb2cgZmlsZQ0KCSAqIEBwcml2YXRlDQoJICogQHR5cGUgbWl4ZWQNCgkgKi8NCiAgICB2YXIgJGJMb2c7DQoNCiAgICAvKioNCgkgKiBCdWlsZGVyDQoJICoNCgkgKiBAcGFyYW0gYm9vbCBiZGVzdHJveV9zZXNzaW9uIG9wdGlvbmFsLiBkb2VzIHRoZSBzZXNzaW9uIG11c3QgYmUgZGVzdHJveSBpZiBhbiBhdHRlbXB0IGlzIGRldGVjdD8NCgkgKiBAcGFyYW0gc3RyaW5nIHVybFJlZGlyZWN0IG9wdGlvbmFsLiB1cmwgdG8gcmVkaXJlY3QgaWYgYW4gc3FsIGluamVjdCBhdHRlbXB0IGlzIGRldGVjdA0KICAgICAqIEBwdWJsaWMNCgkgKiBAdHlwZSB2b2lkDQogICAgICovDQogICAgZnVuY3Rpb24gc3FsX2luamVjdCgkbUxvZz1GQUxTRSwkYmRlc3Ryb3lfc2Vzc2lvbj1GQUxTRSwkdXJsUmVkaXJlY3Q9RkFMU0UpDQogICAgew0KICAgICAgICAkdGhpcy0+YkxvZyA9ICgoJG1Mb2chPUZBTFNFKT8kbUxvZzonJyk7DQogICAgICAgICR0aGlzLT51cmxSZWRpcmVjdCA9ICgoKHRyaW0oJHVybFJlZGlyZWN0KSE9JycpICYmIGZpbGVfZXhpc3RzKCR1cmxSZWRpcmVjdCkpPyR1cmxSZWRpcmVjdDonJyk7DQogICAgICAgICR0aGlzLT5iZGVzdHJveV9zZXNzaW9uID0gJGJkZXN0cm95X3Nlc3Npb247DQogICAgICAgICR0aGlzLT5ycSA9ICcnOw0KICAgIH0NCg0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdGVzdCBpZiB0aGVyZSBpcyBhIHNxbCBpbmplY3QgYXR0ZW1wdCBkZXRlY3QNCgkgKiB0ZXN0IGlmIHRoZXJlIGlzIGEgc3FsIGluamVjdCBhdHRlbXB0IGRldGVjdA0KCSAqDQoJICogQHBhcmFtIHN0cmluZyBzUlEgcmVxdWlyZWQuIFNRTCBEYXRhIHRvIHRlc3QNCiAgICAgKiBAcHVibGljDQoJICogQHR5cGUgYm9vbA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3QoJHNSUSkNCiAgICB7DQogICAgICAgICRzUlEgPSBzdHJ0b2xvd2VyKCRzUlEpOw0KICAgICAgICAkdGhpcy0+cnEgPSAkc1JROw0KICAgICAgICAkYVZhbHVlcyA9IGFycmF5KCk7DQogICAgICAgICRhVGVtcCA9IGFycmF5KCk7IC8vIHRlbXAgYXJyYXkNCiAgICAgICAgJGFXb3JkcyA9IGFycmF5KCk7IC8vDQogICAgICAgICRhU2VwID0gYXJyYXkoJyBhbmQgJywnIG9yICcpOyAvLyBzZXBhcmF0b3JzIGZvciBkZXRlY3QgdGhlDQogICAgICAgICRzQ29uZGl0aW9ucyA9ICcoJzsNCiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOw0KICAgICAgICAkc1NlcCA9ICcnOw0KICAgICAgICAvLyBpcyB0aGVyZSBhbiBhdHRlbXB0IHRvIHVudXNlZCBwYXJ0IG9mIHRoZSBycT8NCiAgICAgICAgaWYgKGlzX2ludCgoc3RycG9zKCRzUlEsIiMiKSkpJiYkdGhpcy0+X2luX3Bvc3QoJyMnKSkgcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCg0KICAgICAgICAvLyBpcyB0aGVyZSBhIGF0dGVtcHQgdG8gZG8gYSAybmQgU1FMIHJlcXVldGUgPw0KICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkc1JRLCc7JykpKXsNCiAgICAgICAgICAgICRhVGVtcCA9IGV4cGxvZGUoJzsnLCRzUlEpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5faW5fcG9zdCgkYVRlbXBbMV0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgiIHdoZXJlICIsJHNSUSk7DQogICAgICAgIGlmIChjb3VudCgkYVRlbXApPT0xKSByZXR1cm4gRkFMU0U7DQogICAgICAgICRzQ29uZGl0aW9ucyA9ICRhVGVtcFsxXTsNCiAgICAgICAgJGFXb3JkcyA9IGV4cGxvZGUoIiAiLCRzQ29uZGl0aW9ucyk7DQogICAgICAgIGlmKHN0cmNhc2VjbXAoJGFXb3Jkc1swXSwnc2VsZWN0JykhPTApICRhU2VwW10gPSAnLCc7DQogICAgICAgICRzU2VwID0gJygnLmltcGxvZGUoJ3wnLCRhU2VwKS4nKSc7DQogICAgICAgICRhVmFsdWVzID0gcHJlZ19zcGxpdCgkc1NlcCwkc0NvbmRpdGlvbnMsLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KDQogICAgICAgIC8vIHRlc3QgdGhlIGFsd2F5cyB0cnVlIGV4cHJlc3Npb25zDQogICAgICAgIGZvcmVhY2goJGFWYWx1ZXMgYXMgJGkgPT4gJHYpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFNRTCBpbmplY3Rpb24gbGlrZSAxPTEgb3IgYT1hIG9yICd6YSc9J3phJw0KICAgICAgICAgICAgaWYgKGlzX2ludChzdHJwb3MoJHYsJz0nKSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICRhVGVtcCA9IGV4cGxvZGUoJz0nLCR2KTsNCiAgICAgICAgICAgICAgICAgaWYgKHRyaW0oJGFUZW1wWzBdKT09dHJpbSgkYVRlbXBbMV0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL1NRTCBpbmplY3Rpb24gbGlrZSAxPD4yDQogICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkdiwnPD4nKSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnPD4nLCR2KTsNCiAgICAgICAgICAgICAgICBpZiAoKHRyaW0oJGFUZW1wWzBdKSE9dHJpbSgkYVRlbXBbMV0pKSYmICgkdGhpcy0+X2luX3Bvc3QoJzw+JykpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0cnBvcygkc0NvbmRpdGlvbnMsJyBudWxsJykpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvbnVsbCAraXMgK251bGwvIiwkc0NvbmRpdGlvbnMpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9pcyArbm90ICtudWxsLyIsJHNDb25kaXRpb25zLCRtYXRjaGVzKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRpID0+ICR2KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5faW5fcG9zdCgkdikpcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocHJlZ19tYXRjaCgiL1thLXowLTldKyArYmV0d2VlbiArW2EtejAtOV0rICthbmQgK1thLXowLTldKy8iLCRzQ29uZGl0aW9ucywkbWF0Y2hlcykpDQogICAgICAgIHsNCiAgICAgICAgICAgICRUZW1wID0gZXhwbG9kZSgnIGJldHdlZW4gJywkbWF0Y2hlc1swXSk7DQogICAgICAgICAgICAkRXZhbHVhdGUgPSAkVGVtcFswXTsNCiAgICAgICAgICAgICRUZW1wID0gZXhwbG9kZSgnIGFuZCAnLCRUZW1wWzFdKTsNCiAgICAgICAgICAgIGlmICgoc3RyY2FzZWNtcCgkRXZhbHVhdGUsJFRlbXBbMF0pPjApICYmIChzdHJjYXNlY21wKCRFdmFsdWF0ZSwkVGVtcFsxXSk8MCkgJiYgJHRoaXMtPl9pbl9wb3N0KCRtYXRjaGVzWzBdKSkgcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX2luX3Bvc3QoJHZhbHVlKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCgkX1BPU1QgYXMgJGkgPT4gJHYpDQogICAgICAgIHsNCiAgICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcyhzdHJ0b2xvd2VyKCR2KSwkdmFsdWUpKSkgcmV0dXJuIFRSVUU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRldGVjdCgpDQogICAgew0KICAgICAgICAvLyBsb2cgdGhlIGF0dGVtcHQgdG8gc3FsIGluamVjdD8NCiAgICAgICAgaWYgKCR0aGlzLT5iTG9nKQ0KICAgICAgICB7DQogICAgICAgICAgICAkZnAgPSBAZm9wZW4oJHRoaXMtPmJMb2csJ2ErJyk7DQogICAgICAgICAgICBpZiAoJGZwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZwdXRzKCRmcCwiXHJcbiIuZGF0ZSgiZC1tLVkgSDppOnMiKS4nIFsnLiR0aGlzLT5ycS4nXSBmcm9tICcuJHRoaXMtPnNJcCA9IGdldGVudigiUkVNT1RFX0FERFIiKSk7DQogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gZGVzdHJveSBzZXNzaW9uPw0KICAgICAgICBpZiAoJHRoaXMtPmJkZXN0cm95X3Nlc3Npb24pIHNlc3Npb25fZGVzdHJveSgpOw0KICAgICAgICAvLyByZWRpcmVjdD8NCiAgICAgICAgaWYgKCR0aGlzLT51cmxSZWRpcmVjdCE9Jycpew0KICAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpICBoZWFkZXIoImxvY2F0aW9uOiAkdGhpcy0+dXJsUmVkaXJlY3QiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gVFJVRTsNCiAgICB9DQoNCglmdW5jdGlvbiBwcm90ZWN0MSgkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkJaWYgKCAkcHJvdGVjdGVkID09ICIiICkgcmV0dXJuIDsNCgkJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIi8iLCAiPSIsICJpbnNlcnQiLCAic2VsZWN0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiZGlzdGluY3QiLCAiaGF2aW5nIiwgInRydW5jYXRlIiwgInJlcGxhY2UiLCAiaGFuZGxlciIsICJsaWtlIiwgInByb2NlZHVyZSIsICJsaW1pdCIsICJvcmRlciBieSIsICJncm91cCBieSIsICJhc2MiLCAiZGVzYyIpOw0KCQkvLyRiYW5saXN0IGlzIHRoZSBsaXN0IG9mIHdvcmRzIHlvdSBkb250IHdhbnQgdG8gYWxsb3cuDQoJCWlmICggZXJlZ2kgKCAiW2EtekEtWjAtOUBdKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJCSRwcm90ZWN0ZWQgPSB0cmltKHN0cl9yZXBsYWNlKCRiYW5saXN0LCAnJywgJHByb3RlY3RlZCkpOyAvLyBUYWtlcyBvdXQgd2hpdGVzcGFjZSwgYW5kIHJlbW92ZXMgYW55IGJhbm5lZCB3b3Jkcy4NCgkJCXJldHVybiAkcHJvdGVjdGVkOw0KCQkJLy9lY2hvICIrIjsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiA7DQoJCQkvL2VjaG8gIi0iOw0KCQkJLy9lY2hvICRwcm90ZWN0ZWQ7DQoJCQkvL2RpZSAoICdUaGlzIHdvcmQgbm90IHN1cHBvcnQnICk7IC8vIE1lc3NhZ2UgaWYgdGhpZXIgaXMgYW55IGNoYXJhY3RlcnMgbm90IGluIFthLXpBLVowLTldLg0KCQl9IC8vIGVuZHMgdGhlIGlmICggZXJlZ2kgKCAiW2EtekEtWjAtOV0rIiwgJHRoaXMtPnByb3RlY3RlZCApICkgew0KCX0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KCWZ1bmN0aW9uIHByb3RlY3QyKCRwcm90ZWN0ZWQpIHsgLy8gVGhpcyBXaWxsIGJlIHRoZSBmdWN0aW9uIHdlIGNhbGwgdG8gcHJvdGVjdCB0aGUgdmFyaWFibGVzLg0KCQlpZiAoICRwcm90ZWN0ZWQgPT0gIiIgKSByZXR1cm4gOw0KCQkkYmFubGlzdCA9IGFycmF5ICgiJyIsICJcIiIsICI8IiwgIlxcIiwgInwiLCAiLyIsICI9IiwgImluc2VydCIsICJzZWxlY3QiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJkaXN0aW5jdCIsICJoYXZpbmciLCAidHJ1bmNhdGUiLCAicmVwbGFjZSIsICJoYW5kbGVyIiwgImxpa2UiLCAicHJvY2VkdXJlIiwgImxpbWl0IiwgIm9yZGVyIGJ5IiwgImdyb3VwIGJ5IiwgImFzYyIsICJkZXNjIik7DQoJCS8vJGJhbmxpc3QgaXMgdGhlIGxpc3Qgb2Ygd29yZHMgeW91IGRvbnQgd2FudCB0byBhbGxvdy4NCgkJaWYgKCBlcmVnaSAoICJbMC05XSsiLCAkcHJvdGVjdGVkICkgKSB7IC8vIE1ha2VzIHN1cmUgb25seSBsZWdpdGltYXRlIENoYXJhY3RlcnMgYXJlIHVzZWQuDQoJCQkkcHJvdGVjdGVkID0gdHJpbShzdHJfcmVwbGFjZSgkYmFubGlzdCwgJycsICRwcm90ZWN0ZWQpKTsgLy8gVGFrZXMgb3V0IHdoaXRlc3BhY2UsIGFuZCByZW1vdmVzIGFueSBiYW5uZWQgd29yZHMuDQoJCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJCS8vZWNobyAiKyI7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gOw0KCQkJLy9lY2hvICItIjsNCgkJCS8vZWNobyAkcHJvdGVjdGVkOw0KCQkJLy9kaWUgKCAnVGhpcyB3b3JkIG5vdCBzdXBwb3J0JyApOyAvLyBNZXNzYWdlIGlmIHRoaWVyIGlzIGFueSBjaGFyYWN0ZXJzIG5vdCBpbiBbYS16QS1aMC05XS4NCgkJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCgl9IC8vIGVuZHMgdGhlIGZ1bmN0aW9uIFByb3RlY3QoKSB7DQoNCglmdW5jdGlvbiBwcm90ZWN0MygkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkJaWYgKCAkcHJvdGVjdGVkID09ICIiICkgcmV0dXJuIDsNCgkJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIj0iLCAiaW5zZXJ0IiwgInNlbGVjdCIsICJ1cGRhdGUiLCAiZGVsZXRlIiwgImRpc3RpbmN0IiwgImhhdmluZyIsICJ0cnVuY2F0ZSIsICJyZXBsYWNlIiwgImhhbmRsZXIiLCAibGlrZSIsICJwcm9jZWR1cmUiLCAibGltaXQiLCAib3JkZXIgYnkiLCAiZ3JvdXAgYnkiLCAiYXNjIiwgImRlc2MiKTsNCgkJLy8kYmFubGlzdCBpcyB0aGUgbGlzdCBvZiB3b3JkcyB5b3UgZG9udCB3YW50IHRvIGFsbG93Lg0KCQlpZiAoIGVyZWdpICggIlvguIEt4LmbYS16QS1aMC05QF0rIiwgJHByb3RlY3RlZCApICkgeyAvLyBNYWtlcyBzdXJlIG9ubHkgbGVnaXRpbWF0ZSBDaGFyYWN0ZXJzIGFyZSB1c2VkLg0KCQkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQkJcmV0dXJuICRwcm90ZWN0ZWQ7DQoJCQkvL2VjaG8gIisiOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIDsNCgkJCS8vZWNobyAiLSI7DQoJCQkvL2VjaG8gJHByb3RlY3RlZDsNCgkJCS8vZGllICggJ1RoaXMgd29yZCBub3Qgc3VwcG9ydCcgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJCX0gLy8gZW5kcyB0aGUgaWYgKCBlcmVnaSAoICJbYS16QS1aMC05XSsiLCAkdGhpcy0+cHJvdGVjdGVkICkgKSB7DQoJfSAvLyBlbmRzIHRoZSBmdW5jdGlvbiBQcm90ZWN0KCkgew0KDQoJLypQUk9URUNUIEVORCovDQp9DQoNCiRpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KJHRpbWUgPSBkYXRlKCJsIGRTIG9mIEYgWSBoOmk6cyBBIik7DQokc2NyaXB0ID0gJF9TRVJWRVJbUEFUSF9UUkFOU0xBVEVEXTsNCiRmcCA9IGZvcGVuICgiSW5qZWN0aW9uLnR4dCIsICJhKyIpOw0KJHNxbF9pbmplY3RfMSA9IGFycmF5KCI7IiwiJyIsIiUiLCciJyk7ICNXaG90aCBuZWVkIHJlcGxhY2UNCiRzcWxfaW5qZWN0XzIgPSBhcnJheSgiIiwgIiIsIiIsIiZxdW90OyIpOyAjVG8gd29udCByZXBsYWNlDQokR0VUX0tFWSA9IGFycmF5X2tleXMoJF9HRVQpOyAjYXJyYXkga2V5cyBmcm9tICRfR0VUDQokUE9TVF9LRVkgPSBhcnJheV9rZXlzKCRfUE9TVCk7ICNhcnJheSBrZXlzIGZyb20gJF9QT1NUDQokQ09PS0lFX0tFWSA9IGFycmF5X2tleXMoJF9DT09LSUUpOyAjYXJyYXkga2V5cyBmcm9tICRfQ09PS0lFDQovKmJlZ2luIGNsZWFyICRfR0VUICovDQpmb3IoJGk9MDskaTxjb3VudCgkR0VUX0tFWSk7JGkrKykNCnsNCiRyZWFsX2dldFskaV0gPSAkX0dFVFskR0VUX0tFWVskaV1dOw0KJF9HRVRbJEdFVF9LRVlbJGldXSA9IHN0cl9yZXBsYWNlKCRzcWxfaW5qZWN0XzEsICRzcWxfaW5qZWN0XzIsIEh0bWxTcGVjaWFsQ2hhcnMoJF9HRVRbJEdFVF9LRVlbJGldXSkpOw0KaWYoJHJlYWxfZ2V0WyRpXSAhPSAkX0dFVFskR0VUX0tFWVskaV1dKQ0Kew0KZndyaXRlICgkZnAsICJJUDogJGlwXHJcbiIpOw0KZndyaXRlICgkZnAsICJNZXRob2Q6IEdFVFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVmFsdWU6ICRyZWFsX2dldFskaV1cclxuIik7DQpmd3JpdGUgKCRmcCwgIlNjcmlwdDogJHNjcmlwdFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVGltZTogJHRpbWVcclxuIik7DQpmd3JpdGUgKCRmcCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuIik7DQp9DQp9DQovKmVuZCBjbGVhciAkX0dFVCAqLw0KLypiZWdpbiBjbGVhciAkX1BPU1QgKi8NCmZvcigkaT0wOyRpPGNvdW50KCRQT1NUX0tFWSk7JGkrKykNCnsNCiRyZWFsX3Bvc3RbJGldID0gJF9QT1NUWyRQT1NUX0tFWVskaV1dOw0KJF9QT1NUWyRQT1NUX0tFWVskaV1dID0gc3RyX3JlcGxhY2UoJHNxbF9pbmplY3RfMSwgJHNxbF9pbmplY3RfMiwgSHRtbFNwZWNpYWxDaGFycygkX1BPU1RbJFBPU1RfS0VZWyRpXV0pKTsNCmlmKCRyZWFsX3Bvc3RbJGldICE9ICRfUE9TVFskUE9TVF9LRVlbJGldXSkNCnsNCmZ3cml0ZSAoJGZwLCAiSVA6ICRpcFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiTWV0aG9kOiBQT1NUXHJcbiIpOw0KZndyaXRlICgkZnAsICJWYWx1ZTogJHJlYWxfcG9zdFskaV1cclxuIik7DQpmd3JpdGUgKCRmcCwgIlNjcmlwdDogJHNjcmlwdFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVGltZTogJHRpbWVcclxuIik7DQpmd3JpdGUgKCRmcCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuIik7DQp9DQp9DQovKmVuZCBjbGVhciAkX1BPU1QgKi8NCi8qYmVnaW4gY2xlYXIgJF9DT09LSUUgKi8NCmZvcigkaT0wOyRpPGNvdW50KCRDT09LSUVfS0VZKTskaSsrKQ0Kew0KJHJlYWxfY29va2llWyRpXSA9ICRfQ09PS0lFWyRDT09LSUVfS0VZWyRpXV07DQokX0NPT0tJRVskQ09PS0lFX0tFWVskaV1dID0gc3RyX3JlcGxhY2UoJHNxbF9pbmplY3RfMSwgJHNxbF9pbmplY3RfMiwgSHRtbFNwZWNpYWxDaGFycygkX0NPT0tJRVskQ09PS0lFX0tFWVskaV1dKSk7DQppZigkcmVhbF9jb29raWVbJGldICE9ICRfQ09PS0lFWyRDT09LSUVfS0VZWyRpXV0pDQp7DQpmd3JpdGUgKCRmcCwgIklQOiAkaXBcclxuIik7DQpmd3JpdGUgKCRmcCwgIk1ldGhvZDogQ09PS0lFXHJcbiIpOw0KZndyaXRlICgkZnAsICJWYWx1ZTogJHJlYWxfY29va2llWyRpXVxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiU2NyaXB0OiAkc2NyaXB0XHJcbiIpOw0KZndyaXRlICgkZnAsICJUaW1lOiAkdGltZVxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4iKTsNCn0NCn0NCg0KLyplbmQgY2xlYXIgJF9DT09LSUUgKi8NCmZjbG9zZSAoJGZwKTsNCiR4YSA9IGdldGVudignUkVNT1RFX0FERFInKTsNCiRiYWR3b3JkcyA9IGFycmF5KCI7IiwiJyIsIlwiIiwiKiIsInVuaW9uIiwiZGVsIiwiREVMIiwiaW5zZXJ0IiwidXBkYXRlIiwiZHJvcCIsInNlbGUiLCJtZW1iIiwic2V0IiwiJCIsInJlczN0Iiwid2FyZWgiLCIlIik7DQoNCmZvcmVhY2goJF9QT1NUIGFzICR2YWx1ZSkNCiAgZm9yZWFjaCgkYmFkd29yZHMgYXMgJHdvcmQpDQogICAgaWYoc3Vic3RyX2NvdW50KCR2YWx1ZSwgJHdvcmQpID4gMCkNCiAgICAgIGRpZSgiRXJyb3IgSVA6ICR4YSAiKTsNCg0KY2xhc3Mgc3FsX2luamVjdA0Kew0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdXJsIHRvIHJlZGlyZWN0IGlmIGFuIHNxbCBpbmplY3QgYXR0ZW1wdCBpcyBkZXRlY3QuIGlmIHVuc2V0LCB2YWx1ZSBpcyBGQUxTRQ0KCSAqIEBwcml2YXRlDQoJICogQHR5cGUgbWl4ZWQNCgkgKi8NCiAgICB2YXIgJHVybFJlZGlyZWN0Ow0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgZG9lcyB0aGUgc2Vzc2lvbiBtdXN0IGJlIGRlc3Ryb3kgaWYgYW4gYXR0ZW1wdCBpcyBkZXRlY3QNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIGJvb2wNCgkgKi8NCiAgICB2YXIgJGJkZXN0cm95X3Nlc3Npb247DQogICAgLyoqDQoJICogQHNob3J0ZGVzYyB0aGUgU1FMIGRhdGEgY3VycmVudGx5IHRlc3QNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIHN0cmluZw0KCSAqLw0KICAgIHZhciAkcnE7DQogICAgLyoqDQoJICogQHNob3J0ZGVzYyBpZiBub3QgRkFMU0UsIHRoZSB1cmwgdG8gdGhlIGxvZyBmaWxlDQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBtaXhlZA0KCSAqLw0KICAgIHZhciAkYkxvZzsNCg0KICAgIC8qKg0KCSAqIEJ1aWxkZXINCgkgKg0KCSAqIEBwYXJhbSBib29sIGJkZXN0cm95X3Nlc3Npb24gb3B0aW9uYWwuIGRvZXMgdGhlIHNlc3Npb24gbXVzdCBiZSBkZXN0cm95IGlmIGFuIGF0dGVtcHQgaXMgZGV0ZWN0Pw0KCSAqIEBwYXJhbSBzdHJpbmcgdXJsUmVkaXJlY3Qgb3B0aW9uYWwuIHVybCB0byByZWRpcmVjdCBpZiBhbiBzcWwgaW5qZWN0IGF0dGVtcHQgaXMgZGV0ZWN0DQogICAgICogQHB1YmxpYw0KCSAqIEB0eXBlIHZvaWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBzcWxfaW5qZWN0KCRtTG9nPUZBTFNFLCRiZGVzdHJveV9zZXNzaW9uPUZBTFNFLCR1cmxSZWRpcmVjdD1GQUxTRSkNCiAgICB7DQogICAgICAgICR0aGlzLT5iTG9nID0gKCgkbUxvZyE9RkFMU0UpPyRtTG9nOicnKTsNCiAgICAgICAgJHRoaXMtPnVybFJlZGlyZWN0ID0gKCgodHJpbSgkdXJsUmVkaXJlY3QpIT0nJykgJiYgZmlsZV9leGlzdHMoJHVybFJlZGlyZWN0KSk/JHVybFJlZGlyZWN0OicnKTsNCiAgICAgICAgJHRoaXMtPmJkZXN0cm95X3Nlc3Npb24gPSAkYmRlc3Ryb3lfc2Vzc2lvbjsNCiAgICAgICAgJHRoaXMtPnJxID0gJyc7DQogICAgfQ0KDQogICAgLyoqDQoJICogQHNob3J0ZGVzYyB0ZXN0IGlmIHRoZXJlIGlzIGEgc3FsIGluamVjdCBhdHRlbXB0IGRldGVjdA0KCSAqIHRlc3QgaWYgdGhlcmUgaXMgYSBzcWwgaW5qZWN0IGF0dGVtcHQgZGV0ZWN0DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nIHNSUSByZXF1aXJlZC4gU1FMIERhdGEgdG8gdGVzdA0KICAgICAqIEBwdWJsaWMNCgkgKiBAdHlwZSBib29sDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdCgkc1JRKQ0KICAgIHsNCiAgICAgICAgJHNSUSA9IHN0cnRvbG93ZXIoJHNSUSk7DQogICAgICAgICR0aGlzLT5ycSA9ICRzUlE7DQogICAgICAgICRhVmFsdWVzID0gYXJyYXkoKTsNCiAgICAgICAgJGFUZW1wID0gYXJyYXkoKTsgLy8gdGVtcCBhcnJheQ0KICAgICAgICAkYVdvcmRzID0gYXJyYXkoKTsgLy8NCiAgICAgICAgJGFTZXAgPSBhcnJheSgnIGFuZCAnLCcgb3IgJyk7IC8vIHNlcGFyYXRvcnMgZm9yIGRldGVjdCB0aGUNCiAgICAgICAgJHNDb25kaXRpb25zID0gJygnOw0KICAgICAgICAkbWF0Y2hlcyA9IGFycmF5KCk7DQogICAgICAgICRzU2VwID0gJyc7DQogICAgICAgIC8vIGlzIHRoZXJlIGFuIGF0dGVtcHQgdG8gdW51c2VkIHBhcnQgb2YgdGhlIHJxPw0KICAgICAgICBpZiAoaXNfaW50KChzdHJwb3MoJHNSUSwiIyIpKSkmJiR0aGlzLT5faW5fcG9zdCgnIycpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KDQogICAgICAgIC8vIGlzIHRoZXJlIGEgYXR0ZW1wdCB0byBkbyBhIDJuZCBTUUwgcmVxdWV0ZSA/DQogICAgICAgIGlmIChpc19pbnQoc3RycG9zKCRzUlEsJzsnKSkpew0KICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnOycsJHNSUSk7DQogICAgICAgICAgICBpZiAoJHRoaXMtPl9pbl9wb3N0KCRhVGVtcFsxXSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgIH0NCg0KICAgICAgICAkYVRlbXAgPSBleHBsb2RlKCIgd2hlcmUgIiwkc1JRKTsNCiAgICAgICAgaWYgKGNvdW50KCRhVGVtcCk9PTEpIHJldHVybiBGQUxTRTsNCiAgICAgICAgJHNDb25kaXRpb25zID0gJGFUZW1wWzFdOw0KICAgICAgICAkYVdvcmRzID0gZXhwbG9kZSgiICIsJHNDb25kaXRpb25zKTsNCiAgICAgICAgaWYoc3RyY2FzZWNtcCgkYVdvcmRzWzBdLCdzZWxlY3QnKSE9MCkgJGFTZXBbXSA9ICcsJzsNCiAgICAgICAgJHNTZXAgPSAnKCcuaW1wbG9kZSgnfCcsJGFTZXApLicpJzsNCiAgICAgICAgJGFWYWx1ZXMgPSBwcmVnX3NwbGl0KCRzU2VwLCRzQ29uZGl0aW9ucywtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoNCiAgICAgICAgLy8gdGVzdCB0aGUgYWx3YXlzIHRydWUgZXhwcmVzc2lvbnMNCiAgICAgICAgZm9yZWFjaCgkYVZhbHVlcyBhcyAkaSA9PiAkdikNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gU1FMIGluamVjdGlvbiBsaWtlIDE9MSBvciBhPWEgb3IgJ3phJz0nemEnDQogICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkdiwnPScpKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnPScsJHYpOw0KICAgICAgICAgICAgICAgICBpZiAodHJpbSgkYVRlbXBbMF0pPT10cmltKCRhVGVtcFsxXSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vU1FMIGluamVjdGlvbiBsaWtlIDE8PjINCiAgICAgICAgICAgIGlmIChpc19pbnQoc3RycG9zKCR2LCc8PicpKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkYVRlbXAgPSBleHBsb2RlKCc8PicsJHYpOw0KICAgICAgICAgICAgICAgIGlmICgodHJpbSgkYVRlbXBbMF0pIT10cmltKCRhVGVtcFsxXSkpJiYgKCR0aGlzLT5faW5fcG9zdCgnPD4nKSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoc3RycG9zKCRzQ29uZGl0aW9ucywnIG51bGwnKSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9udWxsICtpcyArbnVsbC8iLCRzQ29uZGl0aW9ucykpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgiL2lzICtub3QgK251bGwvIiwkc0NvbmRpdGlvbnMsJG1hdGNoZXMpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJGkgPT4gJHYpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPl9pbl9wb3N0KCR2KSlyZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwcmVnX21hdGNoKCIvW2EtejAtOV0rICtiZXR3ZWVuICtbYS16MC05XSsgK2FuZCArW2EtejAtOV0rLyIsJHNDb25kaXRpb25zLCRtYXRjaGVzKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJFRlbXAgPSBleHBsb2RlKCcgYmV0d2VlbiAnLCRtYXRjaGVzWzBdKTsNCiAgICAgICAgICAgICRFdmFsdWF0ZSA9ICRUZW1wWzBdOw0KICAgICAgICAgICAgJFRlbXAgPSBleHBsb2RlKCcgYW5kICcsJFRlbXBbMV0pOw0KICAgICAgICAgICAgaWYgKChzdHJjYXNlY21wKCRFdmFsdWF0ZSwkVGVtcFswXSk+MCkgJiYgKHN0cmNhc2VjbXAoJEV2YWx1YXRlLCRUZW1wWzFdKTwwKSAmJiAkdGhpcy0+X2luX3Bvc3QoJG1hdGNoZXNbMF0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBGQUxTRTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfaW5fcG9zdCgkdmFsdWUpDQogICAgew0KICAgICAgICBmb3JlYWNoKCRfUE9TVCBhcyAkaSA9PiAkdikNCiAgICAgICAgew0KICAgICAgICAgICAgIGlmIChpc19pbnQoc3RycG9zKHN0cnRvbG93ZXIoJHYpLCR2YWx1ZSkpKSByZXR1cm4gVFJVRTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGV0ZWN0KCkNCiAgICB7DQogICAgICAgIC8vIGxvZyB0aGUgYXR0ZW1wdCB0byBzcWwgaW5qZWN0Pw0KICAgICAgICBpZiAoJHRoaXMtPmJMb2cpDQogICAgICAgIHsNCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkdGhpcy0+YkxvZywnYSsnKTsNCiAgICAgICAgICAgIGlmICgkZnApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZnB1dHMoJGZwLCJcclxuIi5kYXRlKCJkLW0tWSBIOmk6cyIpLicgWycuJHRoaXMtPnJxLiddIGZyb20gJy4kdGhpcy0+c0lwID0gZ2V0ZW52KCJSRU1PVEVfQUREUiIpKTsNCiAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLyBkZXN0cm95IHNlc3Npb24/DQogICAgICAgIGlmICgkdGhpcy0+YmRlc3Ryb3lfc2Vzc2lvbikgc2Vzc2lvbl9kZXN0cm95KCk7DQogICAgICAgIC8vIHJlZGlyZWN0Pw0KICAgICAgICBpZiAoJHRoaXMtPnVybFJlZGlyZWN0IT0nJyl7DQogICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgIGhlYWRlcigibG9jYXRpb246ICR0aGlzLT51cmxSZWRpcmVjdCIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBUUlVFOw0KICAgIH0NCg0KDQpmdW5jdGlvbiBwcm90ZWN0MSgkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkkYmFubGlzdCA9IGFycmF5ICgiJyIsICJcIiIsICI8IiwgIlxcIiwgInwiLCAiLyIsICI9IiwgImluc2VydCIsICJzZWxlY3QiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJkaXN0aW5jdCIsICJoYXZpbmciLCAidHJ1bmNhdGUiLCAicmVwbGFjZSIsICJoYW5kbGVyIiwgImxpa2UiLCAicHJvY2VkdXJlIiwgImxpbWl0IiwgIm9yZGVyIGJ5IiwgImdyb3VwIGJ5IiwgImFzYyIsICJkZXNjIik7DQoJLy8kYmFubGlzdCBpcyB0aGUgbGlzdCBvZiB3b3JkcyB5b3UgZG9udCB3YW50IHRvIGFsbG93Lg0KCWlmICggZXJlZ2kgKCAiW2EtekEtWjAtOUBdKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJLy9lY2hvICIrIjsNCgl9IGVsc2Ugew0KCQkvL2VjaG8gIi0iOw0KCQllY2hvICRwcm90ZWN0ZWQ7DQoJCWRpZSAoICcg4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LiX4Li14LmI4LiI4Li44LiU4LmC4Lib4Lij4LiU4Lil4Lit4LiH4LmD4LiK4LmJ4Lij4Liy4Lii4LiB4Liy4Lij4Lit4Li34LmI4LiZLicgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCn0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KZnVuY3Rpb24gcHJvdGVjdDIoJHByb3RlY3RlZCkgeyAvLyBUaGlzIFdpbGwgYmUgdGhlIGZ1Y3Rpb24gd2UgY2FsbCB0byBwcm90ZWN0IHRoZSB2YXJpYWJsZXMuDQoJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIi8iLCAiPSIsICJpbnNlcnQiLCAic2VsZWN0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiZGlzdGluY3QiLCAiaGF2aW5nIiwgInRydW5jYXRlIiwgInJlcGxhY2UiLCAiaGFuZGxlciIsICJsaWtlIiwgInByb2NlZHVyZSIsICJsaW1pdCIsICJvcmRlciBieSIsICJncm91cCBieSIsICJhc2MiLCAiZGVzYyIpOw0KCS8vJGJhbmxpc3QgaXMgdGhlIGxpc3Qgb2Ygd29yZHMgeW91IGRvbnQgd2FudCB0byBhbGxvdy4NCglpZiAoIGVyZWdpICggIlswLTldKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJLy9lY2hvICIrIjsNCgl9IGVsc2Ugew0KCQkvL2VjaG8gIi0iOw0KCQllY2hvICRwcm90ZWN0ZWQ7DQoJCWRpZSAoICcgICDguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguJfguLXguYjguIjguLjguJTguYLguJvguKPguJTguKXguK3guIfguYPguIrguYnguKPguLLguKLguIHguLLguKPguK3guLfguYjguJkuICcgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCn0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KDQp9DQo/Pg=="));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 5eea5d56fe1b555a58b4b9104ddd9ec1 |
| Eval Count | 1 |
| Decode Time | 179 ms |