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("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio..
Decoded Output download
/************************************************
* *
* *
* *
* *
* *
* *
* --------------------------------------------- *
* This is commercial software, only users *
* who have purchased a valid license and *
* accept to the terms of the License *
* Agreement can install and use this program. *
* --------------------------------------------- *
* website: https://maurisweb.ru *
* email: [email protected] *
************************************************/
namespace Tygh\Addons\MauriswebAddonManager;
use Tygh\Tygh;
use Tygh\Registry;
use Tygh\Database\Connection;
use Tygh\Tools\Archiver;
class Files {
protected $db;
protected $archiver;
protected $manager;
protected $file_types;
protected $file_objects;
protected $class_name = 'maurisweb_addon_manager_file_manager';
public function __construct(
Connection $db,
Archiver $archiver
) {
$this->db = $db;
$this->archiver = $archiver;
$manager = Tygh::$app['addons.maurisweb_addon_manager.manager'];
$this->manager = $manager;
$this->file_types = fn_get_schema('maurisweb_addon_manager', 'file_types');
$this->file_objects = fn_get_schema('maurisweb_addon_manager', 'file_objects');
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}", $this);
}
public function getFileContent($file_id) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $file_id);
list($file_data) = $this->getData($file_id);
fn_set_hook("{$this->class_name}_{$function_name}", $file_id, $file_data);
if (!empty($file_data)) {
fn_get_file($file_data['path'], $file_data['filename']);
exit;
}
}
public function getFilesContent($params) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $params);
list($files) = $this->getList($params);
fn_set_hook("{$this->class_name}_{$function_name}", $params, $files);
$extract_path = fn_get_cache_path(false) . 'tmp/maurisweb_addon_manager/files/';
fn_rm($extract_path);
fn_rm($extract_path . 'zip/');
fn_mkdir($extract_path);
fn_mkdir($extract_path . 'zip/');
$file_list = array();
foreach ($files as $file) {
$_file = [
'addon' => $file['addon'],
'company_id' => $file['company_id'],
];
$_path = $this->getFilePath($_file);
$_file = [
'addon' => $file['addon'],
'company_id' => $file['company_id'],
'object_id' => $file['object_id'],
'object_type' => $this->file_objects[$file['object_type']]['name'],
'file_type' => $this->file_types[$file['file_type']]['name'],
];
$full_path = $this->getFilePath($_file);
$patch = str_replace($_path, '', $full_path);
fn_mkdir($extract_path . 'zip/' . $patch);
fn_copy($file['path'], $extract_path . 'zip/' . $patch . $file['filename']);
}
$file_list[] = $extract_path . 'zip/';
$filename = __('maurisweb_addon_manager.filename_zip');
fn_rm($extract_path . $filename . '.zip');
fn_set_hook("{$this->class_name}_{$function_name}_compress", $params, $file_list, $files, $extract_path, $filename);
$this->archiver->compress($extract_path . $filename . '.zip', $file_list);
fn_set_hook("{$this->class_name}_{$function_name}_get", $params, $file_list, $files, $extract_path, $filename);
fn_get_file($extract_path . $filename . '.zip', $filename . '.zip');
}
public function getData($file_id, $params = [], $lang_code = DESCR_SL) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $file_id, $params, $lang_code);
$file = [];
if (!empty($file_id)) {
$default_params = [
'file_id' => $file_id,
];
$params = array_merge($default_params, $params);
list($file, $search) = $this->getList($params, 1, $lang_code);
$file = isset($file[$file_id]) ? $file[$file_id] : [];
}
fn_set_hook("{$this->class_name}_{$function_name}_post", $file, $params, $lang_code);
return [$file, $search];
}
public function getList($params, $items_per_page = 0) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $params, $items_per_page);
$file_list = array();
$default_params = array(
'page' => 1,
'items_per_page' => $items_per_page
);
$params = array_merge($default_params, $params);
$condition = $limit = $join = '';
if (!empty($params['limit'])) {
$limit = $this->db->quote(' LIMIT 0, ?i', $params['limit']);
}
$sorting = '';
$condition = '';
if (!empty($params['item_ids'])) {
$file_ids = is_array($params['item_ids']) ? $params['item_ids'] : explode(',', $params['item_ids']);
}
if (!empty($params['file_id'])) {
$file_ids = is_array($params['file_id']) ? $params['file_id'] : explode(',', $params['file_id']);
}
if (!empty($file_ids)) {
$condition .= $this->db->quote(' AND a.file_id IN (?n)', $file_ids);
}
if (!empty($params['object_id'])) {
$object_ids = is_array($params['object_id']) ? $params['object_id'] : explode(',', $params['object_id']);
$condition .= $this->db->quote(' AND a.object_id IN (?a)', $object_ids);
}
if (!empty($params['object_type'])) {
$object_type = is_array($params['object_type']) ? $params['object_type'] : explode(',', $params['object_type']);
$condition .= $this->db->quote(' AND a.object_type IN (?a)', $object_type);
}
if (!empty($params['addon'])) {
$addon = is_array($params['addon']) ? $params['addon'] : explode(',', $params['addon']);
$condition .= $this->db->quote(' AND a.addon IN (?a)', $addon);
}
if (isset($params['company_id'])) {
$condition .= $this->db->quote(' AND a.company_id =?i', $params['company_id']);
}
if (!empty($params['file_type'])) {
$file_type = is_array($params['file_type'])
? $params['file_type'] : explode(',', $params['file_type']);
$condition .= $this->db->quote(' AND a.file_type IN (?a)', $file_type);
}
$fields = array(
'a.*',
);
fn_set_hook("{$this->class_name}_{$function_name}", $params, $condition, $fields, $join);
if (!empty($params['items_per_page'])) {
$params['total_items'] = $this->db->getField("SELECT COUNT(*) FROM ?:maurisweb_addon_manager_files as a $join WHERE 1 $condition");
$limit = db_paginate($params['page'], $params['items_per_page']);
}
$file_list = $this->db->getHash(
"SELECT ?p FROM ?:maurisweb_addon_manager_files as a " .
$join .
"WHERE 1 ?p ?p ?p",
'file_id',
implode(', ', $fields),
$condition,
$sorting,
$limit
);
fn_set_hook("{$this->class_name}_{$function_name}_post", $file_list, $params, $items_per_page);
return array($file_list, $params);
}
public function delete($file_id) {
$function_name = $this->manager->decamelize(__FUNCTION__);
if ($file_id) {
fn_set_hook("{$this->class_name}_{$function_name}_pre", $file_id);
$file_data = $this->getData($file_id);
if (isset($file_data['path']) && file_exists($file_data['path'])) {
fn_rm($file_data['path']);
}
$this->db->query('DELETE FROM ?:maurisweb_addon_manager_files WHERE file_id = ?i', $file_id);
fn_set_hook("{$this->class_name}_{$function_name}_post", $file_id);
}
}
public function getFileId($file_data) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $file_data);
$file_id = 0;
$join = $condition = '';
if (isset($file_data['object_type']) && isset($file_data['object_id']) && isset($file_data['file_type']) && isset($file_data['filename']) && isset($file_data['addon'])) {
$condition .= $this->db->quote(' object_id=?i AND object_type=?s AND file_type =?s AND filename = ?s AND addon = ?s ', $file_data['object_id'], $file_data['object_type'], $file_data['file_type'], $file_data['filename'], $file_data['addon']);
}
if (!empty($condition)) {
$file_id = $this->db->getField('SELECT file_id FROM ?:maurisweb_addon_manager_files WHERE ?p', $condition);
}
fn_set_hook("{$this->class_name}_{$function_name}_post", $file_id, $file_data);
return $file_id;
}
public function update($file_data, $file_id = 0, $delete = true, $save = true) {
$function_name = $this->manager->decamelize(__FUNCTION__);
fn_set_hook("{$this->class_name}_{$function_name}_pre", $file_id, $file_data);
if (!$file_id) {
$file_id = $this->getFileId($file_data);
}
if ($file_id) {
$this->db->query('UPDATE ?:maurisweb_addon_manager_files SET ?u WHERE file_id = ?i', $file_data, $file_id);
} else {
$file_data['timestamp'] = time();
$file_id = $file_data['file_id'] = $this->db->query("INSERT INTO ?:maurisweb_addon_manager_files ?e", $file_data);
}
if (isset($file_data['filename']) && isset($file_data['path']) && $save) {
$this->save($file_data, $delete);
$this->update($file_data, $file_id, false, false);
}
fn_set_hook("{$this->class_name}_{$function_name}_post", $file_id, $file_data);
return $file_id;
}
public static function getRelativePath($path_name = '', $path = '', $replace = '.') {
$dir = Registry::get('config.dir');
$path = $path ? $path : ($path_name ? $dir[$path_name] : '');
return str_replace($dir['root'], $replace, $path);
}
public function getFilePath($file_data) {
$function_name = $this->manager->decamelize(__FUNCTION__);
$path = [
'company_id' => $file_data['company_id'],
];
if (!empty($file_data['addon'])) {
$path['addon'] = $file_data['addon'];
}
if (!empty($file_data['object_type'])) {
$path['object_type'] = $file_data['object_type'];
}
if (!empty($file_data['object_id'])) {
$path['object_id'] = $file_data['object_id'];
}
if (!empty($file_data['file_type'])) {
$path['file_type'] = $file_data['file_type'];
}
fn_set_hook("{$this->class_name}_{$function_name}", $path, $file_data);
return $this->getRelativePath('files') . implode('/', $path) . '/';
}
public function save(&$file_data, $delete = true) {
$FilePath = $this->getFilePath($file_data);
fn_mkdir($FilePath);
$filename = $file_data["filename"];
$file_info = fn_pathinfo($filename);
$dest = $FilePath . $filename;
fn_rm($dest);
while (file_exists($dest)) {
$filename = fn_strtolower(fn_generate_code($file_info["filename"], 8));
$dest = $FilePath . $filename . '.' . $file_info['extension'];
}
fn_copy($file_data["path"], $dest);
if ($delete) {
$rm = fn_rm($file_data["path"], false);
}
$file_data['path'] = $dest;
}
}
Did this file decode correctly?
Original Code
<?php
eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiAg4pWU4pWX4pSA4pSA4pWU4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWXICAgKg0KICAgICogIOKVkeKVkeKUgOKUgOKVkeKVkeKVkeKVlOKVl+KVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVl+KVkeKVmuKVl+KVlOKVneKVkeKVlOKVkOKVneKVkeKVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVkOKVneKVkeKVlOKVl+KVkSAgICoNCiAgICAqICDilZHilZrilZfilZTilZ3ilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZrilZDilZ3ilZHilIDilZHilZHilIDilZHilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZrilZDilZDilZfilZHilZrilZ3ilZrilZcgICoNCiAgICAqICDilZHilZTilZfilZTilZfilZHilZHilZTilZfilZHilZHilZHilZHilZHilZHilZTilZfilZTilZ3ilIDilZHilZHilIDilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZHilZTilZDilZDilZ3ilZHilZTilZDilZfilZEgICoNCiAgICAqICDilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilIDilZTilZ3ilZrilZfilZTilZDilZ3ilZHilZHilZrilZ3ilZrilZ3ilZHilZHilZrilZDilZDilZfilZHilZrilZDilZ3ilZEgICoNCiAgICAqICDilZrilZ3ilIDilIDilZrilZ3ilZrilZ3ilZrilZ3ilZrilZDilZDilZ3ilZrilZ3ilZrilZ3ilIDilZrilZDilZDilZ3ilZrilZDilZDilZ3ilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZDilZDilZ3ilZrilZDilZDilZDilZ0gICoNCiAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqDQogICAgKiBUaGlzIGlzIGNvbW1lcmNpYWwgc29mdHdhcmUsIG9ubHkgdXNlcnMgICAgICAgKg0KICAgICogd2hvIGhhdmUgcHVyY2hhc2VkIGEgdmFsaWQgbGljZW5zZSBhbmQgICAgICAgICoNCiAgICAqIGFjY2VwdCB0byB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgICAgICAgICAgICAqDQogICAgKiBBZ3JlZW1lbnQgY2FuIGluc3RhbGwgYW5kIHVzZSB0aGlzIHByb2dyYW0uICAgKg0KICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoNCiAgICAqIHdlYnNpdGU6IGh0dHBzOi8vbWF1cmlzd2ViLnJ1ICAgICAgICAgICAgICAgICAqDQogICAgKiAgIGVtYWlsOiBpbmZvQG1hdXJpc3dlYi5ydSAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCm5hbWVzcGFjZSBUeWdoXEFkZG9uc1xNYXVyaXN3ZWJBZGRvbk1hbmFnZXI7Cgp1c2UgVHlnaFxUeWdoOwp1c2UgVHlnaFxSZWdpc3RyeTsKdXNlIFR5Z2hcRGF0YWJhc2VcQ29ubmVjdGlvbjsKdXNlIFR5Z2hcVG9vbHNcQXJjaGl2ZXI7CgpjbGFzcyBGaWxlcyB7CgogICAgcHJvdGVjdGVkICRkYjsKICAgIHByb3RlY3RlZCAkYXJjaGl2ZXI7CiAgICBwcm90ZWN0ZWQgJG1hbmFnZXI7CiAgICBwcm90ZWN0ZWQgJGZpbGVfdHlwZXM7CiAgICBwcm90ZWN0ZWQgJGZpbGVfb2JqZWN0czsKICAgIHByb3RlY3RlZCAkY2xhc3NfbmFtZSA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcl9maWxlX21hbmFnZXInOwoKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgQ29ubmVjdGlvbiAkZGIsCiAgICAgICAgQXJjaGl2ZXIgICRhcmNoaXZlcgogICAgKSB7CiAgICAgICAgJHRoaXMtPmRiID0gJGRiOwogICAgICAgICR0aGlzLT5hcmNoaXZlciA9ICRhcmNoaXZlcjsKICAgICAgICAKCQkkbWFuYWdlciA9IFR5Z2g6OiRhcHBbJ2FkZG9ucy5tYXVyaXN3ZWJfYWRkb25fbWFuYWdlci5tYW5hZ2VyJ107CiAgICAgICAgJHRoaXMtPm1hbmFnZXIgPSAkbWFuYWdlcjsKICAgICAgICAkdGhpcy0+ZmlsZV90eXBlcyA9IGZuX2dldF9zY2hlbWEoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJywgJ2ZpbGVfdHlwZXMnKTsKICAgICAgICAkdGhpcy0+ZmlsZV9vYmplY3RzID0gZm5fZ2V0X3NjaGVtYSgnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInLCAnZmlsZV9vYmplY3RzJyk7CiAgICAgICAgCiAgICAgICAgJGZ1bmN0aW9uX25hbWUgPSAgJHRoaXMtPm1hbmFnZXItPmRlY2FtZWxpemUoX19GVU5DVElPTl9fKTsKICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9IiwgJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudCgkZmlsZV9pZCkgewoKICAgICAgICAkZnVuY3Rpb25fbmFtZSA9ICR0aGlzLT5tYW5hZ2VyLT5kZWNhbWVsaXplKF9fRlVOQ1RJT05fXyk7CiAgICAgICAgZm5fc2V0X2hvb2soInskdGhpcy0+Y2xhc3NfbmFtZX1feyRmdW5jdGlvbl9uYW1lfV9wcmUiLCAkZmlsZV9pZCk7CgogICAgICAgIGxpc3QoJGZpbGVfZGF0YSkgPSAkdGhpcy0+Z2V0RGF0YSgkZmlsZV9pZCk7CgogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX0iLCAkZmlsZV9pZCwgJGZpbGVfZGF0YSk7CiAgICAgICAgaWYgKCFlbXB0eSgkZmlsZV9kYXRhKSkgewogICAgICAgICAgICBmbl9nZXRfZmlsZSgkZmlsZV9kYXRhWydwYXRoJ10sICRmaWxlX2RhdGFbJ2ZpbGVuYW1lJ10pOwoKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzQ29udGVudCgkcGFyYW1zKSB7CgogICAgICAgICRmdW5jdGlvbl9uYW1lID0gICR0aGlzLT5tYW5hZ2VyLT5kZWNhbWVsaXplKF9fRlVOQ1RJT05fXyk7CiAgICAgICAgZm5fc2V0X2hvb2soInskdGhpcy0+Y2xhc3NfbmFtZX1feyRmdW5jdGlvbl9uYW1lfV9wcmUiLCAkcGFyYW1zKTsKCiAgICAgICAgbGlzdCgkZmlsZXMpID0gJHRoaXMtPmdldExpc3QoJHBhcmFtcyk7CgogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX0iLCAkcGFyYW1zLCAkZmlsZXMpOwoKCiAgICAgICAgJGV4dHJhY3RfcGF0aCA9IGZuX2dldF9jYWNoZV9wYXRoKGZhbHNlKSAuICd0bXAvbWF1cmlzd2ViX2FkZG9uX21hbmFnZXIvZmlsZXMvJzsKICAgICAgICBmbl9ybSgkZXh0cmFjdF9wYXRoKTsKCiAgICAgICAgZm5fcm0oJGV4dHJhY3RfcGF0aCAuICd6aXAvJyk7CgogICAgICAgIGZuX21rZGlyKCRleHRyYWN0X3BhdGgpOwogICAgICAgIGZuX21rZGlyKCRleHRyYWN0X3BhdGggLiAnemlwLycpOwoKCiAgICAgICAgJGZpbGVfbGlzdCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICAkZmlsZSkgewoKICAgICAgICAgICAgJF9maWxlID0gWwogICAgICAgICAgICAgICAgJ2FkZG9uJyA9PiAkZmlsZVsnYWRkb24nXSwKICAgICAgICAgICAgICAgICdjb21wYW55X2lkJyA9PiAkZmlsZVsnY29tcGFueV9pZCddLAogICAgICAgICAgICBdOwogICAgICAgICAgICAkX3BhdGggPSAkdGhpcy0+Z2V0RmlsZVBhdGgoJF9maWxlKTsKCiAgICAgICAgICAgICRfZmlsZSA9IFsKICAgICAgICAgICAgICAgICdhZGRvbicgPT4gJGZpbGVbJ2FkZG9uJ10sCiAgICAgICAgICAgICAgICAnY29tcGFueV9pZCcgPT4gJGZpbGVbJ2NvbXBhbnlfaWQnXSwKICAgICAgICAgICAgICAgICdvYmplY3RfaWQnID0+ICRmaWxlWydvYmplY3RfaWQnXSwKICAgICAgICAgICAgICAgICdvYmplY3RfdHlwZScgPT4gJHRoaXMtPmZpbGVfb2JqZWN0c1skZmlsZVsnb2JqZWN0X3R5cGUnXV1bJ25hbWUnXSwKICAgICAgICAgICAgICAgICdmaWxlX3R5cGUnID0+ICR0aGlzLT5maWxlX3R5cGVzWyRmaWxlWydmaWxlX3R5cGUnXV1bJ25hbWUnXSwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICR0aGlzLT5nZXRGaWxlUGF0aCgkX2ZpbGUpOwogICAgICAgICAgICAkcGF0Y2ggPSBzdHJfcmVwbGFjZSgkX3BhdGgsICcnLCAkZnVsbF9wYXRoKTsKICAgICAgICAgICAgZm5fbWtkaXIoJGV4dHJhY3RfcGF0aCAuICd6aXAvJyAuICRwYXRjaCk7CiAgICAgICAgICAgIGZuX2NvcHkoJGZpbGVbJ3BhdGgnXSwgJGV4dHJhY3RfcGF0aCAuICd6aXAvJyAuICRwYXRjaCAuICRmaWxlWydmaWxlbmFtZSddKTsKICAgICAgICB9CiAgICAgICAgJGZpbGVfbGlzdFtdID0gJGV4dHJhY3RfcGF0aCAuICd6aXAvJzsKCiAgICAgICAgJGZpbGVuYW1lID0gX18oJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyLmZpbGVuYW1lX3ppcCcpOwogICAgICAgIGZuX3JtKCRleHRyYWN0X3BhdGggLiAkZmlsZW5hbWUgLiAnLnppcCcpOwoKICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X2NvbXByZXNzIiwgJHBhcmFtcywgJGZpbGVfbGlzdCwgJGZpbGVzLCAkZXh0cmFjdF9wYXRoLCAkZmlsZW5hbWUpOwoKICAgICAgICAkdGhpcy0+YXJjaGl2ZXItPmNvbXByZXNzKCRleHRyYWN0X3BhdGggLiAkZmlsZW5hbWUgLiAnLnppcCcsICRmaWxlX2xpc3QpOwoKICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X2dldCIsICRwYXJhbXMsICRmaWxlX2xpc3QsICRmaWxlcywgJGV4dHJhY3RfcGF0aCwgJGZpbGVuYW1lKTsKCiAgICAgICAgZm5fZ2V0X2ZpbGUoJGV4dHJhY3RfcGF0aCAuICRmaWxlbmFtZSAuICcuemlwJywgJGZpbGVuYW1lIC4gJy56aXAnKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0YSgkZmlsZV9pZCwgJHBhcmFtcyA9IFtdLCAkbGFuZ19jb2RlID0gREVTQ1JfU0wpIHsKICAgICAgICAkZnVuY3Rpb25fbmFtZSA9ICAkdGhpcy0+bWFuYWdlci0+ZGVjYW1lbGl6ZShfX0ZVTkNUSU9OX18pOwogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcHJlIiwgJGZpbGVfaWQsICRwYXJhbXMsICRsYW5nX2NvZGUpOwoKICAgICAgICAkZmlsZSAgPSBbXTsKICAgICAgICBpZiAoIWVtcHR5KCRmaWxlX2lkKSkgewoKICAgICAgICAgICAgJGRlZmF1bHRfcGFyYW1zID0gWwogICAgICAgICAgICAgICAgJ2ZpbGVfaWQnID0+ICRmaWxlX2lkLAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCRkZWZhdWx0X3BhcmFtcywgJHBhcmFtcyk7CgogICAgICAgICAgICBsaXN0KCRmaWxlLCAkc2VhcmNoKSA9ICR0aGlzLT5nZXRMaXN0KCRwYXJhbXMsIDEsICRsYW5nX2NvZGUpOwogICAgICAgICAgICAkZmlsZSA9IGlzc2V0KCRmaWxlWyRmaWxlX2lkXSkgPyAkZmlsZVskZmlsZV9pZF0gOiBbXTsKICAgICAgICB9CgogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcG9zdCIsICRmaWxlLCAkcGFyYW1zLCAkbGFuZ19jb2RlKTsKCiAgICAgICAgcmV0dXJuIFskZmlsZSwgJHNlYXJjaF07CiAgICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGlzdCgkcGFyYW1zLCAkaXRlbXNfcGVyX3BhZ2UgPSAwKSB7CgogICAgICAgICRmdW5jdGlvbl9uYW1lID0gICR0aGlzLT5tYW5hZ2VyLT5kZWNhbWVsaXplKF9fRlVOQ1RJT05fXyk7CiAgICAgICAgZm5fc2V0X2hvb2soInskdGhpcy0+Y2xhc3NfbmFtZX1feyRmdW5jdGlvbl9uYW1lfV9wcmUiLCAkcGFyYW1zLCAkaXRlbXNfcGVyX3BhZ2UpOwoKICAgICAgICAkZmlsZV9saXN0ID0gYXJyYXkoKTsKCiAgICAgICAgJGRlZmF1bHRfcGFyYW1zID0gYXJyYXkoCiAgICAgICAgICAgICdwYWdlJyA9PiAxLAogICAgICAgICAgICAnaXRlbXNfcGVyX3BhZ2UnID0+ICRpdGVtc19wZXJfcGFnZQogICAgICAgICk7CgogICAgICAgICRwYXJhbXMgPSBhcnJheV9tZXJnZSgkZGVmYXVsdF9wYXJhbXMsICRwYXJhbXMpOwoKCiAgICAgICAgJGNvbmRpdGlvbiA9ICRsaW1pdCA9ICRqb2luID0gJyc7CgogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snbGltaXQnXSkpIHsKICAgICAgICAgICAgJGxpbWl0ID0gJHRoaXMtPmRiLT5xdW90ZSgnIExJTUlUIDAsID9pJywgJHBhcmFtc1snbGltaXQnXSk7CiAgICAgICAgfQoKICAgICAgICAkc29ydGluZyA9ICcnOwoKICAgICAgICAkY29uZGl0aW9uID0gJyc7CiAgICAgICAgaWYgKCFlbXB0eSgkcGFyYW1zWydpdGVtX2lkcyddKSkgewogICAgICAgICAgICAkZmlsZV9pZHMgPSBpc19hcnJheSgkcGFyYW1zWydpdGVtX2lkcyddKSA/ICRwYXJhbXNbJ2l0ZW1faWRzJ10gOiBleHBsb2RlKCcsJywgJHBhcmFtc1snaXRlbV9pZHMnXSk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snZmlsZV9pZCddKSkgewogICAgICAgICAgICAkZmlsZV9pZHMgPSBpc19hcnJheSgkcGFyYW1zWydmaWxlX2lkJ10pID8gJHBhcmFtc1snZmlsZV9pZCddIDogZXhwbG9kZSgnLCcsICRwYXJhbXNbJ2ZpbGVfaWQnXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRmaWxlX2lkcykpIHsKICAgICAgICAgICAgJGNvbmRpdGlvbiAuPSAkdGhpcy0+ZGItPnF1b3RlKCcgQU5EIGEuZmlsZV9pZCBJTiAoP24pJywgJGZpbGVfaWRzKTsKICAgICAgICB9CgogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snb2JqZWN0X2lkJ10pKSB7CiAgICAgICAgICAgICRvYmplY3RfaWRzID0gaXNfYXJyYXkoJHBhcmFtc1snb2JqZWN0X2lkJ10pID8gJHBhcmFtc1snb2JqZWN0X2lkJ10gOiBleHBsb2RlKCcsJywgJHBhcmFtc1snb2JqZWN0X2lkJ10pOwoKICAgICAgICAgICAgJGNvbmRpdGlvbiAuPSAkdGhpcy0+ZGItPnF1b3RlKCcgQU5EIGEub2JqZWN0X2lkIElOICg/YSknLCAkb2JqZWN0X2lkcyk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snb2JqZWN0X3R5cGUnXSkpIHsKICAgICAgICAgICAgJG9iamVjdF90eXBlID0gaXNfYXJyYXkoJHBhcmFtc1snb2JqZWN0X3R5cGUnXSkgPyAkcGFyYW1zWydvYmplY3RfdHlwZSddIDogZXhwbG9kZSgnLCcsICRwYXJhbXNbJ29iamVjdF90eXBlJ10pOwoKICAgICAgICAgICAgJGNvbmRpdGlvbiAuPSAkdGhpcy0+ZGItPnF1b3RlKCcgQU5EIGEub2JqZWN0X3R5cGUgSU4gKD9hKScsICRvYmplY3RfdHlwZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRwYXJhbXNbJ2FkZG9uJ10pKSB7CiAgICAgICAgICAgICRhZGRvbiA9IGlzX2FycmF5KCRwYXJhbXNbJ2FkZG9uJ10pID8gJHBhcmFtc1snYWRkb24nXSA6IGV4cGxvZGUoJywnLCAkcGFyYW1zWydhZGRvbiddKTsKCiAgICAgICAgICAgICRjb25kaXRpb24gLj0gJHRoaXMtPmRiLT5xdW90ZSgnIEFORCBhLmFkZG9uIElOICg/YSknLCAkYWRkb24pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJ2NvbXBhbnlfaWQnXSkpIHsKCiAgICAgICAgICAgICRjb25kaXRpb24gLj0gJHRoaXMtPmRiLT5xdW90ZSgnIEFORCBhLmNvbXBhbnlfaWQgPT9pJywgJHBhcmFtc1snY29tcGFueV9pZCddKTsKICAgICAgICB9CgogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snZmlsZV90eXBlJ10pKSB7CiAgICAgICAgICAgICRmaWxlX3R5cGUgPSBpc19hcnJheSgkcGFyYW1zWydmaWxlX3R5cGUnXSkgCiAgICAgICAgICAgICAgICA/ICRwYXJhbXNbJ2ZpbGVfdHlwZSddIDogZXhwbG9kZSgnLCcsICRwYXJhbXNbJ2ZpbGVfdHlwZSddKTsKICAgICAgICAgICAgJGNvbmRpdGlvbiAuPSAkdGhpcy0+ZGItPnF1b3RlKCcgQU5EIGEuZmlsZV90eXBlIElOICg/YSknLCAkZmlsZV90eXBlKTsKICAgICAgICB9CgogICAgICAgICRmaWVsZHMgPSBhcnJheSgKICAgICAgICAgICAgJ2EuKicsCgogICAgICAgICk7CgogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX0iLCAkcGFyYW1zLCAkY29uZGl0aW9uLCAkZmllbGRzLCAkam9pbik7CgogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snaXRlbXNfcGVyX3BhZ2UnXSkpIHsKICAgICAgICAgICAgJHBhcmFtc1sndG90YWxfaXRlbXMnXSA9ICR0aGlzLT5kYi0+Z2V0RmllbGQoIlNFTEVDVCBDT1VOVCgqKSBGUk9NID86bWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZmlsZXMgYXMgYSAkam9pbiBXSEVSRSAxICRjb25kaXRpb24iKTsKICAgICAgICAgICAgJGxpbWl0ID0gZGJfcGFnaW5hdGUoJHBhcmFtc1sncGFnZSddLCAkcGFyYW1zWydpdGVtc19wZXJfcGFnZSddKTsKICAgICAgICB9CgogICAgICAgICRmaWxlX2xpc3QgPSAgJHRoaXMtPmRiLT5nZXRIYXNoKAogICAgICAgICAgICAiU0VMRUNUID9wIEZST00gPzptYXVyaXN3ZWJfYWRkb25fbWFuYWdlcl9maWxlcyBhcyBhICIgLgogICAgICAgICAgICAgICAgJGpvaW4gLgogICAgICAgICAgICAgICAgIldIRVJFIDEgP3AgP3AgP3AiLAogICAgICAgICAgICAnZmlsZV9pZCcsCiAgICAgICAgICAgIGltcGxvZGUoJywgJywgJGZpZWxkcyksCiAgICAgICAgICAgICRjb25kaXRpb24sCiAgICAgICAgICAgICRzb3J0aW5nLAogICAgICAgICAgICAkbGltaXQKICAgICAgICApOwoKICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X3Bvc3QiLCAkZmlsZV9saXN0LCAkcGFyYW1zLCAkaXRlbXNfcGVyX3BhZ2UpOwoKICAgICAgICByZXR1cm4gYXJyYXkoJGZpbGVfbGlzdCwgJHBhcmFtcyk7CiAgICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gZGVsZXRlKCRmaWxlX2lkKSB7CiAgICAgICAgJGZ1bmN0aW9uX25hbWUgPSAgJHRoaXMtPm1hbmFnZXItPmRlY2FtZWxpemUoX19GVU5DVElPTl9fKTsKICAgICAgICBpZiAoJGZpbGVfaWQpIHsKCgogICAgICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X3ByZSIsICRmaWxlX2lkKTsKCiAgICAgICAgICAgICRmaWxlX2RhdGEgPSAkdGhpcy0+Z2V0RGF0YSgkZmlsZV9pZCk7CgoKCiAgICAgICAgICAgIGlmIChpc3NldCgkZmlsZV9kYXRhWydwYXRoJ10pICYmIGZpbGVfZXhpc3RzKCRmaWxlX2RhdGFbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgIGZuX3JtKCRmaWxlX2RhdGFbJ3BhdGgnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5kYi0+cXVlcnkoJ0RFTEVURSBGUk9NID86bWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZmlsZXMgV0hFUkUgZmlsZV9pZCA9ID9pJywgJGZpbGVfaWQpOwoKICAgICAgICAgICAgZm5fc2V0X2hvb2soInskdGhpcy0+Y2xhc3NfbmFtZX1feyRmdW5jdGlvbl9uYW1lfV9wb3N0IiwgJGZpbGVfaWQpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUlkKCRmaWxlX2RhdGEpIHsKICAgICAgICAkZnVuY3Rpb25fbmFtZSA9ICAkdGhpcy0+bWFuYWdlci0+ZGVjYW1lbGl6ZShfX0ZVTkNUSU9OX18pOwogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcHJlIiwgJGZpbGVfZGF0YSk7CiAgICAgICAgJGZpbGVfaWQgID0gMDsKCiAgICAgICAgJGpvaW4gPSAgJGNvbmRpdGlvbiA9ICcnOwoKICAgICAgICBpZiAoaXNzZXQoJGZpbGVfZGF0YVsnb2JqZWN0X3R5cGUnXSkgICYmIGlzc2V0KCRmaWxlX2RhdGFbJ29iamVjdF9pZCddKSAgJiYgaXNzZXQoJGZpbGVfZGF0YVsnZmlsZV90eXBlJ10pICAmJiBpc3NldCgkZmlsZV9kYXRhWydmaWxlbmFtZSddKSAmJiBpc3NldCgkZmlsZV9kYXRhWydhZGRvbiddKSkgewogICAgICAgICAgICAkY29uZGl0aW9uIC49ICR0aGlzLT5kYi0+cXVvdGUoJyBvYmplY3RfaWQ9P2kgQU5EIG9iamVjdF90eXBlPT9zIEFORCBmaWxlX3R5cGUgPT9zIEFORCBmaWxlbmFtZSA9ID9zIEFORCBhZGRvbiA9ID9zICcsICRmaWxlX2RhdGFbJ29iamVjdF9pZCddLCAkZmlsZV9kYXRhWydvYmplY3RfdHlwZSddLCAkZmlsZV9kYXRhWydmaWxlX3R5cGUnXSwgJGZpbGVfZGF0YVsnZmlsZW5hbWUnXSwgJGZpbGVfZGF0YVsnYWRkb24nXSk7CiAgICAgICAgfQoKCiAgICAgICAgaWYgKCFlbXB0eSgkY29uZGl0aW9uKSkgewogICAgICAgICAgICAkZmlsZV9pZCA9ICAkdGhpcy0+ZGItPmdldEZpZWxkKCdTRUxFQ1QgZmlsZV9pZCBGUk9NID86bWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZmlsZXMgV0hFUkUgP3AnLCAkY29uZGl0aW9uKTsKICAgICAgICB9CgogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcG9zdCIsICRmaWxlX2lkLCAkZmlsZV9kYXRhKTsKCiAgICAgICAgcmV0dXJuICRmaWxlX2lkOwogICAgfQogICAgcHVibGljIGZ1bmN0aW9uIHVwZGF0ZSgkZmlsZV9kYXRhLCAkZmlsZV9pZCA9IDAsICRkZWxldGUgPSB0cnVlLCAkc2F2ZSA9IHRydWUpIHsKICAgICAgICAkZnVuY3Rpb25fbmFtZSA9ICAkdGhpcy0+bWFuYWdlci0+ZGVjYW1lbGl6ZShfX0ZVTkNUSU9OX18pOwogICAgICAgIGZuX3NldF9ob29rKCJ7JHRoaXMtPmNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcHJlIiwgJGZpbGVfaWQsICRmaWxlX2RhdGEpOwoKICAgICAgICBpZiAoISRmaWxlX2lkKSB7CiAgICAgICAgICAgICRmaWxlX2lkID0gJHRoaXMtPmdldEZpbGVJZCgkZmlsZV9kYXRhKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlsZV9pZCkgewogICAgICAgICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCdVUERBVEUgPzptYXVyaXN3ZWJfYWRkb25fbWFuYWdlcl9maWxlcyBTRVQgP3UgV0hFUkUgZmlsZV9pZCA9ID9pJywgJGZpbGVfZGF0YSwgJGZpbGVfaWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaWxlX2RhdGFbJ3RpbWVzdGFtcCddID0gdGltZSgpOwogICAgICAgICAgICAkZmlsZV9pZCA9ICRmaWxlX2RhdGFbJ2ZpbGVfaWQnXSA9ICR0aGlzLT5kYi0+cXVlcnkoIklOU0VSVCBJTlRPID86bWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZmlsZXMgP2UiLCAkZmlsZV9kYXRhKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkZmlsZV9kYXRhWydmaWxlbmFtZSddKSAmJiBpc3NldCgkZmlsZV9kYXRhWydwYXRoJ10pICYmICRzYXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zYXZlKCRmaWxlX2RhdGEsICRkZWxldGUpOwogICAgICAgICAgICAkdGhpcy0+dXBkYXRlKCRmaWxlX2RhdGEsICRmaWxlX2lkLCBmYWxzZSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X3Bvc3QiLCAkZmlsZV9pZCwgJGZpbGVfZGF0YSk7CiAgICAgICAgcmV0dXJuICRmaWxlX2lkOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKCRwYXRoX25hbWUgPSAnJywgJHBhdGggPSAnJywgJHJlcGxhY2UgPSAnLicpIHsKICAgICAgICAkZGlyID0gUmVnaXN0cnk6OmdldCgnY29uZmlnLmRpcicpOwogICAgICAgICRwYXRoID0gJHBhdGggPyAkcGF0aCA6ICgkcGF0aF9uYW1lID8gJGRpclskcGF0aF9uYW1lXSA6ICcnKTsKCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCRkaXJbJ3Jvb3QnXSwgJHJlcGxhY2UsICRwYXRoKTsKICAgIH0KCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGdldEZpbGVQYXRoKCRmaWxlX2RhdGEpIHsKICAgICAgICAkZnVuY3Rpb25fbmFtZSA9ICAkdGhpcy0+bWFuYWdlci0+ZGVjYW1lbGl6ZShfX0ZVTkNUSU9OX18pOwoKICAgICAgICAkcGF0aCA9IFsKICAgICAgICAgICAgJ2NvbXBhbnlfaWQnID0+ICRmaWxlX2RhdGFbJ2NvbXBhbnlfaWQnXSwKICAgICAgICBdOwoKICAgICAgICBpZiAoIWVtcHR5KCRmaWxlX2RhdGFbJ2FkZG9uJ10pKSB7CiAgICAgICAgICAgICRwYXRoWydhZGRvbiddID0gJGZpbGVfZGF0YVsnYWRkb24nXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkZmlsZV9kYXRhWydvYmplY3RfdHlwZSddKSkgewogICAgICAgICAgICAkcGF0aFsnb2JqZWN0X3R5cGUnXSA9ICRmaWxlX2RhdGFbJ29iamVjdF90eXBlJ107CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJGZpbGVfZGF0YVsnb2JqZWN0X2lkJ10pKSB7CiAgICAgICAgICAgICRwYXRoWydvYmplY3RfaWQnXSA9ICRmaWxlX2RhdGFbJ29iamVjdF9pZCddOwogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRmaWxlX2RhdGFbJ2ZpbGVfdHlwZSddKSkgewogICAgICAgICAgICAkcGF0aFsnZmlsZV90eXBlJ10gPSAkZmlsZV9kYXRhWydmaWxlX3R5cGUnXTsKICAgICAgICB9CgoKICAgICAgICBmbl9zZXRfaG9vaygieyR0aGlzLT5jbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9IiwgJHBhdGgsICRmaWxlX2RhdGEpOwoKCiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRSZWxhdGl2ZVBhdGgoJ2ZpbGVzJykgLiBpbXBsb2RlKCcvJywgJHBhdGgpIC4gJy8nOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlKCYkZmlsZV9kYXRhLCAkZGVsZXRlID0gdHJ1ZSkgewogICAgICAgICRGaWxlUGF0aCA9ICR0aGlzLT5nZXRGaWxlUGF0aCgkZmlsZV9kYXRhKTsKICAgICAgICBmbl9ta2RpcigkRmlsZVBhdGgpOwogICAgICAgICRmaWxlbmFtZSA9ICRmaWxlX2RhdGFbImZpbGVuYW1lIl07CiAgICAgICAgJGZpbGVfaW5mbyA9IGZuX3BhdGhpbmZvKCRmaWxlbmFtZSk7CgogICAgICAgICRkZXN0ID0gJEZpbGVQYXRoIC4gJGZpbGVuYW1lOwoKICAgICAgICBmbl9ybSgkZGVzdCk7CgogICAgICAgIHdoaWxlIChmaWxlX2V4aXN0cygkZGVzdCkpIHsKICAgICAgICAgICAgJGZpbGVuYW1lID0gZm5fc3RydG9sb3dlcihmbl9nZW5lcmF0ZV9jb2RlKCRmaWxlX2luZm9bImZpbGVuYW1lIl0sIDgpKTsKICAgICAgICAgICAgJGRlc3QgPSAkRmlsZVBhdGggLiAkZmlsZW5hbWUgLiAnLicgLiAkZmlsZV9pbmZvWydleHRlbnNpb24nXTsKICAgICAgICB9CgoKICAgICAgICBmbl9jb3B5KCRmaWxlX2RhdGFbInBhdGgiXSwgJGRlc3QpOwogICAgICAgIGlmICgkZGVsZXRlKSB7CiAgICAgICAgICAgICRybSA9IGZuX3JtKCRmaWxlX2RhdGFbInBhdGgiXSwgZmFsc2UpOwogICAgICAgIH0KCgogICAgICAgICRmaWxlX2RhdGFbJ3BhdGgnXSA9ICRkZXN0OwogICAgfQp9Cg=="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 638efc4ee5d5ec12c271e27afc95cecb |
Eval Count | 1 |
Decode Time | 72 ms |