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("ZXZhbChzdHJfcm90MTMoZ3p1bmNvbXByZXNzKGd6aW5mbGF0ZShzdHJyZXYoYmFz..
Decoded Output download
b'
if (!defined(\'_PS_VERSION_\')) {
exit;
}
require_once dirname(__FILE__) . \'/config.php\';
require_once _MONSTER_BALIKOBOT_CLASSES_DIR_ . \'API.php\';
require_once _MONSTER_BALIKOBOT_CLASSES_DIR_ . \'Carrier.php\';
require_once _MONSTER_BALIKOBOT_CLASSES_DIR_ . \'Order.php\';
require_once _MONSTER_BALIKOBOT_CLASSES_DIR_ . \'Package.php\';
if (!class_exists(\'MonsterModuleLicenseValidator\')) {
class MonsterModuleLicenseValidator
{
private $module;
private $licenseKey;
private $licenseChecked = false;
private $licenseValidity = false;
private $baseUrl = \'licence.monstermedia.cz\';
private $shopUrl;
protected static $validations = [];
public function __construct($shopUrl, $module, $licenseKey)
{
$this->module = $module;
$this->licenseKey = $licenseKey;
$this->shopUrl = $shopUrl;
}
public function isLicenseValid()
{
if (!$this->licenseChecked) {
$this->licenseValidity = $this->checkLicense();
$this->licenseChecked = true;
}
return $this->licenseValidity;
}
private function checkLicense()
{
try {
$data = $this->request(\'GET\', \'/license/\' . $this->module . \'/\' . $this->licenseKey);
// this should be true...
if(is_object($data) && $data->key == $this->licenseKey){
return true;
}else{
//check monster_developer module
if (Module::isInstalled(\'monster_developer\')){
$developerKey = Configuration::get(strtoupper(\'monster_developer\') . \'_LICENSE_KEY\');
$data = $this->request(\'GET\', \'/license/monster_developer/\' . $developerKey);
if(is_object($data) && $data->key == $developerKey) {
return true;
}
}
}
return false;
} catch (Exception $e) {
if ($e->getCode() >= 500) {
// our fault...
return true;
}
return false;
}
}
/**
* @param $method
* @param $endpoint
* @param array $data
*
* @return mixed
* @throws Exception
*/
private function request($method, $endpoint, $data = [])
{
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_URL, $this->baseUrl . $endpoint);
curl_setopt($c, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($c, CURLOPT_HTTPHEADER, [\'X-Host-Validation: \' . $this->shopUrl]);
if (!empty($data)) {
curl_setopt($c, CURLOPT_POSTFIELDS, $data);
}
$body = curl_exec($c);
$httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
curl_close($c);
/*if ($httpcode != 200 && $httpcode != 201) {
throw new Exception($body, $httpcode);
}*/
return json_decode($body);
}
/**
* Validate license for given module
*
* @param $module
* @param $licenseKey
*
* @return boolean
*/
public static function isValid($module, $licenseKey)
{
if (!isset(self::$validations[$module . \'-\' . $licenseKey])) {
$shopUrl = Context::getContext()->shop->domain;
$validator = new self($shopUrl, $module, $licenseKey);
self::$validations[$module . \'-\' . $licenseKey] = $validator->isLicenseValid();
}
return self::$validations[$module . \'-\' . $licenseKey];
}
}
}
$ownModule = mb_strpos($_SERVER[\'REQUEST_URI\'], \'monster_balikobot\') !== false;
$admin = mb_strpos(strtolower(get_class(Context::getContext()->controller)), \'admin\') !== false;
if (!$admin && $ownModule && !MonsterModuleLicenseValidator::isValid(\'monster_balikobot\', Configuration::get(strtoupper(\'monster_balikobot\').\'_LICENSE_KEY\'))) {
http_response_code(403);
echo "Neplatna licence";
die();
}
if(Module::isInstalled(\'monster_developer\') && !class_exists(\'MonsterModuleLicenseValidator\')){
$moduleName = \'monster_balikobot\';
require_once _PS_MODULE_DIR_ . \'monster_developer/validation.php\';
}
abstract class monster_balikobot_core extends Module
{
private $licenseKey;
public function __construct()
{
$this->name = \'monster_balikobot\';
$this->tab = \'shipping_logistics\';
$this->author = \'MONSTER MEDIA, s.r.o.\';
$this->need_instance = 0;
$this->licenseKey = Configuration::get(\'MONSTER_BALIKOBOT_LICENSE_KEY\');
$this->ps_versions_compliancy = array(\'min\' => \'1.5\', \'max\' => \'1.7.999\');
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l(\'Balkobot\');
$this->description = $this->l(\'Napojen e-shopu na Balkobot.\');
$this->confirmUninstall = $this->l(\'Opravdu chcete odinstalovat modul Balkobot?\');
}
public function install()
{
//remove old override if nothing else gets overriden
if (file_exists(_PS_OVERRIDE_DIR_ . "controllers/admin/AdminOrdersController.php")) {
$md5 = md5_file(_PS_OVERRIDE_DIR_ . "controllers/admin/AdminOrdersController.php");
if ($md5 == \'bc9338c7fe7f52863066e54211c42af0\' || $md5 == \'6623325bc37253275a1a139118981519\') {
unlink(_PS_OVERRIDE_DIR_ . "controllers/admin/AdminOrdersController.php");
}
}
$hash = Tools::passwdGen(32);
Configuration::updateValue(\'MONSTER_BALIKOBOT_SECURITY_HASH\', $hash);
Configuration::updateValue(\'MONSTER_BALIKOBOT_INSTALL_DATE\', date("Y-m-d H:i:s"));
return parent::install() && $this->setValues() && $this->setTab() && $this->setDatabase() && $this->setHooks(
) && unlink(_PS_CACHE_DIR_ . \'/class_index.php\');
}
public function uninstall()
{
Configuration::deleteByName(\'MONSTER_BALIKOBOT_SECURITY_HASH\');
return parent::uninstall() && $this->unsetValues() && $this->unsetTab() && $this->unsetDatabase();
}
//hodnoty v configu
public function setValues()
{
return true;
}
public function unsetValues()
{
return Configuration::deleteByName(\'MONSTER_BALIKOBOT_API_USER\') && Configuration::deleteByName(
\'MONSTER_BALIKOBOT_API_KEY\'
) && Configuration::deleteByName(\'MONSTER_BALIKOBOT_COD_MODULE\') && Configuration::deleteByName(
\'MONSTER_BALIKOBOT_COD_MODULE_2\'
) && Configuration::deleteByName(\'MONSTER_BALIKOBOT_ID_ORDER_PARAM\');
}
//taby v adminu
public function setTab()
{
return true;
}
public function unsetTab()
{
return true;
}
//tabulky v DB
public function setDatabase()
{
$sql = \'
CREATE TABLE IF NOT EXISTS `\' . _DB_PREFIX_ . \'monster_balikobot_carriers` (
`id_carrier` int(11) NOT NULL,
`code` varchar(50) NOT NULL,
`service` varchar(50) NOT NULL,
`name` varchar(255) NOT NULL,
`service_name` varchar(255) NOT NULL,
PRIMARY KEY (`id_carrier`)
) DEFAULT CHARSET=utf8\';
if (!Db::getInstance()
->execute($sql)) {
return false;
}
$sql = \'
CREATE TABLE IF NOT EXISTS `\' . _DB_PREFIX_ . \'monster_balikobot_packages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_order` int(11) UNSIGNED NOT NULL,
`package_id` varchar(50) NOT NULL,
`carrier_id` varchar(50) NOT NULL,
`carrier` int(11) NOT NULL,
`carrier_package_type` varchar(50) NULL,
`label_text` varchar(255) NOT NULL DEFAULT \'\',
`supplier` int(11) NOT NULL DEFAULT 0,
`label_url` varchar(255) NOT NULL,
`sent` tinyint(1) NOT NULL DEFAULT 0,
`delivered` tinyint(1) NOT NULL DEFAULT -1,
`order_number` int(11) NOT NULL DEFAULT 1,
`order_count` int(11) NOT NULL DEFAULT 1,
`price_type` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT 1,
`custom_price` DECIMAL( 20, 6 ) NULL DEFAULT 0,
`id_employee` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8\';
if (!Db::getInstance()
->execute($sql)) {
return false;
}
$sql = \'
CREATE TABLE IF NOT EXISTS `\' . _DB_PREFIX_ . \'monster_balikobot_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`supplier_id` int(11) UNSIGNED NULL,
`carrier_code` varchar(50) NOT NULL,
`order_id` varchar(50) NOT NULL,
`file_url` varchar(255) NOT NULL,
`handover_url` varchar(255) NOT NULL,
`labels_url` varchar(255) NOT NULL,
`date` datetime NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8\';
if (!Db::getInstance()
->execute($sql)) {
return false;
}
$sql = \'
CREATE TABLE IF NOT EXISTS `\' . _DB_PREFIX_ . \'monster_balikobot_checks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_order` int(11) NOT NULL,
`checked` int(1) NOT NULL DEFAULT 0,
`error` varchar(255) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8\';
if (!Db::getInstance()
->execute($sql)) {
return false;
}
// in case of update from previous versions
try {
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_packages` ADD `delivered` TINYINT(1) NOT NULL DEFAULT -1 AFTER `sent`\'
);
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_packages` ADD `price_type` TINYINT(1) NOT NULL DEFAULT 1 AFTER `order_count`\'
);
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_packages` ADD `custom_price` DECIMAL( 20, 6 ) NULL DEFAULT 0 AFTER `price_type`\'
);
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_packages` ADD `id_employee` INT(11) NULL DEFAULT NULL AFTER `custom_price`\'
);
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_orders` CHANGE `order_id` `order_id` VARCHAR(50) NOT NULL;\'
);
Db::getInstance()->execute(
\'ALTER TABLE `\' . _DB_PREFIX_ . \'monster_balikobot_orders` CHANGE `supplier_id` `supplier_id` INT(11) UNSIGNED NULL DEFAULT NULL;\'
);
} catch (Exception $e) {
}
return true;
}
public function unsetDatabase()
{
return true;
}
//hooky
public function setHooks()
{
if (_PS_VERSION_ >= "1.7.7.0"){
return $this->registerHook(\'backOfficeHeader\') &&
$this->registerHook(\'displayAdminOrderTop\') &&
$this->registerHook(\'displayAdminOrderMain\') &&
$this->registerHook(\'displayAdminAfterHeader\');
} else {
return $this->registerHook(\'backOfficeHeader\') &&
$this->registerHook(\'displayAdminListBefore\') &&
$this->registerHook(\'displayAdminOrderContentShip\');
}
}
public function getContent()
{
$output = null;
if (Tools::isSubmit(\'submitBalikobotKeys\')) {
Configuration::updateValue(\'MONSTER_BALIKOBOT_LICENSE_KEY\', Tools::getValue(\'license_key\'));
Configuration::updateValue(\'MONSTER_BALIKOBOT_API_USER\', strval(Tools::getValue(\'API_USER\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_API_KEY\', strval(Tools::getValue(\'API_KEY\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_DEBUG\', strval(Tools::getValue(\'DEBUG\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_COD_MODULE\', strval(Tools::getValue(\'cod_module\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_COD_MODULE_2\', strval(Tools::getValue(\'cod_module_2\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_NEW_STATE_1\', strval(Tools::getValue(\'new_state_1\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_NEW_STATE_2\', strval(Tools::getValue(\'new_state_2\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_NEW_STATE_3\', strval(Tools::getValue(\'new_state_3\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_NEW_STATE_4\', strval(Tools::getValue(\'new_state_4\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_ID_ORDER_PARAM\', strval(Tools::getValue(\'id_order_param\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_SUPPLIERS\', strval(Tools::getValue(\'suppliers\')));
Configuration::updateValue(\'MONSTER_BALIKOBOT_TRACKING_MAIL\', strval(Tools::getValue(\'tracking_mail\')));
Configuration::updateValue(
\'MONSTER_BALIKOBOT_EMPLOYEE_PACKAGES\',
strval(Tools::getValue(\'employee_packages\'))
);
$output .= $this->displayConfirmation($this->l(\'Nastaven bylo spn uloeno.\'));
} else {
if (Tools::isSubmit(\'submitBalikobotCarriers\')) {
$default_lang = (int)Configuration::get(\'PS_LANG_DEFAULT\');
$carriers = Carrier::getCarriers($default_lang, false, false, false, null, Carrier::ALL_CARRIERS);
//var_dump(Tools::getAllValues());
foreach ($carriers as $carrier) {
$id_carrier = $carrier[\'id_carrier\'];
$value = strval(Tools::getValue(\'CARRIER_\' . $id_carrier));
$bbCarrier = new BalikobotCarrier($id_carrier);
$bbCarrier->setCodeWithService($value);
$bbCarrier->save();
}
$output .= $this->displayConfirmation($this->l(\'Piazen dopravc bylo spn uloeno.\'));
}
if (Tools::isSubmit(\'submitBalikobotCarriersCustoms\')) {
Configuration::updateValue(
\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_TOPTRANS\',
Tools::getValue(\'CARRIER_CUSTOM_TOPTRANS\')
);
Configuration::updateValue(
\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_PPL\',
Tools::getValue(\'CARRIER_CUSTOM_PPL\')
);
Configuration::updateValue(
\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_GEIS\',
Tools::getValue(\'CARRIER_CUSTOM_GEIS\')
);
Configuration::updateValue(
\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_GWCZ\',
Tools::getValue(\'CARRIER_CUSTOM_GWCZ\')
);
foreach (BalikobotCarrier::getAllAssignedCarriers() as $bbCarrier) {
if ($bbCarrier->code == \'toptrans\') {
Configuration::updateValue(
\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_SERVICE_\' . $bbCarrier->id_carrier,
Tools::getValue(\'CARRIER_CUSTOM_SERVICE_\' . $bbCarrier->id_carrier)
);
}
}
}
if (Tools::isSubmit(\'submitBalikobotSuppliers\')) {
Configuration::updateValue(
\'MONSTER_BALIKOBOT_SUPPLIERS_STATUS\',
json_encode(Tools::getValue(\'supplier_status\'))
);
if (is_array(Tools::getValue(\'SUPPLIER_API\'))) {
foreach (Tools::getValue(\'SUPPLIER_API\') as $id => $data) {
Configuration::updateValue(\'MONSTER_BALIKOBOT_SUPPLIERS_API_\' . $id, json_encode($data));
}
}
}
}
if (!MonsterModuleLicenseValidator::isValid(
$this->name,
Configuration::get(strtoupper($this->name) . \'_LICENSE_KEY\')
)) {
$output .= \'<div class="alert alert-danger"><strong>Licence nen platn.</strong> Funcionalita modulu nebude dostupn</div>\';
} else {
$output .= \'<div class="alert alert-success"><strong>Licence je platn.</strong></div>\';
$hash = Configuration::get(\'MONSTER_BALIKOBOT_SECURITY_HASH\', false);
$date = Configuration::get(\'MONSTER_BALIKOBOT_INSTALL_DATE\', false);
if (!$hash) {
$hash = Tools::passwdGen(32);
Configuration::updateValue(\'MONSTER_BALIKOBOT_SECURITY_HASH\', $hash);
}
if (!$date) {
Configuration::updateValue(\'MONSTER_BALIKOBOT_INSTALL_DATE\', date("Y-m-d H:i:s"));
}
$output .= \'<div class="alert alert-info"><strong>Script pro automatickou kontrolu adres objednvek je zde: <a href="\' . _PS_BASE_URL_ . \'/modules/monster_balikobot/cron.php?hash=\' . $hash . \'">\' . _PS_BASE_URL_ . \'/modules/monster_balikobot/cron.php?hash=\' . $hash . \'</a>.</strong>
<br/><br/>Script kontroluje doruitelnost novch a stav expedovanch objednvek. Nen nutn pro sprvn fungovn modulu.
</div>\';
}
$this->context->smarty->assi'b"gn(
[
'balikobot_orders' => BalikobotOrder::getOrdersHistory(),
]
);
return $output . $this->displayFormKeys() . $this->displayFormCarriers() . $this->displayFormCarriersCustoms(
) . $this->displayFormSuppliers() . $this->displayOrderHistory();
}
protected function displayOrderHistory()
{
if (!MonsterModuleLicenseValidator::isValid(
$this->name,
Configuration::get(strtoupper($this->name) . '_LICENSE_KEY')
)) {
return null;
}
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . 'monster_balikobot.php', 'orders_history.tpl');
}
public function displayFormKeys()
{
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
$fields_form[0]['form'] = array(
'legend' => array(
'title' => $this->l('Licence modulu'),
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Licenn kl'),
'name' => 'license_key',
'required' => true
),
),
'submit' => array(
'title' => $this->l('Save'),
'class' => 'btn btn-default pull-right'
)
);
if (MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
$paymentModules = PaymentModule::getInstalledPaymentModules();
foreach ($paymentModules as &$module) {
$module['displayName'] = Module::getModuleName($module['name']) . ' (' . $module['name'] . ')';
}
$orderStates = OrderState::getOrderStates($default_lang);
$fields_form[1]['form'] = array(
'legend' => array(
'title' => $this->l('Nastaven'),
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('API uivatel'),
'name' => 'API_USER',
'size' => 20,
'required' => true
),
array(
'type' => 'text',
'label' => $this->l('API kl'),
'name' => 'API_KEY',
'size' => 20,
'required' => true
),
array(
'type' => (_PS_VERSION_ > 1.5) ? 'switch' : 'radio',
'class' => 't',
'label' => $this->l('Logovn komunikace'),
'name' => 'DEBUG',
'desc' => 'Ukldat komunikaci s Balkobotem do samostatnho logu.',
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
),
array(
'type' => (_PS_VERSION_ > 1.5) ? 'switch' : 'radio',
'class' => 't',
'label' => $this->l('Expedice z vce sklad'),
'name' => 'suppliers',
'desc' => 'Nutn pedchoz konfigurace na stran Balkobotu.',
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
),
array(
'type' => (_PS_VERSION_ > 1.5) ? 'switch' : 'radio',
'class' => 't',
'label' => $this->l('Odeslat email po naten sledovacho sla'),
'name' => 'tracking_mail',
'desc' => 'Zkaznci automaticky dostanou e-mail se sledovacm slem.',
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
),
array(
'type' => (_PS_VERSION_ > 1.5) ? 'switch' : 'radio',
'class' => 't',
'label' => $this->l('Expedovat pouze vlastn balky'),
'name' => 'employee_packages',
'desc' => 'Zamstnanci budou mt monost odeslat dopravcm pouze ttky, kter sami vygenerovali.',
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
),
array(
'type' => 'select',
'label' => 'Jako ID objednvky do Balkobotu odeslat',
'name' => 'id_order_param',
'options' => array(
'query' => [
['name' => 'id', 'displayName' => 'slo (ID) objednvky'],
['name' => 'reference', 'displayName' => 'Kd objednvky'],
],
'id' => 'name',
'name' => 'displayName'
),
'required' => false
),
array(
'type' => 'select',
'label' => 'Modul pro dobrku',
'name' => 'cod_module',
'options' => array(
'query' => array_merge([['name' => '-', 'displayName' => '-- dn --']], $paymentModules),
'id' => 'name',
'name' => 'displayName'
),
'required' => false
),
array(
'type' => 'select',
'label' => 'Modul pro dobrku 2',
'name' => 'cod_module_2',
'options' => array(
'query' => array_merge([['name' => '-', 'displayName' => '-- dn --']], $paymentModules),
'id' => 'name',
'name' => 'displayName'
),
'required' => false
),
array(
'type' => 'select',
'label' => 'Stav objednvky po vygenerovn ttku',
'name' => 'new_state_1',
'options' => array(
'query' => array_merge([['id_order_state' => '', 'name' => '-- nemnit --']], $orderStates),
'id' => 'id_order_state',
'name' => 'name'
),
'required' => false
),
array(
'type' => 'select',
'label' => 'Stav objednvky po objednn svozu',
'name' => 'new_state_2',
'options' => array(
'query' => array_merge([['id_order_state' => '', 'name' => '-- nemnit --']], $orderStates),
'id' => 'id_order_state',
'name' => 'name'
),
'required' => false
),
array(
'type' => 'select',
'label' => 'Stav objednvky po chybn kontrole adresy',
'name' => 'new_state_3',
'options' => array(
'query' => array_merge([['id_order_state' => '', 'name' => '-- nemnit --']], $orderStates),
'id' => 'id_order_state',
'name' => 'name'
),
'required' => false,
'desc' => 'Vyaduje aktivn script pro kontrolu objednvek.'
),
array(
'type' => 'select',
'label' => 'Stav objednvky po spnm doruen balku',
'name' => 'new_state_4',
'options' => array(
'query' => array_merge([['id_order_state' => '', 'name' => '-- nemnit --']], $orderStates),
'id' => 'id_order_state',
'name' => 'name'
),
'required' => false,
'desc' => 'Vyaduje aktivn script pro kontrolu objednvek.'
),
),
'submit' => array(
'title' => $this->l('Save'),
'class' => 'btn btn-default pull-right'
)
);
}
$helper = $this->getFormHelper('submitBalikobotKeys', $default_lang);
$helper->fields_value['license_key'] = Configuration::get('MONSTER_BALIKOBOT_LICENSE_KEY');
if (MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
$helper->fields_value['API_USER'] = Configuration::get('MONSTER_BALIKOBOT_API_USER');
$helper->fields_value['API_KEY'] = Configuration::get('MONSTER_BALIKOBOT_API_KEY');
$helper->fields_value['DEBUG'] = Configuration::get('MONSTER_BALIKOBOT_DEBUG');
$helper->fields_value['cod_module'] = Configuration::get('MONSTER_BALIKOBOT_COD_MODULE');
$helper->fields_value['cod_module_2'] = Configuration::get('MONSTER_BALIKOBOT_COD_MODULE_2');
$helper->fields_value['new_state_1'] = Configuration::get('MONSTER_BALIKOBOT_NEW_STATE_1');
$helper->fields_value['new_state_2'] = Configuration::get('MONSTER_BALIKOBOT_NEW_STATE_2');
$helper->fields_value['new_state_3'] = Configuration::get('MONSTER_BALIKOBOT_NEW_STATE_3');
$helper->fields_value['new_state_4'] = Configuration::get('MONSTER_BALIKOBOT_NEW_STATE_4');
$helper->fields_value['id_order_param'] = Configuration::get('MONSTER_BALIKOBOT_ID_ORDER_PARAM');
$helper->fields_value['suppliers'] = Configuration::get('MONSTER_BALIKOBOT_SUPPLIERS');
$helper->fields_value['tracking_mail'] = Configuration::get('MONSTER_BALIKOBOT_TRACKING_MAIL');
$helper->fields_value['employee_packages'] = Configuration::get('MONSTER_BALIKOBOT_EMPLOYEE_PACKAGES');
}
return $helper->generateForm($fields_form);
}
public function displayFormCarriers()
{
if (!MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
return null;
}
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
$inputs = [];
$bb_carriers_options = [];
try {
$bbCarriers = BalikobotCarrier::getAllPossibleCarriers();
} catch (BalikobotAPIException $e) {
return $e->getMessageList()[0];
}
foreach ($bbCarriers as $code => $name) {
$bb_carriers_options[] = array(
'id_option' => $code,
'name' => $name,
);
}
$carriers = Carrier::getCarriers($default_lang, false, false, false, null, Carrier::ALL_CARRIERS);
foreach ($carriers as $carrier) {
$inputs[] = array(
'type' => 'select',
'label' => $carrier['name'],
'name' => 'CARRIER_' . $carrier['id_carrier'],
'required' => true,
'options' => array(
'query' => $bb_carriers_options,
'id' => 'id_option',
'name' => 'name',
),
);
}
$fields_form[0]['form'] = array(
'legend' => array(
'title' => $this->l('Piazen dopravc'),
),
'input' => $inputs,
'submit' => array(
'title' => $this->l('Save'),
'class' => 'btn btn-default pull-right'
)
);
$helper = $this->getFormHelper('submitBalikobotCarriers', $default_lang);
foreach ($carriers as $carrier) {
$id_carrier = $carrier['id_carrier'];
$varName = 'CARRIER_' . $id_carrier;
$bbCarrier = new BalikobotCarrier($id_carrier);
$helper->fields_value[$varName] = $bbCarrier->getCodeWithService();
}
return $helper->generateForm($fields_form);
}
public function displayFormCarriersCustoms()
{
if (!MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
return null;
}
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
$inputs = [];
foreach (BalikobotCarrier::getAllAssignedCarriers() as $bbCarrier) {
if (
$bbCarrier->code == 'toptrans' ||
($bbCarrier->code == 'ppl' && in_array($bbCarrier->service, [15, 19])) ||
($bbCarrier->code == 'geis' && in_array($bbCarrier->service, [4, 5, 10, 11])) ||
$bbCarrier->code == 'gwcz'
) { // paletov pepravy s mu_type
$inputs[] = array(
'type' => 'select',
'label' => $bbCarrier->name . ', ' . $bbCarrier->serviceName . ' - vchoz typ balku',
'name' => 'CARRIER_CUSTOM_' . strtoupper($bbCarrier->code),
'required' => true,
'options' => array(
'query' => BalikobotCarrier::getCarrierManipulationUnits($bbCarrier->code),
'id' => 'code',
'name' => 'name',
),
);
}
if ($bbCarrier->code == 'toptrans') { // toptrans vnos do patra
$inputs[] = array(
'type' => 'select',
'label' => $bbCarrier->name . ', ' . $bbCarrier->serviceName . ' - Top Comfort',
'name' => 'CARRIER_CUSTOM_SERVICE_' . $bbCarrier->id_carrier,
'required' => true,
'options' => array(
'query' => array(['code' => 0, 'name' => 'Ne'], ['code' => 1, 'name' => 'Ano']),
'id' => 'code',
'name' => 'name',
),
);
}
}
if ($inputs) {
$fields_form[0]['form'] = array(
'legend' => array(
'title' => $this->l('Speciln nastaven dopravc'),
),
'input' => $inputs,
'submit' => array(
'title' => $this->l('Save'),
'class' => 'btn btn-default pull-right'
)
);
$helper = $this->getFormHelper('submitBalikobotCarriersCustoms', $default_lang);
foreach ($inputs as $i) {
$helper->fields_value[$i['name']] = Configuration::get('MONSTER_BALIKOBOT_' . $i['name']);
}
return $helper->generateForm($fields_form);
} else {
return '';
}
}
public function displayFormSuppliers()
{
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
if (MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey) && Config"b'uration::get(
\'MONSTER_BALIKOBOT_SUPPLIERS\'
)) {
$suppliers = Supplier::getSuppliers();
$fields_form[0][\'form\'] = array(
\'legend\' => array(
\'title\' => $this->l(\'Nastaven dodavatel\'),
),
\'input\' => array(),
\'submit\' => array(
\'title\' => $this->l(\'Save\'),
\'class\' => \'btn btn-default pull-right\'
)
);
$helper = $this->getFormHelper(\'submitBalikobotSuppliers\', $default_lang);
foreach ($suppliers as $s) {
$fields_form[0][\'form\'][\'input\'][] =
array(
\'type\' => (_PS_VERSION_ > 1.5) ? \'switch\' : \'radio\',
\'class\' => \'t\',
\'label\' => $s[\'name\'],
\'name\' => \'supplier_status[\' . (int)$s[\'id_supplier\'] . \']\',
\'values\' => array(
array(
\'id\' => \'active_on\',
\'value\' => 1,
\'label\' => $this->l(\'Yes\')
),
array(
\'id\' => \'active_off\',
\'value\' => 0,
\'label\' => $this->l(\'No\')
)
),
);
$helper->fields_value[\'supplier_status[\' . (int)$s[\'id_supplier\'] . \']\'] = 0;
}
$fields_form[0][\'form\'][\'description\'] = "Dodavatel, kter zde aktivujete, budou mt ttky automaticky tisknut s jejich adresou pes vlastn API.";
$formId = 1;
$suppliersBB = json_decode(Configuration::get(\'MONSTER_BALIKOBOT_SUPPLIERS_STATUS\'));
if (is_array($suppliersBB) || is_object($suppliersBB)) {
foreach ($suppliersBB as $id => $state) {
$helper->fields_value[\'supplier_status[\' . $id . \']\'] = $state;
if ($state) {
$sup = new Supplier($id);
$fields_form[$formId][\'form\'] = array(
\'legend\' => array(
\'title\' => $sup->name,
),
\'input\' => array(
array(
\'type\' => \'text\',
\'label\' => $this->l(\'API uivatel\'),
\'name\' => \'SUPPLIER_API[\' . $id . \'][api_user]\',
\'size\' => 20,
\'required\' => true
),
array(
\'type\' => \'text\',
\'label\' => $this->l(\'API kl\'),
\'name\' => \'SUPPLIER_API[\' . $id . \'][api_key]\',
\'size\' => 20,
\'required\' => true
)
),
\'submit\' => array(
\'title\' => $this->l(\'Save\'),
\'class\' => \'btn btn-default pull-right\'
)
);
foreach (
json_decode(
Configuration::get(\'MONSTER_BALIKOBOT_SUPPLIERS_API_\' . $id)
) as $key => $value
) {
$helper->fields_value[\'SUPPLIER_API[\' . $id . \'][\' . $key . \']\'] = $value;
}
$formId++;
}
}
}
return $helper->generateForm($fields_form);
}
}
public function getFormHelper($submitName, $defaultLang)
{
$helper = new HelperForm();
// Module, token and currentIndex
$helper->module = $this;
$helper->name_controller = $this->name;
$helper->token = Tools::getAdminTokenLite(\'AdminModules\');
$helper->currentIndex = AdminController::$currentIndex . \'&configure=\' . $this->name;
// Language
$helper->default_form_language = $defaultLang;
$helper->allow_employee_form_lang = $defaultLang;
// Title and toolbar
$helper->title = $this->displayName;
$helper->show_toolbar = true;
$helper->toolbar_scroll = true;
$helper->submit_action = $submitName;
$helper->toolbar_btn = array(
\'save\' => array(
\'desc\' => $this->l(\'Save\'),
\'href\' => AdminController::$currentIndex . \'&configure=\' . $this->name . \'&save\' . $this->name . \'&token=\' . Tools::getAdminTokenLite(
\'AdminModules\'
),
),
\'back\' => array(
\'href\' => AdminController::$currentIndex . \'&token=\' . Tools::getAdminTokenLite(\'AdminModules\'),
\'desc\' => $this->l(\'Back to list\')
),
);
return $helper;
}
public function hookDisplayAdminAfterHeader($params)
{
if(Tools::getValue(\'controller\') == \'AdminOrders\' && Tools::getValue(\'id_order\') == false)
{
try {
// order for all carriers
if (Tools::isSubmit(\'submitObjednatSvoz\')) {
$result = BalikobotPackage::orderPackagesForAll();
$this->context->smarty->assign([ \'balikobot_last_order\' => $result ]);
}
// order for one carrier
$submitOrderInfo = $this->getSubmitOrderInfo();
if ($submitOrderInfo !== false) {
$result = BalikobotPackage::orderPackagesForCarrier($submitOrderInfo[\'supplierId\'], $submitOrderInfo[\'carrierCode\']);
$carrierName = BalikobotCarrier::getCarrierNameFromCode($submitOrderInfo[\'carrierCode\']);
$supplierName = Supplier::getNameById($submitOrderInfo[\'supplierId\']);
$this->context->smarty->assign([ \'balikobot_last_order\' => [ $supplierName => [$carrierName => $result ]]]);
}
// print labels for selected orders
if (Tools::isSubmit(\'submitPrintLabel\'))
{
$orderId = Tools::getValue(\'orderId\');
$position = Tools::getValue(\'position\');
// set new package weight, if provided
$weight = Tools::getValue(\'weight\');
if ($weight != \'\') {
BalikobotPackage::setWeight($orderId, $weight);
}
$package = new BalikobotPackage($orderId);
// set new package vat and custom price, if provided
if (Tools::getValue(\'price_type\')) {
$package->price_type = Tools::getValue(\'price_type\');
}
if (Tools::getValue(\'price\')) {
$package->custom_price = Tools::getValue(\'price\');
}
// set new custom label text, if provided
$labelText = Tools::getValue(\'label_text\');
if ($labelText != \'\') {
$package->label_text = $labelText;
}
// set new carrier package type, if provided
$carrierPackageType = Tools::getValue(\'carrier_package_type\');
if ($carrierPackageType != \'\') {
$package->carrier_package_type = $carrierPackageType;
}
// set new packages number, if provided
$pieces = Tools::getValue(\'pieces\');
if ($pieces != \'\') {
$package_pieces = $pieces;
}
else {
$package_pieces = 1;
}
// which label to print
$piece = Tools::getValue(\'piece\');
if ($piece != \'\') {
$package_piece = $piece;
}
else {
$package_piece = \'all\';
}
$labelUrl = $package->getLabelUrl($position, $package_pieces, $package_piece);
Tools::redirect($labelUrl);
}
}
catch(BalikobotAPIException $e)
{
foreach ($e->getMessageList() as $message)
{
$this->warnings[] = $message;
}
}
return $this->hookDisplayAdminListBefore($params);
} else {
return null;
}
}
public function hookDisplayAdminListBefore($params)
{
if (!MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
return null;
}
if (Tools::getValue(\'controller\') == \'AdminOrders\') {
$this->context->smarty->assign([\'balikobot_order\' => BalikobotPackage::getPackagesToOrderCount()]);
if (_PS_VERSION_ >= "1.7.7.0"){
$this->context->smarty->assign(array (
\'balikobot_token\' => Tools::getValue(\'_token\')
));
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . \'monster_balikobot.php\', \'orders_list_177.tpl\');
} else {
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . \'monster_balikobot.php\', \'orders_list.tpl\');
}
} else {
return null;
}
}
/**
* Hook to display Balikobot buttons in Ship part of the order detail.
*/
public function hookDisplayAdminOrderMain($params)
{
return $this->hookDisplayAdminOrderContentShip($params);
}
public function hookDisplayAdminOrderContentShip($params)
{
if (!MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
return null;
}
if (_PS_VERSION_ >= "1.7.7.0"){
$order = new Order($params[\'id_order\']);
// pro 1.7.7.0 se veker post requesty e v top hooku
} else {
$order = $params[\'order\'];
try {
if (Tools::isSubmit(\'submitSmazaniStitku\')) {
BalikobotPackage::delete($order->id);
$this->context->controller->confirmations[] = \'Balk byl spn odebrn z API Balkobotu.\';
}
} catch (BalikobotAPIException $e) {
foreach ($e->getMessageList() as $message) {
$this->context->controller->warnings[] = $message;
}
} catch (Exception $e) {
$this->context->controller->warnings[] = $e->getMessage();
}
}
$package = new BalikobotPackage($order->id);
$package_in_api = (strlen($package->package_id) > 0);
$package_sent = $package->sent;
$package_carrier = $order->id_carrier;
$position_count = $package->getLabelPositionCount();
$carriers = BalikobotCarrier::getAllAssignedCarriers();
$balikobot_mu_types = null;
if(in_array($package->carrier->code, [\'toptrans\', \'gwcz\']) && is_null($package->carrier_package_type)){
$package->carrier_package_type = Configuration::get(\'MONSTER_BALIKOBOT_CARRIER_CUSTOM_\' . strtoupper($package->carrier->code));
$balikobot_mu_types = BalikobotCarrier::getCarrierManipulationUnits($package->carrier->code);
}
$this->context->smarty->assign(array (
\'balikobot_id_order\' => $order->id,
\'balikobot_in_api\' => $package_in_api,
\'balikobot_is_sent\' => $package_sent,
\'balikobot_carrier\' => $package_carrier,
\'balikobot_carriers\' => $carriers,
\'balikobot_position_count\' => $position_count,
\'balikobot_pieces_count\' => $package->order_count,
\'balikobot_label_text\' => $package->label_text,
\'balikobot_carrier_code\' => $package->carrier->code,
\'balikobot_carrier_package_type\' => $package->carrier_package_type,
\'balikobot_mu_types\' => $balikobot_mu_types
));
if (_PS_VERSION_ >= "1.7.7.0"){
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . \'monster_balikobot.php\', \'ship_177.tpl\');
} else {
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . \'monster_balikobot.php\', \'ship.tpl\');
}
}
public function hookDisplayAdminOrderTop()
{
try {
// print labels for selected orders
if (Tools::isSubmit(\'submitPrintLabel\'))
{
$orderId = Tools::getValue(\'orderId\');
$position = Tools::getValue(\'position\');
// set new package weight, if provided
$weight = Tools::getValue(\'weight\');
if ($weight != \'\') {
BalikobotPackage::setWeight($orderId, $weight);
}
$package = new BalikobotPackage($orderId);
// set new package vat and custom price, if provided
if (Tools::getValue(\'price_type\')) {
$package->price_type = Tools::getValue(\'price_type\');
}
if (Tools::getValue(\'price\')) {
$package->custom_price = Tools::getValue(\'price\');
}
// set new custom label text, if provided
$labelText = Tools::getValue(\'label_text\');
if ($labelText != \'\') {
$package->label_text = $labelText;
}
// set new carrier package type, if provided
$carrierPackageType = Tools::getValue(\'carrier_package_type\');
if ($carrierPackageType != \'\') {
$package->carrier_package_type = $carrierPackageType;
}
// set new packages number, if provided
$pieces = Tools::getValue(\'pieces\');
if ($pieces != \'\') {
$package_pieces = $pieces;
}
else {
$package_pieces = 1;
}
// which label to print
$piece = Tools::getValue(\'piece\');
if ($piece != \'\') {
$package_piece = $piece;
}
else {
$package_piece = \'all\';
}
$labelUrl = $package->getLabelUrl($position, $package_pieces, $package_piece);
Tools::redirect($labelUrl);
}
// drop package from Balikobot API
if (Tools::isSubmit(\'submitSmazaniStitku\')) {
$orderId = Tools::getValue(\'orderId\');
BalikobotPackage::delete($orderId);
$this->context->smarty->assign(array (
\'balikobot_confirmations\' => \'Balk byl spn odebrn z API Balkobotu.\'
));
}
}
catch(BalikobotAPIException $e)
{
$this->context->smarty->assign(array (
\'balikobot_warnings\' => $e->getMessageList()
));
}
return $this->display(__DIR__ . DIRECTORY_SEPARATOR . \'monster_balikobot.php\', \'alerts.tpl\');
}
protected function getSubmitOrderInfo()
{
$carrierCodes = array_keys(BalikobotCarrier::$bb_carriers_list);
$supplierIds = DB::getInstance()->executeS(\'SELECT DISTINCT supplier FROM \'._DB_PREFIX_.\'monster_balikobot_packages WHERE sent = 0\');
foreach($supplierIds as $supplierId){
foreach ($carrierCodes as $carrierCode)
{
if (Tools::isSubmit(\'submitObjednatSvoz_\'.$supplierId[\'supplier\'] .\'_\'. $carrierCode))
{
return [\'supplierId\' => $supplierId[\'supplier\'], \'carrierCode\' => $carrierCode];
}
}
}
return false;
}
/**
* Hook which adds Balikobot CSS into all back office pages.
* @return mixed
*/
public function hookBackOfficeHeader()
{
if (!class_exists(\'MonsterModuleLicenseValidator\') || !MonsterModuleLicenseValidator::isValid($this->name, $this->licenseKey)) {
return null;
}
$this->context->smarty->assign(\'module_dir\', __PS_BASE_URI__ . \'modules/\' . $this->name);
return $this->context->smarty->fetch(dirname(__FILE__) . \'/css/css.tpl\');
}
}
'
Did this file decode correctly?
Original Code
<?php eval(base64_decode("ZXZhbChzdHJfcm90MTMoZ3p1bmNvbXByZXNzKGd6aW5mbGF0ZShzdHJyZXYoYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCJaR2QxTDJOQldDOUlMMkl2VlZGMmRqbHNaMVpTT0haM1EyOVVNVk0wU3pBMmRrVlVTV1ZtYkVkTGJIbDJiRWRpY25SbWRtWnNUMUZuUWxoQ1ZqVm1jR0V3Vlc1clp5OUxMMjh3Wm14T1RHVjNVMWQ2VEhCWVJYbGFNeXMwTVcxdmRETmxVRlprZFRkUlIyOUpRbUkzZVRWQ1JtMUZhMlJaVVc5QmJtdENkakZRVURoVFRqaHZaazFHU210UGFFeEtTRWhHY0VoTGJXRnZVM0owZVRoeVUxRkRhMVZWZEdaeFp6VnJTSE0xYUVKaFEwTmlUVWNyYTNGcVIwcEtVRUZuTWtaME9UaENNamQxWmpOUk1qQnNXamM0WjBkV05FMXBTbGxDVW5wSlJVWnFTWFkzTkZVMmVYTjZPVE5UVjI1aFlWVm1SV1FyVG5FNWNUQlJlV1ZHVUhaWVl5OTFTRXBKVEdablpESkZZMjlPT0hoYWJHWkthRTkwTkN0UlVqa3JTMmRsTkU0NE1USkZabmhJTkZGRVJUZG9iV1EwVGpaUU1rWkljRGw2ZVVONU9XRkhSSEJwYXpoeFozRlpSM1Z5YkdSMFRtbzROMmN3Y1VVM1VuQmhMMVpPZW1JNFlXaEhRMEpUZG1odE1UUkRha1V2ZGpkQ2NWTmpVVXMzY1hwdWJWbHBlamh0VUZGTVowdzJNbEp0WVV0S2MxUnRibFZuYkcxSU1YaGpVMnQxV0RScWNscG5URkJIUkhGQlVIZFFZa1Z5Y0RGalNUbHJWbkp1ZFRCMlIwNUlhVXhtY0hGSmEyeHVSR1E0TDNwb1VXWlJhWGxaUXpOTFNFSTBObEpHTUZvM1RFVkVUbmw1Ykc0MFJHZGFRVU5hVEZRek1Ib3pLMWhrVXpFclpTdGhWazFrUTA5Qk0yMW9ibmRwYUV4aVJUWjVUVUp6V2xKaWVHSktabE5ZWVc1aWFGQTFNMUF4Ym1sbkx6aFJVbnBxVVV4QlVGQXJUaTlQVm05VWJXTlRSREpFTjJKemRGcEZieTlXWkhJeFNXeFhVRU5TYkRsaVpVWXpXVlI2ZG5KVFVuWXlUMDU2YlU1d1NFbDJkM2hGU201cFVIVkdVM1owYkRSeVUwUk5TMlZUTldKNE9XTnRiM2RpY0VFMVRHUXJSRzlPVGtOWE1FbEpkMjVrWjJKRFpqRXpPWFJHTlRsbWJVMVJRa2wzVjAxSlJWcEZWR3hrWlcxVlUwcGpja0ppWnpWbVVGUm1WVkpsVTFORFdUTm9NSGhJYjJsVE4wbExXWGRrUWpCaGQyOVNiamc0U3pOeVMycFNOemhCUXk5MFZFdHJTV050VEVOeFR6SlRPRmQzWXpKemVVUnljM1U1UTBaNU1VSjFUMnhQY0RGQ2JUTk9NbEJTY1dzdlRVbDRVbTlvU0d4RlJHUlFWVUZTT1VkbWVIQmhhVVpJT0ZkMVIwRldVVzFyU0haTVJHd3hhVzV4WVZJeE9IUjNVbGxpYTFCTU5XZzRWbXh5U2psUksxcGhVRzkxTlUwNFdEYzNXVTFEVjJVM2FUYzNNVU5WV0VKdWVGbHNNbmhrWVZKbFkyeERTVlJzT1dackwxWmtTa1o2VGtsSFRIZzJjbWhZVm05R1RYVkJNVmt5UmxkS1kxSlpURGw0Vm05WmNEUmpVM1pxZGxCNGExQkNNbTB2UlZWSVRTdG1USE15TmxKUlRVOU5VMk5KUkRaVlIzUXZUVXg2YUROdkwwRlVORmxyZFVvNFMxaEJkelJKYlRCd04yOVJUV1o0V1VOeGRDOHpXR1JPUzI1QmVERkhkbWQ1TkZSRmFYaFRjMjFCUVRBM1MwSjFhbVpxUTJWRlJWRlRVSGxpTlRKcVFXbDBiVEJKT0dkdEwxaEVNbmMyYkVSTGQwNHpRM1ZuWWtWV01IcGphMVZ4VDBGamF6VXZkWFp4U2s1a1JERjJkMUpvWlV0TVlVMVBkbUp2WTBSMFZ6VmFkM2htYWt4ek4wbFhlV3BSTUV0TlUyZEVXRGN2UkdKNWRYZDFPU3RaV0ZwbldYSkVObFZVVGxGeWJFNXFSWFo0VGtWYWVsbHRkek5QY0c5b1lsSnBLMlJ2Ynk4eVp6UkZTMDU2VFc4eE5FRlZabXBCT1ZwT1pscDNaWGw1UkRkVlMwNHJVSGt3UlRabFpsWmxZbWRTYXpGMmJFeElVMlI0VnpCalVuWjNabGR2ZWt0SVRrTm5kbFZZZG5WelRsaFdRMmRPUXl0ek1XNWFhRWMxZVVGVVIzUndWa0pZVWsxeU4wVkNTbGRTVm5GaFJuaDBUMmt4UzA1UVVYUkpRWEZvZGpCQmJtMXRSV0ZCVGpsemVsQjVhR0pEZDFKa1JFRlFXR292U1RKbE4yaGhTMFoxZFdKbE4zSmFURTlOWVRNNU9ISjRNM0JVWVRKQ1RreFRWWFpuUkVab2JqSjRTV2RRUVZCT2IyVkRVV0ptTUZwRWFWbFNNVkJCVGt4UVl5czJNWE5zVGxKdlNsTjNjVEJsY0VkeWJGZHZlVGh3TW5SMFMwdFdSVzF2TDI5RmRHSjFNVUl5UTFwdlJERk9RakYyUlM5R2MwY3hVbmg2ZWxwaGFHZHpTWFU0UldobU1UWmlZMmRQTlN0UVNXcEJiM1JyWWtnNGFIcFZRbHBqT0V0dGQwWjNVazF1WmxaV1p6RkRhMUZRU2pkdlRrSkVibUZ5V0RWa0wwWk5ZbGRoVG5ndlYxQnhVSGx2ZERCbmEzQnRPVzR3U0cxNVJ6Qm5OWHAyZG1oT2JFZHFWVmhyWldVNFkxVTJTMDloU3pRd1R5dEplVVJtUzJvMGFVNXhaakF2YmtwUlR5czRlblZqY0daQll6SnRZMDR4ZVdkQ2VWVkxVblZPU21sVlkwaHRjVEJhWVZGTE5uTnpNMEpEVm1OaVVsTnVUMWRaTTJkbFdVWkhTR2hzWWtGbVJXbElWVVJJTUc5MGRpdERiMXBNT1RNeE9FVlBhVlV6T0Vac1ptbFZUVXQxT1RjMlNGazVZa1p6YUZKYWVuWTNaME15VlVWTWJIQjNhSFJ2WldJNVYwaGlNRE5GYkRsMFZVbHVWWFo2Y0VadGJYbGFlRlpRVmxsSFlqQmlTMHhxWm5kNWJVUlBhMFp4VERWRWVTOVBhRk5FYWt0RlkwMUZWWGhYWnpkdVNubDBkRVF4VW1wTGVsZFJSMEpxYzBac2FHNXBNRXRSU2l0emRESjZaVloyYmtreGEyWjVSV2RaUzAxQlVGUjRZbnBMV0hwRmRsZE5ZVkppYmxCSmRFaEdaUzltWkd0M0swcG5LMlF4WTIwNGVXVTRlVmQ1U1N0U04xcE1OaTlSYWpodlZIRlBhakV4WlhwSE5uZHZieTkzTkRCd1dGa3ZVSGhQWW05eU1rSlhRek5VVlhveFZVOTVSekJzVUVOalJsaEtLM0JyUTNGQlpqQTViM0JITm01YVYwUk9ibUpoY2sxbWVYYzJlV1JPVlZwaE1EWnJXRzB3TUhSdGNqbDFLMjlGVFdrNVIwWkpaa1Y2VDIwMlYyRnVlR0kxVERWblpHOVdXV1YyY1haQlIxUm5PR2RNZEd0UVFXMXliSEpJU1RWNllXSTNabmRRUVdKQmVsTkhTMHBXVWxWYVNGQmllbkZtVEhkWWRGWjFjR3BzYnpSMFdsbzRjVkJ4WkVjMFIzTnZhemRxVm1KSk9VVXhhVk5GTlc5UFUxZDRlbEZzYW1wVFVYZGxWU3R0Tm05cFFsRTVjWEJPYVdsR1VIbDBjMHhvVHpCU2NHeFplbWRDYjBGRVpGSmtSR3RCVWtJeE5XWlpUbTFsWVVwamF6RjZhRUpuWVd0c1RVNVpaak5xYTFwMlR5OU9SV1p5ZW1ka2NVczRNMHd5WmtsU1dYZG5PWGhpTkhSbmN6aDFTM2c0Y21vM1dtOWtTa052V1c1R1RVWlVaR1JaY20xTlJEVkRjV2x3VFdKc2NVd3pNWEJDVVVwaWJtMW5RbVZZVkROSVRteHZSeTlSTWs5cldpczJkWEl6T0ZsUk5YWnZXbEpNUjA5cE9VYzNSMll5TVRkNGMyVm1NVUppVkhNeWJGVnNTbVpRYUVWSFpVMU1VV2M0YjB0SlMxVmhRMWROYkRaalUyTk5kVkkzWlVsV09DdE9iRzV5Y3pWeE1XNXRkRUpZUXpObWNDdFRURzEzTUhORllWZHBka3RZVW14blpqTk9kVFprT0hRd1p6WXdkSFJyTTNaWFlWSkRjSHBOZEVoRWEwcHdPSHB3YW5oVkwzTlRjVVZRTXpGSk4wOXZZWEEzVlUxNVNFeE5URkZ4TkZST2VWcEtUMmR4WXpCUWVVOXliWEpUTDB4QmQxZ3lNWEpWZFZaNmFHNU5jMkUzYVhGUWVsUXdhM1JhVFZkMFVWcEtRbTRyWW5BeVJEWmpkRVpqTkdFd2FtSmtLM1JrV1UxWWNFcHJjMUp1TVRZMlkwTmFhMGt4VURGaWFEaFNNR3RGY0dkM1ZrVldZamMxTDNOSFZGTkpjak15ZG0wd05rSmtXVzh6UzFOSlFubzBaa0pFZEN0cGIxWXJha3d3UmpOTFNrWm9TM1IwZVVoM1owbExheTlhVlRkbksyWkRTVE5STXpKUlJqRmtZbkpGWVU5SmFVcENaVzlvTUhWbFUya3ZUWEpOUWpoNVZFeFlTekJQYUVaeU5GaE1XWEo1Y0U5emJTdGhUMUp0VXk5MFdWbDBSRGd5V0VwbU5HdFpNVkZ3TkdGUmRqVXljVlp4UTFSMlZVTm1Wak5sWTFJclMwNTFRVUp0ZGtwbVJVMVdRVGxRZDJKMFlVOTJTVlJPY2pWb1JqbFNWR1pCVWtkdVptWnphMWRUZDBoT1VtdG9kRzlITnpBM01YWm5TbFpXTjB0Q1V6TkpRa2RVV2s5TlIyeFNiSGsyYkdWSFJGVmFkWEJwWkdGQ1lWcGhia3hrWkcxRlltbFZORzFPVldVNE9DOWhPVk16TkRGbWRVWkpkWEl4VTFSbWFWQXpSbVJrWjNkNGFqTlZSMngzWVhBM2F6bG9ZVmd3UVU1TWNqUnFWSEZuWm1GRFlrNUVkMEp5WldGTlRscEpMMjVKTjFSSldreEtka2RGTW1VMVVsVnplbUpXTmpOcFJrWlRlVWQzWkRKUlRWTjFTMlJNVjFGVGFVbHlWbmhMS3pOaFZFaFZkWEpJVDJ0a1lqTmpiVkpSTkhaNU1tZzJNM2xwYnpOVFZTdGFhRFpqU21WMmNIaGljMVJNTTA1MVpISmxWeXRZUjBWbFJtWkVhamhYSzFGcGNuVm1kVlJ4WmpKWE1HcEtWRXN5TldFeFZFUTJNbFY0VTFOWlVtVXhlV1YyTm05TlREbEpkMmg1Y201aFZteDVUbHBPVm5wUU9UUXlZelF3V1RsRmFTdG5hME53WjNsTFZ6UTVOMGxQV1hZMGRuUTBjamhRT0Vaek56WTFPSGgwWkhCT1EycEZRbU5yY3k5WVdHVXZSSHBZUXk5cVZtVjJiRTlaY0RWRFRVOUhkbmt5U1VzclprOXVLeXRZVVdGMlZHWlBkVzFXTWt3NEswcG9SVTFYV1RsRGNsTlJVVnBYVWtWTFJYUldOMnBtYUU5TFJDdEhTekZLVlRGemFXcHBXbTFWTXpabE5WWlVXa2xwUlVkWWVEQnVNbXgyVDNVelNYRXpjblp4ZDBwdk4xRkZWbFZIU1dkV01rdzNWWGN6UW01SFFWRnRURnBMTW1kR05tZHRkMVJOYWxGRWEyTllZV0pzV2pVNVpXaHRLekpLYUVOdFFuWlRaazFzVEdKUGRVSnFNbVZwZDBWVWQwWTJSVzh4VEd4UVVEWmtabmcxZEVGWEwyb3JMek5IVTFKU1JtWkNURUp3TlRKU1ZGQXdRbFZyVWtSeGJGbzFPREUxZGtreVduSnphemxuUm1SclQycG1WRWQ1YWt0S2RYQm1hMUZMYUhORFQxVkZiRzR6YUcxRFZrZzBhRWxpTUdGWk1UVnZhVXhQWVdwUWJFVnZkMDlYVEVSbVoydG9XWGtyUVdVMGVYaERSVFo0ZDBwRmVtMVZVVmxrTVdaYWQxZEthQzlTWlVGbkwzUlJOV05SZUhGUFZHWnliSHBQT0ZsRmJUSTNjeTlQV0RkUWFtVnVOa1JwYTBGR2JEWlpjMkkyTURGQk5VdzBORWxUWTJaRmNuaFVkVTlvTlVoUlduZ3ZRVTloTjFFclptdFdVakpJWm5CM2FIUk5VRFF5WjFKUVlXOTNZV2xPVEVwaU1sTkJXbUk1WjJGRVQwZFdOVGRSTVVrelEweHRXbGhYWkZvMFUyWjBVbE5oWnpoTFQxbEtSVE5oYVZCdk9VUTFVMVZLUkhSbFJIVlhOMHBvYjBabll6STVRM0JUVmxKbWVFbGtNM0pHSzIweU1FSnBZV0ZOUjFBeVUzaEdjV1pEUTBWWlQyMUdlbE5qVFc1Q1ptTmlWWEIxTmxoYU5tTnBUV0ZqU0dkdFMzcFhWRkpNTjJJeVVYSlFXbE5SVWxvdmFqRkpXVFk1YmpscE5EbFRhVzVrUTIxTVVXWmllSGRRZWpoUFRrZHlaRmgzU2k5aVRWb3hPVkJzYW1sdmRHZFlRM0pWZFc1VldVUk5ZVEZ3TldWME4zSTNVemh6TURGMVdFWjZLMHhhUnl0b00xZG9iakpPVDJWU1JFTXZiM1Z0WlZCSmRVRnVlalpaY1U4MmVtZGlWUzlqUmxRNGJ6aGFNazVIWjI1aGVEaHZWV1p2TW1seWNGUnZXR2RLTUVSclZESkNhMUZRU21OTlpqQkVOV2gwTmxWNE5tTlVSWFZoYkZsSlowUmhXR1ZsZDBjMVRHSjJPR0ZEU21zelFqQldORGhxV0RSeFlrVnFWM1ZHVjBWM1pHTlJWMEoxUm5oYVdFOVJObmRrZERkdlJrTlFhakFyVTBKTFpYbG5iSHBOWTJOc0x6Sk9OME4yY1ZWWWVtRlNSR1ZQV2xCRFozbEZURXRhTjI1UVRrTmplbTF6TVhOc1EwWktTR1VyVFhwc05rSXdUbFZGUnl0SFNEWlJTV2x3ZG1ocVEyMHZTR2tyZDBNcmFtcFVjV2hrVDFWcWRUTnhjaXQyT1VsaGVqWm5VMFI1VVdwclNtSnFjVGxLWjI1VWJXVndPSGQxYTFBM2NreFRaWEoxVDI4cmJtMVVORVI1YlROQlRteExiRmd3VDJrdlQzZ3lVa1Y0YWpsRFlqZHdNbXRLY1ZoT1pIcFlhRTlpU25CdGVtTkpRbmR4UkU1RFFpOVVhVUZ6V0VrMFZHOHdaMFIzWTI5UWVFUkdXbXR4ZEVkWFdWcEVNR2xrVnpBMlkzVjNWVlI0TjBKa1JscFpaRkJEVUdoSFkwZE9WM0ZQUVRaVk9HaEhhSE5XZEhWaWQwWlNUVU5hVDB0Uk9XeHROamxKUTBsa01WbFRiVWxITDJwNFVXNUVhMEZRVkZGMU0xVkVRVlZxUkhCQmRYSXhkbmw2Y1RGc1lqVlpVakpSU2xsSk5qZDZjazltSzFFeE5FbExZalY0T0hwUVZEaEhkSGxpUzBjdlRYVkNLemsxYjJZellrSnBRVzlRTms1UFExaFFOVGd2YTNsV1QxRm1jMUUyUkRkd2MzbFFha2h5T0VkM05UVjBTVk5ITVZsSFRqUnplamd2YlRGMlMwUkNWM05FVldaQmFtTmxlamg2WkdwR1VITXdWRUpFTWtWS1dqRlFORmRTTVVkS1VIRnllWGRyUVROa2EweHJOMmx4ZDJoaU9XVkJVWFp5WjFaVFUwaE5hVUphZG1abWFtMUtPREpsYkdOMmJsTXZhVTgwWlZsTVQwTTJkSFpyVlc1bGVraGpVMnBTWWpJM2FTOU9lbTFQZDNSWVVIcEhXa3N4VldwcVRsWnhZMFpVUTNORWExSlNSbEptVEdSdVRFSklkWEJ2WW5NM2MwOURaaTlYV0hjeVNqaDBVMDFZUzJSUk0yUkJRVFozZVhsNU0yeFhZVnBRYVc4MGFqRllTVVJEUVVOVWJXMHhNalZTUkdOTmNWbHpiWFpuVWpkVGFIQmFRbGxwYWpSbFJIVm5XbXNySzNwYVZ6QnZVVE5SUzA5b09YcExhbGx2WTFCRmMwdGFiMFZuWms5U1QweDZOREJ6YVM4MU1FVmtjWE56VVdSUlIwczRjMGxKZGtGYWJtbEdWRzVHUkhVNWVXNWlhVzVTTms1bVlqSjFabTVvT0hONWFVcDBWV0pNZFRsM1dERjJRVWcxWmtzMmNIaG5la3g2Ym1oa2NHNXVjVE5aVlVOalNrZFpSazlvSzNGMGNuSnFPVGRXTTJ0blRGSnJVbWh5Vm1sMlpIcEZSV0pHTDI1ME0zWXZVVmgxWmpVcmREa3ZVRlIxWmpaRFRtb3ZZaXN6T0RCcWEySnJjVUZTZWtkek5FVXhlR294WlZZeVJHZHFVM1ZCY1ZOQ2JWVmxSRTE0VW05R2FVVXlha1JxVEhNd09FNVRiREE0WWxGNmMyNXBWMmRyT0ZGbVoxUkpjU3RHTkcxa1ZEZFdXR3hVWmtWeFRtbHlTbXRPVEhkdU4xbDNNVlpLV0haTE1uaFhXVU52TVhsc1RHZElibVE0U1ZCTFFVZHlXR1JIWWxGa1NuTnpSbGh6TlROU2N5dEZkbVZxWm1wUE5EQkRiR2szT0doWVEzVkhkVEJFWVRKRlZVOVROMU5vTm5GQllsbHJZVmRqUzFVcmJ6WjVSMnRDY1ZkWGNVUXdVbkpoTXpOelVqaFphalJZY0RFeVRWWlZPVVpqS3pnM2JqTnBTM0ZaYzBKTlFuUXlaRnAxV201cVEwOUlVamd3U0d3MWNXaDFWRkZSZURaVGJtRTBhRUpUU21aYVNVVkdNRlpxYjJsblFrTk9VMHhKUVcxa1FXd3lkV2h5ZUZKb1IyRlRWWEJPYTBKVVFsaFhWM1ZpVWtOMVJESXZSRzVIUlZJeWJWZHBkR2RCVjBWTFJuQkZObThyVjJWUFdHUm1ielZQVVZwd1ZISnFXa3RDV0RSS1RrRTVRMnBXVkROaFRHUkRRV000V25GV2NFdEpRVzEyVWpkVloyWklTbmc1VEdSNFUyRlBlbGRDTkhaeFdXWlRNa0owZDBGVlpVTlNlbXhNYUVWalpqWlNhMU0yVERSNGFHVmxSVzByZG1KV1MxSk9lSFU1YkVabGRsQXdOMDAwZDFaYVNEQkhZamxFT0RKUE1pdDZjbTEzVVRGbVRYY3lkWEprVjNaWGVYTmhWVlZSTlVwUmVtUk9NVTFqZEhSNVJETlNhMFJGZWsxNlVFeElTRVJoZFVGMlVUbDFOall5UWxWbk56Rk5iMjF6YUdOMlJVc3hjWFV6TW5SRGRuVnhRM0ZpZW1KUGVFTlFRa0lyYm0xWWFtRnFRVzlLVjNCS01FVlRNbGc0Y1hFMmJVRTNhMkl6VW1VelNtcFlXa0ZLVDFBNWIyUlZZVE55UnpWNFoxWk5kWGx5ZGs1bGNrWkthRVZGYkZob1ZGaHBSRTlSTTNaTWJVVnphSEZZZVZCc1psaHNSRTFYZVdaRVZuWktORkZKVWpWbk5TdFRWV3MxVTFGTFIwcHJSV2RCUkV4cFEwWjNlVTFuVDJOelFWSTBhakpDT0RSa1ZrRldUVUk1UVRrMGRpdFBSM1pNZVc5all6Tm9abFExVVV0V01sQlZVbFZzVmxsQ2NEVmpORk5LTjFCa2EwWlVObmxHWkZwUWNESnRaRWRoU25aVVJ5dENURTlCTWtoekwxWlBaRzFOUXpsR1NVSjZOV2RLUkdVdlp6Wm5URk5KZGxGWGJ6SklaVVZHUTBKc2FETXhUM3BoUTBOblFWSkZiV3B6TVhkaWQyeHlaekJPVm5aM1FrODRVa0ZQTm5GYU5tdE1jR1ZzTmtFek5WUjZRMjV4TDFjNVMybDRjR0U0ZDJGcU1FeHdRWGhHVmtwM05sZHJjVE5KZGxockwydzVURWhIV1V0SmVqVlJNWEprVHpkTWVYVk5WSGRCTjBoRGVHaHpUeXRpUjFCQmMyUm9iemh4TDJsR2QyNW9aVzVvYVM5R2RVazJNazFrUjBWdE9EWXljRFJ4ZDJOUVprTkNLMDFuY0c1TlRXbFFNblJ5Tm5BMmJYcHNOSFJhUVZsS1ptMW9iMUZTUm1WaVFXOXdjVWhIVkhKdGNGa3hPWGR4YUZOQlpqRnpNMUJhVlhoR1VVZzJNMk5KWTFsNVkzTktSV1ZqY2xoSk9FVTFTR3BsT0dwc1YwUldaVGRrUm05SWMydE1aa1ZqYkRCRFRrSjRSamhzVld4YU5VMXhjM0JyVVVoMFQyWk9PQ3R5Y1hKemExUndWbmRMTWtKS1MzSkplV2hQWmtKR1dtcEJjbTlhVmxscFpESnVSa1V5U3pkUWVFdG9WMU14VWpWd2FqaFRXa0ZpZG1SSU0wSkdhR3B6ZGtkT05VRmpXVEJCZG5aVmNFaGpSWEZaVW5wMldIcHJTekF4Wkd4UVozRnpjR2xXVkU0MlYxSmhkRk5MU1RNclluZE1Wa3B5UmxGRVFXZFpTbWMzVEV0RU1YVmpRVXBKZW1kTFQxUTROekpxTDNkUlZuQjVjUzlKZEVwVU4zRjVlRUY2VUV4a2RGZFpUVGxoWmtwc2NGVTFiVUp4TVhoVFNIRmliRzV6V2tscFZXOHliMU54U1V4dU9WbEdhR294Wm5sWldtaDVSMVF4V214WU5EZFROVm8zUm1OR2JIZzBSRzVUWlcxNU5sQjVRa3gwTkVsdGR6aDJVbUUzZERaWFJVbzRUbm8xYlVkV1RsSjNOamhSZFRGRU1rZDJSM2R0VDNJMk9WQnFObk5qUWxsWVRsRXdNV2dyYUdJME1FWlRZMWREV1RKWFlXOWtMMDVhTldaR1RUaEliemRIVlRkS1QwMHpZMkUwYVU1UFl6Sm1Ua05LU0RJMmMzQlFUbkV5YzFKMlFsaE1iVkI0TUdkYVkyOHpORzlVWjFBMmRqVTVZVGd2WTJSa2J6QjFjbE12Y1dsNVVYazBURFl6U0dScWFsRmxVRzFyTTA1M0wydFpVWEE1ZDFWUE1VZzNjMFZKYjFoT1lrYzVSbUpFVVZaWWMxY3JhRkpWZW5KQmFHYzBRMk42UzNNeVl5OW9WbkIxVlZSYWVUVnFNamh4Ym01d1pVMDBaamc1WVdOUGFWQTNjMlYxY25VMlVpdEdjRkJJVVd4NU9XcHNLMVF6ZDBKSU5uaDJWak15VUdKdlRXYzNWRGhyYjFRNFZYTlFlRTU2TlZKNFZFRnVabFV5U2xseFNIaFFkRXAwZW5KVldHRjZRbVJ0T1ZoaVdFZ3JPV0pZV2sxaVdYTjBUR29yTkhOYWNEZ3hNMHRrVjJFMGN6VXpNVlJUTmt0V1ZscFNSek40VHpaWk1GQTJRbTl2UTI5S1kxQlZWekZ5U1hOM2IxRnlUbWxtVDBVNFZIQjVORzFVWjNoWlFtczBVM0ZGZFZORlYzTXJlazkwYVN0dFJVRnRVbE53ZDIxa1VYaFZVbGxwT0N0RWNXSTBhVFZuYTFoYU5tZEpVR3A2UjNwMGVFeHFVblpUVldaS05FTnhjRlpFVlRSWmFqWkhRbTl1V1RKTE1XWlZjVkV4Ym14UE4xZzNjbUZTZHpSdVFWUk5XRGg0TUc1RWNUUk5jRWxqZW5kRmNqVlNVREJYVUdGaVV6QkJZbGsxYVV4d2JpOTJiR3BSY25saFVGbzNja3RrU1RneGVXMDVSMEZqTXpGVGEzUXpOV1E1WjJsUU16VjNWRVpRTUZKamJHOWpaMDFSYTNGc1JHTkRXV3hVSzJJclMzbGxkRmhQT1RkWmRVdFJXVTFPUnpWRmIzb3ZWbXgxYVhadFIzbGtURFZOYmxCSlptMU9WbGR0UmtoNmRXbHRTbUl6ZDJSblpGVkNNMGRESzJ0R1RuazJiWE5JWm0xUWNXOVJSV1JFYkVWbk9IZFBiRmgwVm5Oa1V6SkVhMVpIYWxaR01HZElUSFJNYzI1eGEyOXdOVk5oU2xoeVRYZHdkR3h2Y0dnMFJDdFZNRU1yYlRKb04zVnlRMHBZVm5KcmNtZDRXSEpwUW1kVVExVnBhM0I2U1UwemVVNWhXSFpxZVRCYU0wdG1ORVpyVFdsYWVFeDVaall5UVROWmRWSjBiVVlyWVRSR1dtVjVOQ3R0VkVWNVpVTk1hM05VVFVOamRsZ3JWWGt4TTFGS04ydzFUMWxCVUZaT05sRlhSM0ZQVFdwdWRsWlhVREJGVkdKRVYwSmtTME0wT0ZWblUzZ3JRek5qVXpOV05sVk5VV0Z3V1ZkV1dFbGhOVFpGUnpoM1NFZ3lhamRCYUROc1dtSk5UMWhWV1ZOU05XTTFVMmRzTlV0dmJuSXZUalp4S3pKUE1uWlBVbkVyY25aVFNrTkxLMGxaVUdkWU1GSlZWMUVyWVM5dFEzWlJiMWRwZG1sSWJrdHZkRVZuVkVOblVUSm1RMWt2YUVGdmFVRjVWSFozY1c4MU1uVkxjbU5YUWt4YVl6TkpUWHBHVWxwMlVHaDNPVUp5ZUcweFpXTXlXRmRxZFhGMk5rcGFLMU0zYmtReFZWQkxaMDU2TmtsaFEwOUlOMXBpY0ZWeVp6VkViR0ZCYkdGek9YZEZZamcyUjJSdFVVOHpURVZWWlRCclJ6Z3ZlV2czT0hoM2JURnRjMk5rUm1WNGRuQm1Lek5JT0ZRNGJTOWlRMFpHV1hneWIwb3JjbnAyWm1sQlZ6VkxSbVV3TVRGQmFWWnNORVUzZWk5WWJXWm1TSEZFVDB4dVZsQkZPVmd3T1ZsTWJETmpVV05tVTJoNmFuQXdWVkkyZGtwclFUVnFjakV6UzNWV2NWVXZSM0JJUWs1NlNuWXlNWGxNUmpsVFUxQjFRMjUzYVRWbmRsZDFXVXhOYkRaUmJFRkdlbGRVYVdKMGQyWnFiRmhSVlVadU4yaHJORGhUUWxoMVRsa3hLMU13YUVwRldXWnBObkFyVlRGU1UwNDRaRU5QWlU5VE9FdHBPRUptVVRKc1RtWkdTbmRIVmtaeGVqQmhkVVkzUmxad2NEUklZVE5LVFZCMlJEZGtVVlphUW5BNFJuVm9lV3hyTldjcmJHdFRXRkI0VGtwR1YwZHNaVGh5TjBseFdqSndiM1pNVDNsNmVtODJlRWRZYTNZeWVVRnhiWHA1THl0eGJFTXhkWGhYYVZRcllqZEhOSGcxWWtRMllqQkNSR0ZpYm5CbFl6UkhZMlZJWld4RFkwdHZaakJaU0hCQmVEQTBlSGt5ZFZOb1NUSTBOMU55U201YVZWUkplRFIyV0VsWFMzcEtUVUpxUW1oNmNFNWpiMUUzYkRkaU5tdFdjVlZVYUdjMmVHRnVZbVJUU1VwdE9FUm1XWGx3VEhCdksxSlRNR2hhU2psRVZsUm1kMmh4T1VaV01WRnZkV2dyVG5sWU5ubzNPVVpSZEhCMGFXc3JRbVZPZG5oNWRXdzNkelZHTTNCSFZrTlFNMVZFTWxsSGRFUXhlVkpsU3poQk5uTTJka3A0TVZCSWNWVlFSV3BYWlRCRVVWcDZObUYyYTI0MWJWaDVhMnBtVkRjNE5ITXhNbXBxZGxsNWF6aHZTV2hrWkROSmJqUm9jamRUVjJ4QmJXWkRVbXhpWmtreGVGWk9TVFIyUWtaa1dIcDViRlZCYkVJeVpsQTJTM0ZoUm1STk5FeHVkbUZOT0VSaFJWbE5PRE5FYzNoaFZYUkpaMDFzYkZabWJqVlpUbVpzWlc1Q2NXVndlRzR2VjNVd1JHcHNSbmQzYmtSVU1GUkljRlZHYldWNFFsTlRXVnBaVUdablJtMXJTVUU0VUhWaFEwNUVLMjUzZEVVclFXUXhWWEoyUW5jeWNqTk5UbUkwWm5relZISmFORmh4VUhCemQwWnhWVFpVYnpJdmNraHFVM1J2ZG5OUGRHcEViMWwzWldWc1FXSTFVV1ptVVVOemRXUlhlVXhDZG5kdk5HWnJSV1JLYUVkTU5sSkRkV3RWVnl0VmVGSlhXVlJ4VjFkRVNucDFRaXN6UTBobU4zWllaV3A1Tm04elZHZHFaMlkwWmpaRFpDOTBhVTVtYW1wRVZGUm1PRXBqZVZKUVNGQjRUMnBDZWtGcVozRjRXRGRMVWk5R1NGaE9SVlZoYzNFcmRWbEZUVnBCZEdwQlZXSlNTRFpFTVdaMGNEaFRjRVJpV1dGeldtZGFaVFYyYmpCTmRVb3pSMlJFU2pWWWFFOXZlbUZ2VlVFMlRqaERVbFZEU2pBeWVHZE1NM1p4ZDNJMFJGa3daRGN5UTFOVmN6WktiVzVZWkZGcmRXNHplRkZVTldsdlJHNUxibFI2Ykd0NWVpdHdZV0oyVUZaUGRra3pURGRhSzJodlQwMTBaUzl5UkVNM1ZUaEZSRWxXTTFVdllUSkRNa3hFU0ZBdlN6SmxaVEo1V0VSa1VtVjZVa2xwZVROdU5XWmhka05uTUZVdlpFbHlaa1JqU0RFM05VVjZOazE2VjAxQ2RVOURhM2h2Y0N0VFptTjFOMGRPVEd3eU1uTmxTRWRwUVdaaVl5dG1WVEZ0YjFKM2NVZFBPREpqUVdsa1QyUXZWbmgxVjFsM2IxTkVSemh2WXpFMlYyUjNkblF5T1RKMFkyWkhWakpyVGxaMlNXZExSbEJ1TWtONmVFeGhkMDFyVjB3MlZUSk9XRW81U0RKSGRGTndSbWxFWlZOMlpXOTFWMFpRSzFOTFNGbHpXR05SUVdSRGJ6SjVkVFpPYTI0NVNrRkpjVmxoVDBoTFltZHVOVVprZUdKd1dFWmpZbVpJV25OU1JUaDZWMnRsYW10MGVYSnFLMnBxY0hGemNrMWhhMmRETXpablUyeExUUzlvZVVKVU1HaHpaRVJpUlVOcVFqVm1iME01Y1U1T2EyNHlVWGh2YVRGbE5FRXlkekZwY1U5dU5XZHNSM3BNVW1FclZVVktRWHBUYUU1cldXbFdWbEJSWjJKdVF6QjNPVGwzTTBWMWRrVm5PRTVXUWxWd1NrSk1SekJVZGtsUU1GTlNjazV3YkdFNWFVOHhkalJaZW5sbmFWa3pOemhFTlhBMlFrNUJjbk5qWWtkaFZEWkhlREJvYjJacFFVbE9lVXhoYW1WbkszaDNhVFZoVjBKcE1tSkRORUo2VUc1TWFWWnJWSEpEUkVWV2NFcElSM0pMT0VjdlFXTjVUSE5uZW05cFdGSkJSSGxNVmxaRFltdDFVRWxpVm0xa1ZVYzJRVzV6Vnk5aU5qSlJkekYwTVU5UGVteFZNemhIYnpKT1UwMUJRVGt3VFhOQk9WbFBZMDh6ZURKRWQycDNNVEVyY2s5T1NWUjRTVTA0YXpsaFRFZEdjazlJY0VSM2MzWlpjVWxSVUhoSldUZzRRMkZuU0U4MVdVOVhjWGRyTjBJME1qSkRaWEE0TmpJeVRqZzRaR05PVEhkU2JqSk5WRFEzUkZKdlIwZDJZMEozZGtodFdtVnNWMHQyVEVvM2JreEtSRkZLYVZGMmVTOTFTek5GVTIxcGFXY3JkU3R4ZGxZNGJEbHBlazl6YkhacVprcHRlRFpQY0dSMVNrVnJORVpDZWxKakx6UlJTSEEwYWxKS1oyaFRUWEpLVlhWdmNtczNNMnRRZWpaV1NFTldObE5QWjFSaGEwWXlabFZCVW05UVkxbDViMUZrUW1KMmVVTndOMUpVYlVRdk1UVkhTSE5EU25SUFRrbFBLMnhaVVVwcGRtc3hUMGhIWkdadFEydElXbmRYWVhvNFQwRjBiVkJYZFd0ek9XSXlWR1EyVTJoT2NDc3ZORGwwVEV4Vk1IaHlXV054VjFKR1VtTktXVE5wY0VOdU5HOU1OMVpoWVUxSVRWVkJXazlDVWpGUWRtSlhLekJhYkZSWVEybElWWGhVWm5OQ2RFWlBVRzF0Y2psUmFIY3pNbTV5TkN0UE1WUjZVRUY1UldGbWJqbGlZMWRWWm5CMVdrcEhVMmxYVG1kb09URnFUSFk0VUZWSE5qRlJNME5KZVVwdVNtOUtObnB0WkhacVJFNDBaMk5CYldSR2RHUk1hM0JsTVRGeFRFTnlMMnAyUkZwVVF5dGFRMUowVkd0d1EwTlpOMmxvVERrNFZrVjJSbGRXTTBVNWFHeGxRbVJvYjJsS1ZGVkZiVmxxU0dkalEyOVhWRkpVVEdwMk16Vk1VVFIxYW1neVZuSk9ZbmRvZFZsNU1sSmpRMGw2UkUxQ05YVnNSVFJtU21Vd01sVXpVMWh6SzJjeVFrSlFlWFpFWjIxd2FXMTJOSGhqVm1OeWMwZFRZVXBoUVdkQ1JXVnNaRUo0U25CRGJtNWhXRUowWkZKT1UxUjNhbkI1UkVrdlpUZDBTV2w2S3pONk1GQldjblJCZVdsU1lXdFBUalZuVEU1UFUxVmxOQ3QwTTB4YWVtcDJaV0ZNUWt4MmFEaERVRXhZV1V4T01ETkROa2hFVmtOdWVHaEJURFpWUzFaMU4yRkRhbUpKUzA5T2QwSm5RV2h5YTJOcWJTdFJLMGRQUzNkeFNrOTZkWFpUVjBFdlVIQjJkMWRWY0VaMWF6ZDBTWEUxV21OaGVrWkZSMEpwTkhwcVlVMVBjMDVGTlhGblUwcHZibW96TkdOdFRYaDBZVkZ0YzFkMFduZEJjbUZ6WWpoMWVtZEJjbk5KZW04clJtWlFNemxoYWtRNFJFMUdaemxTSzNaelVHZFpSRlJtVkdwM2VFVkhNR2wzZDI5a2FrRXZlbFZEVlM5aWJqUXphVlJQT0dOS05VbHFSMmdyWlVrelZsQk1ialZXY1dkUWJHaHdZalpOT1ZKVlNsWktRaXRNV25sVWNWQmxlRUpGVnlzMVptSlZhRmRMUjNscGVIbERVMDVXZWpsQ1VESmlRMVJ3Vldkd1lqbG5lRkJPWWpjM1RXRkZiVGsxVXpWR01VNWtPVlZ4UVRGUWMwaE5ObGg1UTJGT01FbENla2QyYVc1c2VXMXplR2RTUlhkTkx6SlpMemRuTlU1UlMwZDFjbGRzVDI1blJtSnRhM2xITmtFeFVuUnFVREEzYTJnNFZHOVJZalU1ZG01elZtbFlNbEpHYTJaU1FXMDRkWHBpZWpZMlRYVTNVa1EzYlhSaWMzTTRPVkZqZGtaNlVpdDVVRWRDTjJ4cE0zRXZTV2MwYmxWeGRHVjRTbmRHWTIwcldXWllSSGhzUVhseFpIbEJkV2hOVUZGMU5VMXZPV3B5YXpKbWEzaHVia2RaUTJ4amNVNUxOMVJIVFdaVmVHTnBZbXBXWXl0amVGTnRWRVp3UXl0WFFreHJRWGgyWlVGNFFXcGpLM1p3WmtFNFlqZE9ORE5uVjJ0eU16bHJjV2huZVZCelNUVTRkMG9yUlN0Uk5EUmtkWG8wWlRkRGQxWjRjRkkyVFhScGFrdzRVRmd5YVVzd1pXNTBTV3B6VDFBNWVrSkdNRTFsVmpWM1VEVlNRbVpsYjA5a1lpdFFXakI2YmtOUFZXTlpSVTVqWlU4eU5rZFpiM2hJSzBSc09HOUdkazU0TWtabFdEQmFjVGhSVjNGSU1ISnRSRXRQTlc5RGFIQlhWeXRRZUROdmFtZHVjV0pSYm1oNlFtcFdWSHBZTjNCVWFEWTNXakJ1UVZWWFYwTk1NR0ZDYW5RMmNHdFNiVzVYZUdGWWNIUlVRblJ4VGpGTlJXaDJUM2hYWW1oRFltWTNSbTFKTTJFMWRITkJhV0ZTVVdVek15OW5VelUzZG1Gd2NYbDJXVVZNUWlzNFVFOWhNbkY2VlZkQ1kxRmpjRzEwWkhSaldXcGpVVTUzSzFoYVlXeHdRekkxVkVkcVRXTlZNbTh3UkhJemExaFpjV05QYUdOT1lrNXROa1p0U21oR1VVVXpObk4zU21ocVpWQjZRV2xvVFd4cFMweDBNMVZHWW1kaFRuZFliM0JyTUdWMFNUWmhUbTEzWm5CYVlWSjFSVE5sTDNwbWFFRm5la3BIUjJRM1VWa3piR0pyUlRCd2JtNVZLMjUzYlZjd2NTOXljMGhYTmpSYU5rbHVPV3gwV2tWdVduUkNVRzB2WW10UWRGVlVXSEpOYlZKWFRrUk9aMHBFYVc0NU1pOVJUMXBJWkRWcVNtcEhhMGN5TTA0NE1IVk5aV1oxT1haTmVWWlNSM2QyUmpoWk9XbEVSa2tyVFZOcFVsa3ZXRWhMV1Zwc1pYSmpNMWxrYVZOSlRFVkxMMjEwUkZRd2NHNWlURFp2YkhReVkyWmtUV3B2UkZNek5tdDJhek5WU2l0Q1JFcDNMelp4UkVOUlMwMHpUelJuVVZZM1pteExObmc1TTJOSGNHbFBVakZ0Ym01RVJ6WkpWMnBUY1hCSFdWSjVNRTVwVjNReU4yd3hRVWg1Vm1NdmNqaGxZVkV5U0hjd2F6RXJjV1pNTnpKNVdTOTVOVXB5VVc1TlVHZEZhRWgxYTFGMlFrRTVibEZVUjJaaGEyeE1halFyWkd0SVNGTnVjRmMyYW1ZM05IUk9TMjF1Wkd3eGVrbFBTVlo0VW5KQ2VWRkJTVkoyVURSdlpGcHRWMVpXTVdVMUwyUmlOMWQyVWs1M1VHdzBVbXRxTDFGWEwzSlJVRXhUWVdoaVNVSkpUazltUkRoR2NuTkNTMHBPUlU5aVdEQmthVEZHTWpsRmRUQkNWakJ4ZVVsTmNUUklNMmQyZVRaUGJqaFJSMHROVkRaRlpFWTFUV3RTWW5neFJHdE5SbFZ3YkVWRVQzY3diMHhRZERKWlZrMXhTbGsxVmprdlJTOTVNVWx6Wm1oNE1ESlRaM0k0ZW5GSWFXdG5TMWxsU0V3ck9UVXJORXN6VXpsM01tcHJkSEZ0U1ZGMVRsWmpXVVJqZW1sNGFWbHJaR2RYVUhsa01WbFpaazVHYTI5Q2VIQm5URWhSVEhGdE9VdGFRVFZOZUN0SVJtSkplVkpKYVVaSFVYWk5iekIzZDBaYU1sVlNVMlZ1UldKd05IWjRTVFZxTDBSalZFRlZhbloyVDBGM09WTjVOVlE0VDFOSWNVOUJla0p5ZHl0cVdVWTNkRkIzUjJkbk1uQTVRVFp6SzBJclozTXZlVGc1Y25SNlNGbEpWa1pEU2t0clNrUjNTMkZHVUhRek1rUlZTa2hRT1dOR1JsTktZVEJaWVVWNmMzUmtiamhoYWxSVGMxZFRWM1p4VVdJMlkzcGhZMFZ4V25sbGFsTlRPWEJqVUdWSGRVRjBTV2RaVW5kNE4xWllUMnRWU0hCUFN5OUxUVmhXZDFKTVpXczFSa1pQYURkYWJFSmhSMG94TXpVNGJEbERkVE5DT0dkQmNqQTVZa2hhT0M5MVpISmpNbXBaUWs1TE9WTnlTWGd5VlZsb05UVXdkR001Ykd0a2NraE9UblZJTjNOeksyNXdlVWt2TlRoSmJWWnBjakF5WkhkV2VTdHpaR294WVVFd2JrRmFkMFZoVldWblQyaDFWV2h3U0Vad1RtdGpVelpDYzBaQlZVRnBWMU0wWjJSS2JtNVViMDVsU0RWbksyRlVlbkUwVFhwbFJWRXlSR3MwWms4NFFXNWlPSE13YWpWUU5VeExibUZqYUhwbVVubHVPSFJ2YlhSUGN6aElaVWRaZFVGRFNESTBOMFIxV0RBelFpOHlka0ZNVFhGaGFVNWhUM0JQVXpWUFIzUkxSMVp3TTJKU1JGRkJkSGh3VDNORFNXbHZha1ZNVW5CWlZrcE9iMnhMTDNjNFptZFRjVE16WmpCbGNpOUlTV2hFVmxFdmVFSTFZbGRrYlZGblozcENSMFJOTlZaNU9HWlVSV0ZSVkdSbU0wUjZWWFJIU0hScE16TjBWakpuT1haTWNESmlaVTFSZVVaQmVXWlVSVE52S3pFck5uZHVLMVJNYTNWSVIyRjROVGxEU2xSS2FGSkNRV2xJUWpOQk9GQnBlVFpCUmxJMFdIRlVOM3BXVUM5c09IVnJVU3RvU0ZkS2FraEZWV1ZRZUZwTlExUnRVbFl5YkN0RVREbHJVSGRrVWxab1NYVjFRMnBOSzNkTlN5OHpZWG94YUhKWVRUbEtXbVZIWnpKSlVrMUphMlF5TWpFMFNHWnRjMjlJZFVSMVNUSlJjVGhCY2pWcFNGWnhTMVIzYzJ0bmMyMDRiWFJSYzFndllqRlpMemRRVEZBdmRITjJkamxzUm5Zdkt5OTZMMlk1ZGpoMk9HSkplRVk1VkhWQ1ZtcE9aa2hFY2pkRk1WRkxWR1JLYlhsSFJXOU5Razh6VFd4bkwyMWpSa3d6UmxWcFlYVk9lbFUyUTJkM1VqUTNZVkpqU1c1eVR6WnRXVzF0V2xNMFRWaFNZMGhGVFRaUmN5OVBSMGhYTlhCbWRVTktPWFpOV2tGblozWjFjR3hSYjNsNlEybFNXR1UxVkU1RVVGWlhhRkpxU2xCNFR6QkxhUzlJYjJ4TU1tSm9TbVZXVlVScVp6TnVXRFZ5VEVzME56TkRabU50VW14bllucFVMMG94Umk5cU1sSmhMMmhNVTB4blFUQXJPSG80UkdwWWNFVm9OR3BGUTNWWVJuZG9Sbk16UkdRMFdtcFBXWFJvV0dOVk1VZE1kMkUyVTJGaEwwbFBZaXREYkZJNUswRXhjbHAzVVN0Tkx6RlZXRVIyUlhGTk5IWTJWa2wwWjA4NVpVOVdSMjVFTkVwUldHNTNhMmxtUlRJNFRpOXdZekZWWm04eU4xWkNUbmx4VDJWcmIybFJMelJtZGpaQmRqVkZObEV6ZVhKTVdqRlZkVkphTWpaSldsTkJTazlUV2t4T2MyMTNjbkZMU25kd1NsSnhSbUV6TkRFNE9XbzRjRUZvVm1sSU0zSndVMDlWWTJneE4zTktabkpEUlZwTE5sQlRNVnBOVkV4RlJYSTJkRVptS3poa09IVjVXblV4Y21KeFNXdFlNWFJPYjBsQlZuUkJaWEo1Tkd4SFdsRnFWRXMxUTNKNGNsbGpWbmhDWVRSR1VsQk9iamcwTUc1V1dUaFBNRUp3Um5WaFduZHBXVkZNZG1aU1NqRjFaMmxhTlRsSVVGUmpWRlJITkhaQlFrNHZWVGt2VG0xQ1dVNTJRM051VjJSbGVqazNSVWRIYTNnMFVUUldNR0V6VjJ0a1dGaEhLMUZ5UzFGVk1GTlFOM1Y1YzA1NE5ubEhXRkY2YWpJcll5OXdaVXBUV1VOWWFGVkRaV05tZWpkU1IxTkVVRE5CY2tjelQzRXJPRGxaYW5aME5HZGpRelZhVldSYU16RmljWEJuVXpZM2NuaFZXV1F3YVVKRFRGbE5jbmxRWVdFemFHeFdUa1pITnpORWJrcG5TWGR2V1U1VllVbzJlRVJGVDFvemNIaE9WMUZwTmxsc1NVTmtOVlJaV1RsMlEyUnhlbTFNVnpOTFVFMVpaV1paVmt0a1NIVnpkVEpDU0ZsMloxWTFjR3RFU21wTk5sbG1ZUzlsVUZCNlUwWmlVVTlYY2sxYVFsbHJVRUZWU2psVGNVOU1hRWxOVkdOWFZTOVRjMWxYZEdwNGNpOHpTekZoY1U1YWFITXlPSEprTDNkUVEwcEZOa0p1YUhKSVZYZGhOR1EzUnpGSldFbExVaXRCVnpGTmNubEJRUzlvYXpSelJGSjJaVEozYTFoMFVGWk9kRGxDT1hkMFlrdHdiV0ZqVGpaSGNFMDVTR3BtTmswNFVYZEtTbTF1WkZKME1qQnVNSEphWW5kdWNuUm5hM1JuVFRRMWJWRm9Rek42YUZGa1RtNDJkRGh4V0c0eWNHcHhSRzkzVmpCdU1pOUdiRUZNVVZOblptUjVaRkpUTmxKME1FdHVaRkJRYVVKUFNWVTRPVXRuYlZFMlNYbGhhVVV2YzBJNFpuUnVjMDl5VFdObU9WQlpkVzlaUWs5RlZraG9iblZDYkhGVlkyMXVOR1pSTjNZcmFHZExNVGM0TlcxQ2R6aGhXSEJvV1d4VlFpdFZlVGhxV0VsRlJDczBNV3hoZFhjMlVFZFlNVk5XY0dKeGJHVXZlVzltV0ZkaE9YWnNRVVZhVUZaSFRHTTJhbU5FV0ZOMVVIZERZWGxZTURscGJHaFJORkZvZDNaTVdDdG1UamRUYVVoblEyNXhPRzgwZWk5a1dUZHhSRXhDYnpkdlNVMUtablZrTkVwQlQwc3lRUzlhZDBwd05Vd3JXRlZGTWxSSWNtbEJOMk1yWjI5SE5WZzJTbkp6TkZWMlNubFdZbmR1TWtGT1ZVbHZOVXc1VGpZelJXdzJUMUEyY2pKTGRFVlFTVWcxTVhkRmR6RmhaeTl5VUdsRWRrUk1Ua2RQZEhkM1NYQlBSbGhQYTNwWVdsRTJTMFpDTVVsRE9GQm5VemN6VlhCbVRWaDNhbWx6Tm1weUsyNXpXWFZyZG5kemVsTlFVR1JIUVd4WFNsZG9TMmh2U0RSTmFTdHJWbXQxWkVodkszUmphVzlSUW5oQ09XUjZjbE5LTmk5ck5IcEZkMlJUV1UweGFUVklVRGN5U0ZwVU5rMTBXVUU0UzBRM2VUbEJaVXRuU3pkTldYUllkMUpoTmpaMEwwaGtia2xTU0ROV2NFUjBkSFpVVDNVMWFYSlBTVEZtYW0xaFJ6bFFOVGxtZUhNMGQyWllRakF6T1ZFeVVraHZRbFJXVTJWd1l6VXdhbU01VmtOcFFrWm9lRlkwVHpWRFdHZFZhMFJ2Ym1SSk1uZHRNRWROVG5CWlJtWlpkVU5TV1VScllVcGpLM0UxVTBoVlkyWndXVmwwZGxZMFowbExiM0ExUlc5VVZ6Qk9XbXR6YWpWQ1kyUm1ZMWRRTWtGa0sweDVZbXRSUjNGMFJrcGFWSGxqWjBobFMweDRTRmt2VUhwbVVXaEJRMjFUV21KUGQwUXhhM1pNY2xSalZrVlhlRFZ4T1VFM1VYQk5TbmhtWkc0NWVYcE1UbFZuVUZweUsxcElNeXM0VjFScU9UUnhhM056TldKNFFVbHFTM1V3WkhKbldUUjRUbWdyWTJOa09FSnphbmg0VWl0UUt5OVhVazFpV0d0RU5FUlBibTlyYUUxcFdUbE1iekJFYVdaU1FqUnRNVkF4TlRaS2QzUlhlamxXUVVkaFZsbDRiVEphV2xGc05IZEhTMGR4Y1ZoaFZsaDNZbmh4Y3l0WFRFSnZjblJPZUUxcVpFUldUMU5MVDBnelJXZHBWRE5xUVVjck1WVmtURFJsZWtSbGJsRjJZakZLUlVaaVVscGhUMjAzUzB4QmFVWjZaV05yZDFoclprcG5Xa0ZOZVROUFdYUTNkazgyWmxoS2JHRnpaa1poZGpSM1pqbFBPVXBxVTBsNFJrVlhTSFVyZDBSVEswbzBWRm8wV25SbVQza3JWRlZQVWtOdlRXNTZaMWRwUkhKVFR6ZE1jM1paU1hSWVV5dENLMFZOWVU1cVEyaHVVa1pyYkZaaU1GQlZhMGh0VVVaRVRWTjBNVnBFTkRkRVdtWllkMEl2UmpOTFIwdzVVa3R4T1hBelRuVm5NbEJRVXpSSE5DOVpkMVJFY0hsWEwydHROMUozU1hWdlVWcDNSRVpHVkRNNE4wbDFWVzB6VjBOaWRVeHNkblJpVUZnM1pVdDNNMjFoZDFKdGFFSlNWMFZQZW1oNk9YQnFSUzlOV1VNMVRtRnZWamxYYWxNMFZsRlZla2RKVGpscFNtazJjeXMwYlRZMVlVYzFRVFIzYWpKVEwzQmtUVm94UVVwTlNrSkxhV1UxT0RBdk0ybG5OMjgwZDNJNFpXZHhRMlp6ZERWTmNHOHllRWxJVGtWNE1tNVBPVmd6Y2s1WmNUaEhURXRIYURsT2MwNVNiVkZGZEhkWVkwUmtia3h5T0dwSmFqaDNUelJGWWtoTWJsWkdkMWxrZUNzdmExaEtTMHhFTkZVM2JtcFVla0ZYYlM5cE4yeFdhelJNTDB4WmFuVlFVRTl2VGtWdFREVXJWSGQ1Y21wU1VqaGljR2hYV1UxbVVIcE9kRmRFYzFaQk9VVmlaR1J3VWxnME9ITmlVMDVXUXpoTlVuQjNjWG8xVVdSNGFqUTBTM295UlhNd01HWnJUR3REVURaNVRrOUxRbEJqV21kNGNtSTVaM00yZUU5SFdEbHNPRTluV2xvd1IxWnZaVE5aUVdsVVdTOTFhVVJNYW5Wb1ZXUklhakpYZFVWUE1XMDJZekI1YlZGUVZuaFRWVnBqVGtoaFJuZHNOVkZpT0ZwUlowNVZhbGxVWVdWaFIyMUxVbnBZY1dKQmQzSjFTRE00UzNSeGVrTjVZMGd6YUU1VFFYQTRhR3RuTnpoQ2QydFBhSGhCVTFBeVZHSnZNbVpVVjBKb2JGVkJWRlJ1Y0cxMlpVWkZka3BsVERRd2FFZEdjazlxYjFSVFIxbENjekZuTDFabVdGaHlPRmwxZUhOaE1XSm1VM1pZUm1kV1VEbHdjWFpQYlhJelVHSTRVR0U0VGlzdlNYZEZUMHg0WWxSamMzRlNhMnhCTVVNNFpXeGFaRXhSV1VneFJpOWhNV0k0WkU1TGNuTnVRelJ2TkhvNGIyOHZlSGhWYW5oRFVVUTRVVk5DU1V0S1dXOUZkaXMwVWpSd2IyMTRSbWRPYW5aQlpIQXdOR0pCVDFsRk5rWm5TVzVZU1VWc2RVMWtaazFWWjBoeU9UQmlSalZuVHpkYU1HYzFiak5PTm1WR2VXeEJjRGgwYkdkMVlVUnNSV2h2WWtSS2JqWlllQ3M0Um1oNFFsZEpaa0pLVEZKSE16VmxhRVI0UmpBMFRWbFNPVEZ5TUVneFJUTnRSamhrYWxKR1JXOXBNRkIxYW05UmJrbEdRV2g2VDFSemJXdHJhRkZuUmpWeU1XNUlLM016VFcwMmNuVlJOM0ZLVkRWTkswdHhUR2hqZFdOS1YxaDVaa2htVWtwMWJFUmpkekZOVDBkU1VFVkdhVnBsVUc1SFVHMDFXVmxYVTBwaE5TdG1SelJaV0dwa1R6WndOMGRWSzJWS1JVSTRObXgwUjB0T1FVMWlTVVJTVTNJNVJraE5Xak5ITjJkdFRIVjNZemd6U0NzelUxWXZOMkl6ZDJSR1dESTFTM0pZU2pVcmQxZEJTa3RaVm1WbVNHeDJjbEF4VWxKSWJGRTRMMGxrYWpocGVGQkpaVW96Y2t4U01UWTVPRmRxTmpOVWVHWjFlalpHVkc5WmF6ZE5RM1JOYVVNdllXNVpla1JpWVhkeE5VVkZiME51Wkc0emRFbERhbTg1VUdzdlRVSnZjM3BpUjJsTlYyUlNaemhhY0dFNVFtTnlaRVJ5VDJGc2VsZHRObTkyZEdWVVZHbDVlbGxVZFd4QllYTkhZMjVRWlU1YU4yWklaRFJQYjJWalRXdzRRVlU0ZW1WQlNtUlJWRXcxYjBOV2RrOUdSbVppUmtSeVRVVkJZekpWU2tzeGRXZHJiaTlEZUVwRFdVSlBiRU5hZVVKMWQwbHRTakpYYkdack9GSkRaRlI0TW5KUVRXOUJWbE5pU21SNFQxbGhNRmxLWWs4MVZVZDNjbkE0UjJ4UFMwNDBhazFSVjJkdFdHUlpRakJHZEc0MFZITXdNU3QyWlRKQ0x6SXlXVEpCYUVwTVZFcHBTbXhFYm5KSWNtVk5hRE5TWm00NVZtZG9UWEpuVm1OdU1uWjNaRzh6TTBrMFJXeEVVVzVLSzIxdlUzSmpha1pPT1ZVNU5HTjZPR0Y1YmpWbllWUXJNa3d4UW5SNFpWTk5aVmg1YlRCVWJqRlNXaXQxV0hsdVUyTmhNVFo2ZFRoMFRubGhaMHBxU0ZsdFdWTmtOa3huYnk5RWJrUlFja1ExZFhacGNFdENVRWhEZVd3ek4ydEdPRXh1T1hGNllXczNNV0phYW5WMGJHc3lSVXMzZWpkS1QzVkxTa1ZwUVRsaWVVWk1jVlpuY1V4a1Z6WldZMmh6VUhGaUszaFhSVXBYTm5ZM1RuRTRjbkpFYTBSdVJ6Wk9lbEJLV1RCTFprdEhVV3hTUlVaRWMwZHZXWFJVTms4NVdsSnJTU3RwVUZnME0wVXdTa1l2UjI5dlMxWTFXVUpqV0hCVFkyTnJSVFZKT1RZM2JrRk9TVmhCTDNRellsbEdVM0ZCTUdsbU5HMVFNblIxTWpsUFdXMVZjbE4zT1dScWVITlFNbTB3VFRKaVJ6aE9ibTVaVHk5TFYzTjJiRWhQVkd4WmNFTkliRk5PVm1KclRtNTZibEZVVEZoRVVFOUVSR2haUzBKdFJVVlJha2syU2tFMVlrVjNOV2xPU21adUswazNhMkZpWWxKQ1l6SmxWSHBxS3pKYWFFVkVTWFptUjBkcldFeGhSME0wZUdFcmRqQjNSVkV2YVhOMGJHMVhkbXA1TkhkbVFYcDRla0YxTDJKc1FWVXZRVGx6Tkcwd2RGbDBTbWg1TlVWQk1GcHZSME5OVVZabmVHbDJLMnRWYkRGTVNVeDJPR0pxVFhkTVkwRXlWMHBqTTFwS2RWVlNWRE5DSzJJclUxUkNkelpIUjJWTE4yUnViV05XT1UxUlluZFNTVmxzZVZVeFUzTlRibWRsTDB4U09UazFha3R3YzNWRVNscE9WVWQyUVdzNWJFcFRSaXRtZUc5cVdqVlJTVGxpZEdGUkszWjBVRGQxZFU5cmVURlpTMUE1UWpKNVVVWTBZMlZIYTJadU5XcE9VRU5JUWtKc1dUTTJkMFZ5ZUd0RmJGbDNVVzk0WkVwbGN6bHVOemc1Y205UWNTdHdNMGxaY1VWeGNFSmxNblp1Y3l0ek0zUXZWUzl5ZEVZNGRuSnhiRk56SzBoVlRGQmplRXBrVnl0emFWUkZPSGh4Vm01aVFqRmFZM2N6VnpOblZ6QlNWblZIVDFsTVlqaFFNRmR1U3pKR1QyVjVWVGR3UVVkYVltSkRNemczVFU5R1JHWnNkSE41TTFoMlNXMXZTMHRNYUc5amVEa3ZZVlkzYjBOQ1RGSTBMekpoUmpaSllqazBhMDFvVlU5QlRWbHlkblpEVVhoR1pVUnBLMEkyUVdRelExSnFRVWhKU1VoeU9WbDFTVmg0U2tkbk1qQjBUVFI1WlM5UWNrTlNOblI0TTJaTGFraEhjek5TYVZsd1RtczRjMDVoYWtoMVdGRkNPQ3RaT1dNcmJ5dDVWbUkwYXpnNFRIaG5Va1JQZUM5Q2MwUm9Ta3B6YTJ0d1NVb3ZUa1JFU205dWJrWmxTelF4Uld0MlVVb3hXbk5yU1ZCNmNHbERla3hzUkhkbGVUQnpTRmxPWTBkcFRGRllZbnB6WVZGdWJXWnhWVGROUnpWWE9HVTJNbGRPUlU1VFNGSTVSRUpCUW1aaWVWaFJXa0ZLYVZKNmNXOU1ZVWN3U2s0M1VsUkpaVlpUTkhSeFl6VTNTa2N3VXpSak5EbDVjbVJTUmtSSVZYSkVhbWRqVmtVdlZrVnhNSHBwVDJKblprRXJaSEZqUTBZMU5HRTVaR3RRVldsYWRXTm1lWEJPWWpGdU4xcEZVemRKZHpCdWNFbzJORWNyVWxNeU5tSTJNekpUY0ZCRE9HOW5NR05FVWpsd01YcFpLMlZQWm1GNlkyMXJXakVyTDAxaFltZFVXbTlVUWpKc1puRllkakJFVkhSTldXZE9aMFJCYUZKV1JuSmpNak41Y0RCS01YWkJlVk4wZEVVM01rdE5TVmc1YlZWVloyaEZiVXByUlRoMlRGRTNiV3d5UzFVeVIyeEdMMUl5VDNacGRERnRWRGRQTm5GaFZGUTFZVVEyVUVaU2JHeDBiM3BVVjAxdmVuRlJlQ3M0Tm5WNlJGRnFlRWM0YTFaak5EZGFRbWwzYlVOWFZWQm1lbGg1UlhCbWFtZE5iV1ZWWmt4TmJFMUNSRkI2TjJSU05tcFpVbXBRUkVWeFZFSnROMFJVU1c4NVpXVjNSbGgyTURjeVVsSlNOSFZ2TDAxUFdDOTFlRVV2ZDA5YU16TlZhRWRrWlRrNFRVOWlkelV2UlRaYVpFZFNPRXAxY3k5eVNGRTVNWGR4ZUVVeWRDdHFNbHB2ZHpGaFMxY3dSbVJXUkdwelRsUjBjMjk1TjFSUGRGbDFUM0ZPWVZoVmVsRm1jVkY0YmtKTE1tdzFWbU01UmxwdUt6VXpOamxJUTBkSFoyeHlRM3BZYzBsV09VdHdhazVHUjFSVE1UZDROa1p5T1RobVRYSkZlRmhOU20wcmJHUkxTRXQ0WW0xcGVHNDNlREZ0ZFhNMWIxcEZVSHBaYlUxMGFWaFBPV1p4VFZOSEsyeFhkMkp3WW5jME5VaGFkMXBJV0hRMmVETXJkblYxUlN0V0syZDZkazVTY1dGcFpVc3dkamhrU0Nzd2RYYzBZWFE0Yms1cVEzYzBkRTlHVTI4MU4zTXpaSG8wYTJ0cllrczJhWEpGYUVoT2FUWnZPRWxUY2xkWVFXVndTSFl5VGt4dmFXd3pRbXRCUm5jMFJIZG1VazFJWTFOTmRVdENTVFZ3ZVdzemJUZENZV0pSYlhRMVRIVm9jRXRtVGl0dmIzazJTMEZLWTFGVVNqUjJjVVZCWm5veWRVTk9jRzA0UmtocWJtNXpaemwyWTBsMldYTk9Va05WZHpablprOU5jVWhOWTB4RFRuRlFURk0yWTJKcVRVdGFTbkJLVUUxcFVHMHdRall6VGtONlZGaElNVVZVYTBoaVZsSkVZMUJpYlRWWVlURlJaM1JGT0U1WE5sWndkMGhHYW1GTVYxWXdWWGhuUTNCNk9TdHJLekJGT1hGUFEwcFZWSFp0U1ZvMWMxQktPRXhNY1ZrMk1FMDVhR2xMZW5kVFprZExTR1JpYjJObU56SnljM1ZrTmxscmFIRjVUR296U0RsbGNtbE1VVXBaUmtaUGVreFFWRzlHTmxSWVVrMHdRV05EVFhWd2NIbzVSSHBITjBoU1UweEpjWGcyYTBwSk5XUnZObUUzTjJad1RsQndMMU5ZVHlzd2FXTjBjRnB6YkZKM1VXOXRXR1J6Y0ZaT2N6RTRXaklyUVRaRk5GVkthbEZHVVdaVE0zaFZhazkxYm5OMGJYcFdOazg1WWtVd1VWbDVTVU4yTVhaQldTc3JkV1JKT0ZSdVMyaE9iak4xU0Rsb1VHOUtkMWxhYVZKRVdsSlNSVEZMYVU1TWMxQnZRa040VEdJckwzUTFPR2hOWTFBME5XTm1TMlJqUmxoMlUzSm5lRGhzS3l0UWJtaE1aVlExUkhRMmJFMWhZMU0wVUVwVFdUVkpOVXBLWVRaTk1WQXlVVVpEUmswMVdWUXhkWFl2YjFoVlR6SnZhalU1V0d0cUsxcG5SbVZxTm5OTlJVdFRjbFJUZVRBeFRHaEtlR2RaVG13eVdHSkJiR2t3YW0xS1pWRXljVEEwVGxFdldYUlVVVVk1UzJOVWNVTlJOMGhvWVdwek1YZzRRVUZrUkhCQ1R6RnpUMnd3TWtsTVpFWkNTa052VEVKSmVGTjBZVnBGVkhwMmJHVktSR0p5YVZNd2RUVjJjMmRVVmxseGNFUXJkMlJ1WVhoNFVXeG9lR3RKZFhsTlkwdzRhV2d4TVV0bE1XeGFOM2x3YW1Vd1pUbHFPSFp3WVhNMllYSnpVMWxrT0RKMGJ5OTRTVWxDV2l0M1QyRllTalJ2VFRoVmJtOWpXWEJvU2pRNWRXWk1hSEpwVmxsNFJVcG5UR1JzTUZsekwxVXJRbmQxTXpaMVl6VlhibloyZUdsemJGb3dRaXRZU1hWalUwMVJRbkpTT1hwTFZIUldhVWsxV0N0NE9XTmphSGRKWW5GUU5sUllVMFZRV25ka01FVkNSRE5sY0dkSmFESXZhVFJpWjA5R1dWVkdUV0ZNVm5Oa2MycEhUR0pWVkVReGJqTndjRlY1UVVveVJHWkxjMjVrTVc5U2JrMVBhM1J0Y1ZBNGNEWlRVVkZhVldsaFUxbGFNelpTWm1Oa1ZtbFZNV0puUmpWQ05EVnROalJTYm1kT1oydHRNSFZTZVhCT09HcG1hWGt2YVU5bUwwWkdURFZ3VUVwVWVGWjZMMlp4V0hsSk5TOU1la3BVVEhwdUwxbEZURVpFYW5JcldFdElkbGhwVURZeldDdHFRMVZ1YldZdmJWVlhkaXMwWlhCalUzRXJZelUzTTFkU1duRnRiMkZCWjA1TldIUm5aVTE0ZGpWMlZEVnVUMk4zV1ROdFNrSjZSa2REZWtkRFkzcEJVVmt4V213ek5GWXlVVkJQVDNnMWRVWnVTR3BQUmtSSWNrRlJQVDA9IikpKSkpKSk7"));
Function Calls
strrev | 4 |
gzinflate | 4 |
str_rot13 | 4 |
gzuncompress | 4 |
base64_decode | 9 |
Stats
MD5 | e610f552bbff42896cd5e9c957acf053 |
Eval Count | 3 |
Decode Time | 120 ms |