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 $_F=__FILE__;$_C1353562110='Pz48P3YzdgoKbnlPVVUgbWswNVR5a20gewoKLy8qKioqKioqKiogcEFN..
Decoded Output download
$_C1353562110=base64_decode($_C1353562110);$_C1353562110=strtr($_C1353562110,'bA8cO9diKptm1JESwI2ZLGjlsaMy3nBX6UYWo7QfhPgFTk5rzxCuqDeRNv4VH0','JA1xaCvmOVnw8dLtSQ7DZ50MjYRlhc2z9sgiGeTBFy4UfokqH3XIPNuEWpKb6r');$_R=str_replace('__FILE__',"'".$_F."'",$_C1353562110);eval($_R);$_R=0;$_C1353562110=0;?><?php
class workflow {
//********* VARIABLES ***********
var $db;
var $builder_id;
var $project_id;
var $step_name;
var $role_master_id;
var $primary_user_id;
var $secondary_user_id;
var $target_days;
var $escalate;
var $workflow_title;
var $status;
var $created_by;
var $current_date;
var $current_date_time;
var $obj_query;
var $return;
var $line;
var $sth;
var $record_id;
var $master_id;
var $imfields;
var $a_builder_value_id;
var $a_user_group;
var $a_status;
var $updated_at;
var $created_at;
var $updated_by;
var $a_role_master_id;
//********* CONSTRUCTOR FUNTIONS ************
function __construct($db) {
$this->db = $db;
$this->parallel_steps = array();
}
function setCronStatus($value) {
if ($value == '')
$this->cron_status = '';
else
$this->cron_status = $value;
return true;
}
function setDepartmentId($value) {
if ($value == '')
$this->department_id = '';
else
$this->department_id = $value;
return true;
}
function setSWhere($value) {
if ($value == '')
$this->sWhere = '';
else
$this->sWhere = $value;
return true;
}
function setBuilderId($value) {
if ($value == '')
$this->builder_id = '';
else
$this->builder_id = $value;
return true;
}
function setBuilderValueId($value) {
if ($value == '')
$this->builder_value_id = '';
else
$this->builder_value_id = $value;
return true;
}
function setABuilderValueId($value) {
if ($value == '')
$this->a_builder_value_id = '';
else
$this->a_builder_value_id = $value;
return true;
}
function setId($value) {
if ($value == '')
$this->id = '';
else
$this->id = $value;
return true;
}
function setProjectId($value) {
if ($value == '')
$this->project_id = '';
else
$this->project_id = $value;
return true;
}
function setWimId($value) {
if ($value == '')
$this->wim_id = '';
else
$this->wim_id = $value;
return true;
}
function setStepName($value) {
if ($value == '')
$this->step_name = '';
else
$this->step_name = $value;
return true;
}
function setRoleMasterId($value) {
if ($value == '')
$this->role_master_id = '';
else
$this->role_master_id = $value;
return true;
}
function setARoleMasterId($value) {
if ($value == '')
$this->a_role_master_id = '';
else
$this->a_role_master_id = $value;
return true;
}
function setAUserGroupId($value) {
if ($value == '')
$this->a_user_group = '';
else
$this->a_user_group = $value;
return true;
}
function setAUserId($value) {
if ($value == '')
$this->a_user_id = '';
else
$this->a_user_id = $value;
return true;
}
function setTargetDays($value) {
if ($value == '')
$this->target_days = '';
else
$this->target_days = $value;
return true;
}
function setEscalate($value) {
if ($value == '')
$this->escalate = '';
else
$this->escalate = $value;
return true;
}
function setWorkflowTitle($value) {
if ($value == '')
$this->workflow_title = '';
else
$this->workflow_title = $value;
return true;
}
function setStatus($value) {
if ($value == '')
$this->status = '';
else
$this->status = $value;
return true;
}
function setAStatus($value) {
if ($value == '')
$this->a_status = '';
else
$this->a_status = $value;
return true;
}
function setATargetdate($value) {
if ($value == '')
$this->a_target_date = '';
else
$this->a_target_date = $value;
return true;
}
function setARule($value) {
if ($value == '')
$this->a_rule = '';
else
$this->a_rule = $value;
return true;
}
function setRuleId($value) {
if ($value == '')
$this->rule_id = '';
else
$this->rule_id = $value;
return true;
}
function setLogDatetime($value) {
if ($value == '')
$this->log_datetime = '';
else
$this->log_datetime = $value;
return true;
}
function setCurrentDate() {
$this->current_date = date("Y" . "-" . "m" . "-" . "d");
return true;
}
function setCurrentDateTime() {
$this->current_date_time = date("Y-m-d H:i:s A"); //'YYYY-MM-DD HH:MM:SS'
return true;
}
function setCreatedBy($value) {
if ($value == '')
$this->created_by = '';
else
$this->created_by = $value;
return true;
}
function setCreatedAt($value) {
if ($value == '')
$this->created_at = '';
else
$this->created_at = $value;
return true;
}
function setUpdatedBy($value) {
if ($value == '')
$this->updated_by = '';
else
$this->updated_by = $value;
return true;
}
function setUpdatedAt($value) {
if ($value == '')
$this->updated_at = '';
else
$this->updated_at = $value;
return true;
}
function setTaskId($value) {
if ($value == '')
$this->task_id = '';
else
$this->task_id = $value;
return true;
}
function setTaskDisplayType($value) {
if ($value == '')
$this->task_display_type = '';
else
$this->task_display_type = $value;
return true;
}
function setWorkflowManager($value) {
if ($value == '')
$this->workflow_manager = '';
else
$this->workflow_manager = $value;
return true;
}
function setRecordSetId($value) {
if ($value == '')
$this->record_set_id = '';
else
$this->record_set_id = $value;
return true;
}
function setMasterId($value) {
if ($value == '')
$this->master_id = '';
else
$this->master_id = $value;
return true;
}
function setMasterFields($value) {
if ($value == '')
$this->imfields = '';
else
$this->imfields = $value;
return true;
}
function setComment($value) {
if ($value == '')
$this->comment = '';
else
$this->comment = $value;
return true;
}
//sushant 20-07-2017
function setRecordId($value) {
if ($value == '')
$this->record_id = '';
else
$this->record_id = $value;
return true;
}
//*********** Functions *****************************
/* function getWorkFlow_IM_ByGroup($emp_role, $role, $uid, $pid, $filter_query, $sLimit) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
//. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
//echo $filter_query;
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
//. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
//echo $filter_query;
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
}
//}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
} */
function getWorkFlow_IM_ByGroup($emp_role, $role, $uid, $pid, $filter_query, $sLimit, $sWhere) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if ($_SESSION[SESSION_VAR_NAME]['workflow_' . $bid . '_manager'] == $_SESSION[SESSION_VAR_NAME]['user_id']) {
$wf_manager = $_SESSION[SESSION_VAR_NAME]['user_id'];
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND b.workflow_manager = '$wf_manager' $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE v wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND b.workflow_manager = '$wf_manager' AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF(wd.a_user_group = '$role',1,0),IF(wr.user_id='$uid' or wd.a_user_group='$role',1,0))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
/* echo "SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(wd.a_user_group = '$role',1,0),IF(wr.user_id='$uid' or wd.a_user_group='$role',1,0))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit"; */
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF(wd.a_user_group = '$role',1,0),IF(wr.user_id='$uid' OR wd.a_user_group = '$role',1,0))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF(wd.a_user_group = '$role',1,0),IF(wr.user_id='$uid' OR wd.a_user_group = '$role',1,0))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF(wd.a_user_group = '$role',1,0),IF(wr.user_id='$uid' OR wd.a_user_group = :'$role',1,0))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
}
}
}
if (empty($emp_role)) {
// $this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
/* function getWorkFlow_IM_ByGroup($emp_role, $role, $uid, $pid, $filter_query, $sLimit) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_idd FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND $filter_query ORDER BY wd.id DESC $sLimit ");
}
} else {
if ($_SESSION[SESSION_VAR_NAME]['workflow_' . $bid . '_manager'] == $_SESSION[SESSION_VAR_NAME]['user_id']) {
$wf_manager = $_SESSION[SESSION_VAR_NAME]['user_id'];
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND b.workflow_manager = '$wf_manager' ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND b.workflow_manager = '$wf_manager' AND $filter_query ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND $filter_query ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND $filter_query ORDER BY wd.id DESC $sLimit ");
}
}
}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
} */
function getWorkFlow_IM_ByBid_Group_Count($role, $uid, $pid, $bid) {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND wd.builder_id = :BID GROUP BY wd.id ORDER BY wd.id DESC");
/* echo "SELECT DISTINCT wd.id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = '$uid' AND wd.a_user_group = '$role') OR b.workflow_manager='$uid', wr.user_id='$uid' OR wd.a_user_group = '$role') AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = '$pid' AND wd.builder_id = '$bid' GROUP BY wd.id ORDER BY wd.id DESC"; */
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_ByGroup_Count($role, $uid, $pid) {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.status = '1' AND IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID GROUP BY wd.id ORDER BY wd.id DESC");
/* $this->sth = $this->db->prepare("SELECT DISTINCT wd.id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
//. " WHERE IF(wr.user_id IS NULL, wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID ORDER BY wd.id DESC");
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND wd.builder_id = '$bid' GROUP BY wd.id ORDER BY wd.id DESC"); */
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wr.user_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID AND wd.builder_id = '$bid' $filter_wf_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit "); */
/* $this->sth = $this->db->prepare("SELECT DISTINCT wd.id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP, wr.user_id=:USERID) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND b.project_id = :PROJECTID ORDER BY wd.id DESC"); */
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
/* function getWorkFlow_IM_AllUser($emp_role, $role, $uid, $pid, $filter_query, $sLimit) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = '$pid' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = '$pid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = :PROJECTID GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = :PROJECTID AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = :PROJECTID GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = :PROJECTID AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
} */
function getWorkFlow_IM_AllUser($emp_role, $role, $uid, $pid, $filter_query, $sLimit, $search_value, $search_value_bind_count) {
$sWhere = $this->sWhere;
/* echo "SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wr.builder_id = wp.bid AND wr.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'AND b.project_id = $pid AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit";die; */
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND b.project_id = :PID GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
} else {
if (!empty($sWhere)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'AND b.project_id = :PID AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
}
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
if (!empty($sWhere)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
}
} else {
if (!empty($sWhere)) {
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON (bv.builder_id = wd.builder_id AND wd.a_builder_value_id = bv.id)"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id "
. " WHERE b.status='1' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit "); */
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON (bv.builder_id = wd.builder_id AND wd.a_builder_value_id = bv.id)"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id "
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_10 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(bv.start_user = '1' OR bv.processed_user = '1', IF(wr.user_id=:UID_4, 1, IF(wr.user_id=:UID_5, 1, 0)), IF(wr.user_id=:UID_6 OR wd.a_user_group=:ROLE_2, 1, 0)), IF(wd.a_status='8', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='18', IF(wr.user_id=:UID_11, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9, 1, 0), 0))))))) = 1 AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 11; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON (bv.builder_id = wd.builder_id AND wd.a_builder_value_id = bv.id)"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id "
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_10 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(bv.start_user = '1' OR bv.processed_user = '1', IF(wr.user_id=:UID_4, 1, IF(wr.user_id=:UID_5, 1, 0)), IF(wr.user_id=:UID_6 OR wd.a_user_group=:ROLE_2, 1, 0)), IF(wd.a_status='8', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='18', IF(wr.user_id=:UID_11, 1, 0), IF(wd.a_status='20', IF(wl.user_id=:UID_12 AND wl.status='20', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9, 1, 0), 0)))))))) = 1 AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 12; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
}
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
} else {
if (!empty($sWhere)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND b.project_id = :PID $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status='1' AND IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND $filter_query $sWhere GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
}
}
}
}
if (!empty($sWhere)) {
for ($i = 1; $i <= $search_value_bind_count; $i++) {
$this->sth->bindValue(":SEARCH_VALUE_" . $i, "%$search_value%", PDO::PARAM_STR);
}
}
$this->sth->execute();
//print_r($this->sth->debugDumpParams());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_User($emp_role, $role, $uid, $pid, $bid, $filter_query, $last_step_id, $sLimit, $filter_wf_query, $search_value, $search_value_bind_count) {
$sWhere = $this->sWhere;
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else {
if (!empty($sWhere)) {
if ($filter_query == '(completed)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0'), IF(wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0')) = '1' AND wd.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit");
//echo $sWhere;
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else if ($filter_query == '(inprocess)') {
$this->sth = $this->db->prepare("SELECT distinct wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'))='1' "
. " AND wd.builder_id = :BID AND wd.project_id = :PID $sWhere ORDER BY wd.id DESC $sLimit");
/* echo "SELECT distinct wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id FROM workflow_im AS wd "
. " WHERE IF(wd.a_builder_value_id = '$last_step_id', IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'))='1' "
. " AND wd.builder_id = '$bid' AND wd.project_id = '$pid' $sWhere ORDER BY wd.id DESC $sLimit"; */
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'))='1' "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit"); */
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else if ($filter_query == '(interrupted)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id ,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE (wd.a_status = '6' OR wd.a_status = '15') "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id ,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND wd.a_status != '6' AND b.status = '1' AND b.project_id = :PID AND wd.builder_id = :BID AND $filter_query $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
}
} else {
if ($filter_query == '(completed)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0'), IF(wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0')) = '1' AND wd.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else if ($filter_query == '(inprocess)') {
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON wd.record_set_id = ws.record_set_id"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE wd.builder_id = :BID AND wd.project_id = :PID AND (ws.created_by = :UID_1 OR ws.user_group_id=:ROLE_1) AND (IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', 1, 0), IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', 1, 0)) = '1' "
. " OR IF(wr.user_id is null, IF((mp.mem_id = :UID_2 AND wd.a_user_group = :ROLE_2) OR b.workflow_manager=:UID_3, 1, 0) ,IF(wd.a_status='16',IF(wr.user_id=:UID_4,IF(wd.a_status='0',IF(wr.user_id=:UID_5,IF(wr.user_id=:UID_6 or wd.a_user_group=:ROLE_3,1,0),0),0),0), IF(wd.a_status='7', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9, 1, 0), 0))))) = 1) $sWhere ORDER BY wd.id DESC $sLimit"); */
$this->sth = $this->db->prepare("SELECT distinct wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'))='1' "
. " AND wd.builder_id = :BID AND wd.project_id = :PID ORDER BY wd.id DESC $sLimit");
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'))='1' "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit"); */
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
//$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
//$this->sth->bindValue(":UROLE", $role, PDO::PARAM_STR);
/* for ($i = 1; $i <= 9; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 3; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
} */
} else if ($filter_query == '(interrupted)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE (wd.a_status = '6' OR wd.a_status = '15') "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' AND $filter_query $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
}
}
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
if (!empty($sWhere)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager = :UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id = :UID_3 ,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id = :UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id = :UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' AND $filter_wf_query $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
}
} else {
if (!empty($sWhere)) {
if ($filter_query == '(completed)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(ws.user_group_id = :ROLE_1, 1, IF(ws.created_by=:UID_1, 1, 0)) > 0 AND IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0'), IF(wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0')) = '1' AND b.status = '1' AND wd.project_id =:PID AND wd.builder_id = :BID $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else if ($filter_query == '(inprocess)') {
//user inprocesss with search
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' AND IF(wd.a_status <> '4' AND wd.a_status <> '5', '1', '0') <> '0' AND (IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), '1') = '1' "
. " AND (ws.created_by=:UID_9 OR (IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_10 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16',IF(wr.user_id=:UID_3,IF(wd.a_status='0',IF(wr.user_id=:UID_4,IF(wr.user_id=:UID_5 or wd.a_user_group=:ROLE_2,1,0),0),0),0), IF(wd.a_status='7', IF(wr.user_id=:UID_6 OR wd.a_user_group = :ROLE_3, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_8, 1, 0), 0))))) <> '')) "
. " ) $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 10; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 3; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else if ($filter_query == '(interrupted)') {
/* $this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id"
. " WHERE wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' AND ws.created_by = :UID_1 AND (wd.a_status='6' OR wd.a_status='15') "
. " AND IF(wr.user_id is null, IF((mp.mem_id = :UID_2 AND wd.a_user_group = :ROLE_1) OR b.workflow_manager=:UID_3, 1, 0) ,IF(wd.a_status='16',IF(wr.user_id=:UID_4,IF(wd.a_status='0',IF(wr.user_id=:UID_5,IF(wr.user_id=:UID_6 or wd.a_user_group=:ROLE_2,1,0),0),0),0), IF(wd.a_status='7', IF(wr.user_id=:UID_7 OR wd.a_user_group = :ROLE_3, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9 OR ws.created_by= :UID_10, 1, 0), 0))))) <> '') $sWhere ORDER BY wd.id DESC $sLimit"); */
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' AND (ws.created_by = :UID_1 OR wd.a_user_group = :ROLE_1) AND (wd.a_status='6' OR wd.a_status='15' OR wd.a_status='9') "
. " $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":UID_" . $i, $role, PDO::PARAM_STR);
}
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id ,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON (bv.builder_id = wd.builder_id AND wd.a_builder_value_id = bv.id)"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status='18', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13' OR wd.a_status = '20', IF(wr.user_id = :UID_6 OR wl.user_id = :UID_9, 1, 0), 0)))))) = 1"
. " AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 9; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
}
} else {
if ($filter_query == '(completed)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(ws.user_group_id = :ROLE_1, 1, IF(ws.created_by=:UID_1, 1, 0)) > 0 AND IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0'), IF(wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0')) = '1' AND wd.project_id =:PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else if ($filter_query == '(inprocess)') {
//user inprocesss without search
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.project_id = ws.project_id AND wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.status = '1' AND wd.builder_id = :BID AND wd.project_id = :PID AND (IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0')) = '1' "
. " AND (ws.created_by=:UID_10 OR (IF(wr.user_id is null, IF(mp.mem_id = :UID_2 AND wd.a_user_group = :ROLE_1 AND (ws.user_group_id = :ROLE_3 AND ws.status <> 18) OR b.workflow_manager=:UID_3 OR wl.user_id = :UID_11, 1, 0), IF(wd.a_status='16', IF(wr.user_id=:UID_4, IF(wd.a_status='0', IF(wr.user_id=:UID_5,IF(wr.user_id=:UID_6 or wd.a_user_group=:ROLE_2,1,0),0),0),0), IF(wd.a_status='7', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9, 1, 0), 0))))) <> ''))) ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 2; $i <= 11; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 3; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else if ($filter_query == '(interrupted)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id ,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_status_im AS ws ON wd.record_set_id = ws.record_set_id"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' AND (ws.created_by = :UID_1 OR wd.a_user_group = :ROLE_1) AND (wd.a_status='6' OR wd.a_status='15' OR wd.a_status='9') "
. " ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 1; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else {
//User - Due
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON (bv.builder_id = wd.builder_id AND wd.a_builder_value_id = bv.id)"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.project_id = mp.project_id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = :UID_1 AND (wd.a_user_group = :ROLE_1 OR (wl.user_id = :UID_10 AND wl.status=20) OR b.workflow_manager=:UID_2), 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(bv.start_user = '1' OR bv.processed_user = '1', IF(wr.user_id=:UID_4, 1, IF(wr.user_id=:UID_5, 1, 0)), IF(wr.user_id=:UID_6 OR wd.a_user_group=:ROLE_2, 1, 0)), IF(wd.a_status='8', IF(wr.user_id=:UID_7, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_8, 1, 0), IF(wd.a_status='18', IF(wr.user_id=:UID_11, 1, 0), IF(wd.a_status='20', IF(wl.user_id=:UID_12 AND wl.status='20', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_9, 1, 0), 0)))))))) = 1 "
. " AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' AND $filter_query $filter_wf_query $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 12; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
}
}
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0)))))<>'' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id =:PID AND wd.builder_id = :BID AND b.status = '1' $filter_wf_query $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
} else {
if (!empty($sWhere)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else {
if ($filter_query == '(completed)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0'), IF(wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15', '1', '0')) = '1' AND wd.project_id =:PID AND wd.builder_id = :BID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else if ($filter_query == '(inprocess)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wd.a_builder_value_id = :LAST_STEP_ID, IF(wd.a_status <> '1' AND wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0'), IF(wd.a_status <> '4' AND wd.a_status <> '5' AND wd.a_status <> '15', '1', '0')) = '1' "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":LAST_STEP_ID", $last_step_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else if ($filter_query == '(interrupted)') {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id AS wim_id, wd.project_id, wd.builder_id, wd.a_builder_value_id, wd.im_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_im AS wd "
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE (wd.a_status = '6' OR wd.a_status = '15') "
. " AND wd.builder_id = :BID AND wd.project_id = :PID AND b.status = '1' $sWhere ORDER BY wd.id DESC $sLimit");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id,wd.department_id,b.workflow_type,wp.prefix FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " LEFT OUTER JOIN workflow_prefix as wp ON ( wd.builder_id = wp.bid AND wd.record_set_id = wp.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((mp.mem_id = :UID_1 AND wd.a_user_group = :ROLE_1) OR (wl.user_id = :UID_7 AND wl.status=20) OR b.workflow_manager=:UID_2, 1, 0) ,IF(wd.a_status='16', IF(wr.user_id=:UID_3,1,0), IF(wd.a_status='7', IF(wr.user_id=:UID_4 OR wd.a_user_group = :ROLE_2, 1, 0), IF(wd.a_status='10', IF(wr.user_id=:UID_5, 1, 0), IF(wd.a_status = '0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '11' OR wd.a_status = '12' OR wd.a_status = '13', IF(wr.user_id = :UID_6, 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' AND b.project_id = :PID AND wd.builder_id = :BID AND b.status = '1' AND $filter_query $filter_wf_query $sWhere ORDER BY wd.id DESC $sLimit ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
for ($i = 1; $i <= 7; $i++) {
$this->sth->bindValue(":UID_" . $i, $uid, PDO::PARAM_STR);
}
for ($i = 1; $i <= 2; $i++) {
$this->sth->bindValue(":ROLE_" . $i, $role, PDO::PARAM_STR);
}
}
}
}
}
}
if (!empty($sWhere)) {
for ($i = 1; $i <= $search_value_bind_count; $i++) {
$this->sth->bindValue(":SEARCH_VALUE_" . $i, "%$search_value%", PDO::PARAM_STR);
}
}
$this->sth->execute();
//print_r($this->sth->errorInfo());
//print_r($this->sth->debugDumpParams());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_User_AccurateReport_old($emp_role, $role, $uid, $pid, $bid, $sLimit, $from_date, $to_date, $im_id) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id as wim_id, b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.wim_id, ws.builder_id, ws.builder_value_id as a_builder_value_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_status_im AS ws"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = ws.builder_id"
. " LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND b.id = :BID GROUP BY ws.record_set_id ORDER BY ws.id DESC $sLimit");
} else {
if (empty($emp_role)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id as wim_id, b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON wd.record_set_id = ws.record_set_id"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id as wim_id, b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON wd.record_set_id = ws.record_set_id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC $sLimit");
}
if (empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
} else if (empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $emp_role, PDO::PARAM_STR);
}
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":FDATE", $from_date, PDO::PARAM_STR);
$this->sth->bindValue(":TDATE", $to_date, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_User_AccurateReport($emp_role, $role, $uid, $pid, $bid, $sLimit, $from_date, $to_date, $im_id) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id as wim_id, b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.builder_id, ws.builder_value_id as a_builder_value_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.record_set_id = ws.record_set_id AND wd.builder_id = ws.builder_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND b.id = :BID GROUP BY ws.record_set_id ORDER BY ws.id DESC");
} else {
if (empty($emp_role)) {
$this->sth = $this->db->prepare("SELECT DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC");
} else {
$this->sth = $this->db->prepare("SELECT DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC");
}
if (empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
} elseif (!empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $emp_role, PDO::PARAM_STR);
}
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":FDATE", $from_date, PDO::PARAM_STR);
$this->sth->bindValue(":TDATE", $to_date, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
//print_r($this->sth->debugDumpParams());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_User_AccurateReport_Datatable($emp_role, $role, $uid, $pid, $bid, $sLimit, $from_date, $to_date, $im_id) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT wd.id as wim_id, b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.builder_id, ws.builder_value_id as a_builder_value_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.record_set_id = ws.record_set_id AND wd.builder_id = ws.builder_id)"
. " LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND b.id = :BID GROUP BY ws.record_set_id ORDER BY ws.id DESC $sLimit");
} else {
if (empty($emp_role)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = wd.record_set_id)"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (wd.builder_id = ws.builder_id AND wd.record_set_id = ws.record_set_id)"
. " WHERE (DATE(dy_im.log_datetime) BETWEEN :FDATE AND :TDATE) AND b.project_id = :PID AND wd.builder_id = :BID AND IF((ws.created_by = :UID OR ws.user_group_id = :USERGROUP) OR wd.a_user_group=:USERGROUP, '1', '0') <> '0' GROUP BY wd.record_set_id ORDER BY wd.id DESC $sLimit");
}
if (empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
} elseif (!empty($emp_role)) {
$this->sth->bindValue(":UID", $uid, PDO::PARAM_STR);
$this->sth->bindValue(":USERGROUP", $emp_role, PDO::PARAM_STR);
}
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":FDATE", $from_date, PDO::PARAM_STR);
$this->sth->bindValue(":TDATE", $to_date, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
//print_r($this->sth->debugDumpParams());
$this->return = $this->sth->fetchAll();
//$this->sth; die;
return $this->return;
}
function getWorkFlow_IM_User_AccurateReport_all_Datatable($emp_role, $role, $uid, $pid, $sLimit, $from_date, $to_date) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (CAST(ws.created_at AS DATE) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC $sLimit");
} else {
if (empty($emp_role)) {
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (ws.user_group_id = '$role' OR ws.created_by = '$uid') AND (CAST(ws.created_at AS DATE) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (ws.user_group_id = '$emp_role' OR ws.created_by = '$uid') AND (CAST(ws.created_at AS DATE) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC $sLimit");
}
}
if (empty($emp_role)) {
//$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
//$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
//$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_IM_User_all_AccurateReport($emp_role, $role, $uid, $pid, $sLimit, $from_date, $to_date) {
if ($role == 1 || $role == 2) {
/* $this->sth = $this->db->prepare("set dateformat dmy select t.project_id, t.workflow_title, t.record_set_id, t.log_datetime, t.builder_id from (SELECT b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.builder_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_im AS ws LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id "
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id) "
. " WHERE (convert(varchar(10),dy_im.log_datetime,126) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' AND b.id = '$bid' ) AS t group by t.id, t.project_id, t.workflow_title, t.record_set_id, t.log_datetime, t.builder_id"); */
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (ws.created_at BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC");
} else {
if (empty($emp_role)) {
/* $this->sth = $this->db->prepare("SELECT b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.builder_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_im AS ws LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id "
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id) "
. " WHERE (convert(varchar(10),dy_im.log_datetime,126) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' AND b.id = '$bid' group by b.id, b.project_id, b.workflow_title, ws.record_set_id, dy_im.log_datetime, ws.builder_id,ws.created_by "); */
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (ws.user_group_id = '$role' OR ws.created_by = '$uid') AND (ws.created_at BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC");
} else {
/* $this->sth = $this->db->prepare("set dateformat dmy select t.project_id, t.workflow_title, t.record_set_id, t.log_datetime, t.builder_id from (SELECT b.id, b.project_id, b.workflow_title, ws.record_set_id, ws.builder_id, ws.created_by AS user_id, dy_im.log_datetime FROM workflow_im AS ws LEFT OUTER JOIN workflow_builder AS b ON ws.builder_id = b.id "
. " LEFT OUTER JOIN _dynamic_im_$im_id AS dy_im ON(dy_im.id = ws.record_set_id) "
. " WHERE (convert(varchar(10),dy_im.log_datetime,126) BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' AND b.id = '$bid' ) AS t group by t.id, t.project_id, t.workflow_title, t.record_set_id, t.log_datetime, t.builder_id ORDER BY t.id"); */
$this->sth = $this->db->prepare("select wd.id as wim_id, wd.project_id, wd.im_id, wd.record_set_id, wd.builder_id, wd.a_builder_value_id, wd.a_role_master_id, wd.a_user_group, wd.a_status, wd.a_target_date, wd.a_rule, wd.created_by, wd.created_at, wd.updated_at FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON (ws.id = (select ws_s.id from workflow_status_im AS ws_s WHERE ws_s.builder_id = b.id AND ws_s.record_set_id = wd.record_set_id ORDER BY ws_s.id ASC LIMIT 1))"
. " WHERE (ws.user_group_id = '$emp_role' OR ws.created_by = '$uid') AND (ws.created_at BETWEEN '$from_date' AND '$to_date') AND b.project_id = '$pid' ORDER BY wd.id DESC");
}
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilder_ByRole_UserGroup($emp_role, $role, $uid, $pid) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " WHERE b.status = '1' AND b.project_id = '$pid' GROUP BY b.id");
} else {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_builder_values AS wv ON wv.builder_id = b.id"
. " LEFT OUTER JOIN workflow_role_usergroup AS wr ON wv.project_id = wr.project_id "
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (b.project_id = wl.project_id AND b.id = wl.builder_id AND wv.id = wl.builder_value_id)"
. " WHERE b.status = '1' AND IF(b.workflow_manager = '$uid', 1, IF(wr.user_group_id = :USERGROUP OR wl.user_id = '$uid', 1, 0)) > 0 AND b.project_id = :PROJECTID GROUP BY b.id");
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilder_ByRule_UserGroup($emp_role, $role, $uid, $pid) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " WHERE b.status = '1' AND b.project_id = '$pid' GROUP BY b.id");
} else {
/* $this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_builder_values AS wv ON wv.builder_id = b.id"
. " LEFT OUTER JOIN workflow_formulas AS wrf ON wrf.rule_id = wv.rule_id"
. " WHERE b.status = '1' AND wrf.user_group_id = :USERGROUP AND b.project_id = :PROJECTID GROUP BY b.id"); */
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_builder_values AS wv ON wv.builder_id = b.id"
. " LEFT OUTER JOIN workflow_formulas AS wrf ON wrf.rule_id = wv.rule_id"
. " LEFT OUTER JOIN workflow_role_usergroup AS ru ON (ru.role_master_id = wrf.role_master_id AND ru.role_type=1)"
. " WHERE b.status = '1' AND IF(b.workflow_manager = '$uid', 1, IF(ru.user_group_id = '$role', 1, 0)) > 0 AND b.project_id = '$pid' GROUP BY b.id, b.workflow_title");
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilder_ByRule_User($uid, $pid) {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON wr.builder_id = b.id"
. " WHERE b.status = '1' AND IF(b.workflow_manager = '$uid', 1, IF(wr.user_id = '$uid', 1, 0)) > 0 AND b.project_id = '$pid' GROUP BY b.id, b.workflow_title");
//$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
//$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilder_ByUser_limit($emp_role, $role, $uid, $pid) {
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " WHERE b.project_id = '$pid' AND b.status = 1 GROUP BY b.id");
} else {
if (empty($emp_role)) {
/* $this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON ws.builder_id = b.id"
. " WHERE (ws.created_by = :USERID OR wd.a_user_group = :USERGROUP) AND b.project_id = :PROJECTID GROUP BY b.id"); */
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_builder_values AS wv ON wv.builder_id = b.id"
. " LEFT OUTER JOIN workflow_role_usergroup AS wr ON wv.role_master_id = wr.role_master_id"
. " LEFT OUTER JOIN workflow_formulas AS wrf ON wrf.rule_id = wv.rule_id"
. " WHERE IF(wv.role_master_id > 0 && wv.rule_id <= 0, wr.user_group_id = :USERGROUP, wrf.role_master_id )(ws.created_by = :USERID OR wd.a_user_group = :USERGROUP) AND b.project_id = :PROJECTID AND b.status = 1 GROUP BY b.id");
/* echo "SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON ws.builder_id = b.id"
. " WHERE (ws.created_by = '$uid' OR wd.a_user_group = '$role') AND b.project_id = '$pid' GROUP BY b.id"; */
} else {
$this->sth = $this->db->prepare("SELECT b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " WHERE wd.a_user_group = :USERGROUP AND b.project_id = :PROJECTID AND b.status = 1 GROUP BY b.id");
}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_FoundRows_ByTable($table) {
$this->sth = $this->db->prepare("SELECT FOUND_ROWS() as FOUND_ROWS from $table");
$this->sth->bindValue(":TABLE", $table, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilderValue_ByBID($bid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_values WHERE builder_id = :BUILDERID ORDER BY id ASC");
$this->sth->bindValue(":BUILDERID", $bid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilderValue_ByBVID($bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_values WHERE id = :BVID ORDER BY id ASC");
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByID($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE id = :WIMID");
// echo "SELECT * FROM workflow_im WHERE id = '$id'";die;
$this->sth->bindValue(":WIMID", $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByImRIDBvID($im_id, $im_rid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE im_id=:IMID AND record_set_id = :RECORDSETID AND a_builder_value_id = :BVID");
//echo "SELECT * FROM workflow_im WHERE id = '$id'";
$this->sth->bindValue(":IMID", $im_id, PDO::PARAM_STR);
$this->sth->bindValue(":RECORDSETID", $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByRecordSetID($im_id, $id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE im_id=:IMID AND record_set_id = :RECORDSETID ORDER BY id ASC");
//echo "SELECT * FROM workflow_im WHERE im_id= '$im_id' AND record_set_id = '$id'";
$this->sth->bindValue(":IMID", $im_id, PDO::PARAM_STR);
$this->sth->bindValue(":RECORDSETID", $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByRecordSetID_First($im_id, $id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE im_id=:IMID AND record_set_id = :RECORDSETID ORDER BY id ASC LIMIT 1");
//echo "SELECT * FROM workflow_im WHERE im_id= '$im_id' AND record_set_id = '$id'";
$this->sth->bindValue(":IMID", $im_id, PDO::PARAM_STR);
$this->sth->bindValue(":RECORDSETID", $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByStatus() {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE a_status <> 1 AND a_status <> 6 AND a_status <> 4 AND a_status <> 5 ORDER BY id DESC");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByAStatus($pid, $a_status) {
if ($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2) {
$this->sth = $this->db->prepare("SELECT id FROM workflow_im WHERE project_id = :PID AND a_status = :ASTATUS");
} else {
$this->sth = $this->db->prepare("SELECT id FROM workflow_im WHERE project_id = :PID AND a_status = :ASTATUS AND a_user_group = :ROLE");
}
$this->sth->bindValue(":ROLE", $_SESSION[SESSION_VAR_NAME]['role'], PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":ASTATUS", $a_status, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_GroupAStatus($pid, $a_status) {
if ($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND a_status = :ASTATUS GROUP BY builder_id");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":ASTATUS", $a_status, PDO::PARAM_STR);
} else {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND a_status = :ASTATUS AND a_user_group = :ROLE GROUP BY builder_id");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":ASTATUS", $a_status, PDO::PARAM_STR);
$this->sth->bindValue(":ROLE", $_SESSION[SESSION_VAR_NAME]['role'], PDO::PARAM_STR);
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_BID_AStatus($pid, $bid, $bvid, $a_status) {
if ($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND builder_id = :BID AND a_builder_value_id = :BVID AND a_status <> :ASTATUS");
//echo "SELECT * FROM workflow_im WHERE project_id = '$pid' AND builder_id = '$bid' AND a_builder_value_id = '$bvid' AND a_status <> '$a_status'";
} else {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND builder_id = :BID AND a_builder_value_id = :BVID AND a_status <> :ASTATUS AND a_user_group = :AUSERGROUP");
$this->sth->bindValue(":AUSERGROUP", $_SESSION[SESSION_VAR_NAME]['role'], PDO::PARAM_STR);
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":ASTATUS", $a_status, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_BID_AUserGroup($pid, $bid, $bvid, $a_status) {
if ($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND builder_id = :BID AND a_builder_value_id = :BVID AND a_status <> :ASTATUS GROUP BY a_user_group");
//echo "SELECT * FROM workflow_im WHERE project_id = '$pid' AND builder_id = '$bid' AND a_builder_value_id = '$bvid' AND a_status <> '$a_status' GROUP BY a_user_group";
} else {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PID AND builder_id = :BID AND a_builder_value_id = :BVID AND a_status <> :ASTATUS AND a_user_group = :AUSERGROUP GROUP BY a_user_group");
$this->sth->bindValue(":AUSERGROUP", $_SESSION[SESSION_VAR_NAME]['role'], PDO::PARAM_STR);
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":ASTATUS", $a_status, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_LatestWID_All($wim_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE wim_id = :WIMID ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestBVID($bvid, $wim_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND wim_id = :WIMID ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->execute();
// echo "SELECT * FROM workflow_status_im WHERE builder_value_id = $bvid AND wim_id = $wim_id ORDER BY id DESC LIMIT 1"; die;
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_FirstBvid($bvid, $bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE (status <> 1 AND status <> 4 AND status <> 11) AND builder_value_id = :BVID AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id ASC LIMIT 1");
//echo "SELECT top 1 * FROM workflow_status_im WHERE (status <> 1 AND status <> 4 AND status <> 11 AND status <> 0) AND builder_value_id = '$bvid' AND builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id ASC";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_FirstBvid2($bvid, $bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id ASC LIMIT 1");
//echo "SELECT top 1 * FROM workflow_status_im WHERE (status <> 1 AND status <> 4 AND status <> 11 AND status <> 0) AND builder_value_id = '$bvid' AND builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id ASC";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_StartRID($bvid, $wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE (status = '' OR status = '0') AND builder_value_id = :BVID AND wim_id = :WIMID AND record_set_id = :RECORDSETID ORDER BY id ASC LIMIT 1");
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND wim_id = '$wim_id' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestRID($bvid, $wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND wim_id = :WIMID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND wim_id = '$wim_id' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestBvIdRID($bvid, $bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1");
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
//$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestUGroupRID($bid, $im_rid, $u_group) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status <> 0 AND user_group_id = :UGROUP AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1");
//echo "SELECT * FROM workflow_status_im WHERE status <> 0 AND user_group_id = '$u_group' AND builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':UGROUP', $u_group, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestLInprocess($wim_id, $a_user_group_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status = 20 AND wim_id = :WIMID AND user_group_id = :UGROUP ORDER BY id DESC LIMIT 1");
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':UGROUP', $a_user_group_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_OnprocessRID($bvid, $wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND wim_id = :WIMID AND record_set_id = :RECORDSETID AND status != 1 ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND wim_id = '$wim_id' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestByWIM($wim_id) {
//echo "SELECT * FROM workflow_status_im WHERE status != 14 ORDER BY id DESC LIMIT 1";die;
//echo "SELECT * FROM workflow_status_im WHERE status = 1 AND wim_id = $wim_id ORDER BY id DESC LIMIT 1"; die;
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status = 1 AND wim_id = :WIMID ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_skipLatestByWIM($wim_id) {
//echo "SELECT * FROM workflow_status_im WHERE status != 14 ORDER BY id DESC LIMIT 1";die;
//echo "SELECT * FROM workflow_status_im WHERE status = 1 AND wim_id = $wim_id ORDER BY id DESC LIMIT 1"; die;
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status != 14 AND wim_id = '" . $wim_id . "' ORDER BY id DESC LIMIT 1");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIM_LatestByBIdRId($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT top 1 * FROM workflow_im WHERE builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC ");
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_LastApproved_ByRID($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status = 1 AND builder_id = :BID AND record_set_id = :RID ORDER BY id DESC LIMIT 1");
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_LatestByIMRID_BVID($bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BVID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND wim_id = '$wim_id' AND record_set_id = '$im_rid' ORDER BY id DESC LIMIT 1";
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUsers_UserGroup($pid, $gid) {
$this->sth = $this->db->prepare("SELECT lm.user_id,mp.mem_id FROM login_mast AS lm "
. "LEFT OUTER JOIN assign_mem_project as mp ON(mp.mem_id = lm.user_id) "
. "WHERE mp.mem_id IS NOT NULL AND project_id=:PID AND mp.role=:GID AND find_in_set(:GID, mp.role) <> 0");
$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->bindValue(':GID', $gid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUsers_UserGroup_All($pid, $gid) {
$this->sth = $this->db->prepare("SELECT distinct lm.user_id, mp.mem_id FROM login_mast AS lm
LEFT OUTER JOIN assign_mem_project as mp ON(mp.mem_id = lm.user_id)
WHERE lm.user_status = '1' AND lm.delete_flag = '0' AND mp.mem_id IS NOT NULL AND project_id='$pid' AND (lm.role = '$gid' OR FIND_IN_SET(lm.alt_role, '$gid') > 0)");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUsers_UserGroupHierarchy($gid) {
$this->sth = $this->db->prepare("SELECT l.user_id FROM login_mast AS l"
. " LEFT OUTER JOIN user_group as ug ON(l.emp_role = ug.id) "
. " WHERE ug.id = :GID OR FIND_IN_SET(l.alt_role, :GID) > 0");
$this->sth->bindValue(':GID', $gid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getOFFUsers_UserGroup($gid) {
$this->sth = $this->db->prepare("SELECT lm.user_id FROM login_mast AS lm
LEFT OUTER JOIN assign_mem_project as mp ON(mp.mem_id = lm.user_id)
WHERE (lm.role = :GID OR FIND_IN_SET(lm.alt_role, :GID) > 0) and mp.project_id
NOT IN (SELECT mp.project_id FROM login_mast AS lm
LEFT OUTER JOIN assign_mem_project as mp ON(mp.mem_id = lm.user_id)
WHERE (lm.role = :GID OR FIND_IN_SET(lm.alt_role, :GID) > 0) AND mp.mem_id IS NULL)", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->bindValue(':GID', $gid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getOFFUsers_UserGroupHierarchy($gid) {
$this->sth = $this->db->prepare("SELECT l.user_id FROM login_mast AS l"
. " LEFT OUTER JOIN leaves AS lv ON(lv.user_id = l.user_id)"
. " WHERE ug.id = :GID OR FIND_IN_SET(l.alt_role, :GID) > 0 AND lv.status = 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_details WHERE builder_value_id = '$bvid' AND doc_id = '$doc_id' ORDER BY id DESC LIMIT 1";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':GID', $gid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//4-05-2017
function getImsettings_ByimId($pid, $value) {
$this->sth = $this->db->prepare("select * FROM workflow_im_settings WHERE project_id = :PRO_ID AND im_id =:ID");
//echo "select * FROM workflow_im_settings WHERE project_id = '$pid' AND im_id = '$value'";
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->bindValue(":PRO_ID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getImsettings_ByImId_Active($pid, $value) {
$this->sth = $this->db->prepare("select ws.wf_id FROM workflow_im_settings as ws"
. " LEFT OUTER JOIN workflow_builder as wb ON (ws.wf_id = wb.id) WHERE wb.status = '1' AND ws.project_id = :PRO_ID AND ws.im_id =:ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->bindValue(":PRO_ID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function addWorkflowMaster() {
$this->sth = $this->db->prepare("insert into workflow_im(
project_id,
im_id,
record_set_id,
builder_id,
a_builder_value_id,
a_role_master_id,
a_user_group,
department_id,
a_status,
created_by,
updated_at,
created_at) values (:PROJECTID, :IM_ID, :RECORD_ID, :BUILDERID, :ABUILDERVALUEID, :ARMID, :AUSERGRP,:ADEPARTMENT, :ASTATUS, :CREATEDBY, :UPDATEDAT, :CREATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':IM_ID', $this->master_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORD_ID', $this->record_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':ABUILDERVALUEID', $this->a_builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':ARMID', $this->a_role_master_id, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERGRP', $this->a_user_group, PDO::PARAM_STR);
$this->sth->bindValue(':ADEPARTMENT', $this->department_id, PDO::PARAM_STR);
$this->sth->bindValue(':ASTATUS', $this->a_status, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->execute();
//print_r($this->sth->errorInfo());
return $this->db->lastInsertId();
}
function UpdateWIM_Status($value) {
$this->sth = $this->db->prepare("update workflow_im set
a_builder_value_id = :ABUILDERVALUEID,
a_role_master_id = :ARMID,
a_user_group = :AUSERGRP,
a_status = :ASTATUS,
a_target_date = :ATARGETDATE,
a_rule = :ARULE,
updated_at = :UPDATEDDATE
where id = :ID");
$this->sth->bindValue(':ABUILDERVALUEID', $this->a_builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':ARMID', $this->a_role_master_id, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERGRP', $this->a_user_group, PDO::PARAM_STR);
$this->sth->bindValue(':ASTATUS', $this->a_status, PDO::PARAM_STR);
$this->sth->bindValue(':ATARGETDATE', $this->a_target_date, PDO::PARAM_STR);
$this->sth->bindValue(':ARULE', $this->a_rule, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDDATE', $this->updated_at, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function UpdateWIM_Escalate_Status($value) {
$this->sth = $this->db->prepare("update workflow_im set
a_builder_value_id = :ABUILDERVALUEID,
a_role_master_id = :ARMID,
a_user_group = :AUSERGRP,
a_status = :ASTATUS,
updated_at = :UPDATEDDATE
where id = :ID");
$this->sth->bindValue(':ABUILDERVALUEID', $this->a_builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':ARMID', $this->a_role_master_id, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERGRP', $this->a_user_group, PDO::PARAM_STR);
$this->sth->bindValue(':ASTATUS', $this->a_status, PDO::PARAM_STR);
//$this->sth->bindValue(':ATARGETDATE', $this->a_target_date, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDDATE', $this->updated_at, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function UpdateWIM_ARole($value) {
/* echo "update workflow_im set
a_builder_value_id = '$this->a_builder_value_id',
a_role_master_id = '$this->a_role_master_id',
a_user_group = '$this->a_user_group',
a_target_date = '$this->a_target_date',
a_rule = '$this->a_rule',
updated_at = '$this->updated_at'
where id = '$value'"; */
$this->sth = $this->db->prepare("update workflow_im set
a_builder_value_id = :ABUILDERVALUEID,
a_role_master_id = :ARMID,
a_user_group = :AUSERGRP,
a_target_date = :ATARGETDATE,
a_rule = :ARULE,
updated_at = :UPDATEDDATE
where id = :ID");
$this->sth->bindValue(':ABUILDERVALUEID', $this->a_builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':ARMID', $this->a_role_master_id, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERGRP', $this->a_user_group, PDO::PARAM_STR);
$this->sth->bindValue(':ATARGETDATE', $this->a_target_date, PDO::PARAM_STR);
$this->sth->bindValue(':ARULE', $this->a_rule, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDDATE', $this->updated_at, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function UpdateWIM_StatusOnly($value) {
$this->sth = $this->db->prepare("update workflow_im set a_status = :ASTATUS,
updated_at = :UPDATEDDATE
where id = :ID");
/* echo "update workflow_im set a_status = '$this->a_status',
updated_at = '$this->updated_at'
where id = '$value'"; */
$this->sth->bindValue(':ASTATUS', $this->a_status, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDDATE', $this->updated_at, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_WIM($bid) {
$this->sth = $this->db->prepare("delete from workflow_im where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_WIM_ByBvid($im_rid, $bid, $bvid) {
$this->sth = $this->db->prepare("delete from workflow_im where builder_id= :BID AND record_set_id= :IMRID AND a_builder_value_id= :BVID");
$this->sth->bindValue(":IMRID", $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_ById($id) {
$this->sth = $this->db->prepare("delete from workflow_im where id= :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function add_workflowIM_status() {
$this->sth = $this->db->prepare("insert into workflow_status_im(
project_id,
wim_id,
record_set_id,
builder_id,
builder_value_id,
user_group_id,
status,
comment,
created_by,
created_at) values (:PROJECTID, :WIMID, :RECORDSETID, :BUILDERID,:BUILDERVALUEID, :USERGROUPID, :STATUS,:COMMENT,:CREATEDBY,:CREATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':COMMENT', $this->comment, PDO::PARAM_STR);
$this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
$this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function delete_Workflow_IM_Status_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_status_im where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Status_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_status_im where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function get_WIMStatus_BVID($bvid, $wim_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BUILDERVALUEID AND wim_id = :WIMID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BUILDERVALUEID' => $bvid, ':WIMID' => $wim_id));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_RID($bvid, $wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_value_id = :BUILDERVALUEID AND wim_id = :WIMID AND record_set_id = :RECORDSETID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT * FROM workflow_status_im WHERE builder_value_id = '$bvid' AND wim_id = '$wim_id' AND record_set_id = '$im_rid' ORDER BY id DESC";
$this->sth->execute(array(':BUILDERVALUEID' => $bvid, ':WIMID' => $wim_id, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_WIM_ID($wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE wim_id = :WIMID AND record_set_id = :RECORDSETID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':WIMID' => $wim_id, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_BId_RID($bid, $im_rid) {
//echo "SELECT * FROM workflow_status_im WHERE builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id DESC";
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_BId_RID_Logs($bid, $im_rid) {
//echo "SELECT * FROM workflow_status_im WHERE (status != '' OR status != 0) AND builder_id = $bid AND record_set_id = $im_rid ORDER BY id DESC";
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE (status != '' OR status != 0) AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_BId_RID_Logs_RejectBackward($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status = 13 AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_Previous_Triggered($bid, $im_rid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_id = :BID AND record_set_id = :RECORDSETID AND status <> 0 AND builder_value_id <> '$bvid' GROUP BY created_by");
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_Previous_Triggered_data($bid, $im_rid, $bvid) {
//echo "SELECT * FROM workflow_status_im WHERE builder_id = $bid AND record_set_id = $im_rid AND builder_value_id != $bvid order by id desc limit 1";exit;
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_id = $bid AND record_set_id = $im_rid AND builder_value_id <> $bvid AND status not IN (0,14,15) order by id desc limit 1 ");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//
function get_WIMLast_status($bid, $im_rid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE builder_id = :BID AND record_set_id = :RECORDSETID AND status <> 0 AND builder_value_id <> '$bvid' GROUP BY created_by ORDER BY id DESC LIMIT 1");
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_BId_UID($uid, $role, $bid, $bvid, $im_rid) {
if ($role != 1 && $role != 2) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE created_by=:UID AND builder_id = :BID AND record_set_id = :RECORDSETID AND builder_value_id <> :BVID AND (status <> 0 AND status IS NOT NULL) ORDER BY id DESC");
//echo "SELECT * FROM workflow_status_im WHERE created_by='$uid' AND builder_id = '$bid' AND record_set_id = '$im_rid' AND builder_value_is <> '$bvid' AND (status <> 0 AND status IS NOT NULL) ORDER BY id DESC";
$this->sth->bindValue(':UID', $uid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
}
function setBuilderTasklistId($value) {
if ($value == '')
$this->builder_tasklist_id = '';
else
$this->builder_tasklist_id = $value;
return true;
}
function setTaskChildId($value) {
if ($value == '')
$this->task_child_id = '';
else
$this->task_child_id = $value;
return true;
}
function setNA($value) {
if ($value == '')
$this->n_a = '';
else
$this->n_a = $value;
return true;
}
function add_workflow_IM_TaskChild() {
$this->sth = $this->db->prepare("insert into workflow_im_taskchild(
project_id,
wim_id,
builder_id,
builder_value_id,
record_set_id,
task_id,
builder_tasklist_id,
task_child_id,
n_a,
created_by,
created_at,
updated_by,
updated_at) values (:PROJECTID, :WIMID, :BUILDERID, :BUILDERVALUEID, :RECORDSETID, :TASK, :BTLID, :TCHILDID, :NA, :CREATEDBY, :CREATEDAT,:UPDATEDBY,:UPDATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':TASK', $this->task_id, PDO::PARAM_STR);
$this->sth->bindValue(':BTLID', $this->builder_tasklist_id, PDO::PARAM_STR);
$this->sth->bindValue(':TCHILDID', $this->task_child_id, PDO::PARAM_STR);
$this->sth->bindValue(':NA', $this->n_a, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDBY', $this->updated_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_IM_TaskChild_ByBTId($wim_id, $btid, $tcid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_taskchild WHERE wim_id = :WIMID AND builder_tasklist_id = :BTID AND task_child_id = :TCID AND record_set_id = :RECORDSETID");
//echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = '$wim_id' AND builder_tasklist_id = '$btid' AND task_child_id = '$tcid'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BTID', $btid, PDO::PARAM_STR);
$this->sth->bindValue(":TCID", $tcid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_TaskChild_ByRId($wim_id, $bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_taskchild WHERE wim_id = :WIMID AND builder_value_id = :BVID AND record_set_id = :RECORDSETID");
//echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = '$wim_id' AND builder_tasklist_id = '$btid' AND task_child_id = '$tcid'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_Workflow_IM_TaskChild($btid, $tcid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild where builder_tasklist_id= :BTID AND task_child_id = :TCID");
$this->sth->bindValue(":BTID", $btid, PDO::PARAM_STR);
$this->sth->bindValue(":TCID", $tcid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TLID($tlid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild where builder_tasklist_id= :TLID");
$this->sth->bindValue(":TLID", $tlid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TLID_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TC_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
//=====================================
// Task Comments
//=====================================
function add_workflow_IM_TaskChildComment() {
$this->sth = $this->db->prepare("insert into workflow_im_taskchild_comment(
project_id,
wim_id,
builder_id,
builder_value_id,
record_set_id,
task_id,
builder_tasklist_id,
task_child_id,
comment,
created_by,
created_at,
updated_by,
updated_at) values (:PROJECTID, :WIMID, :BUILDERID, :BUILDERVALUEID, :RECORDSETID, :TASK, :BTLID, :TCHILDID, :COMMENT, :CREATEDBY, :CREATEDAT,:UPDATEDBY,:UPDATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':TASK', $this->task_id, PDO::PARAM_STR);
$this->sth->bindValue(':BTLID', $this->builder_tasklist_id, PDO::PARAM_STR);
$this->sth->bindValue(':TCHILDID', $this->task_child_id, PDO::PARAM_STR);
$this->sth->bindValue(':COMMENT', $this->comment, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDBY', $this->updated_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_IM_TaskChildComment_ByBTId_count($bid, $btid, $tcid, $im_rid) {
$this->sth = $this->db->prepare("SELECT id FROM workflow_im_taskchild_comment WHERE builder_id = :BID AND builder_tasklist_id = :BTID AND task_child_id = :TCID AND record_set_id = :RECORDSETID");
//echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = '$wim_id' AND builder_tasklist_id = '$btid' AND task_child_id = '$tcid'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
//$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BTID', $btid, PDO::PARAM_STR);
$this->sth->bindValue(":TCID", $tcid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_TaskChildComment_ByBTId($bid, $btid, $tcid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_taskchild_comment WHERE builder_id = :BID AND builder_tasklist_id = :BTID AND task_child_id = :TCID AND record_set_id = :RECORDSETID");
//echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = '$wim_id' AND builder_tasklist_id = '$btid' AND task_child_id = '$tcid'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BTID', $btid, PDO::PARAM_STR);
$this->sth->bindValue(":TCID", $tcid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_Workflow_IM_TaskChildComment($btid, $tcid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild_comment where builder_tasklist_id= :BTID AND task_child_id = :TCID");
$this->sth->bindValue(":BTID", $btid, PDO::PARAM_STR);
$this->sth->bindValue(":TCID", $tcid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TLCommentID($tlid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild_comment where builder_tasklist_id= :TLID");
$this->sth->bindValue(":TLID", $tlid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TComment_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild_comment where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_TComment_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_im_taskchild_comment where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
//***********************************
// COMMENTS
//***********************************
function setComments($value) {
if ($value == '')
$this->comments = '';
else
$this->comments = $value;
return true;
}
function add_workflow_IM_Comments() {
$this->sth = $this->db->prepare("insert into workflow_im_comments(
project_id,
wim_id,
builder_id,
builder_value_id,
record_set_id,
comments,
created_by,
created_at,
updated_by,
updated_at) values (:PROJECTID, :WIMID, :BUILDERID, :BUILDERVALUEID, :RECORDSETID, :COMMENTS, :CREATEDBY, :CREATEDAT,:UPDATEDBY,:UPDATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':COMMENTS', $this->comments, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDBY', $this->updated_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_IM_Comments_ByBvid($wim_id, $bid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_comments WHERE wim_id = :WIMID AND builder_id = :BID");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Comments_ByRID($bid, $im_rid) {
//echo "SELECT * FROM workflow_im_comments WHERE record_set_id = $im_rid AND builder_id = $bid ORDER BY id ASC";
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_comments WHERE record_set_id = :RECORDSETID AND builder_id = :BID ORDER BY id ASC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
//$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Comments_ByWIMID($wim_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_comments WHERE wim_id = :WIMID AND record_set_id = :RECORDSETID ORDER BY id ASC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Comments_ById($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_comments WHERE id = :ID");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_Workflow_IM_Comments_ID($id) {
$this->sth = $this->db->prepare("delete from workflow_im_comments where id= :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Comments_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_im_comments where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Comments_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_im_comments where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
//***********************************
// ATTACHMENTS
//***********************************
function setFileName($value) {
if ($value == '')
$this->file_name = '';
else
$this->file_name = $value;
return true;
}
function add_workflow_IM_Attachments() {
$this->sth = $this->db->prepare("insert into workflow_im_attachments(
project_id,
wim_id,
builder_id,
builder_value_id,
record_set_id,
file_name,
comments,
created_by,
created_at,
updated_by,
updated_at) values (:PROJECTID, :WIMID, :BUILDERID, :BUILDERVALUEID, :RECORDSETID, :FILENAME, :COMMENTS, :CREATEDBY, :CREATEDAT,:UPDATEDBY,:UPDATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':FILENAME', $this->file_name, PDO::PARAM_STR);
$this->sth->bindValue(':COMMENTS', $this->comments, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDBY', $this->updated_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_IM_Attachments_ByBvid($wim_id, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_attachments WHERE wim_id = :WIMID AND builder_value_id = :BVID");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Attachments_ByRID($bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_attachments WHERE builder_value_id = :BVID AND record_set_id = :RECORDSETID ORDER BY id DESC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
//$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Attachments_ByRID_Only($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_attachments WHERE record_set_id = :RECORDSETID AND builder_id = :BID ORDER BY id DESC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Attachments_ById($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_attachments WHERE id = :ID");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_Workflow_IM_Attachments_ID($id) {
$this->sth = $this->db->prepare("delete from workflow_im_attachments where id= :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Attachments_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_im_attachments where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Attachments_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_im_attachments where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
//***********************************
// MAILS
//***********************************
function setReffId($value) {
if ($value == '')
$this->reff_id = '';
else
$this->reff_id = $value;
return true;
}
function add_workflow_IM_Mails() {
$this->sth = $this->db->prepare("insert into workflow_im_mails(
project_id,
wim_id,
builder_id,
builder_value_id,
reff_id,
record_set_id,
created_by,
created_at,
updated_by,
updated_at) values (:PROJECTID, :WIMID, :BUILDERID, :BUILDERVALUEID, :REFFID, :RECORDSETID, :CREATEDBY, :CREATEDAT,:UPDATEDBY,:UPDATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $this->wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':REFFID', $this->reff_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDBY', $this->updated_by, PDO::PARAM_STR);
$this->sth->bindValue(':UPDATEDAT', $this->updated_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_IM_Mails_ByBvid($wim_id, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_mails WHERE wim_id = :WIMID AND builder_value_id = :BVID");
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Mails_ByRID($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_mails WHERE record_set_id = :RECORDSETID AND builder_id = :BID");
//$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Mails_ById($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_mails WHERE id = :ID");
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_Workflow_IM_Mails_ID($id) {
$this->sth = $this->db->prepare("delete from workflow_im_mails where id= :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Mails_Wim_Id($wim_id) {
$this->sth = $this->db->prepare("delete from workflow_im_mails where wim_id= :WIMID");
$this->sth->bindValue(":WIMID", $wim_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Workflow_IM_Mails_BID($bid) {
$this->sth = $this->db->prepare("delete from workflow_im_mails where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
//***********************************
// LOGS
//***********************************
function setSubReffId($value) {
if ($value == '')
$this->sub_reff_id = '';
else
$this->sub_reff_id = $value;
return true;
}
function setMainModule($value) {
if ($value == '')
$this->main_module = '';
else
$this->main_module = $value;
return true;
}
function setSubModule($value) {
if ($value == '')
$this->sub_module = '';
else
$this->sub_module = $value;
return true;
}
function setTriggers($value) {
if ($value == '')
$this->triggers = '';
else
$this->triggers = $value;
return true;
}
function setTriggerProcess($value) {
if ($value == '')
$this->trigger_process = '';
else
$this->trigger_process = $value;
return true;
}
function setReffModule($value) {
if ($value == '')
$this->reff_module = '';
else
$this->reff_module = $value;
return true;
}
function add_workflow_Logs() {
$this->sth = $this->db->prepare("insert into workflow_logs(
project_id,
reff_module,
reff_id,
sub_reff_id,
builder_id,
builder_value_id,
main_module,
sub_module,
triggers,
trigger_process,
created_by,
created_at) values (:PROJECTID, :REFFMODULE, :REFFID, :SUBREFFID, :BUILDERID, :BUILDERVALUEID, :MAINMODULE, :SUBMODULE, :TRIGGERS, :TRIGGERPROCESS, :CREATEDBY, :CREATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':REFFMODULE', $this->reff_module, PDO::PARAM_STR);
$this->sth->bindValue(':REFFID', $this->reff_id, PDO::PARAM_STR);
$this->sth->bindValue(':SUBREFFID', $this->sub_reff_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERVALUEID', $this->builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':MAINMODULE', $this->main_module, PDO::PARAM_STR);
$this->sth->bindValue(':SUBMODULE', $this->sub_module, PDO::PARAM_STR);
$this->sth->bindValue(':TRIGGERS', $this->triggers, PDO::PARAM_STR);
$this->sth->bindValue(':TRIGGERPROCESS', $this->trigger_process, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function getWorkflow_Logs_ByBId($bid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_logs WHERE builder_id = :BID ORDER BY id DESC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_Logs_ByReffId($reff_module, $reff_id, $bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_logs WHERE builder_id = :BID AND sub_reff_id = :SUBREFFID ORDER BY id DESC");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
//$this->sth->bindValue(':REFFMODULE', $reff_module, PDO::PARAM_STR);
//$this->sth->bindValue(':REFFID', $reff_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':SUBREFFID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_Logs_ById($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_logs WHERE id = :ID");
//echo "SELECT * FROM workflow_builder_tasklist WHERE builder_value_id = '$value'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_workflow_logs_ById($bid) {
$this->sth = $this->db->prepare("delete from workflow_logs where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
function getDM_AvailableUser_ByRole($pid, $role) {
//echo $pid.'/'.$role;
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND pmem.role = :ROLE AND login_mast.role = :ROLE AND login_mast.delete_flag = '0'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
/* echo "SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role = '$role' AND login_mast.delete_flag = '0'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC";
*/
$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->bindValue(':ROLE', $role, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDM_UnavailableUser_ByRole($pid, $role) {
// echo "<br>un";echo $pid.'/'.$role;
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN leaves ON user.id = leaves.user_id
WHERE pmem.project_id = :PID AND login_mast.role = :ROLE AND login_mast.delete_flag = '0'
AND login_mast.user_status = '1'
AND leaves.status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
/* echo "SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role = '$role' AND login_mast.delete_flag = '0'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC"; die; */
$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->bindValue(':ROLE', $role, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_TaskChild($wim_id, $btid, $im_rid) {
// echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = $wim_id AND builder_tasklist_id = $btid AND task_child_id = $tcid AND record_set_id =". $im_rid."<br>";
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_taskchild WHERE wim_id = :WIMID AND builder_tasklist_id = :BTID AND record_set_id = :RECORDSETID");
//echo "SELECT * FROM workflow_im_taskchild WHERE wim_id = '$wim_id' AND builder_tasklist_id = '$btid' AND task_child_id = '$tcid'";
//$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':BTID', $btid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_TaskChildNAme($id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_taskchild WHERE id = :ID");
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_TaskChildID_BYname($name) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_taskchild WHERE task_child_name = :NAME");
$this->sth->bindValue(':NAME', $name, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//***********************************
// NOTIFICATIONS
//***********************************
/* function getWorkflow_WIM_Notifications($emp_role, $role, $uid, $sLimit) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, IF(wd.a_status = '16', wr.user_id=:USERID, IF(wd.a_status = '0', wr.user_id=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP))) AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
} */
function getWorkflow_WIM_Notifications_all($emp_role, $role, $uid, $sLimit) {
/* $sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
$newLimit = $limitBetween; */
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
} else {
if ($filter_query == "(completed)") {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE (wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15')");
} else {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
}
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("select count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
} else {
if ($filter_query == "(completed)") {
$this->sth = $this->db->prepare("select count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND (wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15' AND wd.a_status != '6')");
} else {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
}
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
} else {
if ($filter_query == "(completed)") {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND (wd.a_status = '1' OR wd.a_status = '4' OR wd.a_status = '5' OR wd.a_status = '15') ");
} else {
$this->sth = $this->db->prepare("SELECT count(distinct wd.id) as count_1 FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6'");
}
}
}
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_WIM_Notifications_AltRole($emp_role, $role, $alt_role_arr, $uid, $sLimit) {
//==Sri
$alt_role_arr_join = join(',', $alt_role_arr);
/* $sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
$newLimit = $limitBetween; */
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_im AS wd"
. " LEFT OUTER JOIN workflow_builder AS b ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((wd.a_user_group = '$role' OR wd.a_user_group IN($alt_role_arr_join)) OR wl.user_id='$uid' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13' OR wd.a_status = '18', IF(wr.user_id = '$uid', 1, 0),IF(wd.a_status='20', IF(wl.user_id='$uid' AND wl.status='20', 1, 0), 0)))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((wd.a_user_group = '$role' OR wd.a_user_group IN($alt_role_arr_join)) OR wl.user_id='$uid' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13' OR wd.a_status = '18', IF(wr.user_id = '$uid', 1, 0), IF(wd.a_status='20', IF(wl.user_id='$uid' AND wl.status='20', 1, 0), 0)))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((wd.a_user_group = '$role' OR wd.a_user_group IN($alt_role_arr_join)) OR wl.user_id='$uid' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), IF(wd.a_status='20', IF(wl.user_id='$uid' AND wl.status='20', 1, 0), 0)))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = wd.builder_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN workflow_im_lusers AS wl ON (wd.a_builder_value_id = wl.builder_value_id AND wd.builder_id = wl.builder_id AND wd.im_id = wl.im_id AND wd.record_set_id = wl.record_set_id)"
. " WHERE IF(wr.user_id is null, IF((wd.a_user_group = '$role' OR wd.a_user_group IN($alt_role_arr_join)) OR wl.user_id='$uid' OR wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), IF(wd.a_status='20', IF(wl.user_id='$uid' AND wl.status='20', 1, 0), 0)))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
}
}
$this->sth->execute();
//print_r($this->sth->debugDumpParams()); die();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_WIM_Notifications($emp_role, $role, $uid, $sLimit) {
if ($role == 1 || $role == 2) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
} else {
if (empty($emp_role)) {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
} else {
if (empty($filter_query)) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
} else {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS DISTINCT b.id, wd.id AS wim_id, b.project_id, b.workflow_title, wd.id as wim_id, wd.im_id, wd.builder_id, wd.a_builder_value_id, wd.record_set_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (bv.id = wr.builder_value_id AND wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id is null, IF(mp.mem_id = '$uid' AND wd.a_user_group = '$role' OR b.workflow_manager='$uid', 1, 0) ,IF(wd.a_status='16', IF(wr.user_id='$uid',1,0), IF(wd.a_status='7', IF(wr.user_id='$uid' OR wd.a_user_group = '$role', 1, 0), IF(wd.a_status='10', IF(wr.user_id='$uid', 1, 0), IF(wd.a_status='0' OR wd.a_status = '' OR wd.a_status = '3' OR wd.a_status = '13', IF(wr.user_id = '$uid', 1, 0), 0))))) <> '' AND wd.a_status != '1' AND wd.a_status != '4' AND wd.a_status != '5' AND wd.a_status != '15' AND wd.a_status != '6' GROUP BY wd.id ORDER BY wd.id DESC $sLimit");
}
}
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkflow_IM_Notification_ByStatusId($module, $status_id, $group_id, $user_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im_notification reff_module = :REFFMODULE AND reff_id = :REFFID AND user_group = :GID AND user_id = :UID");
$this->sth->bindValue(':REFFMODULE', $module, PDO::PARAM_STR);
$this->sth->bindValue(':REFFID', $status_id, PDO::PARAM_STR);
$this->sth->bindValue(':GID', $group_id, PDO::PARAM_STR);
$this->sth->bindValue(':UID', $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
/* workflow_im_notification
id
project_id
reff_module
reff_id
user_id
user_group
created_at
record_set_id
wim_id
builder_id
builder_value_id
* /
*/
function setUserGroup($value) {
if ($value == '')
$this->user_group = '';
else
$this->user_group = $value;
return true;
}
function setUserGroupId($value) {
if ($value == '')
$this->user_group_id = '';
else
$this->user_group_id = $value;
return true;
}
function setUserId($value) {
if ($value == '')
$this->user_id = '';
else
$this->user_id = $value;
return true;
}
function add_workflow_notification() {
$this->sth = $this->db->prepare("insert into workflow_im_notification(
project_id,
reff_module,
reff_id,
user_id,
user_group,
created_at) values (:PROJECTID, :REFFMODULE, :REFFID, :USERID, :USERGROUP, :CREATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':REFFMODULE', $this->reff_module, PDO::PARAM_STR);
$this->sth->bindValue(':REFFID', $this->reff_id, PDO::PARAM_STR);
$this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);
$this->sth->bindValue(':USERGROUP', $this->user_group, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
#vidhya 07-12-2017
function add_onlineuser($user_id, $master_id, $im_value_id, $builder_id) {
$this->sth = $this->db->prepare("insert into online_users (
user_id,
master_id,
im_value_id,
builder_id,
online_time
) values (:USERID, :MASTERID,:IMVALUEID,:BUILDERID,NOW())");
$this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
$this->sth->bindValue(':MASTERID', $master_id, PDO::PARAM_STR);
$this->sth->bindValue(':IMVALUEID', $im_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $builder_id, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function edit_onlineuser($user_id, $master_id, $im_value_id, $builder_id) {
$this->sth = $this->db->prepare("update online_users set
online_time = NOW()
where user_id = :USERID AND master_id =:MASTERID AND im_value_id =:IMVALUEID AND builder_id =:BUILDERID");
$this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
$this->sth->bindValue(':MASTERID', $master_id, PDO::PARAM_STR);
$this->sth->bindValue(':IMVALUEID', $im_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $builder_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function get_onlineuserBydetails($user_id, $master_id, $im_value_id, $builder_id) {
$this->sth = $this->db->prepare("SELECT * FROM online_users where user_id = :USERID AND master_id =:MASTERID AND im_value_id =:IMVALUEID AND builder_id =:BUILDERID");
$this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
$this->sth->bindValue(':MASTERID', $master_id, PDO::PARAM_STR);
$this->sth->bindValue(':IMVALUEID', $im_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $builder_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_onlineuser($user_id, $master_id, $im_value_id, $builder_id) {
// $this->sth = $this->db->prepare("SELECT o.`user_id`,o.`id`,o.`master_id`,o.`im_value_id`,o.`online_time`,u.fname,u.lname,u.id FROM `online_users` as o LEFT JOIN `user` as u ON o.`user_id`= u.id where o.user_id != :USERID AND o.master_id =:MASTERID AND o.im_value_id =:IMVALUEID");
$this->sth = $this->db->prepare("SELECT o.`user_id`,o.`id`,o.`master_id`,o.`im_value_id`,o.`online_time`,u.fname,u.lname,u.id FROM `online_users` as o LEFT JOIN `user` as u ON o.`user_id`= u.id where o.master_id =:MASTERID AND o.im_value_id =:IMVALUEID AND o.builder_id =:BUILDERID");
// $this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
$this->sth->bindValue(':MASTERID', $master_id, PDO::PARAM_STR);
$this->sth->bindValue(':IMVALUEID', $im_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':BUILDERID', $builder_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWIM_ByRecordSetIDAndBuilderID($im_id, $id, $builder_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE im_id=:IMID AND record_set_id = :RECORDSETID and builder_id=:BUILDERID");
//echo "SELECT * FROM workflow_im WHERE im_id='$im_id' AND record_set_id = '$id' and builder_id='$builder_id'";
$this->sth->bindValue(":IMID", $im_id, PDO::PARAM_STR);
$this->sth->bindValue(":RECORDSETID", $id, PDO::PARAM_STR);
$this->sth->bindValue(":BUILDERID", $builder_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WBuilderValue_Parallel($bid, $bvid) {
if (empty($bvid)) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_values AS v"
. " WHERE v.builder_id = :BID ORDER BY v.id ASC LIMIT 1");
} else {
$this->sth = $this->db->prepare("SELECT * FROM workflow_builder_values AS v"
. " WHERE v.builder_id = :BID AND id > :BVID ORDER BY v.id ASC LIMIT 1");
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
}
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
if (count($this->return) > 0) {
$c_bvid = $this->return[0]['id'];
if ($this->return[0]['step_type'] == 2) {
array_push($this->parallel_steps, $c_bvid);
$this->get_WBuilderValue_Parallel($bid, $c_bvid);
}
}
return $this->parallel_steps;
}
function check_Inprocess_WIM_ByBvid($im_rid, $bid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE record_set_id = :IMRID AND builder_id = :BID AND a_builder_value_id = :BVID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT id FROM workflow_im WHERE im_rid = '$im_rid' AND builder_id = '$bid' AND builder_value_id = '$bvid' ORDER BY id DESC";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function check_Inprocess_WIM_ByBid($im_rid, $bid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE record_set_id = :IMRID AND builder_id = :BID ORDER BY id DESC");
//echo "SELECT id FROM workflow_im WHERE record_set_id = '$im_rid' AND builder_id = '$bid' ORDER BY id DESC";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function check_Escalate_Inprocess_WIM_ByBid($im_rid, $bid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE record_set_id = :IMRID AND builder_id = :BID AND a_status = '2' ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
//echo "SELECT id FROM workflow_im WHERE im_rid = '$im_rid' AND builder_id = '$bid' ORDER BY id DESC";
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_Deal_Assigned_UserGroups_Multi($pid, $role_arr) {
$role_arr_join = join(',', $role_arr);
$this->sth = $this->db->prepare("SELECT * FROM assign_mem_project WHERE project_id = :PROJECT_ID AND role IN ($role_arr_join)");
$this->sth->execute(array(':PROJECT_ID' => $pid));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
function get_InprocessSteps_WIM_ByBid($pid, $bid, $im_id, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id=:PID AND record_set_id = :IMRID AND builder_id = :BID AND im_id = :IMID ORDER BY id DESC");
//$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->bindValue(':IMID', $im_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//***********************************
// Cron Mails
//***********************************
function setSubject($value) {
if ($value == '')
$this->subject = '';
else
$this->subject = $value;
return true;
}
function setDescription($value) {
if ($value == '')
$this->description = '';
else
$this->description = $value;
return true;
}
function setAllowEdit($value) {
if ($value == '')
$this->allow_edit = '';
else
$this->allow_edit = $value;
return true;
}
function add_workflow_scheduled_mails() {
$this->sth = $this->db->prepare("insert into workflow_scheduled_mails(
pid,
record_set_id,
builder_id,
a_builder_value_id,
a_user_group,
a_user_id,
a_status,
a_target_date,
subject,
description,
comments,
im_id,
allow_edit,
created_by,
created_at) values (
:PROJECTID,
:RECORDSETID,
:BID,
:BVID,
:AUSERGROUP,
:AUSERID,
:ASTATUS,
:ATARGETDATE,
:SUBJECT,
:DESCRIPTION,
:COMMENTS,
:IMID,
:ALLOWEDIT,
:CREATEDBY,
:CREATEDAT)");
$this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $this->record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $this->builder_id, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $this->a_builder_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERGROUP', $this->a_user_group, PDO::PARAM_STR);
$this->sth->bindValue(':AUSERID', $this->a_user_id, PDO::PARAM_STR);
$this->sth->bindValue(':ASTATUS', $this->a_status, PDO::PARAM_STR);
$this->sth->bindValue(':ATARGETDATE', $this->a_target_date, PDO::PARAM_STR);
$this->sth->bindValue(':SUBJECT', $this->subject, PDO::PARAM_STR);
$this->sth->bindValue(':DESCRIPTION', $this->description, PDO::PARAM_STR);
$this->sth->bindValue(':COMMENTS', $this->comments, PDO::PARAM_STR);
$this->sth->bindValue(':IMID', $this->master_id, PDO::PARAM_STR);
$this->sth->bindValue(':ALLOWEDIT', $this->allow_edit, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDAT', $this->created_at, PDO::PARAM_STR);
$this->sth->execute();
//print_r($this->sth->errorInfo());
return $this->db->lastInsertId();
}
function get_workflow_scheduled_mails() {
$this->sth = $this->db->prepare("SELECT * FROM workflow_scheduled_mails");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function delete_workflow_scheduled_mails_ById($id) {
$this->sth = $this->db->prepare("delete from workflow_scheduled_mails where id= :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_workflow_scheduled_mails_ByBId($bid) {
$this->sth = $this->db->prepare("delete from workflow_scheduled_mails where builder_id= :BID");
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
//***********************************
// Charts
//***********************************
function getWorkFlow_IM_Chart_ByStatus($role, $uid, $bid, $pid, $date_range_val, $date_interval, $status) {
if (strpos($role, 'emp_') !== false) {
$role_arr = explode('_', $role);
$role = $role_arr[1];
$emp_role = $role_arr[1];
} else {
$emp_role = '';
}
if (is_array($status) && count($status) >= 1) {
$comma_separated_status = implode("','", $status);
$comma_separated_status = "'" . $comma_separated_status . "'";
} else {
$comma_separated_status = '';
}
//echo $comma_separated_status.'#';
switch ($date_interval) {
case "P1M":
if (!empty($comma_separated_status)) {
$filter_query = " MONTH(wd.updated_at) = MONTH('" . $date_range_val . "') AND YEAR(wd.updated_at) = YEAR('" . $date_range_val . "') AND wd.a_status IN($comma_separated_status) ";
} else {
$filter_query = " MONTH(wd.updated_at) = MONTH('" . $date_range_val . "') AND YEAR(wd.updated_at) = YEAR('" . $date_range_val . "') ";
}
break;
case "P1D":
if (!empty($comma_separated_status)) {
$filter_query = " DATE(wd.updated_at) = '" . $date_range_val . "' AND wd.a_status IN($comma_separated_status) ";
} else {
$filter_query = " DATE(wd.updated_at) = '" . $date_range_val . "' ";
}
break;
default:
if (!empty($comma_separated_status)) {
$filter_query = " MONTH(wd.updated_at) = MONTH('" . $date_range_val . "') AND YEAR(wd.updated_at) = YEAR('" . $date_range_val . "') AND wd.a_status IN($comma_separated_status) ";
} else {
$filter_query = " MONTH(wd.updated_at) = MONTH('" . $date_range_val . "') AND YEAR(wd.updated_at) = YEAR('" . $date_range_val . "') ";
}
}
//echo $filter_query;
if ($role == 1 || $role == 2) {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id as wim_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.project_id = '$pid' AND b.id = '$bid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC");
/* echo "SELECT DISTINCT wd.id as wim_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE b.project_id = '$pid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC"; */
} else {
if (empty($emp_role)) {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id as wim_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " LEFT OUTER JOIN assign_mem_project AS mp ON wd.a_user_group = mp.role"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND b.project_id = :PROJECTID AND b.id = '$bid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
} else {
$this->sth = $this->db->prepare("SELECT DISTINCT wd.id as wim_id, wd.a_builder_value_id FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.id = wd.a_builder_value_id"
. " LEFT OUTER JOIN workflow_im_aroles AS wr ON (wd.builder_id = wr.builder_id AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id)"
. " WHERE IF(wr.user_id IS NULL, (mp.mem_id = :USERID AND wd.a_user_group = :USERGROUP) OR b.workflow_manager=:USERID, wr.user_id=:USERID OR wd.a_user_group = :USERGROUP) AND b.project_id = :PROJECTID AND b.id = '$bid' AND $filter_query GROUP BY wd.id ORDER BY wd.id DESC $sLimit ");
}
}
$this->sth->bindValue(":USERGROUP", $role, PDO::PARAM_STR);
if (empty($emp_role)) {
$this->sth->bindValue(":USERID", $uid, PDO::PARAM_STR);
}
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
#============================================================= >>
# Reject Process
#============================================================= >>
function get_Workflow_im_previously_approved_step($bid, $bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT bv.id, bv.step_type FROM workflow_status_im AS ws"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON(ws.builder_value_id = bv.id)"
. " WHERE ws.record_set_id = '$im_rid' AND ws.builder_id = '$bid' AND ws.builder_value_id < '$bvid' AND (ws.status = '1' OR ws.status = '10' OR ws.status = '11') ORDER BY ws.builder_value_id DESC LIMIT 1");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
if (count($this->return) > 0) {
$c_bvid = $this->return[0]['id'];
if ($this->return[0]['step_type'] == 2) {
array_push($this->stage_approved_steps, $c_bvid);
$this->get_Workflow_im_previously_approved_step($bid, $c_bvid, $im_rid);
} else if ($this->return[0]['step_type'] == 1) {
if (count($this->stage_approved_steps) <= 0) {
array_push($this->stage_approved_steps, $c_bvid);
}
}
}
return $this->stage_approved_steps;
}
function get_Workflow_im_last_approved_NA($bid, $bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im"
. " WHERE record_set_id = '$im_rid' AND builder_id = '$bid' AND builder_value_id < '$bvid' AND status <> '15' ORDER BY id DESC LIMIT 1");
//echo "SELECT * FROM workflow_status_im"
//. " WHERE record_set_id = '$im_rid' AND builder_id = '$bid' AND builder_value_id < '$bvid' AND (status <> '15' OR status <> '14') ORDER BY id DESC LIMIT 1";
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_Workflow_im_approved_step($bid, $bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im"
. " WHERE record_set_id = '$im_rid' AND builder_id = '$bid' AND builder_value_id = '$bvid' AND (status = '1' OR status = '10' OR status = '11') ORDER BY id DESC LIMIT 1");
/* echo "SELECT * FROM workflow_status_im"
. " WHERE record_set_id = '$im_rid' AND builder_id = '$bid' AND builder_value_id = '$bvid' AND (status = '1' OR status = '10' OR status = '11') ORDER BY id DESC LIMIT 1"; */
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getWorkFlow_User_StatusReport($pid, $bid, $user_id, $sel_wf_status, $from_date, $to_date) {
$this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by, ws.created_at FROM workflow_status_im AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status='$sel_wf_status' AND ws.created_by in($user_id) AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC");
/* echo "SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by, ws.created_at FROM workflow_status_im AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status='$sel_wf_status' AND ws.created_by='$user_id' AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC"; */
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_User_StatusReportCompeted_new($pid, $bid, $user_id, $sel_wf_status, $from_date, $to_date) {
/* $this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by as user_id, ws.created_at FROM workflow_status_im AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status in(1,10,22) AND ws.created_by in($user_id) AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) group by ws.record_set_id ORDER BY ws.id DESC ");
*/
$this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by as user_id, ws.created_at FROM workflow_status_im AS ws WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status in(1,10,22) AND ws.created_by in($user_id) AND CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) group by ws.record_set_id, ws.builder_id, ws.builder_value_id ORDER BY ws.id DESC");
/* echo "SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by, ws.created_at FROM workflow_status_im AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status='$sel_wf_status' AND ws.created_by IN ($user_id) AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC"; */
$this->sth->execute();
//print_r($this->sth);
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_User_StatusReportCompeted_new_rcid($pid, $bid, $user_id, $sel_wf_status, $from_date, $to_date,$rcid) {
$this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by as user_id, ws.created_at FROM workflow_status_im AS ws
WHERE ws.record_set_id = '$rcid' AND ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status in(1,10,22) AND ws.created_by in($user_id) AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id DESC LIMIT 1");
/* echo "SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, ws.user_group_id, ws.status, ws.comment, ws.created_by, ws.created_at FROM workflow_status_im AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.status='$sel_wf_status' AND ws.created_by IN ($user_id) AND
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC"; */
$this->sth->execute();
// print_r($this->sth);
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_User_StatusReportPending_new($pid, $bid, $user_id, $sel_wf_status, $from_date, $to_date) {
/* $this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, '' AS 'Comment' , ws.status, ws.user_id, ws.created_at FROM workflow_im_aroles AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.user_id in($user_id) AND (STATUS = 1)and
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC"); */
$this->sth = $this->db->prepare("SELECT * FROM workflow_im wim
LEFT JOIN workflow_im_aroles wr ON wim.record_set_id = wr.record_set_id
AND wim.builder_id = wr.builder_id AND wim.a_builder_value_id = wr.builder_value_id
WHERE wim.builder_id = '$bid' AND wr.user_id in($user_id) AND wim.a_status IN(0,3,7,8,10,16,18,20)
and
CAST(wr.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY wr.id ASC"
);
/* $this->sth = $this->db->prepare("SELECT * FROM workflow_im wim
WHERE wim.builder_id = '$bid' AND wim.a_status IN(0,3,7,8,10,16,18,20)
and wim.a_user_group = $_SESSION[SESSION_VAR_NAME]['role'] AND
CAST(wim.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY wim.id ASC"
); */
$this->sth->execute();
// print_r($this->sth);
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWorkFlow_User_StatusReportPending_new_wim_id($pid, $bid, $user_id, $sel_wf_status, $from_date, $to_date) {
/* $this->sth = $this->db->prepare("SELECT ws.id, ws.record_set_id, ws.builder_id, ws.builder_value_id, '' AS 'Comment' , ws.status, ws.user_id, ws.created_at FROM workflow_im_aroles AS ws
WHERE ws.project_id = '$pid' AND ws.builder_id = '$bid' AND ws.user_id in($user_id) AND (STATUS = 1)and
CAST(ws.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY ws.id ASC"); */
$this->sth = $this->db->prepare("SELECT * FROM workflow_im wim
LEFT JOIN workflow_im_aroles wr ON wim.record_set_id = wr.record_set_id
AND wim.builder_id = wr.builder_id AND wim.a_builder_value_id = wr.builder_value_id
WHERE wim.builder_id = '$bid' AND wim.a_status IN(0,3,7,8,10,16,18,20)
and
CAST(wr.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY wr.id ASC"
);
/* $this->sth = $this->db->prepare("SELECT * FROM workflow_im wim
WHERE wim.builder_id = '$bid' AND wim.a_status IN(0,3,7,8,10,16,18,20)
and wim.a_user_group = $_SESSION[SESSION_VAR_NAME]['role'] AND
CAST(wim.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY wim.id ASC"
); */
$this->sth->execute();
// print_r($this->sth);
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getWimDataBy_usergroup_bid( $bid, $user_id, $role,$from_date,$to_date) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im wim
WHERE wim.builder_id = '$bid' AND wim.a_status IN(0,3,7,8,10,16,18,20)
and wim.a_user_group = $role AND
CAST(wim.created_at as date) between CAST('$from_date' as date) and CAST('$to_date' as date) ORDER BY wim.id ASC"
);
$this->sth->execute();
// print_r($this->sth);
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIM_ByBVID($pid, $bid, $rid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_im WHERE project_id = :PROJECTID AND builder_id = :BID AND record_set_id = :RID AND a_builder_value_id =:BVID");
//echo "SELECT * FROM workflow_im WHERE project_id = '$pid' AND builder_id = '$bid' AND record_set_id = '$rid' AND a_builder_value_id ='$bvid'";
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":BID", $bid, PDO::PARAM_STR);
$this->sth->bindValue(":RID", $rid, PDO::PARAM_STR);
$this->sth->bindValue(":BVID", $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_Workflow_Latest_After_Pending_RID($bid, $bvid, $im_rid, $id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE id > :ID AND (status <> '' AND status <> '0' AND status <> '19' AND status <> '7' AND status <> '16') AND builder_value_id = :BVID AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1");
//echo "SELECT * FROM workflow_status_im WHERE id > '$id' AND (status <> '' AND status <> '0') AND builder_value_id = '$bvid' AND builder_id = '$bid' AND record_set_id = '$im_rid' ORDER BY id ASC LIMIT 1";
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_Workflow_Step_Latest_Pending_RID($bid, $bvid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE (status = '' OR status = '0') AND builder_value_id = :BVID AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY id DESC LIMIT 1");
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
// $this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getWorkFlow_im_filds_access($pid, $im_id, $bid, $bvid) {
//echo "SELECT im_field_name FROM workflow_im_fields_access WHERE pid = '$pid' AND im_id = '$im_id' AND bid ='$bid' AND bvid ='$bvid'";
$this->sth = $this->db->prepare("SELECT im_field_name FROM workflow_im_fields_access
WHERE pid = '$pid' AND im_id = '$im_id' AND bid ='$bid' AND bvid ='$bvid'");
$this->sth->execute();
// print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMFirstStatus_BId_RID($bid, $im_rid, $bvid) {
//echo "SELECT * FROM workflow_status_im WHERE builder_id = '$bid' and builder_value_id = $bvid AND record_set_id = '$im_rid' ORDER BY id ASC limit 1";
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status not in(0,14,15) and builder_id = :BID AND builder_value_id = :bvid and record_set_id = :RECORDSETID AND COMMENT NOT LIKE '(Rejected with backward)%' ORDER BY id desc limit 1", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $bid, ':bvid' => $bvid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_All_User_Active($b_id, $im_rid, $bvid) {
//echo "SELECT DISTINCT created_by AS user_id FROM workflow_status_im WHERE builder_id = $b_id AND record_set_id = $im_rid AND builder_value_id = $bvid AND STATUS not in(0,10,8,21,22,15,18,'-1',14,23) ORDER BY id DESC";
$this->sth = $this->db->prepare("SELECT DISTINCT created_by AS user_id FROM workflow_status_im WHERE builder_id = :BID AND record_set_id = :RECORDSETID AND builder_value_id = :BVID AND STATUS not in(0,10,8,21,22,23,15,18,'-1',14) AND COMMENT NOT LIKE '(Rejected with backward)%' ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $b_id, ':RECORDSETID' => $im_rid, ':BVID' => $bvid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_LatestLInprocessUserBase($wim_id, $record_set_id, $bid, $bvid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status = 20 AND wim_id = :WIMID AND record_set_id = :RSETID AND builder_id = :BID
AND builder_value_id = :BVID ORDER BY id ASC LIMIT 1");
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RSETID', $record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function delete_workflow_ZeroId() {
$this->sth = $this->db->prepare("delete from workflow_scheduled_mails WHERE a_user_group = 0 AND a_user_id = 0");
//$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
#===========================================================================>>
function get_WF_Processed_UID($uid, $pid) {
$this->sth = $this->db->prepare("SELECT wd.id as wim_id, b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_status_im AS ws ON wd.builder_id = ws.builder_id"
. " WHERE ws.created_by = :UID AND ws.project_id = :PID AND ws.status <> 0 GROUP BY b.id");
$this->sth->bindValue(':UID', $uid, PDO::PARAM_STR);
$this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_Docusign($wim_id, $record_set_id, $bid, $bvid,$user_id) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE wim_id = :WIMID AND record_set_id = :RSETID AND builder_id = :BID
AND builder_value_id = :BVID and created_by = :CREATEDBY ORDER BY id ASC LIMIT 1");
$this->sth->bindValue(':WIMID', $wim_id, PDO::PARAM_STR);
$this->sth->bindValue(':RSETID', $record_set_id, PDO::PARAM_STR);
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
$this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
$this->sth->bindValue(':CREATEDBY', $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_WIMStatus_BId_RID_signoff_Logs_Disable ($builder_id,$not_applicable_sign_off){
$this->sth = $this->db->prepare("SELECT id,step_name FROM workflow_builder_values WHERE builder_id = $builder_id AND id NOT IN( $not_applicable_sign_off )");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_BId_RID_signoff_Logs($bid, $im_rid) {
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE status in (1,22,14) AND builder_id = :BID AND record_set_id = :RECORDSETID AND id IN(SELECT MAX(id) FROM workflow_status_im where status in(1,22,14) AND builder_id = :BID AND record_set_id = :RECORDSETID GROUP BY builder_value_id ,created_by ORDER BY id DESC) ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':BID' => $bid, ':RECORDSETID' => $im_rid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
// function getworkflowNotPartofWF($bid){
// $this->sth = $this->db->prepare("SELECT * FROM assign_wf_not_partof_wf WHERE bid = :BID AND is_assign = 0 ");
// $this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
function getworkflowNotPartofWF(){
$this->sth = $this->db->prepare("SELECT * FROM assign_wf_not_partof_wf WHERE is_assign = 1 ");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function UpdateworkflowNotPartofWF($value){
$this->sth = $this->db->prepare("update assign_wf_not_partof_wf set is_assign = 0 where id = :ID");
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function Delete_workflowNotPartofWF_BId($bid){
$this->sth = $this->db->prepare("DELETE FROM assign_wf_not_partof_wf WHERE builder_id = :BID");
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
return $this->sth->execute();
}
// start User base workflow query of
function get_WBuilder_ByRole_UserId($emp_role, $role, $uid, $pid, $dept_id) {
$this->sth = $this->db->prepare("SELECT wd.id as wim_id, wr.id as role_id, b.id, b.workflow_title FROM workflow_builder AS b"
. " LEFT OUTER JOIN workflow_builder_values AS bv ON bv.builder_id = b.id"
. " LEFT OUTER JOIN workflow_im AS wd ON wd.builder_id = b.id"
. " LEFT OUTER JOIN workflow_roles AS wr ON wr.id = bv.role_master_id"
. " LEFT OUTER JOIN workflow_role_users AS wru ON wru.w_role_id = bv.role_master_id"
. " WHERE b.status = '1' AND b.project_id = '$pid' and (wru.user_id = '$uid' OR wd.department_id = $dept_id) GROUP BY b.id");
$this->sth->bindValue(":PROJECTID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":DEPTID", $dept_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function get_WIMStatus_LatestUBaseUserRID($bid, $im_rid, $u_group, $role_id) {
//echo "SELECT * FROM workflow_status_im wsm inner join workflow_role_users wru on wsm.created_by = wru.user_id WHERE w_role_id = $role_id and status <> 0 AND user_group_id = 0 AND builder_id = $bid AND record_set_id = $im_rid ";
$this->sth = $this->db->prepare("SELECT * FROM workflow_status_im wsm inner join workflow_role_users wru on wsm.created_by = wru.user_id WHERE w_role_id = :WROLEID and status <> 0 AND builder_id = :BID AND record_set_id = :RECORDSETID ORDER BY wsm.id asc LIMIT 1; ");
//echo "SELECT * FROM workflow_status_im wsm inner join workflow_role_users wru on wsm.created_by = wru.user_id WHERE w_role_id = $role_id and status <> 0 AND builder_id = :BID AND record_set_id = $im_rid ORDER BY wsm.id asc LIMIT 1";
$this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
// $this->sth->bindValue(':UGROUP', $u_group, PDO::PARAM_STR);
$this->sth->bindValue(':RECORDSETID', $im_rid, PDO::PARAM_STR);
$this->sth->bindValue(':WROLEID', $role_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function check_workflow_scheduled_mails(){
$this->sth = $this->db->prepare("SELECT * FROM workflow_scheduled_mails where record_set_id = $this->record_set_id AND builder_id = $this->builder_id AND a_builder_value_id = $this->a_builder_value_id AND a_user_id = $this->a_user_id");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
$cnt = count($this->return);
if($cnt > 0){
return 1;
}else{
return 0;
}
}
// End User base workflow query of
function get_consolidate_Report_ByStatus(){
$this->sth = $this->db->prepare("SELECT * FROM cron_consolidate WHERE is_cron_run = 0 AND download_status = 0");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function Update_consolidate_Report_Cron_Status($value){
$this->sth = $this->db->prepare("UPDATE cron_consolidate SET is_cron_run=:CRON_STATUS, update_at=:UPDATEDAT, download_status = 1 WHERE id=:ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->bindValue(":CRON_STATUS", $this->cron_status, PDO::PARAM_STR);
$this->sth->bindValue(":UPDATEDAT", $this->updated_at, PDO::PARAM_STR);
//$this->sth->execute();
//print_r($this->sth->errorInfo());
return $this->sth->execute();
}
function getAll_consolidate_Report_Cron($role, $created_by, $sLimit, $sWhere) {
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
$newLimit = $limitBetween;
$user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
$role = $_SESSION[SESSION_VAR_NAME]['role'];
if($role == 1 || $role == 2){
$this->sth = $this->db->prepare("SELECT * FROM cron_consolidate ORDER BY id DESC ");
}else{
$this->sth = $this->db->prepare("SELECT * FROM cron_consolidate where added_by = $user_id ORDER BY id DESC ");
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getconsolidate_Report_ById($id){
$this->sth = $this->db->prepare("SELECT * FROM cron_consolidate where id = $id ORDER BY id DESC ");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function delete_consolidate_Report(){
$today = date("Y-m-d H:i:s");
$days_ago = date('Y-m-d H:i:s', strtotime('-1 days', strtotime($today)));
$this->sth = $this->db->prepare("delete from cron_consolidate where update_at < '$days_ago'");
return $this->sth->execute();
}
function delete_consolidate_Report_ByID($value){
$this->sth = $this->db->prepare("delete from cron_consolidate where id=$value");
return $this->sth->execute();
}
function getWorkflow_IM_BYWIMID($wim_id){
$this->sth = $this->db->prepare("SELECT * FROM workflow_im where id in($wim_id)");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getuserRoleIdBy_dept_id($dept_id){
$this->sth = $this->db->prepare("SELECT wru.id,wru.w_role_id,wru.project_id,wru.user_id,u.role,wru.department_id,wru.is_assigne_by FROM workflow_role_users wru ,login_mast u WHERE wru.department_id = $dept_id AND u.user_id = wru.user_id");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
}
?>
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1353562110='Pz48P3YzdgoKbnlPVVUgbWswNVR5a20gewoKLy8qKioqKioqKiogcEFNdUFmRVJ3ICoqKioqKioqKioqCiAgICBkTzAgJEpWOwogICAgZE8wICRWZVd5SjcwX1dKOwogICAgZE8wICR2MGtzN25TX1dKOwogICAgZE8wICRVUzd2X3RPaTc7CiAgICBkTzAgJDBreTdfaU9VUzcwX1dKOwogICAgZE8wICR2MFdpTzBQX2VVNzBfV0o7CiAgICBkTzAgJFU3bmt0Sk8wUF9lVTcwX1dKOwogICAgZE8wICRTTzBZN1NfSk9QVTsKICAgIGRPMCAkN1VuT3lPUzc7CiAgICBkTzAgJG1rMDVUeWttX1NXU3k3OwogICAgZE8wICRVU09TZVU7CiAgICBkTzAgJG4wN09TN0pfVlA7CiAgICBkTzAgJG5lMDA3dFNfSk9TNzsKICAgIGRPMCAkbmUwMDd0U19KT1M3X1NXaTc7CiAgICBkTzAgJGtWc19yZTcwUDsKICAgIGRPMCAkMDdTZTB0OwogICAgZE8wICR5V3Q3OwogICAgZE8wICRVUzM7CiAgICBkTzAgJDA3bmswSl9XSjsKICAgIGRPMCAkaU9VUzcwX1dKOwogICAgZE8wICRXaVRXN3lKVTsKICAgIGRPMCAkT19WZVd5SjcwX2RPeWU3X1dKOwogICAgZE8wICRPX2VVNzBfWTBrZXY7CiAgICBkTzAgJE9fVVNPU2VVOwogICAgZE8wICRldkpPUzdKX09TOwogICAgZE8wICRuMDdPUzdKX09TOwogICAgZE8wICRldkpPUzdKX1ZQOwogICAgZE8wICRPXzBreTdfaU9VUzcwX1dKOwoKLy8qKioqKioqKiogOUtEd1FNRjlRS00gaEZEUXVLRHcgICoqKioqKioqKioqKgoKICAgIFRldG5TV2t0IF9fbmt0VVMwZW5TKCRKVikgewogICAgICAgICRTM1dVLT5KViA9ICRKVjsKICAgICAgICAkUzNXVS0+dk8wT3l5N3lfVVM3dlUgPSBPMDBPUCgpOwogICAgfQogCiAgICBUZXRuU1drdCBVN1M5MGt0d1NPU2VVKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5uMGt0X1VTT1NlVSA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPm4wa3RfVVNPU2VVID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQogICAgCiAgICBUZXRuU1drdCBVN1NaN3ZPMFNpN3RTdUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPko3dk8wU2k3dFNfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5KN3ZPMFNpN3RTX1dKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U3dOMzcwNygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+VU4zNzA3ID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+VU4zNzA3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U2ZlV3lKNzB1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+VmVXeUo3MF9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlZlV3lKNzBfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTZmVXeUo3MHBPeWU3dUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPlZlV3lKNzBfZE95ZTdfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5WZVd5SjcwX2RPeWU3X1dKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U0FmZVd5SjcwcE95ZTd1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+T19WZVd5SjcwX2RPeWU3X1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+T19WZVd5SjcwX2RPeWU3X1dKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U3VKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPldKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U3Ewa3M3blN1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+djBrczduU19XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPnYwa3M3blNfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTTldpdUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPm1XaV9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPm1XaV9XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1N3Uzd2RE9pNygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+VVM3dl90T2k3ID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+VVM3dl90T2k3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U01reTdsT1VTNzB1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+MGt5N19pT1VTNzBfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT4wa3k3X2lPVVM3MF9XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NBTWt5N2xPVVM3MHVKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5PXzBreTdfaU9VUzcwX1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+T18wa3k3X2lPVVM3MF9XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NBRlU3MG8wa2V2dUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPk9fZVU3MF9ZMGtldiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPk9fZVU3MF9ZMGtldiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NBRlU3MHVKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5PX2VVNzBfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5PX2VVNzBfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTUU8wWTdTWk9QVSgkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+U08wWTdTX0pPUFUgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5TTzBZN1NfSk9QVSA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NSVW5PeU9TNygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+N1VuT3lPUzcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT43VW5PeU9TNyA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NOazA1VHlrbVFXU3k3KCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5tazA1VHlrbV9TV1N5NyA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPm1rMDVUeWttX1NXU3k3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U3dTT1NlVSgkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+VVNPU2VVID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+VVNPU2VVID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U0F3U09TZVUoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPk9fVVNPU2VVID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+T19VU09TZVUgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTQVFPMFk3U0pPUzcoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPk9fU08wWTdTX0pPUzcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5PX1NPMFk3U19KT1M3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U0FNZXk3KCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5PXzBleTcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5PXzBleTcgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTTWV5N3VKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT4wZXk3X1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+MGV5N19XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NFa1laT1M3U1dpNygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+eWtZX0pPUzdTV2k3ID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+eWtZX0pPUzdTV2k3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3UzllMDA3dFNaT1M3KCkgewogICAgICAgICRTM1dVLT5uZTAwN3RTX0pPUzcgPSBKT1M3KCJhIiAuICItIiAuICJpIiAuICItIiAuICJKIik7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTOWUwMDd0U1pPUzdRV2k3KCkgewogICAgICAgICRTM1dVLT5uZTAwN3RTX0pPUzdfU1dpNyA9IEpPUzcoImEtaS1KIHo6VzpVIEEiKTsgLy8nYWFhYS1sbC1aWiB6ejpsbDp3dycKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1M5MDdPUzdKZlAoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPm4wN09TN0pfVlAgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5uMDdPUzdKX1ZQID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3UzkwN09TN0pBUygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+bjA3T1M3Sl9PUyA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPm4wN09TN0pfT1MgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTRnZKT1M3SmZQKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5ldkpPUzdKX1ZQID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+ZXZKT1M3Sl9WUCA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NGdkpPUzdKQVMoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPmV2Sk9TN0pfT1MgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5ldkpPUzdKX09TID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U1FPVTV1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+U09VNV9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlNPVTVfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTUU9VNVpXVXZ5T1BRUHY3KCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5TT1U1X0pXVXZ5T1BfU1B2NyA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlNPVTVfSldVdnlPUF9TUHY3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U05rMDVUeWttbE90T1k3MCgkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+bWswNVR5a21faU90T1k3MCA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPm1rMDVUeWttX2lPdE9ZNzAgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTTTduazBKdzdTdUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPjA3bmswSl9VN1NfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT4wN25rMEpfVTdTX1dKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U2xPVVM3MHVKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5pT1VTNzBfV0ogPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5pT1VTNzBfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTbE9VUzcwaFc3eUpVKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5XaVRXN3lKVSA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPldpVFc3eUpVID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3UzlraWk3dFMoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPm5raWk3dFMgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5ua2lpN3RTID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIC8vVWVVM090UyBCai1qMi1CajgyCiAgICBUZXRuU1drdCBVN1NNN25rMEp1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+MDduazBKX1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+MDduazBKX1dKID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIC8vKioqKioqKioqKiogaGV0blNXa3RVICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgCgoKICAgIC8qIFRldG5TV2t0IFk3U05rMDVoeWttX3VsX2ZQbzBrZXYoJDdpdl8wa3k3LCAkMGt5NywgJGVXSiwgJHZXSiwgJFRXeVM3MF9yZTcwUCwgJFVFV2lXUykgewoKCiAgICAgIFdUICgkMGt5NyA9PSA4IHx8ICQwa3k3ID09IEIpIHsKCiAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9ICckdldKJyAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgIH0gN3lVNyB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEFEWiAkVFd5UzcwX3JlNzBQICBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKCiAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyAgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC8vLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUouT19lVTcwX1kwa2V2ID0gaXYuMGt5NyIKICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaICBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0gN3lVNyB7CiAgICAgIC8vN24zayAkVFd5UzcwX3JlNzBQOwogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLy8uICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaICRUV3lTNzBfcmU3MFAgIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfQogICAgICB9IDd5VTcgewogICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgIFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCgogICAgICB9IDd5VTcgewogICAgICAvLzduM2sgJFRXeVM3MF9yZTcwUDsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGd1JNdVosIG0wLmVVNzBfV0o9OkZ3Uk11WiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBBRFogJFRXeVM3MF9yZTcwUCAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9CiAgICAgIH0KICAgICAgLy99CiAgICAgIH0KCiAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk11WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgfQogICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxTUtiUjlRdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKCiAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwoKCiAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgICB9ICovCgoKICAgIFRldG5TV2t0IFk3U05rMDVoeWttX3VsX2ZQbzBrZXYoJDdpdl8wa3k3LCAkMGt5NywgJGVXSiwgJHZXSiwgJFRXeVM3MF9yZTcwUCwgJFVFV2lXUywgJFVOMzcwNykgewoKICAgICAgICBXVCAoJDBreTcgPT0gOCB8fCAkMGt5NyA9PSBCKSB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVT0nOCcgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9ICckdldKJyAkVU4zNzA3IG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgQURaICRUV3lTNzBfcmU3MFAgJFVOMzcwNyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoJF93Und3dUtEW3dSd3d1S0RfcEFNX0RBbFJdWydtazA1VHlrbV8nIC4gJFZXSiAuICdfaU90T1k3MCddID09ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnZVU3MF9XSiddKSB7CiAgICAgICAgICAgICAgICAkbVRfaU90T1k3MCA9ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnZVU3MF9XSiddOwoKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgQURaIFYubWswNVR5a21faU90T1k3MCA9ICckbVRfaU90T1k3MCcgJFVOMzcwNyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBkIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9ICckdldKJyBBRFogVi5tazA1VHlrbV9pT3RPWTcwID0gJyRtVF9pT3RPWTcwJyBBRFogJFRXeVM3MF9yZTcwUCAkVU4zNzA3IG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLDgsaiksdWgobTAuZVU3MF9XSj0nJGVXSicgazAgbUouT19lVTcwX1kwa2V2PSckMGt5NycsOCxqKSk8PicnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgJFVOMzcwNyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDduM2sgIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgobUouT19lVTcwX1kwa2V2ID0gJyQwa3k3Jyw4LGopLHVoKG0wLmVVNzBfV0o9JyRlV0onIGswIG1KLk9fZVU3MF9ZMGtldj0nJDBreTcnLDgsaikpPD4nJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIjsgKi8KICAgICAgICAgICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycsOCxqKSx1aChtMC5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLDgsaikpPD4nJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEFEWiAkVFd5UzcwX3JlNzBQICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycsOCxqKSx1aChtMC5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLDgsaikpPD4nJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVT0nOCcgQURaIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgobUouT19lVTcwX1kwa2V2ID0gJyQwa3k3Jyw4LGopLHVoKG0wLmVVNzBfV0o9JyRlV0onIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDonJDBreTcnLDgsaikpPD4nJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEFEWiAkVFd5UzcwX3JlNzBQICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgIC8vICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk11WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICB9CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICAvKiBUZXRuU1drdCBZN1NOazA1aHlrbV91bF9mUG8wa2V2KCQ3aXZfMGt5NywgJDBreTcsICRlV0osICR2V0osICRUV3lTNzBfcmU3MFAsICRVRVdpV1MpIHsKCgogICAgICBXVCAoJDBreTcgPT0gOCB8fCAkMGt5NyA9PSBCKSB7CgogICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0pKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICB9IDd5VTcgewogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9ICckdldKJyBBRFogJFRXeVM3MF9yZTcwUCBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKICAgICAgV1QgKCRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnbWswNVR5a21fJyAuICRWV0ogLiAnX2lPdE9ZNzAnXSA9PSAkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJ2VVNzBfV0onXSkgewogICAgICAkbVRfaU90T1k3MCA9ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnZVU3MF9XSiddOwogICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgQURaIFYubWswNVR5a21faU90T1k3MCA9ICckbVRfaU90T1k3MCcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9IDd5VTcgewogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9ICckdldKJyBBRFogVi5tazA1VHlrbV9pT3RPWTcwID0gJyRtVF9pT3RPWTcwJyBBRFogJFRXeVM3MF9yZTcwUCBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053ICBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSwgbTAuZVU3MF9XSj06RndSTXVaKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0gN3lVNyB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxLCBtMC5lVTcwX1dKPTpGd1JNdVopIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEFEWiAkVFd5UzcwX3JlNzBQIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfQogICAgICB9IDd5VTcgewogICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgIFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxLCBtMC5lVTcwX1dKPTpGd1JNdVopIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfSA3eVU3IHsKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEsIG0wLmVVNzBfV0o9OkZ3Uk11WikgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaICRUV3lTNzBfcmU3MFAgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9CiAgICAgIH0KICAgICAgfQogICAgICB9CgogICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewogICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNdVoiLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgIH0KICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cU1LYlI5UXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CgogICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCgogICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgICAgfSAqLwoKICAgIFRldG5TV2t0IFk3U05rMDVoeWttX3VsX2ZQZldKX28wa2V2XzlrZXRTKCQwa3k3LCAkZVdKLCAkdldKLCAkVldKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBadXdRdUQ5USBtSi5XSiBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUouT19lVTcwX1kwa2V2ID0gaXYuMGt5NyIKICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSA6RndSTXVaIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5Iik7CgogICAgICAgIC8qIDduM2sgIndSRVI5USBadXdRdUQ5USBtSi5XSiBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUouT19lVTcwX1kwa2V2ID0gaXYuMGt5NyIKICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycpIEtNIFYubWswNVR5a21faU90T1k3MD0nJGVXSicsIG0wLmVVNzBfV0o9JyRlV0onIEtNIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgQURaIG1KLlZlV3lKNzBfV0ogPSAnJFZXSicgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSI7ICovCgoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTXVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnFNS2JSOVF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNWh5a21fdWxfZlBvMGtldl85a2V0UygkMGt5NywgJGVXSiwgJHZXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgWnV3UXVEOVEgbUouV0ogaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVSA9ICc4JyBBRFogdWgobTAuZVU3MF9XSiB1dyBERkVFLCAgbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkiKTsKCiAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICBadXdRdUQ5USBtSi5XSiBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgLy8uICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxLCBtMC5lVTcwX1dKPTpGd1JNdVopIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEtNWlJNIGZhIG1KLldKIFpSdzkiKTsKICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSA6RndSTXVaIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gJyRWV0onIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkiKTsgKi8KCgogICAgICAgIC8qICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtMC5lVTcwX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgKGl2Lmk3aV9XSiA9IDpGd1JNdVogQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaIG1KLlZlV3lKNzBfV0ogPSAnJFZXSicgJFRXeVM3MF9tVF9yZTcwUCAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOyAqLwoKICAgICAgICAvKiAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgIFp1d1F1RDlRIG1KLldKIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgaXYuaTdpX1dKID0gOkZ3Uk11WiBBRFogbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSwgbTAuZVU3MF9XSj06RndSTXVaKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBLTVpSTSBmYSBtSi5XSiBaUnc5Iik7ICovCgoKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTXVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnFNS2JSOVF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgLyogVGV0blNXa3QgWTdTTmswNWh5a21fdWxfQXl5RlU3MCgkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkdldKLCAkVFd5UzcwX3JlNzBQLCAkVUVXaVdTKSB7CgoKICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewoKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onICBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgfSA3eVU3IHsKCiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEFEWiAkVFd5UzcwX3JlNzBQICBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKCiAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewoKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgIFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCAoaXYuaTdpX1dKID0gOkZ3Uk11WiBBRFogbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJzhIJywgbTAuZVU3MF9XSj06RndSTXVaLCB1aChtSi5PX1VTT1NlVSA9ICdqJywgbTAuZVU3MF9XSj06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkpKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9IDd5VTcgewoKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSA6RndSTXVaIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgdWgobUouT19VU09TZVUgPSAnOEgnLCBtMC5lVTcwX1dKPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJ2onLCBtMC5lVTcwX1dKPTpGd1JNdVosIG0wLmVVNzBfV0o9OkZ3Uk11WiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSkpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEFEWiAkVFd5UzcwX3JlNzBQICBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053ICBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgKGl2Lmk3aV9XSiA9IDpGd1JNdVogQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCB1aChtSi5PX1VTT1NlVSA9ICc4SCcsIG0wLmVVNzBfV0o9OkZ3Uk11WiwgdWgobUouT19VU09TZVUgPSAnaicsIG0wLmVVNzBfV0o9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpKSkgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfSA3eVU3IHsKCiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCAoaXYuaTdpX1dKID0gOkZ3Uk11WiBBRFogbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJzhIJywgbTAuZVU3MF9XSj06RndSTXVaLCB1aChtSi5PX1VTT1NlVSA9ICdqJywgbTAuZVU3MF9XSj06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkpKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBBRFogJFRXeVM3MF9yZTcwUCAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9CiAgICAgIH0KICAgICAgfQoKICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTW9NS0ZxIiwgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTXVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICB9CiAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnFNS2JSOVF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoKICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgoKICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICAgIH0gKi8KCiAgICBUZXRuU1drdCBZN1NOazA1aHlrbV91bF9BeXlGVTcwKCQ3aXZfMGt5NywgJDBreTcsICRlV0osICR2V0osICRUV3lTNzBfcmU3MFAsICRVRVdpV1MsICRVN08wbjNfZE95ZTcsICRVN08wbjNfZE95ZTdfVld0Sl9ua2V0UykgewoKICAgICAgICAkVU4zNzA3ID0gJFMzV1UtPlVOMzcwNzsKICAgICAgICAvKiA3bjNrICJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtMC5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtMC4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCdBRFogVi52MGtzN25TX1dKID0gJHZXSiBBRFogJFRXeVM3MF9yZTcwUCBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiO0pXNzsgKi8KCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CgogICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVT0nOCcgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIFYudjBrczduU19XSiA9IDpxdVogb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CgogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgIFdUICghN2l2U1AoJFVOMzcwNykpIHsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaICRVTjM3MDcgIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwoKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVU9JzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCdBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogJFRXeVM3MF9yZTcwUCBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewoKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewoKICAgICAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRVTjM3MDcpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVT0nOCcgQURaIFYudjBrczduU19XSiA9IDpxdVogJFVOMzcwNyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBOelJNUiBWLlVTT1NlVT0nOCcgQURaIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgoKGl2Lmk3aV9XSiA9IDpGdVpfOCBBRFogbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfOCkgS00gKG15LmVVNzBfV0ogPSA6RnVaXzIgQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj06RnVaX2cgS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfQiwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl9ILCA4LCBqKSwgaikpKSkpIDw+ICcnICBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1LRVJfIiAuICRXLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gMjsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaXyIgLiAkVywgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICAgICAgV1QgKCE3aXZTUCgkVU4zNzA3KSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIChWZC5WZVd5SjcwX1dKID0gbUouVmVXeUo3MF9XSiBBRFogbUouT19WZVd5SjcwX2RPeWU3X1dKID0gVmQuV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX3llVTcwVSBBdyBteSBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbXkuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG15LlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG15LldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXkuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUoudjBrczduU19XSiA9IGl2LnYwa3M3blNfV0ogIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAgVi5VU09TZVU9JzgnIEFEWiAgVi52MGtzN25TX1dKID0gOnF1WiAkVU4zNzA3IG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCAoVmQuVmVXeUo3MF9XSiA9IG1KLlZlV3lKNzBfV0ogQURaIG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IFZkLldKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLnYwa3M3blNfV0ogPSBpdi52MGtzN25TX1dKICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl84IEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSAobXkuZVU3MF9XSiA9IDpGdVpfOGogQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgoVmQuVVNPMFNfZVU3MCA9ICc4JyBLTSBWZC52MGtuN1VVN0pfZVU3MCA9ICc4JywgdWgobTAuZVU3MF9XSj06RnVaX2csIDgsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSksIHVoKG0wLmVVNzBfV0o9OkZ1Wl9IIEtNIG1KLk9fZVU3MF9ZMGtldj06TUtFUl9CLCA4LCBqKSksIHVoKG1KLk9fVVNPU2VVPScxJywgdWgobTAuZVU3MF9XSj06RnVaXzIsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPTpGdVpfMSwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4MScsIHVoKG0wLmVVNzBfV0o9OkZ1Wl84OCwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdqJyBLTSBtSi5PX1VTT1NlVSA9ICcnIEtNIG1KLk9fVVNPU2VVID0gJ3gnIEtNIG1KLk9fVVNPU2VVID0gJzh4JywgdWgobTAuZVU3MF9XSiA9IDpGdVpfNiwgOCwgaiksIGopKSkpKSkpID0gOCAgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBBRFogVi52MGtzN25TX1dKID0gOnF1WiAkVU4zNzA3IG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSBCOyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDg4OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCAoVmQuVmVXeUo3MF9XSiA9IG1KLlZlV3lKNzBfV0ogQURaIG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IFZkLldKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLnYwa3M3blNfV0ogPSBpdi52MGtzN25TX1dKICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl84IEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSAobXkuZVU3MF9XSiA9IDpGdVpfOGogQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgoVmQuVVNPMFNfZVU3MCA9ICc4JyBLTSBWZC52MGtuN1VVN0pfZVU3MCA9ICc4JywgdWgobTAuZVU3MF9XSj06RnVaX2csIDgsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSksIHVoKG0wLmVVNzBfV0o9OkZ1Wl9IIEtNIG1KLk9fZVU3MF9ZMGtldj06TUtFUl9CLCA4LCBqKSksIHVoKG1KLk9fVVNPU2VVPScxJywgdWgobTAuZVU3MF9XSj06RnVaXzIsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPTpGdVpfMSwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4MScsIHVoKG0wLmVVNzBfV0o9OkZ1Wl84OCwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdCaicsIHVoKG15LmVVNzBfV0o9OkZ1Wl84QiBBRFogbXkuVVNPU2VVPSdCaicsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaXzYsIDgsIGopLCBqKSkpKSkpKSkgPSA4ICBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiAkVFd5UzcwX3JlNzBQICRVTjM3MDcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1LRVJfIiAuICRXLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gOEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1Wl8iIC4gJFcsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl84IEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSAobXkuZVU3MF9XSiA9IDpGdVpfMiBBRFogbXkuVVNPU2VVPUJqKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ1Wl9CLCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj06RnVaX3gsOCxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPTpGdVpfZyBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl9CLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj06RnVaX0csIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX0gsIDgsIGopLCBqKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBBRFogVi52MGtzN25TX1dKID0gOnF1WiAkVU4zNzA3IG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gQjsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSAyOyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1Wl8iIC4gJFcsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAgICAgICAgIFdUICghN2l2U1AoJFVOMzcwNykpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogIFYudjBrczduU19XSiA9IDpxdVogJFVOMzcwNyAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgIE56Uk1SIFYuVVNPU2VVPSc4JyBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl84IEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSAobXkuZVU3MF9XSiA9IDpGdVpfMiBBRFogbXkuVVNPU2VVPUJqKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ1Wl9CLCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj06RnVaX3gsOCxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPTpGdVpfZyBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl9CLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj06RnVaX0csIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX0gsIDgsIGopLCBqKSkpKSkgPD4gJycgIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaICRUV3lTNzBfcmU3MFAgJFVOMzcwNyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gQjsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TUtFUl8iIC4gJFcsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSAyOyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFdUICghN2l2U1AoJFVOMzcwNykpIHsKICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9ICRVN08wbjNfZE95ZTdfVld0Sl9ua2V0UzsgJFcrKykgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6d1JBTTl6X3BBRUZSXyIgLiAkVywgIiUkVTdPMG4zX2RPeWU3JSIsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIC8vdjBXdFNfMCgkUzNXVS0+VVMzLT5KN1ZlWVplaXZxTzBPaVUoKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNWh5a21fdWxfRlU3MCgkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkdldKLCAkVldKLCAkVFd5UzcwX3JlNzBQLCAkeU9VU19VUzd2X1dKLCAkVUVXaVdTLCAkVFd5UzcwX21UX3JlNzBQLCAkVTdPMG4zX2RPeWU3LCAkVTdPMG4zX2RPeWU3X1ZXdEpfbmtldFMpIHsKCgogICAgICAgICRVTjM3MDcgPSAkUzNXVS0+VU4zNzA3OwoKICAgICAgICBXVCAoJDBreTcgPT0gOCB8fCAkMGt5NyA9PSBCKSB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIFYuVVNPU2VVID0gJzgnIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRVTjM3MDcpKSB7CiAgICAgICAgICAgICAgICAgICAgV1QgKCRUV3lTNzBfcmU3MFAgPT0gJyhua2l2eTdTN0opJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyBoTUtsIG1rMDVUeWttX1dpIEF3IG1KICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSA6RUF3UV93UVJxX3VaLCB1aChtSi5PX1VTT1NlVSA9ICc4JyBLTSBtSi5PX1VTT1NlVSA9ICdnJyBLTSBtSi5PX1VTT1NlVSA9ICdHJyBLTSBtSi5PX1VTT1NlVSA9ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPSAnZycgS00gbUouT19VU09TZVUgPSAnRycgS00gbUouT19VU09TZVUgPSAnOEcnLCAnOCcsICdqJykpID0gJzgnIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIFYuVVNPU2VVID0gJzgnICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vN24zayAkVU4zNzA3OwoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RUF3UV93UVJxX3VaIiwgJHlPVVNfVVM3dl9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICB9IDd5VTcgV1QgKCRUV3lTNzBfcmU3MFAgPT0gJyhXdHYwa243VVUpJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIEpXVVNXdG5TIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPD4gJzgnIEFEWiBtSi5PX1VTT1NlVSA8PiAnZycgQURaIG1KLk9fVVNPU2VVIDw+ICdHJyBBRFogbUouT19VU09TZVUgPD4gJzhHJywgJzgnLCAnaicpKT0nOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CgogICAgICAgICAgICAgICAgICAgICAgICAvKiA3bjNrICJ3UkVSOVEgSldVU1d0blMgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSAnJHlPVVNfVVM3dl9XSicsIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPD4gJzgnIEFEWiBtSi5PX1VTT1NlVSA8PiAnZycgQURaIG1KLk9fVVNPU2VVIDw+ICdHJyBBRFogbUouT19VU09TZVUgPD4gJzhHJywgJzgnLCAnaicpKT0nOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogbUouVmVXeUo3MF9XSiA9ICckVldKJyBBRFogbUoudjBrczduU19XSiA9ICckdldKJyAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyI7ICovCgogICAgICAgICAgICAgICAgICAgICAgICAvKiAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0ogaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSk9JzgnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiBBRFogVi5VU09TZVUgPSAnOCcgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkVBd1Ffd1FScV91WiIsICR5T1VTX1VTN3ZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IFdUICgkVFd5UzcwX3JlNzBQID09ICcoV3RTNzAwZXZTN0opJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKICxtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIChtSi5PX1VTT1NlVSA9ICdIJyBLTSBtSi5PX1VTT1NlVSA9ICc4RycpICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiBBRFogVi5VU09TZVUgPSAnOCcgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAsbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgQURaIFYuVVNPU2VVID0gJzgnIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogJFRXeVM3MF9yZTcwUCAgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgoKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgIFdUICgkVFd5UzcwX3JlNzBQID09ICcobmtpdnk3UzdKKScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVID0gJzgnIEtNIG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJywgJzgnLCAnaicpLCB1aChtSi5PX1VTT1NlVSA9ICdnJyBLTSBtSi5PX1VTT1NlVSA9ICdHJyBLTSBtSi5PX1VTT1NlVSA9ICc4RycsICc4JywgJ2onKSkgPSAnOCcgQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogVi5VU09TZVUgPSAnOCcgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkVBd1Ffd1FScV91WiIsICR5T1VTX1VTN3ZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IFdUICgkVFd5UzcwX3JlNzBQID09ICcoV3R2MGtuN1VVKScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSiBoTUtsIG1rMDVUeWttX1dpIEF3IG1KICIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiBBRFogKG1VLm4wN09TN0pfVlAgPSA6RnVaXzggS00gbVUuZVU3MF9ZMGtldl9XSj06TUtFUl84KSBBRFogKHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsIDgsIGopLCB1aChtSi5PX1VTT1NlVSA8PiAnOCcgQURaIG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCA4LCBqKSkgPSAnOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBLTSB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKChpdi5pN2lfV0ogPSA6RnVaX0IgQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSX0IpIEtNIFYubWswNVR5a21faU90T1k3MD06RnVaX3gsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLHVoKG0wLmVVNzBfV0o9OkZ1Wl9nLHVoKG1KLk9fVVNPU2VVPSdqJyx1aChtMC5lVTcwX1dKPTpGdVpfRyx1aChtMC5lVTcwX1dKPTpGdVpfSCBrMCBtSi5PX2VVNzBfWTBrZXY9Ok1LRVJfeCw4LGopLGopLGopLGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl8yLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj06RnVaXzEsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaXzYsIDgsIGopLCBqKSkpKSkgPSA4KSAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIEpXVVNXdG5TIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPD4gJzgnIEFEWiBtSi5PX1VTT1NlVSA8PiAnZycgQURaIG1KLk9fVVNPU2VVIDw+ICdHJyBBRFogbUouT19VU09TZVUgPD4gJzhHJywgJzgnLCAnaicpKT0nOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSA6RUF3UV93UVJxX3VaLCB1aChtSi5PX1VTT1NlVSA8PiAnOCcgQURaIG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCAnOCcsICdqJyksIHVoKG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCAnOCcsICdqJykpPSc4JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogbUoudjBrczduU19XSiA9IDpxdVogQURaIFYuVVNPU2VVID0gJzgnICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7ICovCgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpFQXdRX3dRUnFfdVoiLCAkeU9VU19VUzd2X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGTUtFUiIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRrMCAoJFcgPSA4OyAkVyA8PSA2OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaXyIgLiAkVywgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IHg7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9ICovCiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IFdUICgkVFd5UzcwX3JlNzBQID09ICcoV3RTNzAwZXZTN0opJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyBoTUtsIG1rMDVUeWttX1dpIEF3IG1KICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG1KLk9fVVNPU2VVID0gJ0gnIEtNIG1KLk9fVVNPU2VVID0gJzhHJykgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLlVTT1NlVSA9ICc4JyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogJFRXeVM3MF9yZTcwUCAgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgoKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewoKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewoKICAgICAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRVTjM3MDcpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKChpdi5pN2lfV0ogPSA6RnVaXzggQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSXzgpIEtNIChteS5lVTcwX1dKID0gOkZ1Wl8yIEFEWiBteS5VU09TZVU9QmopIEtNIFYubWswNVR5a21faU90T1k3MCA9IDpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX3ggLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj06RnVaX2cgS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfQiwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX0csIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX0gsIDgsIGopLCBqKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIFYuVVNPU2VVID0gJzgnICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1Wl8iIC4gJFcsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1LRVJfIiAuICRXLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKChpdi5pN2lfV0ogPSA6RnVaXzggQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSXzgpIEtNIChteS5lVTcwX1dKID0gOkZ1Wl8yIEFEWiBteS5VU09TZVU9QmopIEtNIFYubWswNVR5a21faU90T1k3MD06RnVaX0IsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLCB1aChtMC5lVTcwX1dKPTpGdVpfeCw4LGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9nIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSX0IsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl9HLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl9ILCA4LCBqKSwgaikpKSkpIDw+ICcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogJFRXeVM3MF9tVF9yZTcwUCAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCgogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSAyOyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSBCOyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgIFdUICghN2l2U1AoJFVOMzcwNykpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIFdUICgkVFd5UzcwX3JlNzBQID09ICcobmtpdnk3UzdKKScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUoudjBrczduU19XSiA9IG1VLnYwa3M3blNfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtVS5WZVd5SjcwX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1VLmVVNzBfWTBrZXZfV0ogPSA6TUtFUl84LCA4LCB1aChtVS5uMDdPUzdKX1ZQPTpGdVpfOCwgOCwgaikpID4gaiBBRFogdWgobUouT19WZVd5SjcwX2RPeWU3X1dKID0gOkVBd1Ffd1FScV91WiwgdWgobUouT19VU09TZVUgPSAnOCcgS00gbUouT19VU09TZVUgPSAnZycgS00gbUouT19VU09TZVUgPSAnRycgS00gbUouT19VU09TZVUgPSAnOEcnLCAnOCcsICdqJyksIHVoKG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJywgJzgnLCAnaicpKSA9ICc4JyBBRFogVi5VU09TZVUgPSAnOCcgQURaIG1KLnYwa3M3blNfV0ogPTpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkVBd1Ffd1FScV91WiIsICR5T1VTX1VTN3ZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gODsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1Wl8iIC4gJFcsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSA4OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TUtFUl8iIC4gJFcsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gN3lVNyBXVCAoJFRXeVM3MF9yZTcwUCA9PSAnKFd0djBrbjdVVSknKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lVTcwIFd0djBrbjdVVVUgbVdTMyBVN08wbjMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUoudjBrczduU19XSiA9IG1VLnYwa3M3blNfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtVS5WZVd5SjcwX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUoudjBrczduU19XSiA9IGl2LnYwa3M3blNfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogdWgobUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycsICc4JywgJ2onKSA8PiAnaicgQURaICh1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSA6RUF3UV93UVJxX3VaLCB1aChtSi5PX1VTT1NlVSA8PiAnOCcgQURaIG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCAnOCcsICdqJyksICc4JykgPSAnOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgQURaIChtVS5uMDdPUzdKX1ZQPTpGdVpfNiBLTSAodWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl84IEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSAobXkuZVU3MF9XSiA9IDpGdVpfOGogQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsdWgobTAuZVU3MF9XSj06RnVaX3gsdWgobUouT19VU09TZVU9J2onLHVoKG0wLmVVNzBfV0o9OkZ1Wl9nLHVoKG0wLmVVNzBfV0o9OkZ1Wl9HIGswIG1KLk9fZVU3MF9ZMGtldj06TUtFUl9CLDgsaiksaiksaiksaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj06RnVaX0ggS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfeCwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl8yLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl8xLCA4LCBqKSwgaikpKSkpIDw+ICcnKSkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgKSAgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpFQXdRX3dRUnFfdVoiLCAkeU9VU19VUzd2X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gOGo7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IHg7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSA3eVU3IFdUICgkVFd5UzcwX3JlNzBQID09ICcoV3RTNzAwZXZTN0opJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSiBoTUtsIG1rMDVUeWttX1dpIEF3IG1KICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgKG1KLnYwa3M3blNfV0ogPSBtVS52MGtzN25TX1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLnYwa3M3blNfV0ogPSBpdi52MGtzN25TX1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogbVUubjA3T1M3Sl9WUCA9IDpGdVpfOCBBRFogKG1KLk9fVVNPU2VVPSdIJyBLTSBtSi5PX1VTT1NlVT0nOEcnKSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgoaXYuaTdpX1dKID0gOkZ1Wl9CIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ1Wl94LCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJyx1aChtMC5lVTcwX1dKPTpGdVpfZyx1aChtSi5PX1VTT1NlVT0naicsdWgobTAuZVU3MF9XSj06RnVaX0csdWgobTAuZVU3MF9XSj06RnVaX0ggazAgbUouT19lVTcwX1kwa2V2PTpNS0VSX0IsOCxqKSxqKSxqKSxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPTpGdVpfMiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl94LCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj06RnVaXzEsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaXzYgS00gbVUubjA3T1M3Sl9WUD0gOkZ1Wl84aiwgOCwgaiksIGopKSkpKSA8PiAnJykgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUoudjBrczduU19XSiA9IG1VLnYwa3M3blNfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtVS5WZVd5SjcwX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLlZlV3lKNzBfV0ogPSBtSi5WZVd5SjcwX1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi52MGtzN25TX1dKID0gaXYudjBrczduU19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogbUoudjBrczduU19XSiA9IDpxdVogQURaIFYuVVNPU2VVID0gJzgnIEFEWiAobVUubjA3T1M3Sl9WUCA9IDpGdVpfOCBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84KSBBRFogKG1KLk9fVVNPU2VVPSdIJyBLTSBtSi5PX1VTT1NlVT0nOEcnIEtNIG1KLk9fVVNPU2VVPSc2JykgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSA4OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gODsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1LRVJfIiAuICRXLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IDd5VTcgewoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAsbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIChWZC5WZVd5SjcwX1dKID0gbUouVmVXeUo3MF9XSiBBRFogbUouT19WZVd5SjcwX2RPeWU3X1dKID0gVmQuV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUouT19lVTcwX1kwa2V2ID0gaXYuMGt5NyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKChpdi5pN2lfV0ogPSA6RnVaXzggQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSXzgpIEtNIChteS5lVTcwX1dKID0gOkZ1Wl8yIEFEWiBteS5VU09TZVU9QmopIEtNIFYubWswNVR5a21faU90T1k3MD06RnVaX0IsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLCB1aChtMC5lVTcwX1dKPTpGdVpfeCw4LGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9nIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSX0IsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPTpGdVpfRywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4MScsIHVoKG0wLmVVNzBfV0o9OkZ1Wl8xLCA4LCBqKSwgIHVoKG1KLk9fVVNPU2VVPSdqJyBLTSBtSi5PX1VTT1NlVSA9ICcnIEtNIG1KLk9fVVNPU2VVID0gJ3gnIEtNIG1KLk9fVVNPU2VVID0gJzh4JyBLTSBtSi5PX1VTT1NlVSA9ICdCaicsIHVoKG0wLmVVNzBfV0ogPSA6RnVaX0ggS00gbXkuZVU3MF9XSiA9IDpGdVpfNiwgOCwgaiksIGopKSkpKSkgPSA4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDY7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICBXVCAoJFRXeVM3MF9yZTcwUCA9PSAnKG5raXZ5N1M3SiknKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogQXcgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyBoTUtsIG1rMDVUeWttX1dpIEF3IG1KICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgKG1KLnYwa3M3blNfV0ogPSBtVS52MGtzN25TX1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtVS5lVTcwX1kwa2V2X1dKID0gOk1LRVJfOCwgOCwgdWgobVUubjA3T1M3Sl9WUD06RnVaXzgsIDgsIGopKSA+IGogQURaIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVID0gJzgnIEtNIG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJywgJzgnLCAnaicpLCB1aChtSi5PX1VTT1NlVSA9ICdnJyBLTSBtSi5PX1VTT1NlVSA9ICdHJyBLTSBtSi5PX1VTT1NlVSA9ICc4RycsICc4JywgJ2onKSkgPSAnOCcgQURaIG1KLnYwa3M3blNfV0ogPTpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpFQXdRX3dRUnFfdVoiLCAkeU9VU19VUzd2X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDg7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gODsgJFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1LRVJfIiAuICRXLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IDd5VTcgV1QgKCRUV3lTNzBfcmU3MFAgPT0gJyhXdHYwa243VVUpJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lVTcwIFd0djBrbjdVVVUgbVdTM2tlUyBVN08wbjMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUoudjBrczduU19XSiA9IG1VLnYwa3M3blNfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtVS5WZVd5SjcwX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLlZlV3lKNzBfV0ogPSBtSi5WZVd5SjcwX1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUoudjBrczduU19XSiA9IGl2LnYwa3M3blNfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVUgPSAnOCcgQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiAgQURaICh1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSA6RUF3UV93UVJxX3VaLCB1aChtSi5PX1VTT1NlVSA8PiAnOCcgQURaIG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCAnOCcsICdqJyksIHVoKG1KLk9fVVNPU2VVIDw+ICdnJyBBRFogbUouT19VU09TZVUgPD4gJ0cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnOEcnLCAnOCcsICdqJykpID0gJzgnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBBRFogKG1VLm4wN09TN0pfVlA9OkZ1Wl84aiBLTSAodWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSA6RnVaX0IgQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpNS0VSXzggQURaIChtVS5lVTcwX1kwa2V2X1dKID0gOk1LRVJfeCBBRFogbVUuVVNPU2VVIDw+IDgxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ1Wl94IEtNIG15LmVVNzBfV0ogPSA6RnVaXzg4LCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj06RnVaX2csIHVoKG1KLk9fVVNPU2VVPSdqJywgdWgobTAuZVU3MF9XSj06RnVaX0csdWgobTAuZVU3MF9XSj06RnVaX0ggazAgbUouT19lVTcwX1kwa2V2PTpNS0VSX0IsOCxqKSxqKSxqKSxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPTpGdVpfMiwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl8xLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl82LCA4LCBqKSwgaikpKSkpIDw+ICcnKSkpIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkVBd1Ffd1FScV91WiIsICR5T1VTX1VTN3ZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gQjsgJFcgPD0gODg7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IHg7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSA3eVU3IFdUICgkVFd5UzcwX3JlNzBQID09ICcoV3RTNzAwZXZTN0opJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSiAsbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuVmVXeUo3MF9XSiA9IG1KLlZlV3lKNzBfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX3llVTcwVSBBdyBteSBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbXkuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG15LlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG15LldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXkuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogKG1VLm4wN09TN0pfVlAgPSA6RnVaXzggS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfOCkgQURaIChtSi5PX1VTT1NlVT0nSCcgS00gbUouT19VU09TZVU9JzhHJyBLTSBtSi5PX1VTT1NlVT0nNicpICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSA4OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaXyIgLiAkVywgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRrMCAoJFcgPSA4OyAkVyA8PSA4OyAkVysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TUtFUl8iIC4gJFcsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GVTcwIC0gWmU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIChWZC5WZVd5SjcwX1dKID0gbUouVmVXeUo3MF9XSiBBRFogbUouT19WZVd5SjcwX2RPeWU3X1dKID0gVmQuV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgQXcgaXYgS0QgbUoudjBrczduU19XSiA9IGl2LnYwa3M3blNfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSA6RnVaXzggQURaIChtSi5PX2VVNzBfWTBrZXYgPSA6TUtFUl84IEtNIChteS5lVTcwX1dKID0gOkZ1Wl84aiBBRFogbXkuVVNPU2VVPUJqKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ1Wl9CKSwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgoVmQuVVNPMFNfZVU3MCA9ICc4JyBLTSBWZC52MGtuN1VVN0pfZVU3MCA9ICc4JywgdWgobTAuZVU3MF9XSj06RnVaX2csIDgsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSksIHVoKG0wLmVVNzBfV0o9OkZ1Wl9IIEtNIG1KLk9fZVU3MF9ZMGtldj06TUtFUl9CLCA4LCBqKSksIHVoKG1KLk9fVVNPU2VVPScxJywgdWgobTAuZVU3MF9XSj06RnVaXzIsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPTpGdVpfMSwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4MScsIHVoKG0wLmVVNzBfV0o9OkZ1Wl84OCwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdCaicsIHVoKG15LmVVNzBfV0o9OkZ1Wl84QiBBRFogbXkuVVNPU2VVPSdCaicsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSA6RnVaXzYsIDgsIGopLCBqKSkpKSkpKSkgPSA4ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyBBRFogJFRXeVM3MF9yZTcwUCAkVFd5UzcwX21UX3JlNzBQICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUazAgKCRXID0gODsgJFcgPD0gOEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgoKGl2Lmk3aV9XSiA9IDpGdVpfOCBBRFogbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfOCkgS00gKG15LmVVNzBfV0ogPSA6RnVaXzIgQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj06RnVaX2cgS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfQiwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gOkZ1Wl9ILCA4LCBqKSwgaikpKSkpPD4nJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBWLnYwa3M3blNfV0ogPTpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBWLlVTT1NlVSA9ICc4JyAkVFd5UzcwX21UX3JlNzBQICAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCgogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaXyIgLiAkVywgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TUtFUl8iIC4gJFcsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRVTjM3MDcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKLG1KLko3dk8wU2k3dFNfV0osVi5tazA1VHlrbV9TUHY3LG12LnYwN1RXYyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fdjA3VFdjIE9VIG12IEtEICggbUouVmVXeUo3MF9XSiA9IG12LlZXSiBBRFogbUouMDduazBKX1U3U19XSiA9IG12LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAgVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIFYuVVNPU2VVID0gJzgnICRVTjM3MDcgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgICAgIFdUICgkVFd5UzcwX3JlNzBQID09ICcobmtpdnk3UzdKKScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSA6RUF3UV93UVJxX3VaLCB1aChtSi5PX1VTT1NlVSA9ICc4JyBLTSBtSi5PX1VTT1NlVSA9ICdnJyBLTSBtSi5PX1VTT1NlVSA9ICdHJyBLTSBtSi5PX1VTT1NlVSA9ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPSAnZycgS00gbUouT19VU09TZVUgPSAnRycgS00gbUouT19VU09TZVUgPSAnOEcnLCAnOCcsICdqJykpID0gJzgnIEFEWiBtSi52MGtzN25TX1dKID06cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogVi5VU09TZVUgPSAnOCcgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RUF3UV93UVJxX3VaIiwgJHlPVVNfVVM3dl9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IDd5VTcgV1QgKCRUV3lTNzBfcmU3MFAgPT0gJyhXdHYwa243VVUpJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIEF3IG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSixtSi5KN3ZPMFNpN3RTX1dKLFYubWswNVR5a21fU1B2Nyxtdi52MDdUV2MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IDpFQXdRX3dRUnFfdVosIHVoKG1KLk9fVVNPU2VVIDw+ICc4JyBBRFogbUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSwgdWgobUouT19VU09TZVUgPD4gJ2cnIEFEWiBtSi5PX1VTT1NlVSA8PiAnRycgQURaIG1KLk9fVVNPU2VVIDw+ICc4RycsICc4JywgJ2onKSkgPSAnOCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBtSi52MGtzN25TX1dKID0gOnF1WiBBRFogVi5VU09TZVUgPSAnOCcgJFVOMzcwNyBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpFQXdRX3dRUnFfdVoiLCAkeU9VU19VUzd2X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gN3lVNyBXVCAoJFRXeVM3MF9yZTcwUCA9PSAnKFd0UzcwMGV2UzdKKScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBBdyBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fV2kgQXcgbUogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV92MDdUV2MgT1UgbXYgS0QgKCBtSi5WZVd5SjcwX1dKID0gbXYuVldKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXYuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAobUouT19VU09TZVUgPSAnSCcgS00gbUouT19VU09TZVUgPSAnOEcnKSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIG1KLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLlVTT1NlVSA9ICc4JyAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0osbUouSjd2TzBTaTd0U19XSixWLm1rMDVUeWttX1NQdjcsbXYudjA3VFdjIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX3YwN1RXYyBPVSBtdiBLRCAoIG1KLlZlV3lKNzBfV0ogPSBtdi5WV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtdi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgoKGl2Lmk3aV9XSiA9IDpGdVpfOCBBRFogbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfOCkgS00gKG15LmVVNzBfV0ogPSA6RnVaXzIgQURaIG15LlVTT1NlVT1CaikgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGdVpfQiwgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9OkZ1Wl94LDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj06RnVaX2cgS00gbUouT19lVTcwX1kwa2V2ID0gOk1LRVJfQiwgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9OkZ1Wl9HLCA4LCBqKSwgdWgobUouT19VU09TZVUgPSAnaicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4OCcgS00gbUouT19VU09TZVUgPSAnOEInIEtNIG1KLk9fVVNPU2VVID0gJzh4JywgdWgobTAuZVU3MF9XSiA9IDpGdVpfSCwgOCwgaiksIGopKSkpKSA8PiAnJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogVi5VU09TZVUgPSAnOCcgQURaICRUV3lTNzBfcmU3MFAgJFRXeVM3MF9tVF9yZTcwUCAkVU4zNzA3IEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IDI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVpfIiAuICRXLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9IEI7ICRXKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSXyIgLiAkVywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgV1QgKCE3aXZTUCgkVU4zNzA3KSkgewoKICAgICAgICAgICAgVGswICgkVyA9IDg7ICRXIDw9ICRVN08wbjNfZE95ZTdfVld0Sl9ua2V0UzsgJFcrKykgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6d1JBTTl6X3BBRUZSXyIgLiAkVywgIiUkVTdPMG4zX2RPeWU3JSIsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIC8vdjBXdFNfMCgkUzNXVS0+VVMzLT43MDBrMHV0VGsoKSk7CiAgICAgICAgLy92MFd0U18wKCRTM1dVLT5VUzMtPko3VmVZWmVpdnFPME9pVSgpKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNWh5a21fdWxfRlU3MF9Bbm5lME9TN003dmswU19reUooJDdpdl8wa3k3LCAkMGt5NywgJGVXSiwgJHZXSiwgJFZXSiwgJFVFV2lXUywgJFQwa2lfSk9TNywgJFNrX0pPUzcsICRXaV9XSikgewoKCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewoKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgbUouV0ogT1UgbVdpX1dKLCBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1VLjA3bmswSl9VN1NfV0osIG1VLm1XaV9XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiBPVSBPX1ZlV3lKNzBfZE95ZTdfV0osIG1VLm4wN09TN0pfVlAgQXcgZVU3MF9XSiwgSlBfV2kueWtZX0pPUzdTV2k3IGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IG1VLlZlV3lKNzBfV0oiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbVUuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBfSlB0T2lXbl9XaV8kV2lfV0ogQXcgSlBfV2kgS0QoSlBfV2kuV0ogPSBtVS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKFpBUVIoSlBfV2kueWtZX0pPUzdTV2k3KSBmUlFOUlJEIDpoWkFRUiBBRFogOlFaQVFSKSBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogVi5XSiA9IDpmdVogb01LRnEgZmEgbVUuMDduazBKX1U3U19XSiBLTVpSTSBmYSBtVS5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBPVSBtV2lfV0osIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBfSlB0T2lXbl9XaV8kV2lfV0ogQXcgSlBfV2kgS0QoSlBfV2kuV0ogPSBtSi4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAoWkFRUihKUF9XaS55a1lfSk9TN1NXaTcpIGZSUU5SUkQgOmhaQVFSIEFEWiA6UVpBUVIpIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogdWgoKG1VLm4wN09TN0pfVlAgPSA6RnVaIEtNIG1VLmVVNzBfWTBrZXZfV0ogPSA6RndSTW9NS0ZxKSBLTSBtSi5PX2VVNzBfWTBrZXY9OkZ3Uk1vTUtGcSwgJzgnLCAnaicpIDw+ICdqJyBvTUtGcSBmYSBtSi4wN25rMEpfVTdTX1dKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIG1KLldKIE9VIG1XaV9XSiwgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIF9KUHRPaVduX1dpXyRXaV9XSiBBdyBKUF9XaSBLRChKUF9XaS5XSiA9IG1KLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCBtSi4wN25rMEpfVTdTX1dKID0gbVUuMDduazBKX1U3U19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAoWkFRUihKUF9XaS55a1lfSk9TN1NXaTcpIGZSUU5SUkQgOmhaQVFSIEFEWiA6UVpBUVIpIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtSi5WZVd5SjcwX1dKID0gOmZ1WiBBRFogdWgoKG1VLm4wN09TN0pfVlAgPSA6RnVaIEtNIG1VLmVVNzBfWTBrZXZfV0ogPSA6RndSTW9NS0ZxKSBLTSBtSi5PX2VVNzBfWTBrZXY9OkZ3Uk1vTUtGcSwgJzgnLCAnaicpIDw+ICdqJyAgb01LRnEgZmEgbUouMDduazBKX1U3U19XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTW9NS0ZxIiwgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgfSA3eVU3IFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVoiLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkN2l2XzBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6aFpBUVIiLCAkVDBraV9KT1M3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6UVpBUVIiLCAkU2tfSk9TNywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCgogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVoeWttX3VsX0ZVNzBfQW5uZTBPUzdNN3ZrMFMoJDdpdl8wa3k3LCAkMGt5NywgJGVXSiwgJHZXSiwgJFZXSiwgJFVFV2lXUywgJFQwa2lfSk9TNywgJFNrX0pPUzcsICRXaV9XSikgewoKCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewoKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFp1d1F1RDlRIG1KLldKIE9VIG1XaV9XSiwgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtVS4wN25rMEpfVTdTX1dKLCBtVS5WZVd5SjcwX1dKLCBtVS5WZVd5SjcwX2RPeWU3X1dKIE9VIE9fVmVXeUo3MF9kT3llN19XSiwgbVUubjA3T1M3Sl9WUCBBdyBlVTcwX1dKLCBKUF9XaS55a1lfSk9TN1NXaTcgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtVS5WZVd5SjcwX1dKKSIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtVS5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIF9KUHRPaVduX1dpXyRXaV9XSiBBdyBKUF9XaSBLRChKUF9XaS5XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAoWkFRUihKUF9XaS55a1lfSk9TN1NXaTcpIGZSUU5SUkQgOmhaQVFSIEFEWiA6UVpBUVIpIEFEWiBWLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBWLldKID0gOmZ1WiBvTUtGcSBmYSBtVS4wN25rMEpfVTdTX1dKIEtNWlJNIGZhIG1VLldKIFpSdzkiKTsKICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIF9KUHRPaVduX1dpXyRXaV9XSiBBdyBKUF9XaSBLRChKUF9XaS5XSiA9IG1KLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobUouVmVXeUo3MF9XSiA9IG1VLlZlV3lKNzBfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtVS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIChaQVFSKEpQX1dpLnlrWV9KT1M3U1dpNykgZlJRTlJSRCA6aFpBUVIgQURaIDpRWkFRUikgQURaIFYudjBrczduU19XSiA9IDpxdVogQURaIG1KLlZlV3lKNzBfV0ogPSA6ZnVaIEFEWiB1aCgobVUubjA3T1M3Sl9WUCA9IDpGdVogS00gbVUuZVU3MF9ZMGtldl9XSiA9IDpGd1JNb01LRnEpIEtNIG1KLk9fZVU3MF9ZMGtldj06RndSTW9NS0ZxLCAnOCcsICdqJykgPD4gJ2onIG9NS0ZxIGZhIG1KLjA3bmswSl9VN1NfV0ogS01aUk0gZmEgbUouV0ogWlJ3OSIpOwogICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgX0pQdE9pV25fV2lfJFdpX1dKIEF3IEpQX1dpIEtEKEpQX1dpLldKID0gbUouMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIChtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKFpBUVIoSlBfV2kueWtZX0pPUzdTV2k3KSBmUlFOUlJEIDpoWkFRUiBBRFogOlFaQVFSKSBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIHVoKChtVS5uMDdPUzdKX1ZQID0gOkZ1WiBLTSBtVS5lVTcwX1kwa2V2X1dKID0gOkZ3Uk1vTUtGcSkgS00gbUouT19lVTcwX1kwa2V2PTpGd1JNb01LRnEsICc4JywgJ2onKSA8PiAnaicgb01LRnEgZmEgbUouMDduazBKX1U3U19XSiBLTVpSTSBmYSBtSi5XSiBaUnc5Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGdVoiLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICB9IDd5VTdXVCAoITdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQ3aXZfMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6aFpBUVIiLCAkVDBraV9KT1M3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6UVpBUVIiLCAkU2tfSk9TNywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIC8vdjBXdFNfMCgkUzNXVS0+VVMzLT5KN1ZlWVplaXZxTzBPaVUoKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgoKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1aHlrbV91bF9GVTcwX0FubmUwT1M3TTd2azBTX1pPU09TT1Z5NygkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkdldKLCAkVldKLCAkVUVXaVdTLCAkVDBraV9KT1M3LCAkU2tfSk9TNywgJFdpX1dKKSB7CgoKICAgICAgICBXVCAoJDBreTcgPT0gOCB8fCAkMGt5NyA9PSBCKSB7CgogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBtSi5XSiBPVSBtV2lfV0osIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiBPVSBPX1ZlV3lKNzBfZE95ZTdfV0osIG1VLm4wN09TN0pfVlAgQXcgZVU3MF9XSiwgSlBfV2kueWtZX0pPUzdTV2k3IGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgKG1KLjA3bmswSl9VN1NfV0ogPSBtVS4wN25rMEpfVTdTX1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSikiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbVUuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBfSlB0T2lXbl9XaV8kV2lfV0ogQXcgSlBfV2kgS0QoSlBfV2kuV0ogPSBtVS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKFpBUVIoSlBfV2kueWtZX0pPUzdTV2k3KSBmUlFOUlJEIDpoWkFRUiBBRFogOlFaQVFSKSBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogVi5XSiA9IDpmdVogb01LRnEgZmEgbVUuMDduazBKX1U3U19XSiBLTVpSTSBmYSBtVS5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgX0pQdE9pV25fV2lfJFdpX1dKIEF3IEpQX1dpIEtEKEpQX1dpLldKID0gbUouMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIChtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKFpBUVIoSlBfV2kueWtZX0pPUzdTV2k3KSBmUlFOUlJEIDpoWkFRUiBBRFogOlFaQVFSKSBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIHVoKChtVS5uMDdPUzdKX1ZQID0gOkZ1WiBLTSBtVS5lVTcwX1kwa2V2X1dKID0gOkZ3Uk1vTUtGcSkgS00gbUouT19lVTcwX1kwa2V2PTpGd1JNb01LRnEsICc4JywgJ2onKSA8PiAnaicgb01LRnEgZmEgbUouMDduazBKX1U3U19XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgX0pQdE9pV25fV2lfJFdpX1dKIEF3IEpQX1dpIEtEKEpQX1dpLldKID0gbUouMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIChtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG1VLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKFpBUVIoSlBfV2kueWtZX0pPUzdTV2k3KSBmUlFOUlJEIDpoWkFRUiBBRFogOlFaQVFSKSBBRFogVi52MGtzN25TX1dKID0gOnF1WiBBRFogbUouVmVXeUo3MF9XSiA9IDpmdVogQURaIHVoKChtVS5uMDdPUzdKX1ZQID0gOkZ1WiBLTSBtVS5lVTcwX1kwa2V2X1dKID0gOkZ3Uk1vTUtGcSkgS00gbUouT19lVTcwX1kwa2V2PTpGd1JNb01LRnEsICc4JywgJ2onKSA8PiAnaicgb01LRnEgZmEgbUouMDduazBKX1U3U19XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ1WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgIH0gN3lVN1dUICghN2l2U1AoJDdpdl8wa3k3KSkgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RnVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTW9NS0ZxIiwgJDdpdl8wa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpoWkFRUiIsICRUMGtpX0pPUzcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpRWkFRUiIsICRTa19KT1M3LCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgLy92MFd0U18wKCRTM1dVLT5VUzMtPko3VmVZWmVpdnFPME9pVSgpKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCiAgICAgICAgLy8kUzNXVS0+VVMzOyBKVzc7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNWh5a21fdWxfRlU3MF9Bbm5lME9TN003dmswU19PeXlfWk9TT1NPVnk3KCQ3aXZfMGt5NywgJDBreTcsICRlV0osICR2V0osICRVRVdpV1MsICRUMGtpX0pPUzcsICRTa19KT1M3KSB7CgogICAgICAgIFdUICgkMGt5NyA9PSA4IHx8ICQwa3k3ID09IEIpIHsKCiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIlU3eTduUyBtSi5XSiBPVSBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLk9fMGt5N19pT1VTNzBfV0osIG1KLk9fZVU3MF9ZMGtldiwgbUouT19VU09TZVUsIG1KLk9fU08wWTdTX0pPUzcsIG1KLk9fMGV5NywgbUoubjA3T1M3Sl9WUCwgbUoubjA3T1M3Sl9PUywgbUouZXZKT1M3Sl9PUyBoTUtsIG1rMDVUeWttX1dpIEF3IG1KIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIChtVS5XSiA9IChVN3k3blMgbVVfVS5XSiBUMGtpIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVV9VIE56Uk1SIG1VX1UuVmVXeUo3MF9XSiA9IFYuV0ogQURaIG1VX1UuMDduazBKX1U3U19XSiA9IG1KLjA3bmswSl9VN1NfV0ogS01aUk0gZmEgbVVfVS5XSiBBdzkgRXVsdVEgOCkpIgogICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAoOUF3UShtVS5uMDdPUzdKX09TIEF3IFpBUVIpIGZSUU5SUkQgJyRUMGtpX0pPUzcnIEFEWiAnJFNrX0pPUzcnKSBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIlU3eTduUyBtSi5XSiBPVSBtV2lfV0osIG1KLnYwa3M3blNfV0osIG1KLldpX1dKLCBtSi4wN25rMEpfVTdTX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLk9fMGt5N19pT1VTNzBfV0osIG1KLk9fZVU3MF9ZMGtldiwgbUouT19VU09TZVUsIG1KLk9fU08wWTdTX0pPUzcsIG1KLk9fMGV5NywgbUoubjA3T1M3Sl9WUCwgbUoubjA3T1M3Sl9PUywgbUouZXZKT1M3Sl9PUyBoTUtsIG1rMDVUeWttX1dpIEF3IG1KIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgKG1VLldKID0gKFU3eTduUyBtVV9VLldKIFQwa2kgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VX1UgTnpSTVIgbVVfVS5WZVd5SjcwX1dKID0gVi5XSiBBRFogbVVfVS4wN25rMEpfVTdTX1dKID0gbUouMDduazBKX1U3U19XSiBLTVpSTSBmYSBtVV9VLldKIEF3OSBFdWx1USA4KSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAobVUuZVU3MF9ZMGtldl9XSiA9ICckMGt5NycgS00gbVUubjA3T1M3Sl9WUCA9ICckZVdKJykgQURaICg5QXdRKG1VLm4wN09TN0pfT1MgQXcgWkFRUikgZlJRTlJSRCAnJFQwa2lfSk9TNycgQURaICckU2tfSk9TNycpIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiVTd5N25TIG1KLldKIE9VIG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouT18wa3k3X2lPVVM3MF9XSiwgbUouT19lVTcwX1kwa2V2LCBtSi5PX1VTT1NlVSwgbUouT19TTzBZN1NfSk9TNywgbUouT18wZXk3LCBtSi5uMDdPUzdKX1ZQLCBtSi5uMDdPUzdKX09TLCBtSi5ldkpPUzdKX09TIGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobVUuV0ogPSAoVTd5N25TIG1VX1UuV0ogVDBraSBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVVfVSBOelJNUiBtVV9VLlZlV3lKNzBfV0ogPSBWLldKIEFEWiBtVV9VLjA3bmswSl9VN1NfV0ogPSBtSi4wN25rMEpfVTdTX1dKIEtNWlJNIGZhIG1VX1UuV0ogQXc5IEV1bHVRIDgpKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIChtVS5lVTcwX1kwa2V2X1dKID0gJyQ3aXZfMGt5NycgS00gbVUubjA3T1M3Sl9WUCA9ICckZVdKJykgQURaICg5QXdRKG1VLm4wN09TN0pfT1MgQXcgWkFRUikgZlJRTlJSRCAnJFQwa2lfSk9TNycgQURaICckU2tfSk9TNycpIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTXVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIH0KCiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cU1LYlI5UXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1aHlrbV91bF9GVTcwX095eV9Bbm5lME9TN003dmswUygkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkdldKLCAkVUVXaVdTLCAkVDBraV9KT1M3LCAkU2tfSk9TNykgewoKCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewogICAgICAgICAgICAvKiAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJVN1MgSk9TN1RrMGlPUyBKaVAgVTd5N25TICAgUy52MGtzN25TX1dKLCBTLm1rMDVUeWttX1NXU3k3LCBTLjA3bmswSl9VN1NfV0osIFMueWtZX0pPUzdTV2k3LCBTLlZlV3lKNzBfV0ogVDBraSAod1JFUjlRICBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1VLjA3bmswSl9VN1NfV0osIG1VLlZlV3lKNzBfV0osIG1VLm4wN09TN0pfVlAgQXcgZVU3MF9XSiwgSlBfV2kueWtZX0pPUzdTV2k3IGhNS2wgbWswNVR5a21fV2kgQXcgbVUgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtVS5WZVd5SjcwX1dKID0gVi5XSiAiCiAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBfSlB0T2lXbl9XaV8kV2lfV0ogQXcgSlBfV2kgS0QoSlBfV2kuV0ogPSBtVS4wN25rMEpfVTdTX1dKKSAgIgogICAgICAgICAgICAgIC4gIiBOelJNUiAobmt0ZDcwUyhkTzBuM08wKDhqKSxKUF9XaS55a1lfSk9TN1NXaTcsOEJIKSBmUlFOUlJEICckVDBraV9KT1M3JyBBRFogJyRTa19KT1M3JykgQURaIFYudjBrczduU19XSiA9ICckdldKJyBBRFogVi5XSiA9ICckVldKJyAgICkgQXcgUyAgWTBrZXYgVlAgUy5XSiwgIFMudjBrczduU19XSiwgUy5tazA1VHlrbV9TV1N5NywgUy4wN25rMEpfVTdTX1dKLCBTLnlrWV9KT1M3U1dpNywgUy5WZVd5SjcwX1dKIik7ICovCgogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJVN3k3blMgbUouV0ogT1UgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5PXzBreTdfaU9VUzcwX1dKLCBtSi5PX2VVNzBfWTBrZXYsIG1KLk9fVVNPU2VVLCBtSi5PX1NPMFk3U19KT1M3LCBtSi5PXzBleTcsIG1KLm4wN09TN0pfVlAsIG1KLm4wN09TN0pfT1MsIG1KLmV2Sk9TN0pfT1MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobVUuV0ogPSAoVTd5N25TIG1VX1UuV0ogVDBraSBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVVfVSBOelJNUiBtVV9VLlZlV3lKNzBfV0ogPSBWLldKIEFEWiBtVV9VLjA3bmswSl9VN1NfV0ogPSBtSi4wN25rMEpfVTdTX1dKIEtNWlJNIGZhIG1VX1UuV0ogQXc5IEV1bHVRIDgpKSIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG1VLm4wN09TN0pfT1MgZlJRTlJSRCAnJFQwa2lfSk9TNycgQURaICckU2tfSk9TNycpIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgS01aUk0gZmEgbUouV0ogWlJ3OSIpOwogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewoKICAgICAgICAgICAgICAgIC8qICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtVS4wN25rMEpfVTdTX1dKLCBtVS5WZVd5SjcwX1dKLCBtVS5uMDdPUzdKX1ZQIEF3IGVVNzBfV0osIEpQX1dpLnlrWV9KT1M3U1dpNyBoTUtsIG1rMDVUeWttX1dpIEF3IG1VIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbVUuVmVXeUo3MF9XSiA9IFYuV0ogIgogICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIF9KUHRPaVduX1dpXyRXaV9XSiBBdyBKUF9XaSBLRChKUF9XaS5XSiA9IG1VLjA3bmswSl9VN1NfV0opICAiCiAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAobmt0ZDcwUyhkTzBuM08wKDhqKSxKUF9XaS55a1lfSk9TN1NXaTcsOEJIKSBmUlFOUlJEICckVDBraV9KT1M3JyBBRFogJyRTa19KT1M3JykgQURaIFYudjBrczduU19XSiA9ICckdldKJyBBRFogVi5XSiA9ICckVldKJyBZMGtldiBWUCBWLldKLCAgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtVS4wN25rMEpfVTdTX1dKLCBKUF9XaS55a1lfSk9TN1NXaTcsIG1VLlZlV3lKNzBfV0osbVUubjA3T1M3Sl9WUCAiKTsgKi8KCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJVN3k3blMgbUouV0ogT1UgbVdpX1dKLCBtSi52MGtzN25TX1dKLCBtSi5XaV9XSiwgbUouMDduazBKX1U3U19XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi5PXzBreTdfaU9VUzcwX1dKLCBtSi5PX2VVNzBfWTBrZXYsIG1KLk9fVVNPU2VVLCBtSi5PX1NPMFk3U19KT1M3LCBtSi5PXzBleTcsIG1KLm4wN09TN0pfVlAsIG1KLm4wN09TN0pfT1MsIG1KLmV2Sk9TN0pfT1MgaE1LbCBtazA1VHlrbV9XaSBBdyBtSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwIEF3IFYgS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIChtVS5XSiA9IChVN3k3blMgbVVfVS5XSiBUMGtpIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVV9VIE56Uk1SIG1VX1UuVmVXeUo3MF9XSiA9IFYuV0ogQURaIG1VX1UuMDduazBKX1U3U19XSiA9IG1KLjA3bmswSl9VN1NfV0ogS01aUk0gZmEgbVVfVS5XSiBBdzkgRXVsdVEgOCkpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG1VLmVVNzBfWTBrZXZfV0ogPSAnJDBreTcnIEtNIG1VLm4wN09TN0pfVlAgPSAnJGVXSicpIEFEWiAobVUubjA3T1M3Sl9PUyBmUlFOUlJEICckVDBraV9KT1M3JyBBRFogJyRTa19KT1M3JykgQURaIFYudjBrczduU19XSiA9ICckdldKJyBLTVpSTSBmYSBtSi5XSiBaUnc5Iik7CiAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiVTdTIEpPUzdUazBpT1MgSmlQIFU3eTduUyAgUy52MGtzN25TX1dKLCBTLm1rMDVUeWttX1NXU3k3LCBTLjA3bmswSl9VN1NfV0osIFMueWtZX0pPUzdTV2k3LCBTLlZlV3lKNzBfV0ogVDBraSAod1JFUjlRICBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1VLjA3bmswSl9VN1NfV0osIG1VLlZlV3lKNzBfV0osIG1VLm4wN09TN0pfVlAgQXcgZVU3MF9XSiwgSlBfV2kueWtZX0pPUzdTV2k3IGhNS2wgbWswNVR5a21fV2kgQXcgbVUgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtVS5WZVd5SjcwX1dKID0gVi5XSiAiCiAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgX0pQdE9pV25fV2lfJFdpX1dKIEF3IEpQX1dpIEtEKEpQX1dpLldKID0gbVUuMDduazBKX1U3U19XSikgIgogICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG5rdGQ3MFMoZE8wbjNPMCg4aiksSlBfV2kueWtZX0pPUzdTV2k3LDhCSCkgZlJRTlJSRCAnJFQwa2lfSk9TNycgQURaICckU2tfSk9TNycpIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgQURaIFYuV0ogPSAnJFZXSicgKSBBdyBTIFkwa2V2IFZQIFMuV0osICBTLnYwa3M3blNfV0osIFMubWswNVR5a21fU1dTeTcsIFMuMDduazBKX1U3U19XSiwgUy55a1lfSk9TN1NXaTcsIFMuVmVXeUo3MF9XSiBLTVpSTSBmYSBTLldKIik7ICovCgogICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiVTd5N25TIG1KLldKIE9VIG1XaV9XSiwgbUoudjBrczduU19XSiwgbUouV2lfV0osIG1KLjA3bmswSl9VN1NfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouT18wa3k3X2lPVVM3MF9XSiwgbUouT19lVTcwX1kwa2V2LCBtSi5PX1VTT1NlVSwgbUouT19TTzBZN1NfSk9TNywgbUouT18wZXk3LCBtSi5uMDdPUzdKX1ZQLCBtSi5uMDdPUzdKX09TLCBtSi5ldkpPUzdKX09TIGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MCBBdyBWIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCAobVUuV0ogPSAoVTd5N25TIG1VX1UuV0ogVDBraSBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVVfVSBOelJNUiBtVV9VLlZlV3lKNzBfV0ogPSBWLldKIEFEWiBtVV9VLjA3bmswSl9VN1NfV0ogPSBtSi4wN25rMEpfVTdTX1dKIEtNWlJNIGZhIG1VX1UuV0ogQXc5IEV1bHVRIDgpKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIChtVS5lVTcwX1kwa2V2X1dKID0gJyQ3aXZfMGt5NycgS00gbVUubjA3T1M3Sl9WUCA9ICckZVdKJykgQURaIChtVS5uMDdPUzdKX09TIGZSUU5SUkQgJyRUMGtpX0pPUzcnIEFEWiAnJFNrX0pPUzcnKSBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIEtNWlJNIGZhIG1KLldKIFpSdzkiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OZmVXeUo3MF9mUE1reTdfRlU3MG8wa2V2KCQ3aXZfMGt5NywgJDBreTcsICRlV0osICR2V0opIHsKCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVUgPSAnOCcgQURaIFYudjBrczduU19XSiA9ICckdldKJyBvTUtGcSBmYSBWLldKIik7CiAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFYuV0osIFYubWswNVR5a21fU1dTeTcgIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgbWQgS0QgbWQuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV8wa3k3X2VVNzBZMGtldiBBdyBtMCBLRCBtZC52MGtzN25TX1dKID0gbTAudjBrczduU19XSiAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKFYudjBrczduU19XSiA9IG15LnYwa3M3blNfV0ogQURaIFYuV0ogPSBteS5WZVd5SjcwX1dKIEFEWiBtZC5XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0opIgogICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVSA9ICc4JyBBRFogdWgoVi5tazA1VHlrbV9pT3RPWTcwID0gJyRlV0onLCA4LCAgdWgobTAuZVU3MF9ZMGtldl9XSiA9IDpGd1JNb01LRnEgS00gbXkuZVU3MF9XSiA9ICckZVdKJywgOCwgaikpID4gaiBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBvTUtGcSBmYSBWLldKIik7CiAgICAgICAgfQogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cU1LYlI5UXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTmZlV3lKNzBfZlBNZXk3X0ZVNzBvMGtldigkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkdldKKSB7CiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVUgPSAnOCcgQURaIFYudjBrczduU19XSiA9ICckdldKJyBvTUtGcSBmYSBWLldKIik7CiAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFYuV0osIFYubWswNVR5a21fU1dTeTcgIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgbWQgS0QgbWQuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9UazBpZXlPVSBBdyBtMFQgS0QgbTBULjBleTdfV0ogPSBtZC4wZXk3X1dKIgogICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVSA9ICc4JyBBRFogbTBULmVVNzBfWTBrZXZfV0ogPSA6RndSTW9NS0ZxIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIG9NS0ZxIGZhIFYuV0oiKTsgKi8KCiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBWLldKLCBWLm1rMDVUeWttX1NXU3k3ICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IG1kIEtEIG1kLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVGswaWV5T1UgQXcgbTBUIEtEIG0wVC4wZXk3X1dKID0gbWQuMGV5N19XSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttXzBreTdfZVU3MFkwa2V2IEF3IDBlIEtEICgwZS4wa3k3X2lPVVM3MF9XSiA9IG0wVC4wa3k3X2lPVVM3MF9XSiBBRFogMGUuMGt5N19TUHY3PTgpIgogICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBWLlVTT1NlVSA9ICc4JyBBRFogdWgoVi5tazA1VHlrbV9pT3RPWTcwID0gJyRlV0onLCA4LCAgdWgoMGUuZVU3MF9ZMGtldl9XSiA9ICckMGt5NycsIDgsIGopKSA+IGogIEFEWiBWLnYwa3M3blNfV0ogPSAnJHZXSicgb01LRnEgZmEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyIpOwogICAgICAgIH0KCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cU1LYlI5UXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKCiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgoKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTmZlV3lKNzBfZlBNZXk3X0ZVNzAoJGVXSiwgJHZXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgbTAuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVUgPSAnOCcgQURaIHVoKFYubWswNVR5a21faU90T1k3MCA9ICckZVdKJywgOCwgIHVoKG0wLmVVNzBfV0ogPSAnJGVXSicsIDgsIGopKSA+IGogICBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIG9NS0ZxIGZhIFYuV0osIFYubWswNVR5a21fU1dTeTciKTsKCiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOyAgICAgICAgCiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxTUtiUjlRdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OZmVXeUo3MF9mUEZVNzBfeVdpV1MoJDdpdl8wa3k3LCAkMGt5NywgJGVXSiwgJHZXSikgewoKCiAgICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi52MGtzN25TX1dKID0gJyR2V0onIEFEWiBWLlVTT1NlVSA9IDggb01LRnEgZmEgVi5XSiIpOwogICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgICAgICAvKiAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIEtEIG1VLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG1VLm4wN09TN0pfVlAgPSA6RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIG9NS0ZxIGZhIFYuV0oiKTsgKi8KCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgbWQgS0QgbWQuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fMGt5N19lVTcwWTBrZXYgQXcgbTAgS0QgbWQuMGt5N19pT1VTNzBfV0ogPSBtMC4wa3k3X2lPVVM3MF9XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9UazBpZXlPVSBBdyBtMFQgS0QgbTBULjBleTdfV0ogPSBtZC4wZXk3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobWQuMGt5N19pT1VTNzBfV0ogPiBqICYmIG1kLjBleTdfV0ogPD0gaiwgbTAuZVU3MF9ZMGtldl9XSiA9IDpGd1JNb01LRnEsIG0wVC4wa3k3X2lPVVM3MF9XSiApKG1VLm4wN09TN0pfVlAgPSA6RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEFEWiBWLnYwa3M3blNfV0ogPSA6cU1LYlI5UXVaIEFEWiBWLlVTT1NlVSA9IDggb01LRnEgZmEgVi5XSiIpOwoKICAgICAgICAgICAgICAgIC8qIDduM2sgIndSRVI5USBWLldKLCBWLm1rMDVUeWttX1NXU3k3ICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgS0QgbVUuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiAobVUubjA3T1M3Sl9WUCA9ICckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnKSBBRFogVi52MGtzN25TX1dKID0gJyR2V0onIG9NS0ZxIGZhIFYuV0oiOyAqLwogICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBWLldKLCBWLm1rMDVUeWttX1NXU3k3ICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaIFYuVVNPU2VVID0gOCBvTUtGcSBmYSBWLldKIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6RndSTXVaIiwgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIH0KICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxTUtiUjlRdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCgogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19oa2V0Sk1rbVVfZlBRT1Z5NygkU09WeTcpIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgaEtGRFpfTUtOdygpIE9VIGhLRkRaX01LTncgVDBraSAkU09WeTciKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6UUFmRVIiLCAkU09WeTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OZmVXeUo3MHBPeWU3X2ZQZnVaKCRWV0opIHsKCgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgTnpSTVIgVmVXeUo3MF9XSiA9IDpmRnVFWlJNdVogS01aUk0gZmEgV0ogQXc5Iik7CgoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmRnVFWlJNdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwoKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTmZlV3lKNzBwT3llN19mUGZwdVooJFZkV0opIHsKCgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgTnpSTVIgV0ogPSA6ZnB1WiBLTVpSTSBmYSBXSiBBdzkiKTsKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZwdVoiLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTnVsX2ZQdVooJFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXSiA9IDpOdWx1WiIpOwogICAgICAgIC8vIDduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgV0ogPSAnJFdKJyI7Slc3OwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpOdWx1WiIsICRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOdWxfZlB1aU11WmZkdVooJFdpX1dKLCAkV2lfMFdKLCAkVmRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgV2lfV0o9OnVsdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogQURaIE9fVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIFdKID0gJyRXSiciOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnVsdVoiLCAkV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNUjlLTVp3UlF1WiIsICRXaV8wV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmcHVaIiwgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTnVsX2ZQTTduazBKdzdTdVooJFdpX1dKLCAkV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIFdpX1dKPTp1bHVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIEF3OSIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXaV9XSj0gJyRXaV9XSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdKJyI7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6dWx1WiIsICRXaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1SOUtNWndSUXVaIiwgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U051bF9mUE03bmswSnc3U3VaX2hXMFVTKCRXaV9XSiwgJFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXaV9XSj06dWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBBdzkgRXVsdVEgOCIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXaV9XSj0gJyRXaV9XSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdKJyI7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6dWx1WiIsICRXaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk1SOUtNWndSUXVaIiwgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U051bF9mUHdTT1NlVSgpIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIE9fVVNPU2VVIDw+IDggQURaIE9fVVNPU2VVIDw+IEggQURaIE9fVVNPU2VVIDw+IGcgQURaIE9fVVNPU2VVIDw+IEcgS01aUk0gZmEgV0ogWlJ3OSIpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOdWxfZlBBd1NPU2VVKCR2V0osICRPX1VTT1NlVSkgewogICAgICAgIFdUICgkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSA9PSA4IHx8ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddID09IEIpIHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFdKIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgdjBrczduU19XSiA9IDpxdVogQURaIE9fVVNPU2VVID0gOkF3UUFRRnciKTsKICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgV0ogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKID0gOnF1WiBBRFogT19VU09TZVUgPSA6QXdRQVFGdyBBRFogT19lVTcwX1kwa2V2ID0gOk1LRVIiKTsKICAgICAgICB9CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TUtFUiIsICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkF3UUFRRnciLCAkT19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTnVsX28wa2V2QXdTT1NlVSgkdldKLCAkT19VU09TZVUpIHsKICAgICAgICBXVCAoJF93Und3dUtEW3dSd3d1S0RfcEFNX0RBbFJdWycwa3k3J10gPT0gOCB8fCAkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSA9PSBCKSB7CiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgdjBrczduU19XSiA9IDpxdVogQURaIE9fVVNPU2VVID0gOkF3UUFRRncgb01LRnEgZmEgVmVXeUo3MF9XSiIpOwogICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkF3UUFRRnciLCAkT19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIHYwa3M3blNfV0ogPSA6cXVaIEFEWiBPX1VTT1NlVSA9IDpBd1FBUUZ3IEFEWiBPX2VVNzBfWTBrZXYgPSA6TUtFUiBvTUtGcSBmYSBWZVd5SjcwX1dKIik7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6QXdRQVFGdyIsICRPX1VTT1NlVSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNS0VSIiwgJF93Und3dUtEW3dSd3d1S0RfcEFNX0RBbFJdWycwa3k3J10sIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICB9CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U051bF9mdVpfQXdTT1NlVSgkdldKLCAkVldKLCAkVmRXSiwgJE9fVVNPU2VVKSB7CgogICAgICAgIFdUICgkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSA9PSA4IHx8ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddID09IEIpIHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKID0gOnF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIE9fVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiBPX1VTT1NlVSA8PiA6QXdRQVFGdyIpOwogICAgICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgdjBrczduU19XSiA9ICckdldKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBBRFogT19WZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogT19VU09TZVUgPD4gJyRPX1VTT1NlVSciOwogICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgdjBrczduU19XSiA9IDpxdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBPX1ZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogT19VU09TZVUgPD4gOkF3UUFRRncgQURaIE9fZVU3MF9ZMGtldiA9IDpBRndSTW9NS0ZxIik7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkFGd1JNb01LRnEiLCAkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIH0KICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnB1WiIsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkF3UUFRRnciLCAkT19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U051bF9mdVpfQUZVNzBvMGtldigkdldKLCAkVldKLCAkVmRXSiwgJE9fVVNPU2VVKSB7CgogICAgICAgIFdUICgkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSA9PSA4IHx8ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddID09IEIpIHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKID0gOnF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIE9fVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiBPX1VTT1NlVSA8PiA6QXdRQVFGdyBvTUtGcSBmYSBPX2VVNzBfWTBrZXYiKTsKICAgICAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIHYwa3M3blNfV0ogPSAnJHZXSicgQURaIFZlV3lKNzBfV0ogPSAnJFZXSicgQURaIE9fVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIE9fVVNPU2VVIDw+ICckT19VU09TZVUnIG9NS0ZxIGZhIE9fZVU3MF9ZMGtldiI7CiAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKID0gOnF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIE9fVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiBPX1VTT1NlVSA8PiA6QXdRQVFGdyBBRFogT19lVTcwX1kwa2V2ID0gOkFGd1JNb01LRnEgb01LRnEgZmEgT19lVTcwX1kwa2V2Iik7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkFGd1JNb01LRnEiLCAkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJzBreTcnXSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIH0KICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnB1WiIsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkF3UUFRRnciLCAkT19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfRU9TN1VTTnVaX0F5eSgkbVdpX1dKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIG1XaV9XSiA9IDpOdWx1WiBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX0o3U09XeVUgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIEprbl9XSiA9ICckSmtuX1dKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX0VPUzdVU2ZwdVooJFZkV0osICRtV2lfV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiBtV2lfV0ogPSA6TnVsdVogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IiwgTzAwT1AocVpLOjpBUVFNXzlGTXdLTSA9PiBxWks6OjlGTXdLTV9oTlpLREVhKSk7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9KN1NPV3lVIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEFEWiBKa25fV0ogPSAnJEprbl9XSicgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpOdWx1WicsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7Ci8vICAgICAgICA3bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gJFZkV0ogQURaIG1XaV9XSiA9ICRtV2lfV0ogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsgSlc3OwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX2hXMFVTZmRXSigkVmRXSiwgJFZXSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiAoVVNPU2VVIDw+IDggQURaIFVTT1NlVSA8PiBnIEFEWiBVU09TZVUgPD4gODgpIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIEF3OSBFdWx1USA4Iik7CgogICAgICAgIC8vN24zayAid1JFUjlRIFNrdiA4ICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgKFVTT1NlVSA8PiA4IEFEWiBVU09TZVUgPD4gZyBBRFogVVNPU2VVIDw+IDg4IEFEWiBVU09TZVUgPD4gaikgQURaIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEtNWlJNIGZhIFdKIEF3OSI7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRXaV8wV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQogICAgCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX2hXMFVTZmRXSkIoJFZkV0osICRWV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBBdzkgRXVsdVEgOCIpOwoKICAgICAgICAvLzduM2sgIndSRVI5USBTa3YgOCAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIChVU09TZVUgPD4gOCBBRFogVVNPU2VVIDw+IGcgQURaIFVTT1NlVSA8PiA4OCBBRFogVVNPU2VVIDw+IGopIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBBdzkiOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX3dTTzBTTXVaKCRWZFdKLCAkbVdpX1dKLCAkV2lfMFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIChVU09TZVUgPSAnJyBLTSBVU09TZVUgPSAnaicpIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVogQURaIG1XaV9XSiA9IDpOdWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBBdzkgRXVsdVEgOCIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIG1XaV9XSiA9ICckbVdpX1dKJyBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfSjdTT1d5VSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogSmtuX1dKID0gJyRKa25fV0onIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX0VPUzdVU011WigkVmRXSiwgJG1XaV9XSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVogQURaIG1XaV9XSiA9IDpOdWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEFEWiBtV2lfV0ogPSAnJG1XaV9XSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdpXzBXSicgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX0o3U09XeVUgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIEprbl9XSiA9ICckSmtuX1dKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9FT1M3VVNmZHVKTXVaKCRWZFdKLCAkVldKLCAkV2lfMFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4Iik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfSjdTT1d5VSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogSmtuX1dKID0gJyRKa25fV0onIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX0VPUzdVU0ZvMGtldk11WigkVldKLCAkV2lfMFdKLCAkZV9ZMGtldikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBVU09TZVUgPD4gaiBBRFogZVU3MF9ZMGtldl9XSiA9IDpGb01LRnEgQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVIDw+IGogQURaIGVVNzBfWTBrZXZfV0ogPSAnJGVfWTBrZXYnIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGb01LRnEnLCAkZV9ZMGtldiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9FT1M3VVNFdXR2MGtuN1VVKCRtV2lfV0osICRPX2VVNzBfWTBrZXZfV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVID0gQmogQURaIG1XaV9XSiA9IDpOdWx1WiBBRFogZVU3MF9ZMGtldl9XSiA9IDpGb01LRnEgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4Iik7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZvTUtGcScsICRPX2VVNzBfWTBrZXZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfS3R2MGtuN1VVTXVaKCRWZFdKLCAkbVdpX1dKLCAkV2lfMFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogbVdpX1dKID0gOk51bHVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEFEWiBVU09TZVUgIT0gOCBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEFEWiBtV2lfV0ogPSAnJG1XaV9XSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdpXzBXSicgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX0o3U09XeVUgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIEprbl9XSiA9ICckSmtuX1dKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9FT1M3VVNmUE51bCgkbVdpX1dKKSB7Ci8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVICE9IDhnICAgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjtKVzc7Ci8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVID0gOCAgQURaIG1XaV9XSiA9ICRtV2lfV0ogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsgSlc3OwogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFVTT1NlVSA9IDggIEFEWiBtV2lfV0ogPSA6TnVsdVogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IiwgTzAwT1AocVpLOjpBUVFNXzlGTXdLTSA9PiBxWks6OjlGTXdLTV9oTlpLREVhKSk7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9KN1NPV3lVIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEFEWiBKa25fV0ogPSAnJEprbl9XSicgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4IjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9VNVd2RU9TN1VTZlBOdWwoJG1XaV9XSikgewovLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFVTT1NlVSAhPSA4ZyAgIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7Slc3OwovLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFVTT1NlVSA9IDggIEFEWiBtV2lfV0ogPSAkbVdpX1dKIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7IEpXNzsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBVU09TZVUgIT0gOGcgIEFEWiBtV2lfV0ogPSAnIiAuICRtV2lfV0ogLiAiJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsX0VPUzdVU2ZQZnVKTXVKKCRWV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFNrdiA4ICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBaUnc5ICIpOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfRU9VU0F2djBrZDdKX2ZQTXVaKCRWV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVID0gOCBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TXVaIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCIpOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9FT1M3VVNmUHVsTXVaX2ZwdVooJFZkV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIG1XaV9XSiA9ICckbVdpX1dKJyBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfSjdTT1d5VSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogSmtuX1dKID0gJyRKa25fV0onIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NGVTcwVV9GVTcwbzBrZXYoJHZXSiwgJFlXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgeWkuZVU3MF9XSixpdi5pN2lfV0ogaE1LbCB5a1lXdF9pT1VTIEF3IHlpICIKICAgICAgICAgICAgICAgIC4gIkVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgT1UgaXYgS0QoaXYuaTdpX1dKID0geWkuZVU3MF9XSikgIgogICAgICAgICAgICAgICAgLiAiTnpSTVIgaXYuaTdpX1dKIHV3IERLUSBERkVFIEFEWiB2MGtzN25TX1dKPTpxdVogQURaIGl2LjBreTc9Om91WiBBRFogVFd0Sl9XdF9VN1MoOm91WiwgaXYuMGt5NykgPD4gaiIpOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxdVonLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6b3VaJywgJFlXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTRlU3MFVfRlU3MG8wa2V2X0F5eSgkdldKLCAkWVdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBKV1VTV3RuUyB5aS5lVTcwX1dKLCBpdi5pN2lfV0ogaE1LbCB5a1lXdF9pT1VTIEF3IHlpIAogICAgICAgICAgICBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIE9VIGl2IEtEKGl2Lmk3aV9XSiA9IHlpLmVVNzBfV0opCiAgICAgICAgICAgIE56Uk1SIHlpLmVVNzBfVVNPU2VVID0gJzgnIEFEWiB5aS5KN3k3UzdfVHlPWSA9ICdqJyBBRFogaXYuaTdpX1dKIHV3IERLUSBERkVFIEFEWiB2MGtzN25TX1dKPSckdldKJyBBRFogKHlpLjBreTcgPSAnJFlXSicgS00gaHVEWl91RF93UlEoeWkuT3lTXzBreTcsICckWVdKJykgPiBqKSIpOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U0ZVNzBVX0ZVNzBvMGtldnpXNzBPMG4zUCgkWVdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB5LmVVNzBfV0ogaE1LbCB5a1lXdF9pT1VTIEF3IHkiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIGVVNzBfWTBrZXYgT1UgZVkgS0QoeS43aXZfMGt5NyA9IGVZLldKKSAiCiAgICAgICAgICAgICAgICAuICIgTnpSTVIgZVkuV0ogPSA6b3VaIEtNIGh1RFpfdURfd1JRKHkuT3lTXzBreTcsIDpvdVopID4gaiIpOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpvdVonLCAkWVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NLaGhGVTcwVV9GVTcwbzBrZXYoJFlXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgeWkuZVU3MF9XSiBoTUtsIHlrWVd0X2lPVVMgQXcgeWkgCiAgICAgICAgICAgIEVSaFEgS0ZRUk0gYkt1RCBPVVVXWXRfaTdpX3Ywa3M3blMgT1UgaXYgS0QoaXYuaTdpX1dKID0geWkuZVU3MF9XSikgCiAgICAgICAgICAgIE56Uk1SICh5aS4wa3k3ID0gOm91WiBLTSBodURaX3VEX3dSUSh5aS5PeVNfMGt5NywgOm91WikgPiBqKSBPdEogaXYudjBrczduU19XSgogICAgICAgICAgICBES1EgdUQgKHdSRVI5USBpdi52MGtzN25TX1dKIGhNS2wgeWtZV3RfaU9VUyBBdyB5aSAKICAgICAgICAgICAgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBPVSBpdiBLRChpdi5pN2lfV0ogPSB5aS5lVTcwX1dKKSAKICAgICAgICAgICAgTnpSTVIgKHlpLjBreTcgPSA6b3VaIEtNIGh1RFpfdURfd1JRKHlpLk95U18wa3k3LCA6b3VaKSA+IGopIEFEWiBpdi5pN2lfV0ogdXcgREZFRSkiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKCiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxdVonLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6b3VaJywgJFlXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTS2hoRlU3MFVfRlU3MG8wa2V2elc3ME8wbjNQKCRZV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHkuZVU3MF9XSiBoTUtsIHlrWVd0X2lPVVMgQXcgeSIKICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgeTdPZDdVIEF3IHlkIEtEKHlkLmVVNzBfV0ogPSB5LmVVNzBfV0opIgogICAgICAgICAgICAgICAgLiAiIE56Uk1SIGVZLldKID0gOm91WiBLTSBodURaX3VEX3dSUSh5Lk95U18wa3k3LCA6b3VaKSA+IGogQURaIHlkLlVTT1NlVSA9IDgiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX0o3U09XeVUgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIEprbl9XSiA9ICckSmtuX1dKJyBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6b3VaJywgJFlXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgLy9nLWpHLUJqODIKICAgIFRldG5TV2t0IFk3U3VpVTdTU1d0WVVfZlBXaXVKKCR2V0osICRkT3llNykgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIlU3eTduUyAqIGhNS2wgbWswNVR5a21fV2lfVTdTU1d0WVUgTnpSTVIgdjBrczduU19XSiA9IDpxTUtfdVogQURaIFdpX1dKID06dVoiKTsKICAgICAgICAvLzduM2sgIlU3eTduUyAqIGhNS2wgbWswNVR5a21fV2lfVTdTU1d0WVUgTnpSTVIgdjBrczduU19XSiA9ICckdldKJyBBRFogV2lfV0ogPSAnJGRPeWU3JyI7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6dVoiLCAkZE95ZTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxTUtfdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U3VpVTdTU1d0WVVfZlB1aXVKX0FuU1dkNygkdldKLCAkZE95ZTcpIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiVTd5N25TIG1VLm1UX1dKIGhNS2wgbWswNVR5a21fV2lfVTdTU1d0WVUgT1UgbVUiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgT1UgbVYgS0QgKG1VLm1UX1dKID0gbVYuV0opIE56Uk1SIG1WLlVTT1NlVSA9ICc4JyBBRFogbVUudjBrczduU19XSiA9IDpxTUtfdVogQURaIG1VLldpX1dKID06dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjp1WiIsICRkT3llNywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnFNS191WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgT0pKTmswNVR5a21sT1VTNzAoKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIld0VTcwUyBXdFNrIG1rMDVUeWttX1dpKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjBrczduU19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpX1dKLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3bmswSl9VN1NfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19WZVd5SjcwX2RPeWU3X1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT18wa3k3X2lPVVM3MF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fZVU3MF9ZMGtldiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKN3ZPMFNpN3RTX1dKLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1VTT1NlVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4wN09TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkpPUzdKX09TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjA3T1M3Sl9PUykgZE95ZTdVICg6cU1LYlI5UXVaLCA6dWxfdVosIDpNUjlLTVpfdVosIDpmRnVFWlJNdVosIDpBZkZ1RVpSTXBBRUZSdVosIDpBTWx1WiwgOkFGd1JNb01xLDpBWlJxQU1RbFJEUSwgOkF3UUFRRncsIDo5TVJBUVJaZmEsIDpGcVpBUVJaQVEsIDo5TVJBUVJaQVEpIik7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dWxfdVonLCAkUzNXVS0+aU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01aX3VaJywgJFMzV1UtPjA3bmswSl9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk11WicsICRTM1dVLT5WZVd5SjcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QWZGdUVaUk1wQUVGUnVaJywgJFMzV1UtPk9fVmVXeUo3MF9kT3llN19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkFNbHVaJywgJFMzV1UtPk9fMGt5N19pT1VTNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBRndSTW9NcScsICRTM1dVLT5PX2VVNzBfWTBrZXYsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBWlJxQU1RbFJEUScsICRTM1dVLT5KN3ZPMFNpN3RTX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QXdRQVFGdycsICRTM1dVLT5PX1VTT1NlVSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpmYScsICRTM1dVLT5uMDdPUzdKX1ZQLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWkFRJywgJFMzV1UtPmV2Sk9TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaQVEnLCAkUzNXVS0+bjA3T1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgLy92MFd0U18wKCRTM1dVLT5VUzMtPjcwMGswdXRUaygpKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPkpWLT55T1VTdXRVNzBTdUooKTsKICAgIH0KCiAgICBUZXRuU1drdCBGdkpPUzdOdWxfd1NPU2VVKCRkT3llNykgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJldkpPUzcgbWswNVR5a21fV2kgVTdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19WZVd5SjcwX2RPeWU3X1dKID0gOkFmRnVFWlJNcEFFRlJ1WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fMGt5N19pT1VTNzBfV0ogPSA6QU1sdVosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX2VVNzBfWTBrZXYgPSA6QUZ3Uk1vTXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19VU09TZVUgPSA6QXdRQVFGdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fU08wWTdTX0pPUzcgPSA6QVFBTW9SUVpBUVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPXzBleTcgPSA6QU1GRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkpPUzdKX09TID0gOkZxWkFRUlpaQVFSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTM3MDcgV0ogPSA6dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBZkZ1RVpSTXBBRUZSdVonLCAkUzNXVS0+T19WZVd5SjcwX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QU1sdVonLCAkUzNXVS0+T18wa3k3X2lPVVM3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkFGd1JNb01xJywgJFMzV1UtPk9fZVU3MF9ZMGtldiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkF3UUFRRncnLCAkUzNXVS0+T19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBUUFNb1JRWkFRUicsICRTM1dVLT5PX1NPMFk3U19KT1M3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QU1GRVInLCAkUzNXVS0+T18wZXk3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWlpBUVInLCAkUzNXVS0+ZXZKT1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVaJywgJGRPeWU3LCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgRnZKT1M3TnVsX1JVbk95T1M3X3dTT1NlVSgkZE95ZTcpIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiZXZKT1M3IG1rMDVUeWttX1dpIFU3UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fVmVXeUo3MF9kT3llN19XSiA9IDpBZkZ1RVpSTXBBRUZSdVosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPXzBreTdfaU9VUzcwX1dKID0gOkFNbHVaLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19lVTcwX1kwa2V2ID0gOkFGd1JNb01xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fVVNPU2VVID0gOkF3UUFRRncsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfT1MgPSA6RnFaQVFSWlpBUVIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMzcwNyBXSiA9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkFmRnVFWlJNcEFFRlJ1WicsICRTM1dVLT5PX1ZlV3lKNzBfZE95ZTdfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBTWx1WicsICRTM1dVLT5PXzBreTdfaU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QUZ3Uk1vTXEnLCAkUzNXVS0+T19lVTcwX1kwa2V2LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QXdRQVFGdycsICRTM1dVLT5PX1VTT1NlVSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QVFBTW9SUVpBUVInLCAkUzNXVS0+T19TTzBZN1NfSk9TNywgcVpLOjpxQU1BbF93UU0pOyAgICAgICAKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGcVpBUVJaWkFRUicsICRTM1dVLT5ldkpPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dVonLCAkZE95ZTcsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBGdkpPUzdOdWxfQU1reTcoJGRPeWU3KSB7CiAgICAgICAgLyogN24zayAiZXZKT1M3IG1rMDVUeWttX1dpIFU3UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIE9fVmVXeUo3MF9kT3llN19XSiA9ICckUzNXVS0+T19WZVd5SjcwX2RPeWU3X1dKJywKICAgICAgICAgIE9fMGt5N19pT1VTNzBfV0ogPSAnJFMzV1UtPk9fMGt5N19pT1VTNzBfV0onLAogICAgICAgICAgT19lVTcwX1kwa2V2ID0gJyRTM1dVLT5PX2VVNzBfWTBrZXYnLAoKICAgICAgICAgIE9fU08wWTdTX0pPUzcgPSAnJFMzV1UtPk9fU08wWTdTX0pPUzcnLAogICAgICAgICAgT18wZXk3ID0gJyRTM1dVLT5PXzBleTcnLAogICAgICAgICAgZXZKT1M3Sl9PUyA9ICckUzNXVS0+ZXZKT1M3Sl9PUycKICAgICAgICAgIG0zNzA3IFdKID0gJyRkT3llNyciOyAqLwogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoImV2Sk9TNyBtazA1VHlrbV9XaSBVN1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1ZlV3lKNzBfZE95ZTdfV0ogPSA6QWZGdUVaUk1wQUVGUnVaLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT18wa3k3X2lPVVM3MF9XSiA9IDpBTWx1WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fZVU3MF9ZMGtldiA9IDpBRndSTW9NcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19TTzBZN1NfSk9TNyA9IDpBUUFNb1JRWkFRUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fMGV5NyA9IDpBTUZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfT1MgPSA6RnFaQVFSWlpBUVIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMzcwNyBXSiA9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkFmRnVFWlJNcEFFRlJ1WicsICRTM1dVLT5PX1ZlV3lKNzBfZE95ZTdfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBTWx1WicsICRTM1dVLT5PXzBreTdfaU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QUZ3Uk1vTXEnLCAkUzNXVS0+T19lVTcwX1kwa2V2LCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkFRQU1vUlFaQVFSJywgJFMzV1UtPk9fU08wWTdTX0pPUzcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBTUZFUicsICRTM1dVLT5PXzBleTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGcVpBUVJaWkFRUicsICRTM1dVLT5ldkpPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dVonLCAkZE95ZTcsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBGdkpPUzdOdWxfd1NPU2VVS3R5UCgkZE95ZTcpIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiZXZKT1M3IG1rMDVUeWttX1dpIFU3UyBPX1VTT1NlVSA9IDpBd1FBUUZ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZKT1M3Sl9PUyA9IDpGcVpBUVJaWkFRUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0zNzA3IFdKID0gOnVaIik7CiAgICAgICAgLyogN24zayAiZXZKT1M3IG1rMDVUeWttX1dpIFU3UyBPX1VTT1NlVSA9ICckUzNXVS0+T19VU09TZVUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZXZKT1M3Sl9PUyA9ICckUzNXVS0+ZXZKT1M3Sl9PUycKICAgICAgICAgIG0zNzA3IFdKID0gJyRkT3llNyciOyAqLwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBd1FBUUZ3JywgJFMzV1UtPk9fVVNPU2VVLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWlpBUVInLCAkUzNXVS0+ZXZKT1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVaJywgJGRPeWU3LCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX051bCgkVldKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2kgbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV9OdWxfZlBmZFdKKCRXaV8wV0osICRWV0osICRWZFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2kgbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiBBRFogMDduazBKX1U3U19XSj0gOnVsTXVaIEFEWiBPX1ZlV3lKNzBfZE95ZTdfV0o9IDpmcHVaIik7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnVsTXVaIiwgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmcHVaIiwgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKCgogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX2ZQdUooJFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2kgbTM3MDcgV0o9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnVaIiwgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a211bF9VU09TZVUoKSB7CgoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJXdFU3MFMgV3RTayBtazA1VHlrbV9VU09TZVVfV2koCiAgICAgICAgICAgIHYwa3M3blNfV0osCiAgICAgICAgICAgIG1XaV9XSiwKICAgICAgICAgICAgMDduazBKX1U3U19XSiwKICAgICAgICAgICAgVmVXeUo3MF9XSiwKICAgICAgICAgICAgVmVXeUo3MF9kT3llN19XSiwKICAgICAgICAgICAgZVU3MF9ZMGtldl9XSiwKICAgICAgICAgICAgVVNPU2VVLAogICAgICAgICAgICBua2lpN3RTLAogICAgICAgICAgICBuMDdPUzdKX1ZQLAogICAgICAgICAgICBuMDdPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpOdWx1WiwgOk1SOUtNWndSUXVaLCA6ZkZ1RVpSTXVaLDpmRnVFWlJNcEFFRlJ1WiwgOkZ3Uk1vTUtGcXVaLCA6d1FBUUZ3LDo5S2xsUkRRLDo5TVJBUVJaZmEsOjlNUkFRUlpBUSkiKTsKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkUzNXVS0+bVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkUzNXVS0+MDduazBKX1U3U19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk11WicsICRTM1dVLT5WZVd5SjcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXBBRUZSdVonLCAkUzNXVS0+VmVXeUo3MF9kT3llN19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlLbGxSRFEnLCAkUzNXVS0+bmtpaTd0UywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZ3Uk1vTUtGcXVaJywgJFMzV1UtPmVVNzBfWTBrZXZfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp3UUFRRncnLCAkUzNXVS0+VVNPU2VVLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWmZhJywgJFMzV1UtPm4wN09TN0pfVlAsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaQVEnLCAkUzNXVS0+bjA3T1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CgogICAgICAgIDA3U2UwdCAkUzNXVS0+SlYtPnlPVVN1dFU3MFN1SigpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF93U09TZVVfZnVaKCRWV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9VU09TZVVfV2kgbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF93U09TZVVfTldpX3VKKCRtV2lfV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9VU09TZVVfV2kgbTM3MDcgbVdpX1dKPSA6TnVsdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpOdWx1WiIsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfZnB1WigkVmRXSiwgJG1XaV9XSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gOmZGdUVaUk1wQUVGUnVaIEFEWiBtV2lfV0ogPSA6TnVsdVogS01aUk0gZmEgV0ogWlJ3OSIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoTzAwT1AoJzpmRnVFWlJNcEFFRlJ1WicgPT4gJFZkV0osICc6TnVsdVonID0+ICRtV2lfV0opKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX011WigkVmRXSiwgJG1XaV9XSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX2RPeWU3X1dKID0gOmZGdUVaUk1wQUVGUnVaIEFEWiBtV2lfV0ogPSA6TnVsdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIG1XaV9XSiA9ICckbVdpX1dKJyBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBaUnc5IjsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6ZkZ1RVpSTXBBRUZSdVonID0+ICRWZFdKLCAnOk51bHVaJyA9PiAkbVdpX1dKLCAnOk1SOUtNWndSUXVaJyA9PiAkV2lfMFdKKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9OdWxfdVooJG1XaV9XSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBtV2lfV0ogPSA6TnVsdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoTzAwT1AoJzpOdWx1WicgPT4gJG1XaV9XSiwgJzpNUjlLTVp3UlF1WicgPT4gJFdpXzBXSikpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfZnVKX011WigkVldKLCAkV2lfMFdKKSB7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEtNWlJNIGZhIFdKIFpSdzkiOwogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIFpSdzkiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6ZnVaJyA9PiAkVldKLCAnOk1SOUtNWndSUXVaJyA9PiAkV2lfMFdKKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9mdUpfTXVaX0VrWVUoJFZXSiwgJFdpXzBXSikgewogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgKFVTT1NlVSAhPSAnJyBLTSBVU09TZVUgIT0gaikgQURaIFZlV3lKNzBfV0ogPSAkVldKIEFEWiAwN25rMEpfVTdTX1dKID0gJFdpXzBXSiBLTVpSTSBmYSBXSiBaUnc5IjsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiAoVVNPU2VVICE9ICcnIEtNIFVTT1NlVSAhPSBqKSBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoTzAwT1AoJzpmdVonID0+ICRWV0osICc6TVI5S01ad1JRdVonID0+ICRXaV8wV0opKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9mdUpfTXVaX0VrWVVfTTdzN25TZk9uNW1PMEooJFZXSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBVU09TZVUgPSA4eCBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoTzAwT1AoJzpmdVonID0+ICRWV0osICc6TVI5S01ad1JRdVonID0+ICRXaV8wV0opKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX3EwN2RXa2VVX1EwV1lZNzA3SigkVldKLCAkV2lfMFdKLCAkVmRXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBBRFogVVNPU2VVIDw+IGogQURaIFZlV3lKNzBfZE95ZTdfV0ogPD4gJyRWZFdKJyBvTUtGcSBmYSBuMDdPUzdKX1ZQIik7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNyhPMDBPUCgnOmZ1WicgPT4gJFZXSiwgJzpNUjlLTVp3UlF1WicgPT4gJFdpXzBXSikpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfcTA3ZFdrZVVfUTBXWVk3MDdKX0pPU08oJFZXSiwgJFdpXzBXSiwgJFZkV0opIHsKCi8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9XSiA9ICRWV0ogQURaIDA3bmswSl9VN1NfV0ogPSAkV2lfMFdKICBBRFogVmVXeUo3MF9kT3llN19XSiAhPSAkVmRXSiBrMEo3MCBWUCBXSiBKN1VuIHlXaVdTIDgiOzdjV1M7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfV0ogPSAkVldKIEFEWiAwN25rMEpfVTdTX1dKID0gJFdpXzBXSiAgICBBRFogVmVXeUo3MF9kT3llN19XSiA8PiAkVmRXSiBBRFogVVNPU2VVIHRrUyB1RCAoaiw4Zyw4RykgazBKNzAgVlAgV0ogSjdVbiB5V2lXUyA4ICIpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCi8vCgogICAgVGV0blNXa3QgWTdTX051bEVPVVNfVVNPU2VVKCRWV0osICRXaV8wV0osICRWZFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEFEWiBVU09TZVUgPD4gaiBBRFogVmVXeUo3MF9kT3llN19XSiA8PiAnJFZkV0onIG9NS0ZxIGZhIG4wN09TN0pfVlAgICBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6ZnVaJyA9PiAkVldKLCAnOk1SOUtNWndSUXVaJyA9PiAkV2lfMFdKKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX051bHdTT1NlVV9mdUpfRnVaKCRlV0osICQwa3k3LCAkVldKLCAkVmRXSiwgJFdpXzBXSikgewogICAgICAgIFdUICgkMGt5NyAhPSA4ICYmICQwa3k3ICE9IEIpIHsKCiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIG4wN09TN0pfVlA9OkZ1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogQURaIFZlV3lKNzBfZE95ZTdfV0ogPD4gOmZwdVogQURaIChVU09TZVUgPD4gaiBBRFogVVNPU2VVIHV3IERLUSBERkVFKSBLTVpSTSBmYSBXSiBaUnc5Iik7CiAgICAgICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgbjA3T1M3Sl9WUD0nJGVXSicgQURaIFZlV3lKNzBfV0ogPSAnJFZXSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdpXzBXSicgQURaIFZlV3lKNzBfZE95ZTdfV1UgPD4gJyRWZFdKJyBBRFogKFVTT1NlVSA8PiBqIEFEWiBVU09TZVUgdXcgREtRIERGRUUpIEtNWlJNIGZhIFdKIFpSdzkiOwogICAgICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGdVonLCAkZVdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICAgICAgfQogICAgfQoKICAgIFRldG5TV2t0IFU3U2ZlV3lKNzBRT1U1eVdVU3VKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5WZVd5SjcwX1NPVTV5V1VTX1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+VmVXeUo3MF9TT1U1eVdVU19XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NRT1U1OTNXeUp1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+U09VNV9uM1d5Sl9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlNPVTVfbjNXeUpfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTREEoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPnRfTyA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPnRfTyA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a21fdWxfUU9VNTkzV3lKKCkgewoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sgbWswNVR5a21fV2lfU09VNW4zV3lKKCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwa3M3blNfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlV3lKNzBfZE95ZTdfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwN25rMEpfVTdTX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09VNV9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX1NPVTV5V1VTX1dKLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPVTVfbjNXeUpfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X08sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX1ZQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjA3T1M3Sl9PUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkpPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpOdWx1WiwgOmZGdUVaUk11WiwgOmZGdUVaUk1wQUVGUnVaLCA6TVI5S01ad1JRdVosIDpRQXc0LCA6ZlFFdVosIDpROXp1RVp1WiwgOkRBLCA6OU1SQVFSWmZhLCA6OU1SQVFSWkFRLDpGcVpBUVJaZmEsOkZxWkFRUlpBUSkiKTsKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkUzNXVS0+bVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXVaJywgJFMzV1UtPlZlV3lKNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmRnVFWlJNcEFFRlJ1WicsICRTM1dVLT5WZVd5SjcwX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkUzNXVS0+MDduazBKX1U3U19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOlFBdzQnLCAkUzNXVS0+U09VNV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZRRXVaJywgJFMzV1UtPlZlV3lKNzBfU09VNXlXVVNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpROXp1RVp1WicsICRTM1dVLT5TT1U1X24zV3lKX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6REEnLCAkUzNXVS0+dF9PLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWmZhJywgJFMzV1UtPm4wN09TN0pfVlAsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaQVEnLCAkUzNXVS0+bjA3T1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZxWkFRUlpmYScsICRTM1dVLT5ldkpPUzdKX1ZQLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWkFRJywgJFMzV1UtPmV2Sk9TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5KVi0+eU9VU3V0VTcwU3VKKCk7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfUU9VNTkzV3lKX2ZQZlF1SigkbVdpX1dKLCAkVlNXSiwgJFNuV0osICRXaV8wV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX1NPVTVuM1d5SiBOelJNUiBtV2lfV0ogPSA6TnVsdVogQURaIFZlV3lKNzBfU09VNXlXVVNfV0ogPSA6ZlF1WiBBRFogU09VNV9uM1d5Sl9XSiA9IDpROXVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX1NPVTVuM1d5SiBOelJNUiBtV2lfV0ogPSAnJG1XaV9XSicgQURaIFZlV3lKNzBfU09VNXlXVVNfV0ogPSAnJFZTV0onIEFEWiBTT1U1X24zV3lKX1dKID0gJyRTbldKJyI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZRdVonLCAkVlNXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOlE5dVoiLCAkU25XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF9RT1U1OTNXeUpfZlBNdUooJG1XaV9XSiwgJFZkV0osICRXaV8wV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX1NPVTVuM1d5SiBOelJNUiBtV2lfV0ogPSA6TnVsdVogQURaIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaV9TT1U1bjNXeUogTnpSTVIgbVdpX1dKID0gJyRtV2lfV0onIEFEWiBWZVd5SjcwX1NPVTV5V1VTX1dKID0gJyRWU1dKJyBBRFogU09VNV9uM1d5Sl9XSiA9ICckU25XSiciOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpOdWx1WicsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRXaV8wV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX1FPVTU5M1d5SigkVlNXSiwgJFNuV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9XaV9TT1U1bjNXeUogbTM3MDcgVmVXeUo3MF9TT1U1eVdVU19XSj0gOmZRdVogQURaIFNPVTVfbjNXeUpfV0ogPSA6UTl1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZRdVoiLCAkVlNXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOlE5dVoiLCAkU25XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX1FFdVooJFN5V0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9XaV9TT1U1bjNXeUogbTM3MDcgVmVXeUo3MF9TT1U1eVdVU19XSj0gOlFFdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpRRXVaIiwgJFN5V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF9RRXVaX05XaV91SigkbVdpX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfU09VNW4zV3lKIG0zNzA3IG1XaV9XSj0gOk51bHVaIik7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6TnVsdVoiLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBKN3k3UzdfTmswNVR5a21fdWxfUTlfZnVaKCRWV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9XaV9TT1U1bjNXeUogbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgICAgICAgIFFPVTUgOWtpaTd0U1UKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKICAgIFRldG5TV2t0IE9KSl9tazA1VHlrbV91bF9RT1U1OTNXeUo5a2lpN3RTKCkgewoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sgbWswNVR5a21fV2lfU09VNW4zV3lKX25raWk3dFMoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjBrczduU19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaV9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlV3lKNzBfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVXeUo3MF9kT3llN19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3bmswSl9VN1NfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1U1X1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlV3lKNzBfU09VNXlXVVNfV0osICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09VNV9uM1d5Sl9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5raWk3dFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX1ZQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjA3T1M3Sl9PUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkpPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpOdWx1WiwgOmZGdUVaUk11WiwgOmZGdUVaUk1wQUVGUnVaLCA6TVI5S01ad1JRdVosIDpRQXc0LCA6ZlFFdVosIDpROXp1RVp1WiwgOjlLbGxSRFEsIDo5TVJBUVJaZmEsIDo5TVJBUVJaQVEsOkZxWkFRUlpmYSw6RnFaQVFSWkFRKSIpOwoKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpOdWx1WicsICRTM1dVLT5tV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmRnVFWlJNdVonLCAkUzNXVS0+VmVXeUo3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk1wQUVGUnVaJywgJFMzV1UtPlZlV3lKNzBfZE95ZTdfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRTM1dVLT4wN25rMEpfVTdTX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6UUF3NCcsICRTM1dVLT5TT1U1X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZlFFdVonLCAkUzNXVS0+VmVXeUo3MF9TT1U1eVdVU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOlE5enVFWnVaJywgJFMzV1UtPlNPVTVfbjNXeUpfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5S2xsUkRRJywgJFMzV1UtPm5raWk3dFMsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaZmEnLCAkUzNXVS0+bjA3T1M3Sl9WUCwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpBUScsICRTM1dVLT5uMDdPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWmZhJywgJFMzV1UtPmV2Sk9TN0pfVlAsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGcVpBUVJaQVEnLCAkUzNXVS0+ZXZKT1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPkpWLT55T1VTdXRVNzBTdUooKTsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF9RT1U1OTNXeUo5a2lpN3RTX2ZQZlF1Sl9ua2V0UygkVldKLCAkVlNXSiwgJFNuV0osICRXaV8wV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgV0ogaE1LbCBtazA1VHlrbV9XaV9TT1U1bjNXeUpfbmtpaTd0UyBOelJNUiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogVmVXeUo3MF9TT1U1eVdVU19XSiA9IDpmUXVaIEFEWiBTT1U1X24zV3lKX1dKID0gOlE5dVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVoiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfU09VNW4zV3lKIE56Uk1SIG1XaV9XSiA9ICckbVdpX1dKJyBBRFogVmVXeUo3MF9TT1U1eVdVU19XSiA9ICckVlNXSicgQURaIFNPVTVfbjNXeUpfV0ogPSAnJFNuV0onIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZlF1WicsICRWU1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6UTl1WiIsICRTbldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX3VsX1FPVTU5M1d5SjlraWk3dFNfZlBmUXVKKCRWV0osICRWU1dKLCAkU25XSiwgJFdpXzBXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfU09VNW4zV3lKX25raWk3dFMgTnpSTVIgVmVXeUo3MF9XSiA9IDpmdVogQURaIFZlV3lKNzBfU09VNXlXVVNfV0ogPSA6ZlF1WiBBRFogU09VNV9uM1d5Sl9XSiA9IDpROXVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX1NPVTVuM1d5SiBOelJNUiBtV2lfV0ogPSAnJG1XaV9XSicgQURaIFZlV3lKNzBfU09VNXlXVVNfV0ogPSAnJFZTV0onIEFEWiBTT1U1X24zV3lKX1dKID0gJyRTbldKJyI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmUXVaJywgJFZTV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpROXVaIiwgJFNuV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRXaV8wV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX1FPVTU5M1d5SjlraWk3dFMoJFZTV0osICRTbldKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfU09VNW4zV3lKX25raWk3dFMgbTM3MDcgVmVXeUo3MF9TT1U1eVdVU19XSj0gOmZRdVogQURaIFNPVTVfbjNXeUpfV0ogPSA6UTl1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZRdVoiLCAkVlNXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOlE5dVoiLCAkU25XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX1FFOWtpaTd0U3VaKCRTeVdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfU09VNW4zV3lKX25raWk3dFMgbTM3MDcgVmVXeUo3MF9TT1U1eVdVU19XSj0gOlFFdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpRRXVaIiwgJFN5V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF9ROWtpaTd0U19mdVooJFZXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX1NPVTVuM1d5Sl9ua2lpN3RTIG0zNzA3IFZlV3lKNzBfV0o9IDpmdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBKN3k3UzdfTmswNVR5a21fdWxfUTlraWk3dFNfTldpX3VKKCRtV2lfV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9XaV9TT1U1bjNXeUpfbmtpaTd0UyBtMzcwNyBtV2lfV0o9IDpOdWx1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk51bHVaIiwgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICAgICAgOUtsbFJEUXcKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAKCiAgICBUZXRuU1drdCBVN1M5a2lpN3RTVSgkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+bmtpaTd0U1UgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5ua2lpN3RTVSA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a21fdWxfOWtpaTd0U1UoKSB7CgoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJXdFU3MFMgV3RTayBtazA1VHlrbV9XaV9ua2lpN3RTVSggIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjBrczduU19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaV9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlV3lKNzBfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVXeUo3MF9kT3llN19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3bmswSl9VN1NfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBua2lpN3RTVSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX1ZQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjA3T1M3Sl9PUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkpPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpOdWx1WiwgOmZGdUVaUk11WiwgOmZGdUVaUk1wQUVGUnVaLCA6TVI5S01ad1JRdVosIDo5S2xsUkRRdywgOjlNUkFRUlpmYSwgOjlNUkFRUlpBUSw6RnFaQVFSWmZhLDpGcVpBUVJaQVEpIik7CgoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJFMzV1UtPm1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk11WicsICRTM1dVLT5WZVd5SjcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXBBRUZSdVonLCAkUzNXVS0+VmVXeUo3MF9kT3llN19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFMzV1UtPjA3bmswSl9VN1NfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5S2xsUkRRdycsICRTM1dVLT5ua2lpN3RTVSwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaZmEnLCAkUzNXVS0+bjA3T1M3Sl9WUCwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpBUScsICRTM1dVLT5uMDdPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWmZhJywgJFMzV1UtPmV2Sk9TN0pfVlAsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGcVpBUVJaQVEnLCAkUzNXVS0+ZXZKT1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPkpWLT55T1VTdXRVNzBTdUooKTsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF85a2lpN3RTVV9mUGZkV0ooJG1XaV9XSiwgJFZXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX25raWk3dFNVIE56Uk1SIG1XaV9XSiA9IDpOdWx1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVoiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9TT1U1eVdVUyBOelJNUiAgVmVXeUo3MF9kT3llN19XSiA9ICckZE95ZTcnIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfOWtpaTd0U1VfZlBNdVooJFZXSiwgJFdpXzBXSikgewoKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfbmtpaTd0U1UgTnpSTVIgMDduazBKX1U3U19XSiA9ICRXaV8wV0ogQURaIFZlV3lKNzBfV0ogPSAkVldKIEtNWlJNIGZhIFdKIEF3OSI7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfbmtpaTd0U1UgTnpSTVIgMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogS01aUk0gZmEgV0ogQXc5Iik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1ZlV3lKNzBfU09VNXlXVVMgTnpSTVIgIFZlV3lKNzBfZE95ZTdfV0ogPSAnJGRPeWU3JyI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CgogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX3VsXzlraWk3dFNVX2ZQTnVsdVooJG1XaV9XSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX25raWk3dFNVIE56Uk1SIG1XaV9XSiA9IDpOdWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBLTVpSTSBmYSBXSiBBdzkiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9TT1U1eVdVUyBOelJNUiAgVmVXeUo3MF9kT3llN19XSiA9ICckZE95ZTcnIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF85a2lpN3RTVV9mUHVKKCRXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX25raWk3dFNVIE56Uk1SIFdKID0gOnVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1ZlV3lKNzBfU09VNXlXVVMgTnpSTVIgIFZlV3lKNzBfZE95ZTdfV0ogPSAnJGRPeWU3JyI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp1WicsICRXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsXzlraWk3dFNVX3VaKCRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX25raWk3dFNVIG0zNzA3IFdKPSA6dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjp1WiIsICRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsXzlraWk3dFNVX05XaV91SigkbVdpX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfbmtpaTd0U1UgbTM3MDcgbVdpX1dKPSA6TnVsdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpOdWx1WiIsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF85a2lpN3RTVV9mdVooJFZXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX25raWk3dFNVIG0zNzA3IFZlV3lKNzBfV0o9IDpmdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gICAgICBBUVFBOXpsUkRRdwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgIAoKICAgIFRldG5TV2t0IFU3U2hXeTdET2k3KCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5UV3k3X3RPaTcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5UV3k3X3RPaTcgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgT0pKX21rMDVUeWttX3VsX0FTU09uM2k3dFNVKCkgewoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sgbWswNVR5a21fV2lfT1NTT24zaTd0U1UoICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MGtzN25TX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVXeUo3MF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX2RPeWU3X1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDduazBKX1U3U19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRXeTdfdE9pNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5raWk3dFNVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4wN09TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX09TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZKT1M3Sl9WUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfT1MpIGRPeWU3VSAoOnFNS2JSOVF1WiwgOk51bHVaLCA6ZkZ1RVpSTXVaLCA6ZkZ1RVpSTXBBRUZSdVosIDpNUjlLTVp3UlF1WiwgOmh1RVJEQWxSLCA6OUtsbFJEUXcsIDo5TVJBUVJaZmEsIDo5TVJBUVJaQVEsOkZxWkFRUlpmYSw6RnFaQVFSWkFRKSIpOwoKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpOdWx1WicsICRTM1dVLT5tV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmRnVFWlJNdVonLCAkUzNXVS0+VmVXeUo3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk1wQUVGUnVaJywgJFMzV1UtPlZlV3lKNzBfZE95ZTdfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRTM1dVLT4wN25rMEpfVTdTX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6aHVFUkRBbFInLCAkUzNXVS0+VFd5N190T2k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OUtsbFJEUXcnLCAkUzNXVS0+bmtpaTd0U1UsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWmZhJywgJFMzV1UtPm4wN09TN0pfVlAsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaQVEnLCAkUzNXVS0+bjA3T1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZxWkFRUlpmYScsICRTM1dVLT5ldkpPUzdKX1ZQLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnFaQVFSWkFRJywgJFMzV1UtPmV2Sk9TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5KVi0+eU9VU3V0VTcwU3VKKCk7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfQVNTT24zaTd0U1VfZlBmZFdKKCRtV2lfV0osICRWZFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfT1NTT24zaTd0U1UgTnpSTVIgbVdpX1dKID0gOk51bHVaIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVoiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9TT1U1eVdVUyBOelJNUiAgVmVXeUo3MF9kT3llN19XSiA9ICckZE95ZTcnIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF9BU1NPbjNpN3RTVV9mUE11WigkVmRXSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX09TU09uM2k3dFNVIE56Uk1SIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiAgS01aUk0gZmEgV0ogWlJ3OSIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9WZVd5SjcwX1NPVTV5V1VTIE56Uk1SICBWZVd5SjcwX2RPeWU3X1dKID0gJyRkT3llNyciOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfQVNTT24zaTd0U1VfZlBNdVpfS3R5UCgkVldKLCAkV2lfMFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfT1NTT24zaTd0U1UgTnpSTVIgMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogS01aUk0gZmEgV0ogWlJ3OSIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9WZVd5SjcwX1NPVTV5V1VTIE56Uk1SICBWZVd5SjcwX2RPeWU3X1dKID0gJyRkT3llNyciOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF9BU1NPbjNpN3RTVV9mUHVKKCRXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX09TU09uM2k3dFNVIE56Uk1SIFdKID0gOnVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1ZlV3lKNzBfU09VNXlXVVMgTnpSTVIgIFZlV3lKNzBfZE95ZTdfV0ogPSAnJGRPeWU3JyI7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp1WicsICRXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX0FTU09uM2k3dFNVX3VaKCRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX09TU09uM2k3dFNVIG0zNzA3IFdKPSA6dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjp1WiIsICRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX0FTU09uM2k3dFNVX05XaV91SigkbVdpX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfT1NTT24zaTd0U1UgbTM3MDcgbVdpX1dKPSA6TnVsdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpOdWx1WiIsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF9BU1NPbjNpN3RTVV9mdVooJFZXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX09TU09uM2k3dFNVIG0zNzA3IFZlV3lKNzBfV0o9IDpmdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gICAgICBsQXVFdwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgIAoKICAgIFRldG5TV2t0IFU3U003VFR1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+MDdUVF9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPjA3VFRfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgT0pKX21rMDVUeWttX3VsX2xPV3lVKCkgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIld0VTcwUyBXdFNrIG1rMDVUeWttX1dpX2lPV3lVKCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwa3M3blNfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlV3lKNzBfZE95ZTdfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwN1RUX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDduazBKX1U3U19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4wN09TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX09TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZKT1M3Sl9WUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Sk9TN0pfT1MpIGRPeWU3VSAoOnFNS2JSOVF1WiwgOk51bHVaLCA6ZkZ1RVpSTXVaLCA6ZkZ1RVpSTXBBRUZSdVosIDpNUmhodVosIDpNUjlLTVp3UlF1WiwgOjlNUkFRUlpmYSwgOjlNUkFRUlpBUSw6RnFaQVFSWmZhLDpGcVpBUVJaQVEpIik7CgoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJFMzV1UtPm1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZGdUVaUk11WicsICRTM1dVLT5WZVd5SjcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXBBRUZSdVonLCAkUzNXVS0+VmVXeUo3MF9kT3llN19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SaGh1WicsICRTM1dVLT4wN1RUX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkUzNXVS0+MDduazBKX1U3U19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpmYScsICRTM1dVLT5uMDdPUzdKX1ZQLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWkFRJywgJFMzV1UtPm4wN09TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGcVpBUVJaZmEnLCAkUzNXVS0+ZXZKT1M3Sl9WUCwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZxWkFRUlpBUScsICRTM1dVLT5ldkpPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+SlYtPnlPVVN1dFU3MFN1SigpOwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX3VsX2xPV3lVX2ZQZmRXSigkbVdpX1dKLCAkVmRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfaU9XeVUgTnpSTVIgbVdpX1dKID0gOk51bHVaIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpOdWx1WicsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfbE9XeVVfZlBNdVooJFZXSiwgJFdpXzBXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfaU9XeVUgTnpSTVIgMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVoiKTsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk51bHVaJywgJG1XaV9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUjlLTVp3UlF1WicsICRXaV8wV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfbE9XeVVfZlB1SigkV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX2lPV3lVIE56Uk1SIFdKID0gOnVaIik7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dVonLCAkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX2xPV3lVX3VaKCRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX2lPV3lVIG0zNzA3IFdKPSA6dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjp1WiIsICRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgVGV0blNXa3QgSjd5N1M3X05rMDVUeWttX3VsX2xPV3lVX05XaV91SigkbVdpX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiSjd5N1M3IFQwa2kgbWswNVR5a21fV2lfaU9XeVUgbTM3MDcgbVdpX1dKPSA6TnVsdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpOdWx1WiIsICRtV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19OazA1VHlrbV91bF9sT1d5VV9mdVooJFZXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX1dpX2lPV3lVIG0zNzA3IFZlV3lKNzBfV0o9IDpmdVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gICAgICBFS293Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgCiAgICBUZXRuU1drdCBVN1N3ZVZNN1RUdUooJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPlVlVl8wN1RUX1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+VWVWXzA3VFRfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTbE9XdGxrSmV5NygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+aU9XdF9pa0pleTcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5pT1d0X2lrSmV5NyA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1N3ZVZsa0pleTcoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPlVlVl9pa0pleTcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5VZVZfaWtKZXk3ID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U1EwV1lZNzBVKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5TMFdZWTcwVSA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlMwV1lZNzBVID0gJGRPeWU3OwogICAgICAgIDA3U2UwdCBTMGU3OwogICAgfQoKICAgIFRldG5TV2t0IFU3U1EwV1lZNzBxMGtuN1VVKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5TMFdZWTcwX3Ywa243VVUgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT5TMFdZWTcwX3Ywa243VVUgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTTTdUVGxrSmV5NygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+MDdUVF9pa0pleTcgPSAnJzsKICAgICAgICA3eVU3CiAgICAgICAgICAgICRTM1dVLT4wN1RUX2lrSmV5NyA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a21fRWtZVSgpIHsKCgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIld0VTcwUyBXdFNrIG1rMDVUeWttX3lrWVUoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjBrczduU19XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3VFRfaWtKZXk3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDdUVF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVlVl8wN1RUX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVXeUo3MF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX2RPeWU3X1dKLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlPV3RfaWtKZXk3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWVWX2lrSmV5NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMwV1lZNzBVLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzBXWVk3MF92MGtuN1VVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4wN09TN0pfVlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpNUmhobEtaRkVSLCA6TVJoaHVaLCA6d0ZmTVJoaHVaLCA6ZkZ1RVpSTXVaLCA6ZkZ1RVpSTXBBRUZSdVosIDpsQXVEbEtaRkVSLCA6d0ZmbEtaRkVSLCA6UU11b29STXcsIDpRTXVvb1JNcU1LOVJ3dywgOjlNUkFRUlpmYSwgOjlNUkFRUlpBUSkiKTsKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVJoaGxLWkZFUicsICRTM1dVLT4wN1RUX2lrSmV5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SaGh1WicsICRTM1dVLT4wN1RUX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6d0ZmTVJoaHVaJywgJFMzV1UtPlVlVl8wN1RUX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXVaJywgJFMzV1UtPlZlV3lKNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmRnVFWlJNcEFFRlJ1WicsICRTM1dVLT5WZVd5SjcwX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmxBdURsS1pGRVInLCAkUzNXVS0+aU9XdF9pa0pleTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp3RmZsS1pGRVInLCAkUzNXVS0+VWVWX2lrSmV5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOlFNdW9vUk13JywgJFMzV1UtPlMwV1lZNzBVLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6UU11b29STXFNSzlSd3cnLCAkUzNXVS0+UzBXWVk3MF92MGtuN1VVLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpmYScsICRTM1dVLT5uMDdPUzdKX1ZQLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWkFRJywgJFMzV1UtPm4wN09TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+SlYtPnlPVVN1dFU3MFN1SigpOwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX0VrWVVfZlBmdUooJFZXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX3lrWVUgTnpSTVIgVmVXeUo3MF9XSiA9IDpmdVogS01aUk0gZmEgV0ogWlJ3OSIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9WZVd5SjcwX1NPVTV5V1VTIE56Uk1SICBWZVd5SjcwX2RPeWU3X1dKID0gJyRkT3llNyciOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fRWtZVV9mUE03VFR1SigkMDdUVF9pa0pleTcsICQwN1RUX1dKLCAkVldKLCAkV2lfMFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21feWtZVSBOelJNUiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogVWVWXzA3VFRfV0ogPSA6d0ZmTVJoaHVaIEtNWlJNIGZhIFdKIFpSdzkiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9TT1U1eVdVUyBOelJNUiAgVmVXeUo3MF9kT3llN19XSiA9ICckZE95ZTcnIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUmhobEtaRkVSJywgJDA3VFRfaWtKZXk3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgLy8kUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUmhodVonLCAkMDdUVF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp3RmZNUmhodVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV9Fa1lVX2ZQdUooJFdKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21feWtZVSBOelJNUiBXSiA9IDp1WiIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9WZVd5SjcwX1NPVTV5V1VTIE56Uk1SICBWZVd5SjcwX2RPeWU3X1dKID0gJyRkT3llNyciOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dVonLCAkV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19tazA1VHlrbV95a1lVX2ZQdUooJFZXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG1rMDVUeWttX3lrWVUgbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgIFRldG5TV2t0IFk3U1psX0FkT1d5T1Z5N0ZVNzBfZlBNa3k3KCR2V0osICQwa3k3KSB7CiAgICAgICAgLy83bjNrICR2V0ouJy8nLiQwa3k3OwoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgdmk3aS52MGtzN25TX1dKLCB2aTdpLjBreTcsIGVVNzAuV0osIGVVNzAuVHRPaTcsIGVVNzAuaXRPaTcsIGVVNzAueXRPaTcgaE1LbCBgT1VVV1l0X2k3aV92MGtzN25TYCBBdyB2aTdpCiAgICAgICAgICAgICAgICAgYkt1RCB5a1lXdF9pT1VTIEtEIHZpN2kuaTdpX1dKID0geWtZV3RfaU9VUy5lVTcwX1dKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgYkt1RCBlVTcwIEtEIGVVNzAuV0ogPSB5a1lXdF9pT1VTLmVVNzBfV0oKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBOelJNUiB2aTdpLnYwa3M3blNfV0ogPSA6cXVaIEFEWiB2aTdpLjBreTcgPSA6TUtFUiBBRFogeWtZV3RfaU9VUy4wa3k3ID0gOk1LRVIgQURaIHlrWVd0X2lPVVMuSjd5N1M3X1R5T1kgPSAnaicKICAgICAgICAgICAgICAgICBBRFogeWtZV3RfaU9VUy5lVTcwX1VTT1NlVSA9ICc4JwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIG9NS0ZxIGZhIHlrWVd0X2lPVVMuZVU3MF9XSgogICAgICAgICAgICAgICAgIEtNWlJNIGZhIGVVNzAuVHRPaTcgQXc5Iik7CiAgICAgICAgLyogICAgIDduM2sgIndSRVI5USB2aTdpLnYwa3M3blNfV0osIHZpN2kuMGt5NywgZVU3MC5XSiwgZVU3MC5UdE9pNywgZVU3MC5pdE9pNywgZVU3MC55dE9pNyBoTUtsIGBPVVVXWXRfaTdpX3Ywa3M3blNgIEF3IHZpN2kKICAgICAgICAgIGJLdUQgeWtZV3RfaU9VUyBLRCB2aTdpLmk3aV9XSiA9IHlrWVd0X2lPVVMuZVU3MF9XSgogICAgICAgICAgYkt1RCBlVTcwIEtEIGVVNzAuV0ogPSB5a1lXdF9pT1VTLmVVNzBfV0oKICAgICAgICAgIE56Uk1SIHZpN2kudjBrczduU19XSiA9ICckdldKJyBBRFogeWtZV3RfaU9VUy4wa3k3ID0gJyQwa3k3JyBBRFogeWtZV3RfaU9VUy5KN3k3UzdfVHlPWSA9ICdqJwogICAgICAgICAgQURaIHlrWVd0X2lPVVMuZVU3MF9VU09TZVUgPSAnOCcKICAgICAgICAgIG9NS0ZxIGZhIHlrWVd0X2lPVVMuZVU3MF9XSgogICAgICAgICAgS01aUk0gZmEgZVU3MC5UdE9pNyBBdzkiOwogICAgICAgICAqLwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnF1WicsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNS0VSJywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTWmxfRnRPZE9XeU9WeTdGVTcwX2ZQTWt5NygkdldKLCAkMGt5NykgewogICAgICAgIC8vIDduM2sgIjxWMD5ldCI7N24zayAkdldKLicvJy4kMGt5NzsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHZpN2kudjBrczduU19XSiwgdmk3aS4wa3k3LCBlVTcwLldKLCBlVTcwLlR0T2k3LCBlVTcwLml0T2k3LCBlVTcwLnl0T2k3IGhNS2wgYE9VVVdZdF9pN2lfdjBrczduU2AgQXcgdmk3aQogICAgICAgICAgICAgICAgIGJLdUQgeWtZV3RfaU9VUyBLRCB2aTdpLmk3aV9XSiA9IHlrWVd0X2lPVVMuZVU3MF9XSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGJLdUQgZVU3MCBLRCBlVTcwLldKID0geWtZV3RfaU9VUy5lVTcwX1dKCiAgICAgICAgICAgICAgICAgYkt1RCB5N09kN1UgS0QgZVU3MC5XSiA9IHk3T2Q3VS5lVTcwX1dKCiAgICAgICAgICAgICAgICAgTnpSTVIgdmk3aS52MGtzN25TX1dKID0gOnF1WiBBRFogeWtZV3RfaU9VUy4wa3k3ID0gOk1LRVIgQURaIHlrWVd0X2lPVVMuSjd5N1M3X1R5T1kgPSAnaicKICAgICAgICAgICAgICAgICBBRFogeWtZV3RfaU9VUy5lVTcwX1VTT1NlVSA9ICc4JwogICAgICAgICAgICAgICAgIEFEWiB5N09kN1UuVVNPU2VVID0gJzgnCiAgICAgICAgICAgICAgICAgb01LRnEgZmEgeWtZV3RfaU9VUy5lVTcwX1dKCiAgICAgICAgICAgICAgICAgS01aUk0gZmEgZVU3MC5UdE9pNyBBdzkiKTsKICAgICAgICAvKiAgIDduM2sgIndSRVI5USB2aTdpLnYwa3M3blNfV0osIHZpN2kuMGt5NywgZVU3MC5XSiwgZVU3MC5UdE9pNywgZVU3MC5pdE9pNywgZVU3MC55dE9pNyBoTUtsIGBPVVVXWXRfaTdpX3Ywa3M3blNgIEF3IHZpN2kKICAgICAgICAgIGJLdUQgeWtZV3RfaU9VUyBLRCB2aTdpLmk3aV9XSiA9IHlrWVd0X2lPVVMuZVU3MF9XSgogICAgICAgICAgYkt1RCBlVTcwIEtEIGVVNzAuV0ogPSB5a1lXdF9pT1VTLmVVNzBfV0oKICAgICAgICAgIE56Uk1SIHZpN2kudjBrczduU19XSiA9ICckdldKJyBBRFogeWtZV3RfaU9VUy4wa3k3ID0gJyQwa3k3JyBBRFogeWtZV3RfaU9VUy5KN3k3UzdfVHlPWSA9ICdqJwogICAgICAgICAgQURaIHlrWVd0X2lPVVMuZVU3MF9VU09TZVUgPSAnOCcKICAgICAgICAgIG9NS0ZxIGZhIHlrWVd0X2lPVVMuZVU3MF9XSgogICAgICAgICAgS01aUk0gZmEgZVU3MC5UdE9pNyBBdzkiOyAgSlc3OyAqLwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnF1WicsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNS0VSJywgJDBreTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTmswNVR5a21fdWxfUU9VNTkzV3lKKCRtV2lfV0osICRWU1dKLCAkV2lfMFdKKSB7Ci8vICAgICAgICA3bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpX1NPVTVuM1d5SiBOelJNUiBtV2lfV0ogPSAkbVdpX1dKIEFEWiBWZVd5SjcwX1NPVTV5V1VTX1dKID0gJFZTV0ogQURaIFNPVTVfbjNXeUpfV0ogPSAkU25XSiBBRFogMDduazBKX1U3U19XSiA9Ii4gJFdpXzBXSi4iPFYwPiI7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaV9TT1U1bjNXeUogTnpSTVIgbVdpX1dKID0gOk51bHVaIEFEWiBWZVd5SjcwX1NPVTV5V1VTX1dKID0gOmZRdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVoiKTsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2lfU09VNW4zV3lKIE56Uk1SIG1XaV9XSiA9ICckbVdpX1dKJyBBRFogVmVXeUo3MF9TT1U1eVdVU19XSiA9ICckVlNXSicgQURaIFNPVTVfbjNXeUpfV0ogPSAnJFNuV0onIjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnFNS2JSOVF1WicsICRTM1dVLT52MGtzN25TX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZlF1WicsICRWU1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX3VsX1FPVTU5M1d5SkRBaTcoJFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9WZVd5SjcwX1NPVTVuM1d5SiBOelJNUiBXSiA9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVaJywgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX3VsX1FPVTU5M1d5SnVaX2ZhdE9pNygkdE9pNykgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9TT1U1bjNXeUogTnpSTVIgU09VNV9uM1d5Sl90T2k3ID0gOkRBbFIiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpEQWxSJywgJHRPaTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICAgICAgREtRdWh1OUFRdUtEdwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAKCiAgICAvKiBUZXRuU1drdCBZN1NOazA1VHlrbV9OdWxfRGtTV1RXbk9TV2t0VSgkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkVUVXaVdTKSB7CgoKICAgICAgV1QgKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQikgewoKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICB9IDd5VTcgewoKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfQogICAgICB9IDd5VTcgewoKICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CgogICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyAgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSA6RndSTXVaIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgdWgobUouT19VU09TZVUgPSAnOEgnLCBtMC5lVTcwX1dKPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJ2onLCBtMC5lVTcwX1dKPTpGd1JNdVosIG0wLmVVNzBfV0o9OkZ3Uk11WiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSkpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfSA3eVU3IHsKCiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCAoaXYuaTdpX1dKID0gOkZ3Uk11WiBBRFogbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJzhIJywgbTAuZVU3MF9XSj06RndSTXVaLCB1aChtSi5PX1VTT1NlVSA9ICdqJywgbTAuZVU3MF9XSj06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkpKSBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgIH0KICAgICAgfSA3eVU3IHsKICAgICAgV1QgKDdpdlNQKCRUV3lTNzBfcmU3MFApKSB7CiAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053ICBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgKGl2Lmk3aV9XSiA9IDpGd1JNdVogQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCB1aChtSi5PX1VTT1NlVSA9ICc4SCcsIG0wLmVVNzBfV0o9OkZ3Uk11WiwgdWgobUouT19VU09TZVUgPSAnaicsIG0wLmVVNzBfV0o9OkZ3Uk11WiwgbTAuZVU3MF9XSj06RndSTXVaIEtNIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpKSkgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4Rycgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICB9IDd5VTcgewoKICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIHV3IERGRUUsIChpdi5pN2lfV0ogPSA6RndSTXVaIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9OkZ3Uk11WiwgdWgobUouT19VU09TZVUgPSAnOEgnLCBtMC5lVTcwX1dKPTpGd1JNdVosIHVoKG1KLk9fVVNPU2VVID0gJ2onLCBtMC5lVTcwX1dKPTpGd1JNdVosIG0wLmVVNzBfV0o9OkZ3Uk11WiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSkpIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgfQogICAgICB9CiAgICAgIH0KCiAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk1vTUtGcSIsICQwa3k3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk11WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgfQoKICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoKICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgoKICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICAgIH0gKi8KCgoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX051bF9Ea1NXVFduT1NXa3RVX095eSgkN2l2XzBreTcsICQwa3k3LCAkZVdKLCAkVUVXaVdTKSB7CgogICAgICAgIC8qICRVRVdpV1MgPSBVUzBfMDd2eU9uNyhPMDBPUCgieVdpV1MiLCAiRXVsdVEiLCAiRVdpV1MiKSwgIiIsICRVRVdpV1MpOwogICAgICAgICAgJHlXaVdTZjdTbTc3dCA9IDdjdnlrSjcoIiwiLCBTMFdpKFVTMF8wN3Z5T243KCJ5V2lXUyIsICIiLCAkVUVXaVdTKSkpOwogICAgICAgICAgJHQ3bUVXaVdTID0gJHlXaVdTZjdTbTc3dDsgKi8KICAgICAgICBXVCAoJDBreTcgPT0gOCB8fCAkMGt5NyA9PSBCKSB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBua2V0UyhKV1VTV3RuUyBtSi5XSikgT1UgbmtldFNfOCAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIik7CiAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICBXVCAoJFRXeVM3MF9yZTcwUCA9PSAiKG5raXZ5N1M3SikiKSB7CiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIG5rZXRTKEpXVVNXdG5TIG1KLldKKSBPVSBua2V0U184ICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgKG1KLk9fVVNPU2VVID0gJzgnIEtNIG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJykiKTsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIG5rZXRTKEpXVVNXdG5TIG1KLldKKSBPVSBua2V0U184ICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewoKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJVN3k3blMgbmtldFMoSldVU1d0blMgbUouV0opIE9VIG5rZXRTXzggIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCciKTsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgV1QgKCRUV3lTNzBfcmU3MFAgPT0gIihua2l2eTdTN0opIikgewogICAgICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJVN3k3blMgbmtldFMoSldVU1d0blMgbUouV0opIE9VIG5rZXRTXzggIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnICBBRFogKG1KLk9fVVNPU2VVID0gJzgnIEtNIG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnKSIpOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBua2V0UyhKV1VTV3RuUyBtSi5XSikgT1UgbmtldFNfOCAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKGl2Lmk3aV9XSiA9ICckZVdKJyBBRFogbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JyBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9JyRlV0onLCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj0nJGVXSicsOCxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj0nJGVXSicsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSAnJGVXSicsIDgsIGopLCBqKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBua2V0UyhKV1VTV3RuUyBtSi5XSikgT1UgbmtldFNfOCAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgoaXYuaTdpX1dKID0gJyRlV0onIEFEWiBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnIEtNIFYubWswNVR5a21faU90T1k3MD0nJGVXSicsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLCB1aChtMC5lVTcwX1dKPSckZVdKJyw4LGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9JyRlV0onIEtNIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPSckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdqJyBLTSBtSi5PX1VTT1NlVSA9ICcnIEtNIG1KLk9fVVNPU2VVID0gJ3gnIEtNIG1KLk9fVVNPU2VVID0gJzh4JywgdWgobTAuZVU3MF9XSiA9ICckZVdKJywgOCwgaiksIGopKSkpKSA8PiAnJyAgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyIpOwogICAgICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgICAgICBXVCAoJFRXeVM3MF9yZTcwUCA9PSAiKG5raXZ5N1M3SikiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBua2V0UyhKV1VTV3RuUyBtSi5XSikgT1UgbmtldFNfOCAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnICBBRFogKG1KLk9fVVNPU2VVID0gJzgnIEtNIG1KLk9fVVNPU2VVID0gJ2cnIEtNIG1KLk9fVVNPU2VVID0gJ0cnIEtNIG1KLk9fVVNPU2VVID0gJzhHJykgICIpOwogICAgICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBua2V0UyhKV1VTV3RuUyBtSi5XSikgT1UgbmtldFNfOCAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCciKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV9OdWxfRGtTV1RXbk9TV2t0VV9BeVNNa3k3KCQ3aXZfMGt5NywgJDBreTcsICRPeVNfMGt5N19PMDAsICRlV0osICRVRVdpV1MpIHsKICAgICAgICAvLz09dzBXCiAgICAgICAgJE95U18wa3k3X08wMF9za1d0ID0gc2tXdCgnLCcsICRPeVNfMGt5N19PMDApOwoKICAgICAgICAvKiAkVUVXaVdTID0gVVMwXzA3dnlPbjcoTzAwT1AoInlXaVdTIiwgIkV1bHVRIiwgIkVXaVdTIiksICIiLCAkVUVXaVdTKTsKICAgICAgICAgICR5V2lXU2Y3U203N3QgPSA3Y3Z5a0o3KCIsIiwgUzBXaShVUzBfMDd2eU9uNygieVdpV1MiLCAiIiwgJFVFV2lXUykpKTsKICAgICAgICAgICR0N21FV2lXUyA9ICR5V2lXU2Y3U203N3Q7ICovCgogICAgICAgIFdUICgkMGt5NyA9PSA4IHx8ICQwa3k3ID09IEIpIHsKCgogICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgIH0gN3lVNyB7CgoKICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgIH0KICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgV1QgKDdpdlNQKCQ3aXZfMGt5NykpIHsKCiAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fV2kgQXcgbUoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzAgQXcgViBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuVmVXeUo3MF9XSiA9IG1KLlZlV3lKNzBfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX3llVTcwVSBBdyBteSBLRCAobUouT19WZVd5SjcwX2RPeWU3X1dKID0gbXkuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG15LlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG15LldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbXkuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgobUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JyBLTSBtSi5PX2VVNzBfWTBrZXYgdUQoJE95U18wa3k3X08wMF9za1d0KSkgS00gbXkuZVU3MF9XSj0nJGVXSicgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnIEtNIG1KLk9fVVNPU2VVID0gJzgxJywgdWgobTAuZVU3MF9XSiA9ICckZVdKJywgOCwgaiksdWgobUouT19VU09TZVU9J0JqJywgdWgobXkuZVU3MF9XSj0nJGVXSicgQURaIG15LlVTT1NlVT0nQmonLCA4LCBqKSwgaikpKSkpKSA8PiAnJyBBRFogbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuVmVXeUo3MF9XSiA9IG1KLlZlV3lKNzBfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfeWVVNzBVIEF3IG15IEtEIChtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogPSBteS5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbXkuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbXkuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBteS4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aCgobUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JyBLTSBtSi5PX2VVNzBfWTBrZXYgdUQoJE95U18wa3k3X08wMF9za1d0KSkgS00gbXkuZVU3MF9XSj0nJGVXSicgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnIEtNIG1KLk9fVVNPU2VVID0gJzgxJywgdWgobTAuZVU3MF9XSiA9ICckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdCaicsIHVoKG15LmVVNzBfV0o9JyRlV0onIEFEWiBteS5VU09TZVU9J0JqJywgOCwgaiksIGopKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSA3eVU3IHsKCiAgICAgICAgICAgICAgICBXVCAoN2l2U1AoJFRXeVM3MF9yZTcwUCkpIHsKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5WZVd5SjcwX1dKID0gbUouVmVXeUo3MF9XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogV1UgdGV5eSwgdWgoKG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gbUouT19lVTcwX1kwa2V2IHVEKCRPeVNfMGt5N19PMDBfc2tXdCkpIEtNIG15LmVVNzBfV0o9JyRlV0onIEtNIFYubWswNVR5a21faU90T1k3MD0nJGVXSicsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLCB1aChtMC5lVTcwX1dKPSckZVdKJyw4LGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9JyRlV0onIEtNIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPSckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdqJyBLTSBtSi5PX1VTT1NlVSA9ICcnIEtNIG1KLk9fVVNPU2VVID0gJ3gnIEtNIG1KLk9fVVNPU2VVID0gJzh4JywgdWgobTAuZVU3MF9XSiA9ICckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdCaicsIHVoKG15LmVVNzBfV0o9JyRlV0onIEFEWiBteS5VU09TZVU9J0JqJywgOCwgaiksIGopKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5WZVd5SjcwX1dKID0gbUouVmVXeUo3MF9XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV95ZVU3MFUgQXcgbXkgS0QgKG1KLk9fVmVXeUo3MF9kT3llN19XSiA9IG15LlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBteS5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBteS5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG15LjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKChtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnIEtNIG1KLk9fZVU3MF9ZMGtldiB1RCgkT3lTXzBreTdfTzAwX3NrV3QpKSBLTSBteS5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnIEtNIFYubWswNVR5a21faU90T1k3MD0nJGVXSicsIDgsIGopICx1aChtSi5PX1VTT1NlVT0nOEgnLCB1aChtMC5lVTcwX1dKPSckZVdKJyw4LGopLCB1aChtSi5PX1VTT1NlVT0nMicsIHVoKG0wLmVVNzBfV0o9JyRlV0onIEtNIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0nOGonLCB1aChtMC5lVTcwX1dKPSckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdqJyBLTSBtSi5PX1VTT1NlVSA9ICcnIEtNIG1KLk9fVVNPU2VVID0gJ3gnIEtNIG1KLk9fVVNPU2VVID0gJzh4JywgdWgobTAuZVU3MF9XSiA9ICckZVdKJywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSdCaicsIHVoKG15LmVVNzBfV0o9JyRlV0onIEFEWiBteS5VU09TZVU9J0JqJywgOCwgaiksIGopKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIC8vdjBXdFNfMCgkUzNXVS0+VVMzLT5KN1ZlWVplaXZxTzBPaVUoKSk7IEpXNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U05rMDVUeWttX051bF9Ea1NXVFduT1NXa3RVKCQ3aXZfMGt5NywgJDBreTcsICRlV0osICRVRVdpV1MpIHsKCgogICAgICAgIFdUICgkMGt5NyA9PSA4IHx8ICQwa3k3ID09IEIpIHsKCiAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIHdJRV85QUU5X2hLRkRaX01LTncgWnV3UXVEOVEgVi5XSiwgbUouV0ogQXcgbVdpX1dKLCBWLnYwa3M3blNfV0osIFYubWswNVR5a21fU1dTeTcsIG1KLldKIE9VIG1XaV9XSiwgbUouV2lfV0osIG1KLlZlV3lKNzBfV0osIG1KLk9fVmVXeUo3MF9kT3llN19XSiwgbUouMDduazBKX1U3U19XSiAgaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChWZC5XSiA9IG0wLlZlV3lKNzBfZE95ZTdfV0ogQURaIG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgbUouT19VU09TZVUgIT0gJzgnIEFEWiBtSi5PX1VTT1NlVSAhPSAnZycgQURaIG1KLk9fVVNPU2VVICE9ICdHJyBBRFogbUouT19VU09TZVUgIT0gJzhHJyBBRFogbUouT19VU09TZVUgIT0gJ0gnIG9NS0ZxIGZhIG1KLldKIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyIpOwogICAgICAgICAgICB9IDd5VTcgewoKCiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBtSi5XSiBBdyBtV2lfV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgb01LRnEgZmEgbUouV0ogIEtNWlJNIGZhIG1KLldKIFpSdzkgJFVFV2lXUyAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewoKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIG1KLldKIEF3IG1XaV9XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgT1VVV1l0X2k3aV92MGtzN25TIEF3IGl2IEtEIG1KLk9fZVU3MF9ZMGtldiA9IGl2LjBreTciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICB9IDd5VTcgewoKICAgICAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgd0lFXzlBRTlfaEtGRFpfTUtOdyBadXdRdUQ5USBWLldKLCBtSi5XSiBBdyBtV2lfV0osIFYudjBrczduU19XSiwgVi5tazA1VHlrbV9TV1N5NywgbUouV0ogT1UgbVdpX1dKLCBtSi5XaV9XSiwgbUouVmVXeUo3MF9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKLCBtSi4wN25rMEpfVTdTX1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IFZkIEtEIFZkLldKID0gbUouT19WZVd5SjcwX2RPeWU3X1dKIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKFZkLldKID0gbTAuVmVXeUo3MF9kT3llN19XSiBBRFogbUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKGl2Lmk3aV9XSiA9ICckZVdKJyBBRFogbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JyBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9JyRlV0onLCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj0nJGVXSicsOCxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj0nJGVXSicsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSAnJGVXSicsIDgsIGopLCBqKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgICAgIFdUICg3aXZTUCgkVFd5UzcwX3JlNzBQKSkgewogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIG1KLldKIEF3IG1XaV9XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOelJNUiB1aChtMC5lVTcwX1dKIFdVIHRleXksIHVoKGl2Lmk3aV9XSiA9ICckZVdKJyBBRFogbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JyBLTSBWLm1rMDVUeWttX2lPdE9ZNzA9JyRlV0onLCA4LCBqKSAsdWgobUouT19VU09TZVU9JzhIJywgdWgobTAuZVU3MF9XSj0nJGVXSicsOCxqKSwgdWgobUouT19VU09TZVU9JzInLCB1aChtMC5lVTcwX1dKPSckZVdKJyBLTSBtSi5PX2VVNzBfWTBrZXYgPSAnJDBreTcnLCA4LCBqKSwgdWgobUouT19VU09TZVU9JzhqJywgdWgobTAuZVU3MF9XSj0nJGVXSicsIDgsIGopLCB1aChtSi5PX1VTT1NlVT0naicgS00gbUouT19VU09TZVUgPSAnJyBLTSBtSi5PX1VTT1NlVSA9ICd4JyBLTSBtSi5PX1VTT1NlVSA9ICc4eCcsIHVoKG0wLmVVNzBfV0ogPSAnJGVXSicsIDgsIGopLCBqKSkpKSkgPD4gJycgQURaIG1KLk9fVVNPU2VVICE9ICc4JyBBRFogbUouT19VU09TZVUgIT0gJ2cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnRycgQURaIG1KLk9fVVNPU2VVICE9ICc4RycgQURaIG1KLk9fVVNPU2VVICE9ICdIJyBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MiKTsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CgogICAgICAgICAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USB3SUVfOUFFOV9oS0ZEWl9NS053IFp1d1F1RDlRIFYuV0osIG1KLldKIEF3IG1XaV9XSiwgVi52MGtzN25TX1dKLCBWLm1rMDVUeWttX1NXU3k3LCBtSi5XSiBPVSBtV2lfV0osIG1KLldpX1dKLCBtSi5WZVd5SjcwX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0osIG1KLjA3bmswSl9VN1NfV0ogIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAoVmQuV0ogPSBtMC5WZVd5SjcwX2RPeWU3X1dKIEFEWiBtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgdWgobTAuZVU3MF9XSiBXVSB0ZXl5LCB1aChpdi5pN2lfV0ogPSAnJGVXSicgQURaIG1KLk9fZVU3MF9ZMGtldiA9ICckMGt5NycgS00gVi5tazA1VHlrbV9pT3RPWTcwPSckZVdKJywgOCwgaikgLHVoKG1KLk9fVVNPU2VVPSc4SCcsIHVoKG0wLmVVNzBfV0o9JyRlV0onLDgsaiksIHVoKG1KLk9fVVNPU2VVPScyJywgdWgobTAuZVU3MF9XSj0nJGVXSicgS00gbUouT19lVTcwX1kwa2V2ID0gJyQwa3k3JywgOCwgaiksIHVoKG1KLk9fVVNPU2VVPSc4aicsIHVoKG0wLmVVNzBfV0o9JyRlV0onLCA4LCBqKSwgdWgobUouT19VU09TZVU9J2onIEtNIG1KLk9fVVNPU2VVID0gJycgS00gbUouT19VU09TZVUgPSAneCcgS00gbUouT19VU09TZVUgPSAnOHgnLCB1aChtMC5lVTcwX1dKID0gJyRlV0onLCA4LCBqKSwgaikpKSkpIDw+ICcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOCcgQURaIG1KLk9fVVNPU2VVICE9ICdnJyBBRFogbUouT19VU09TZVUgIT0gJ0cnIEFEWiBtSi5PX1VTT1NlVSAhPSAnOEcnIEFEWiBtSi5PX1VTT1NlVSAhPSAnSCcgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1VHlrbV91bF9Ea1NXVFduT1NXa3RfZlB3U09TZVV1SigkaWtKZXk3LCAkVVNPU2VVX1dKLCAkWTBrZXZfV0osICRlVTcwX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCAgbWswNVR5a21fV2lfdGtTV1RXbk9TV2t0IDA3VFRfaWtKZXk3ID0gOk1SaGhsS1pGRVIgQURaIDA3VFRfV0ogPSA6TVJoaHVaIEFEWiBlVTcwX1kwa2V2ID0gOm91WiBBRFogZVU3MF9XSiA9IDpGdVoiKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVJoaGxLWkZFUicsICRpa0pleTcsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUmhodVonLCAkVVNPU2VVX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6b3VaJywgJFkwa2V2X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnVaJywgJGVVNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgLyogbWswNVR5a21fV2lfdGtTV1RXbk9TV2t0CgogICAgICBXSgogICAgICB2MGtzN25TX1dKCiAgICAgIDA3VFRfaWtKZXk3CiAgICAgIDA3VFRfV0oKICAgICAgZVU3MF9XSgogICAgICBlVTcwX1kwa2V2CiAgICAgIG4wN09TN0pfT1MKCiAgICAgIDA3bmswSl9VN1NfV0oKICAgICAgbVdpX1dKCiAgICAgIFZlV3lKNzBfV0oKICAgICAgVmVXeUo3MF9kT3llN19XSgogICAgICogLwogICAgICovCgogICAgVGV0blNXa3QgVTdTRlU3MG8wa2V2KCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5lVTcwX1kwa2V2ID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+ZVU3MF9ZMGtldiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBVN1NGVTcwbzBrZXZ1SigkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+ZVU3MF9ZMGtldl9XSiA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPmVVNzBfWTBrZXZfV0ogPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTRlU3MHVKKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5lVTcwX1dKID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+ZVU3MF9XSiA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a21fdGtTV1RXbk9TV2t0KCkgewoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sgbWswNVR5a21fV2lfdGtTV1RXbk9TV2t0KCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MGtzN25TX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDdUVF9pa0pleTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwN1RUX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVU3MF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVVNzBfWTBrZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMDdPUzdKX09TKSBkT3llN1UgKDpxTUtiUjlRdVosIDpNUmhobEtaRkVSLCA6TVJoaHVaLCA6RndSTXVaLCA6RndSTW9NS0ZxLCA6OU1SQVFSWkFRKSIpOwoKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6cU1LYlI5UXVaJywgJFMzV1UtPnYwa3M3blNfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpNUmhobEtaRkVSJywgJFMzV1UtPjA3VFRfaWtKZXk3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVJoaHVaJywgJFMzV1UtPjA3VFRfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGd1JNdVonLCAkUzNXVS0+ZVU3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZ3Uk1vTUtGcScsICRTM1dVLT5lVTcwX1kwa2V2LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWkFRJywgJFMzV1UtPm4wN09TN0pfT1MsIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+SlYtPnlPVVN1dFU3MFN1SigpOwogICAgfQoKICAgICNkV0ozUE8gajItOEItQmo4MgoKICAgIFRldG5TV2t0IE9KSl9rdHlXdDdlVTcwKCRlVTcwX1dKLCAkaU9VUzcwX1dKLCAkV2lfZE95ZTdfV0osICRWZVd5SjcwX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sga3R5V3Q3X2VVNzBVICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVTcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU9VUzcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lfZE95ZTdfV0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZVd5SjcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3R5V3Q3X1NXaTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgZE95ZTdVICg6RndSTXVaLCA6bEF3UVJNdVosOnVscEFFRlJ1Wiw6ZkZ1RVpSTXVaLERLTigpKSIpOwoKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RndSTXVaJywgJGVVNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpsQXdRUk11WicsICRpT1VTNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp1bHBBRUZSdVonLCAkV2lfZE95ZTdfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmRnVFWlJNdVonLCAkVmVXeUo3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPkpWLT55T1VTdXRVNzBTdUooKTsKICAgIH0KCiAgICBUZXRuU1drdCA3SldTX2t0eVd0N2VVNzAoJGVVNzBfV0osICRpT1VTNzBfV0osICRXaV9kT3llN19XSiwgJFZlV3lKNzBfV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJldkpPUzcga3R5V3Q3X2VVNzBVIFU3UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt0eVd0N19TV2k3ID0gREtOKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMzcwNyBlVTcwX1dKID0gOkZ3Uk11WiBBRFogaU9VUzcwX1dKID06bEF3UVJNdVogQURaIFdpX2RPeWU3X1dKID06dWxwQUVGUnVaIEFEWiBWZVd5SjcwX1dKID06ZkZ1RVpSTXVaIik7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZ3Uk11WicsICRlVTcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6bEF3UVJNdVonLCAkaU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dWxwQUVGUnVaJywgJFdpX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXVaJywgJFZlV3lKNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKCiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBZN1Nfa3R5V3Q3ZVU3MGZQSjdTT1d5VSgkZVU3MF9XSiwgJGlPVVM3MF9XSiwgJFdpX2RPeWU3X1dKLCAkVmVXeUo3MF9XSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgIGt0eVd0N19lVTcwVSBtMzcwNyBlVTcwX1dKID0gOkZ3Uk11WiBBRFogaU9VUzcwX1dKID06bEF3UVJNdVogQURaIFdpX2RPeWU3X1dKID06dWxwQUVGUnVaIEFEWiBWZVd5SjcwX1dKID06ZkZ1RVpSTXVaIik7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZ3Uk11WicsICRlVTcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6bEF3UVJNdVonLCAkaU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dWxwQUVGUnVaJywgJFdpX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXVaJywgJFZlV3lKNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX2t0eVd0N2VVNzAoJGVVNzBfV0osICRpT1VTNzBfV0osICRXaV9kT3llN19XSiwgJFZlV3lKNzBfV0opIHsKLy8gICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBrLmBlVTcwX1dKYCxrLmBXSmAsay5gaU9VUzcwX1dKYCxrLmBXaV9kT3llN19XSmAsay5ga3R5V3Q3X1NXaTdgLGUuVHRPaTcsZS55dE9pNyxlLldKIGhNS2wgYGt0eVd0N19lVTcwVWAgT1UgayBFUmhRIGJLdUQgYGVVNzBgIE9VIGUgIEtEIGsuYGVVNzBfV0pgPSBlLldKIG0zNzA3IGsuZVU3MF9XSiAhPSA6RndSTXVaIEFEWiBrLmlPVVM3MF9XSiA9OmxBd1FSTXVaIEFEWiBrLldpX2RPeWU3X1dKID06dWxwQUVGUnVaIik7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIGsuYGVVNzBfV0pgLGsuYFdKYCxrLmBpT1VTNzBfV0pgLGsuYFdpX2RPeWU3X1dKYCxrLmBrdHlXdDdfU1dpN2AsZS5UdE9pNyxlLnl0T2k3LGUuV0ogaE1LbCBga3R5V3Q3X2VVNzBVYCBPVSBrIEVSaFEgYkt1RCBgZVU3MGAgT1UgZSAgS0Qgay5gZVU3MF9XSmA9IGUuV0ogbTM3MDcgIGsuaU9VUzcwX1dKID06bEF3UVJNdVogQURaIGsuV2lfZE95ZTdfV0ogPTp1bHBBRUZSdVogQURaIGsuVmVXeUo3MF9XSiA9OmZGdUVaUk11WiIpOwoKLy8gICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkZ3Uk11WicsICRlVTcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6bEF3UVJNdVonLCAkaU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dWxwQUVGUnVaJywgJFdpX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZkZ1RVpSTXVaJywgJFZlV3lKNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTTnVsX2ZQTTduazBKdzdTdVpBdEpmZVd5SjcwdVooJFdpX1dKLCAkV0osICRWZVd5SjcwX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXaV9XSj06dWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBPdEogVmVXeUo3MF9XSj06ZkZ1RVpSTXVaIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIFdpX1dKPSckV2lfV0onIEFEWiAwN25rMEpfVTdTX1dKID0gJyRXSicgT3RKIFZlV3lKNzBfV0o9JyRWZVd5SjcwX1dKJyI7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnVsdVoiLCAkV2lfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpNUjlLTVp3UlF1WiIsICRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZGdUVaUk11WiIsICRWZVd5SjcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OZmVXeUo3MHBPeWU3X3FPME95eTd5KCRWV0osICRWZFdKKSB7CiAgICAgICAgV1QgKDdpdlNQKCRWZFdKKSkgewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1ZlV3lKNzBfZE95ZTdVIEF3IGQiCiAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIGQuVmVXeUo3MF9XSiA9IDpmdVogS01aUk0gZmEgZC5XSiBBdzkgRXVsdVEgOCIpOwogICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgZCIKICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgZC5WZVd5SjcwX1dKID0gOmZ1WiBBRFogV0ogPiA6ZnB1WiBLTVpSTSBmYSBkLldKIEF3OSBFdWx1USA4Iik7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZwdVoiLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIH0KICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmdVoiLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIFdUIChua2V0UygkUzNXVS0+MDdTZTB0KSA+IGopIHsKICAgICAgICAgICAgJG5fVmRXSiA9ICRTM1dVLT4wN1NlMHRbal1bJ1dKJ107CiAgICAgICAgICAgIFdUICgkUzNXVS0+MDdTZTB0W2pdWydVUzd2X1NQdjcnXSA9PSBCKSB7CiAgICAgICAgICAgICAgICBPMDBPUF92ZVUzKCRTM1dVLT52TzBPeXk3eV9VUzd2VSwgJG5fVmRXSik7CiAgICAgICAgICAgICAgICAkUzNXVS0+WTdTX05mZVd5SjcwcE95ZTdfcU8wT3l5N3koJFZXSiwgJG5fVmRXSik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgMDdTZTB0ICRTM1dVLT52TzBPeXk3eV9VUzd2VTsKICAgIH0KCiAgICBUZXRuU1drdCBuMzduNV91dHYwa243VVVfTnVsX2ZQZmRXSigkV2lfMFdKLCAkVldKLCAkVmRXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIDA3bmswSl9VN1NfV0ogPSA6dWxNdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBPX1ZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBLTVpSTSBmYSBXSiBaUnc5IiwgTzAwT1AocVpLOjpBUVFNXzlGTXdLTSA9PiBxWks6OjlGTXdLTV9oTlpLREVhKSk7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgV0ogaE1LbCBtazA1VHlrbV9XaSBOelJNUiBXaV8wV0ogPSAnJFdpXzBXSicgQURaIFZlV3lKNzBfV0ogPSAnJFZXSicgQURaIFZlV3lKNzBfZE95ZTdfV0ogPSAnJFZkV0onIEtNWlJNIGZhIFdKIFpSdzkiOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dWxNdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgbjM3bjVfdXR2MGtuN1VVX051bF9mUGZXSigkV2lfMFdKLCAkVldKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgMDduazBKX1U3U19XSiA9IDp1bE11WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogS01aUk0gZmEgV0ogWlJ3OSIpOwogICAgICAgIC8vN24zayAid1JFUjlRIFdKIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBLTVpSTSBmYSBXSiBaUnc5IjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVsTXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgbjM3bjVfUlVuT3lPUzdfdXR2MGtuN1VVX051bF9mUGZXSigkV2lfMFdKLCAkVldKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgMDduazBKX1U3U19XSiA9IDp1bE11WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIE9fVVNPU2VVID0gJ0InIEtNWlJNIGZhIFdKIFpSdzkiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAvLzduM2sgIndSRVI5USBXSiBoTUtsIG1rMDVUeWttX1dpIE56Uk1SIFdpXzBXSiA9ICckV2lfMFdKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBLTVpSTSBmYSBXSiBaUnc5IjsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVsTXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX1o3T3lfQVVVV1l0N0pfRlU3MG8wa2V2VV9sZXlTVygkdldKLCAkMGt5N19PMDApIHsKICAgICAgICAkMGt5N19PMDBfc2tXdCA9IHNrV3QoJywnLCAkMGt5N19PMDApOwoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIE9VVVdZdF9pN2lfdjBrczduUyBOelJNUiB2MGtzN25TX1dKID0gOnFNS2JSOVFfdVogQURaIDBreTcgdUQgKCQwa3k3X08wMF9za1d0KSIpOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6cU1LYlI5UV91WicgPT4gJHZXSikpOwogICAgICAgICRTM1dVLT4wN1NlMHQ4ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDg7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX3V0djBrbjdVVXdTN3ZVX051bF9mUGZXSigkdldKLCAkVldKLCAkV2lfV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKPTpxdVogQURaIDA3bmswSl9VN1NfV0ogPSA6dWxNdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiBXaV9XSiA9IDp1bHVaIEtNWlJNIGZhIFdKIFpSdzkiKTsKICAgICAgICAvLyRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkVmRXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnF1WicsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzp1bHVaJywgJFdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVsTXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgICAgIDkwa3QgbE9XeVUKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAKCgogICAgVGV0blNXa3QgVTdTd2VWczduUygkZE95ZTcpIHsKICAgICAgICBXVCAoJGRPeWU3ID09ICcnKQogICAgICAgICAgICAkUzNXVS0+VWVWczduUyA9ICcnOwogICAgICAgIDd5VTcKICAgICAgICAgICAgJFMzV1UtPlVlVnM3blMgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTWjdVbjBXdlNXa3QoJGRPeWU3KSB7CiAgICAgICAgV1QgKCRkT3llNyA9PSAnJykKICAgICAgICAgICAgJFMzV1UtPko3VW4wV3ZTV2t0ID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+SjdVbjBXdlNXa3QgPSAkZE95ZTc7CiAgICAgICAgMDdTZTB0IFMwZTc7CiAgICB9CgogICAgVGV0blNXa3QgVTdTQXl5a21SSldTKCRkT3llNykgewogICAgICAgIFdUICgkZE95ZTcgPT0gJycpCiAgICAgICAgICAgICRTM1dVLT5PeXlrbV83SldTID0gJyc7CiAgICAgICAgN3lVNwogICAgICAgICAgICAkUzNXVS0+T3l5a21fN0pXUyA9ICRkT3llNzsKICAgICAgICAwN1NlMHQgUzBlNzsKICAgIH0KCiAgICBUZXRuU1drdCBPSkpfbWswNVR5a21fVW4zN0pleTdKX2lPV3lVKCkgewoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygiV3RVNzBTIFd0U2sgbWswNVR5a21fVW4zN0pleTdKX2lPV3lVKCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2V0osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwN25rMEpfVTdTX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVXeUo3MF9XSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fVmVXeUo3MF9kT3llN19XSiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX2VVNzBfWTBrZXYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19lVTcwX1dKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19VU09TZVUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1NPMFk3U19KT1M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWVWczduUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEo3VW4wV3ZTV2t0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmtpaTd0U1UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaV9XSiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPeXlrbV83SldTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjA3T1M3Sl9WUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4wN09TN0pfT1MpIGRPeWU3VSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cU1LYlI5UXVaLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpNUjlLTVp3UlF1WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmdVosIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZwdVosIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOkFGd1JNb01LRnEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6QUZ3Uk11WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpBd1FBUUZ3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpBUUFNb1JRWkFRUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3RmZiUjlRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlpSdzlNdXFRdUtELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjlLbGxSRFF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnVsdVosIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOkFFRUtOUlp1USwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo5TVJBUVJaZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OU1SQVFSWkFRKSIpOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpxTUtiUjlRdVonLCAkUzNXVS0+djBrczduU19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFMzV1UtPjA3bmswSl9VN1NfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkUzNXVS0+VmVXeUo3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZwdVonLCAkUzNXVS0+T19WZVd5SjcwX2RPeWU3X1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QUZ3Uk1vTUtGcScsICRTM1dVLT5PX2VVNzBfWTBrZXYsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBRndSTXVaJywgJFMzV1UtPk9fZVU3MF9XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOkF3UUFRRncnLCAkUzNXVS0+T19VU09TZVUsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpBUUFNb1JRWkFRUicsICRTM1dVLT5PX1NPMFk3U19KT1M3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6d0ZmYlI5UScsICRTM1dVLT5VZVZzN25TLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6WlJ3OU11cVF1S0QnLCAkUzNXVS0+SjdVbjBXdlNXa3QsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5S2xsUkRRdycsICRTM1dVLT5ua2lpN3RTVSwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVsdVonLCAkUzNXVS0+aU9VUzcwX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6QUVFS05SWnVRJywgJFMzV1UtPk95eWttXzdKV1MsIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzo5TVJBUVJaZmEnLCAkUzNXVS0+bjA3T1M3Sl9WUCwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOjlNUkFRUlpBUScsICRTM1dVLT5uMDdPUzdKX09TLCBxWks6OnFBTUFsX3dRTSk7CgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAvL3YwV3RTXzAoJFMzV1UtPlVTMy0+NzAwazB1dFRrKCkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+SlYtPnlPVVN1dFU3MFN1SigpOwogICAgfQoKICAgIFRldG5TV2t0IFk3U19tazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUoKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUiKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IEo3eTdTN19tazA1VHlrbV9VbjM3SmV5N0pfaU9XeVVfZlB1SigkV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUgbTM3MDcgV0o9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnVaIiwgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KCiAgICBUZXRuU1drdCBKN3k3UzdfbWswNVR5a21fVW4zN0pleTdKX2lPV3lVX2ZQZnVKKCRWV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUgbTM3MDcgVmVXeUo3MF9XSj0gOmZ1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOmZ1WiIsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgICAgICAgICAgOTNPMFNVCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgIAoKICAgIFRldG5TV2t0IFk3U05rMDVoeWttX3VsXzkzTzBTX2ZQd1NPU2VVKCQwa3k3LCAkZVdKLCAkVldKLCAkdldKLCAkSk9TN18wT3RZN19kT3ksICRKT1M3X1d0UzcwZE95LCAkVVNPU2VVKSB7CgogICAgICAgIFdUIChVUzB2a1UoJDBreTcsICc3aXZfJykgIT09IFRPeVU3KSB7CiAgICAgICAgICAgICQwa3k3X08wMCA9IDdjdnlrSjcoJ18nLCAkMGt5Nyk7CiAgICAgICAgICAgICQwa3k3ID0gJDBreTdfTzAwWzhdOwogICAgICAgICAgICAkN2l2XzBreTcgPSAkMGt5N19PMDBbOF07CiAgICAgICAgfSA3eVU3IHsKICAgICAgICAgICAgJDdpdl8wa3k3ID0gJyc7CiAgICAgICAgfQoKCiAgICAgICAgV1QgKFdVX08wME9QKCRVU09TZVUpICYmIG5rZXRTKCRVU09TZVUpID49IDgpIHsKICAgICAgICAgICAgJG5raWlPX1U3dk8wT1M3Sl9VU09TZVUgPSBXaXZ5a0o3KCInLCciLCAkVVNPU2VVKTsKICAgICAgICAgICAgJG5raWlPX1U3dk8wT1M3Sl9VU09TZVUgPSAiJyIgLiAkbmtpaU9fVTd2TzBPUzdKX1VTT1NlVSAuICInIjsKICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAkbmtpaU9fVTd2TzBPUzdKX1VTT1NlVSA9ICcnOwogICAgICAgIH0KLy83bjNrICRua2lpT19VN3ZPME9TN0pfVVNPU2VVLicjJzsKICAgICAgICBVbVdTbjMgKCRKT1M3X1d0UzcwZE95KSB7CiAgICAgICAgICAgIG5PVTcgInE4bCI6CiAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRua2lpT19VN3ZPME9TN0pfVVNPU2VVKSkgewogICAgICAgICAgICAgICAgICAgICRUV3lTNzBfcmU3MFAgPSAiIGxLRFF6KG1KLmV2Sk9TN0pfT1MpID0gbEtEUXooJyIgLiAkSk9TN18wT3RZN19kT3kgLiAiJykgQURaIGFSQU0obUouZXZKT1M3Sl9PUykgPSBhUkFNKCciIC4gJEpPUzdfME90WTdfZE95IC4gIicpIEFEWiBtSi5PX1VTT1NlVSB1RCgkbmtpaU9fVTd2TzBPUzdKX1VTT1NlVSkgIjsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgJFRXeVM3MF9yZTcwUCA9ICIgbEtEUXoobUouZXZKT1M3Sl9PUykgPSBsS0RReignIiAuICRKT1M3XzBPdFk3X2RPeSAuICInKSBBRFogYVJBTShtSi5ldkpPUzdKX09TKSA9IGFSQU0oJyIgLiAkSk9TN18wT3RZN19kT3kgLiAiJykgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFYwN081OwogICAgICAgICAgICBuT1U3ICJxOFoiOgogICAgICAgICAgICAgICAgV1QgKCE3aXZTUCgkbmtpaU9fVTd2TzBPUzdKX1VTT1NlVSkpIHsKICAgICAgICAgICAgICAgICAgICAkVFd5UzcwX3JlNzBQID0gIiBaQVFSKG1KLmV2Sk9TN0pfT1MpID0gJyIgLiAkSk9TN18wT3RZN19kT3kgLiAiJyBBRFogbUouT19VU09TZVUgdUQoJG5raWlPX1U3dk8wT1M3Sl9VU09TZVUpICI7CiAgICAgICAgICAgICAgICB9IDd5VTcgewogICAgICAgICAgICAgICAgICAgICRUV3lTNzBfcmU3MFAgPSAiIFpBUVIobUouZXZKT1M3Sl9PUykgPSAnIiAuICRKT1M3XzBPdFk3X2RPeSAuICInICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBWMDdPNTsKICAgICAgICAgICAgSjdUT2V5UzoKCiAgICAgICAgICAgICAgICBXVCAoITdpdlNQKCRua2lpT19VN3ZPME9TN0pfVVNPU2VVKSkgewogICAgICAgICAgICAgICAgICAgICRUV3lTNzBfcmU3MFAgPSAiIGxLRFF6KG1KLmV2Sk9TN0pfT1MpID0gbEtEUXooJyIgLiAkSk9TN18wT3RZN19kT3kgLiAiJykgQURaIGFSQU0obUouZXZKT1M3Sl9PUykgPSBhUkFNKCciIC4gJEpPUzdfME90WTdfZE95IC4gIicpIEFEWiBtSi5PX1VTT1NlVSB1RCgkbmtpaU9fVTd2TzBPUzdKX1VTT1NlVSkgIjsKICAgICAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAgICAgJFRXeVM3MF9yZTcwUCA9ICIgbEtEUXoobUouZXZKT1M3Sl9PUykgPSBsS0RReignIiAuICRKT1M3XzBPdFk3X2RPeSAuICInKSBBRFogYVJBTShtSi5ldkpPUzdKX09TKSA9IGFSQU0oJyIgLiAkSk9TN18wT3RZN19kT3kgLiAiJykgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9Ci8vN24zayAkVFd5UzcwX3JlNzBQOwogICAgICAgIFdUICgkMGt5NyA9PSA4IHx8ICQwa3k3ID09IEIpIHsKICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFp1d1F1RDlRIG1KLldKIE9VIG1XaV9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIFYudjBrczduU19XSiA9ICckdldKJyBBRFogVi5XSiA9ICckVldKJyBBRFogJFRXeVM3MF9yZTcwUCBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5Iik7CgogICAgICAgICAgICAvKiA3bjNrICJ3UkVSOVEgWnV3UXVEOVEgbUouV0ogT1UgbVdpX1dKIGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtMCBLRCAobUouVmVXeUo3MF9XSiA9IG0wLlZlV3lKNzBfV0ogIEFEWiBtSi5XaV9XSiA9IG0wLldpX1dKIEFEWiBtSi4wN25rMEpfVTdTX1dKID0gbTAuMDduazBKX1U3U19XSikiCiAgICAgICAgICAgICAgLiAiIE56Uk1SIFYudjBrczduU19XSiA9ICckdldKJyBBRFogJFRXeVM3MF9yZTcwUCBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5IjsgKi8KICAgICAgICB9IDd5VTcgewogICAgICAgICAgICBXVCAoN2l2U1AoJDdpdl8wa3k3KSkgewogICAgICAgICAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIFp1d1F1RDlRIG1KLldKIE9VIG1XaV9XSiwgbUouT19WZVd5SjcwX2RPeWU3X1dKICBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRCBWZC5XSiA9IG1KLk9fVmVXeUo3MF9kT3llN19XSiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgQXcgbTAgS0QgKG1KLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKICBBRFogbUouV2lfV0ogPSBtMC5XaV9XSiBBRFogbUouMDduazBKX1U3U19XSiA9IG0wLjA3bmswSl9VN1NfV0opIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIE9VVVdZdF9pN2lfdjBrczduUyBBdyBpdiBLRCBtSi5PX2VVNzBfWTBrZXYgPSBpdi4wa3k3IgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTnpSTVIgdWgobTAuZVU3MF9XSiB1dyBERkVFLCAoaXYuaTdpX1dKID0gOkZ3Uk11WiBBRFogbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgS00gVi5tazA1VHlrbV9pT3RPWTcwPTpGd1JNdVosIG0wLmVVNzBfV0o9OkZ3Uk11WiBLTSBtSi5PX2VVNzBfWTBrZXYgPSA6RndSTW9NS0ZxKSBBRFogVi52MGtzN25TX1dKID0gOnFNS2JSOVF1WiBBRFogVi5XSiA9ICckVldKJyBBRFogJFRXeVM3MF9yZTcwUCBvTUtGcSBmYSBtSi5XSiBLTVpSTSBmYSBtSi5XSiBaUnc5ICRVRVdpV1MgIik7CiAgICAgICAgICAgIH0gN3lVNyB7CiAgICAgICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgWnV3UXVEOVEgbUouV0ogT1UgbVdpX1dKLCBtSi5PX1ZlV3lKNzBfZE95ZTdfV0ogaE1LbCBtazA1VHlrbV9WZVd5SjcwIEF3IFYiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2kgQXcgbUogS0QgbUouVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuV0ogPSBtSi5PX1ZlV3lKNzBfZE95ZTdfV0oiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fV2lfTzBreTdVIEF3IG0wIEtEIChtSi5WZVd5SjcwX1dKID0gbTAuVmVXeUo3MF9XSiAgQURaIG1KLldpX1dKID0gbTAuV2lfV0ogQURaIG1KLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE56Uk1SIHVoKG0wLmVVNzBfV0ogdXcgREZFRSwgKGl2Lmk3aV9XSiA9IDpGd1JNdVogQURaIG1KLk9fZVU3MF9ZMGtldiA9IDpGd1JNb01LRnEpIEtNIFYubWswNVR5a21faU90T1k3MD06RndSTXVaLCBtMC5lVTcwX1dKPTpGd1JNdVogS00gbUouT19lVTcwX1kwa2V2ID0gOkZ3Uk1vTUtGcSkgQURaIFYudjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaIFYuV0ogPSAnJFZXSicgQURaICRUV3lTNzBfcmU3MFAgb01LRnEgZmEgbUouV0ogS01aUk0gZmEgbUouV0ogWlJ3OSAkVUVXaVdTICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGd1JNb01LRnEiLCAkMGt5NywgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIFdUICg3aXZTUCgkN2l2XzBreTcpKSB7CiAgICAgICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOkZ3Uk11WiIsICRlV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICB9CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6cU1LYlI5UXVaIiwgJHZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKCiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgoKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ID4+CiMgICAgICAgICAgICAgICAgIE03czduUyBxMGtuN1VVCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ID4+CgogICAgVGV0blNXa3QgWTdTX05rMDVUeWttX1dpX3YwN2RXa2VVeVBfT3Z2MGtkN0pfVVM3digkVldKLCAkVmRXSiwgJFdpXzBXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBWZC5XSiwgVmQuVVM3dl9TUHY3IGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9WZVd5SjcwX2RPeWU3VSBBdyBWZCBLRChtVS5WZVd5SjcwX2RPeWU3X1dKID0gVmQuV0opIgogICAgICAgICAgICAgICAgLiAiIE56Uk1SIG1VLjA3bmswSl9VN1NfV0ogPSAnJFdpXzBXSicgQURaIG1VLlZlV3lKNzBfV0ogPSAnJFZXSicgQURaIG1VLlZlV3lKNzBfZE95ZTdfV0ogPCAnJFZkV0onIEFEWiAobVUuVVNPU2VVID0gJzgnIEtNIG1VLlVTT1NlVSA9ICc4aicgS00gbVUuVVNPU2VVID0gJzg4JykgS01aUk0gZmEgbVUuVmVXeUo3MF9kT3llN19XSiBaUnc5IEV1bHVRIDgiKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKCiAgICAgICAgV1QgKG5rZXRTKCRTM1dVLT4wN1NlMHQpID4gaikgewogICAgICAgICAgICAkbl9WZFdKID0gJFMzV1UtPjA3U2UwdFtqXVsnV0onXTsKICAgICAgICAgICAgV1QgKCRTM1dVLT4wN1NlMHRbal1bJ1VTN3ZfU1B2NyddID09IEIpIHsKICAgICAgICAgICAgICAgIE8wME9QX3ZlVTMoJFMzV1UtPlVTT1k3X092djBrZDdKX1VTN3ZVLCAkbl9WZFdKKTsKICAgICAgICAgICAgICAgICRTM1dVLT5ZN1NfTmswNVR5a21fV2lfdjA3ZFdrZVV5UF9PdnYwa2Q3Sl9VUzd2KCRWV0osICRuX1ZkV0osICRXaV8wV0opOwogICAgICAgICAgICB9IDd5VTcgV1QgKCRTM1dVLT4wN1NlMHRbal1bJ1VTN3ZfU1B2NyddID09IDgpIHsKICAgICAgICAgICAgICAgIFdUIChua2V0UygkUzNXVS0+VVNPWTdfT3Z2MGtkN0pfVVM3dlUpIDw9IGopIHsKICAgICAgICAgICAgICAgICAgICBPMDBPUF92ZVUzKCRTM1dVLT5VU09ZN19PdnYwa2Q3Sl9VUzd2VSwgJG5fVmRXSik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIDA3U2UwdCAkUzNXVS0+VVNPWTdfT3Z2MGtkN0pfVVM3dlU7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX05rMDVUeWttX1dpX3lPVVNfT3Z2MGtkN0pfREEoJFZXSiwgJFZkV0osICRXaV8wV0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSIKICAgICAgICAgICAgICAgIC4gIiBOelJNUiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiBWZVd5SjcwX2RPeWU3X1dKIDwgJyRWZFdKJyBBRFogVVNPU2VVIDw+ICc4RycgS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4Iik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSIKICAgICAgICAvLy4gIiBOelJNUiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiBWZVd5SjcwX2RPeWU3X1dKIDwgJyRWZFdKJyBBRFogKFVTT1NlVSA8PiAnOEcnIEtNIFVTT1NlVSA8PiAnOGcnKSBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiOwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwoKCiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX05rMDVUeWttX1dpX092djBrZDdKX1VTN3YoJFZXSiwgJFZkV0osICRXaV8wV0opIHsKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kiCiAgICAgICAgICAgICAgICAuICIgTnpSTVIgMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBBRFogVmVXeUo3MF9XSiA9ICckVldKJyBBRFogVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIChVU09TZVUgPSAnOCcgS00gVVNPU2VVID0gJzhqJyBLTSBVU09TZVUgPSAnODgnKSBLTVpSTSBmYSBXSiBaUnc5IEV1bHVRIDgiKTsKICAgICAgICAvKiA3bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSIKICAgICAgICAgIC4gIiBOelJNUiAwN25rMEpfVTdTX1dKID0gJyRXaV8wV0onIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gJyRWZFdKJyBBRFogKFVTT1NlVSA9ICc4JyBLTSBVU09TZVUgPSAnOGonIEtNIFVTT1NlVSA9ICc4OCcpIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCI7ICovCgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CgoKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1aHlrbV9GVTcwX3dTT1NlVU03dmswUygkdldKLCAkVldKLCAkZVU3MF9XSiwgJFU3eV9tVF9VU09TZVUsICRUMGtpX0pPUzcsICRTa19KT1M3KSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBtVS5XSiwgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiwgbVUuZVU3MF9ZMGtldl9XSiwgbVUuVVNPU2VVLCBtVS5ua2lpN3RTLCBtVS5uMDdPUzdKX1ZQLCBtVS5uMDdPUzdKX09TIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VCiAgICAgICAgICAgICAgICBOelJNUiBtVS52MGtzN25TX1dKID0gJyR2V0onIEFEWiBtVS5WZVd5SjcwX1dKID0gJyRWV0onIEFEWiBtVS5VU09TZVU9JyRVN3lfbVRfVVNPU2VVJyBBRFogIG1VLm4wN09TN0pfVlAgV3QoJGVVNzBfV0opIEFEWgogICAgICAgICAgICAgICAgOUF3UShtVS5uMDdPUzdKX09TIE9VIEpPUzcpIFY3U203N3QgOUF3USgnJFQwa2lfSk9TNycgT1UgSk9TNykgT3RKIDlBd1EoJyRTa19KT1M3JyBPVSBKT1M3KSBLTVpSTSBmYSBtVS5XSiBBdzkiKTsKCiAgICAgICAgLyogN24zayAid1JFUjlRIG1VLldKLCBtVS4wN25rMEpfVTdTX1dKLCBtVS5WZVd5SjcwX1dKLCBtVS5WZVd5SjcwX2RPeWU3X1dKLCBtVS5lVTcwX1kwa2V2X1dKLCBtVS5VU09TZVUsIG1VLm5raWk3dFMsIG1VLm4wN09TN0pfVlAsIG1VLm4wN09TN0pfT1MgaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUKICAgICAgICAgIE56Uk1SIG1VLnYwa3M3blNfV0ogPSAnJHZXSicgQURaIG1VLlZlV3lKNzBfV0ogPSAnJFZXSicgQURaIG1VLlVTT1NlVT0nJFU3eV9tVF9VU09TZVUnIEFEWiAgbVUubjA3T1M3Sl9WUD0nJGVVNzBfV0onIEFEWgogICAgICAgICAgOUF3UShtVS5uMDdPUzdKX09TIE9VIEpPUzcpIFY3U203N3QgOUF3USgnJFQwa2lfSk9TNycgT1UgSk9TNykgT3RKIDlBd1EoJyRTa19KT1M3JyBPVSBKT1M3KSBLTVpSTSBmYSBtVS5XSiBBdzkiOyAqLwoKCgoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgLy92MFd0U18wKCRTM1dVLT5VUzMtPjcwMGswdXRUaygpKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCgogICAgVGV0blNXa3QgWTdTTmswNWh5a21fRlU3MF93U09TZVVNN3ZrMFM5a2l2N1M3Sl90N20oJHZXSiwgJFZXSiwgJGVVNzBfV0osICRVN3lfbVRfVVNPU2VVLCAkVDBraV9KT1M3LCAkU2tfSk9TNykgewoKICAgICAgIC8qICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgbVUuV0osIG1VLjA3bmswSl9VN1NfV0osIG1VLlZlV3lKNzBfV0osIG1VLlZlV3lKNzBfZE95ZTdfV0osIG1VLmVVNzBfWTBrZXZfV0osIG1VLlVTT1NlVSwgbVUubmtpaTd0UywgbVUubjA3T1M3Sl9WUCBPVSBlVTcwX1dKLCBtVS5uMDdPUzdKX09TIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VCiAgICAgICAgICAgICAgICBOelJNUiBtVS52MGtzN25TX1dKID0gJyR2V0onIEFEWiBtVS5WZVd5SjcwX1dKID0gJyRWV0onIEFEWiBtVS5VU09TZVUgV3QoOCw4aixCQikgQURaICBtVS5uMDdPUzdKX1ZQIFd0KCRlVTcwX1dKKSBBRFoKICAgICAgICAgICAgICAgIDlBd1EobVUubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgWTBrZXYgVlAgbVUuMDduazBKX1U3U19XSiBLTVpSTSBmYSBtVS5XSiBaUnc5ICIpOwoJCQkJICovCiRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBtVS5XSiwgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiwgbVUuZVU3MF9ZMGtldl9XSiwgbVUuVVNPU2VVLCBtVS5ua2lpN3RTLCBtVS5uMDdPUzdKX1ZQIE9VIGVVNzBfV0osIG1VLm4wN09TN0pfT1MgaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgQXcgbVUgTnpSTVIgbVUudjBrczduU19XSiA9ICckdldKJyBBRFogbVUuVmVXeUo3MF9XSiA9ICckVldKJyBBRFogbVUuVVNPU2VVIFd0KDgsOGosQkIpIEFEWiAgbVUubjA3T1M3Sl9WUCBXdCgkZVU3MF9XSikgQURaIDlBd1EobVUubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgWTBrZXYgVlAgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiBLTVpSTSBmYSBtVS5XSiBaUnc5Iik7CiAgICAgICAgICAvKiA3bjNrICJ3UkVSOVEgbVUuV0osIG1VLjA3bmswSl9VN1NfV0osIG1VLlZlV3lKNzBfV0osIG1VLlZlV3lKNzBfZE95ZTdfV0osIG1VLmVVNzBfWTBrZXZfV0osIG1VLlVTT1NlVSwgbVUubmtpaTd0UywgbVUubjA3T1M3Sl9WUCwgbVUubjA3T1M3Sl9PUyBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVQogICAgICAgICAgTnpSTVIgbVUudjBrczduU19XSiA9ICckdldKJyBBRFogbVUuVmVXeUo3MF9XSiA9ICckVldKJyBBRFogbVUuVVNPU2VVPSckVTd5X21UX1VTT1NlVScgQURaICBtVS5uMDdPUzdKX1ZQIHVEICgkZVU3MF9XSikgQURaCiAgICAgICAgICA5QXdRKG1VLm4wN09TN0pfT1MgT1UgSk9TNykgVjdTbTc3dCA5QXdRKCckVDBraV9KT1M3JyBPVSBKT1M3KSBPdEogOUF3USgnJFNrX0pPUzcnIE9VIEpPUzcpIEtNWlJNIGZhIG1VLldKIEF3OSI7ICAgKi8KCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAvL3YwV3RTXzAoJFMzV1UtPlVTMyk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgkKCVRldG5TV2t0IFk3U05rMDVoeWttX0ZVNzBfd1NPU2VVTTd2azBTOWtpdjdTN0pfdDdtXzBuV0ooJHZXSiwgJFZXSiwgJGVVNzBfV0osICRVN3lfbVRfVVNPU2VVLCAkVDBraV9KT1M3LCAkU2tfSk9TNywkMG5XSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgbVUuV0osIG1VLjA3bmswSl9VN1NfV0osIG1VLlZlV3lKNzBfV0osIG1VLlZlV3lKNzBfZE95ZTdfV0osIG1VLmVVNzBfWTBrZXZfV0osIG1VLlVTT1NlVSwgbVUubmtpaTd0UywgbVUubjA3T1M3Sl9WUCBPVSBlVTcwX1dKLCBtVS5uMDdPUzdKX09TIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VCiAgICAgICAgICAgICAgICBOelJNUiBtVS4wN25rMEpfVTdTX1dKID0gJyQwbldKJyBBRFogbVUudjBrczduU19XSiA9ICckdldKJyBBRFogbVUuVmVXeUo3MF9XSiA9ICckVldKJyBBRFogbVUuVVNPU2VVIFd0KDgsOGosQkIpIEFEWiAgbVUubjA3T1M3Sl9WUCBXdCgkZVU3MF9XSikgQURaCiAgICAgICAgICAgICAgICA5QXdRKG1VLm4wN09TN0pfT1MgT1UgSk9TNykgVjdTbTc3dCA5QXdRKCckVDBraV9KT1M3JyBPVSBKT1M3KSBPdEogOUF3USgnJFNrX0pPUzcnIE9VIEpPUzcpIEtNWlJNIGZhIG1VLldKIFpSdzkgRXVsdVEgOCIpOwoKICAgICAgICAgIC8qIDduM2sgIndSRVI5USBtVS5XSiwgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiwgbVUuZVU3MF9ZMGtldl9XSiwgbVUuVVNPU2VVLCBtVS5ua2lpN3RTLCBtVS5uMDdPUzdKX1ZQLCBtVS5uMDdPUzdKX09TIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIEF3IG1VCiAgICAgICAgICBOelJNUiBtVS52MGtzN25TX1dKID0gJyR2V0onIEFEWiBtVS5WZVd5SjcwX1dKID0gJyRWV0onIEFEWiBtVS5VU09TZVU9JyRVN3lfbVRfVVNPU2VVJyBBRFogIG1VLm4wN09TN0pfVlAgdUQgKCRlVTcwX1dKKSBBRFoKICAgICAgICAgIDlBd1EobVUubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgS01aUk0gZmEgbVUuV0ogQXc5IjsgICAqLwoKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAvLyB2MFd0U18wKCRTM1dVLT5VUzMpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKCgoKICAgVGV0blNXa3QgWTdTTmswNWh5a21fRlU3MF93U09TZVVNN3ZrMFNxN3RKV3RZX3Q3bSgkdldKLCAkVldKLCAkZVU3MF9XSiwgJFU3eV9tVF9VU09TZVUsICRUMGtpX0pPUzcsICRTa19KT1M3KSB7CgogICAgICAgIC8qICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBtVS5XSiwgbVUuMDduazBKX1U3U19XSiwgbVUuVmVXeUo3MF9XSiwgbVUuVmVXeUo3MF9kT3llN19XSiwgJycgQXcgJzlraWk3dFMnICwgbVUuVVNPU2VVLCAgbVUuZVU3MF9XSiwgbVUubjA3T1M3Sl9PUyBoTUtsIG1rMDVUeWttX1dpX08wa3k3VSBBdyBtVQogICAgICAgICAgICAgICAgTnpSTVIgbVUudjBrczduU19XSiA9ICckdldKJyBBRFogbVUuVmVXeUo3MF9XSiA9ICckVldKJyBBRFogICBtVS5lVTcwX1dKIFd0KCRlVTcwX1dKKSBBRFogKHdRQVFGdyA9IDgpT3RKCiAgICAgICAgICAgICAgICA5QXdRKG1VLm4wN09TN0pfT1MgT1UgSk9TNykgVjdTbTc3dCA5QXdRKCckVDBraV9KT1M3JyBPVSBKT1M3KSBPdEogOUF3USgnJFNrX0pPUzcnIE9VIEpPUzcpIEtNWlJNIGZhIG1VLldKIEF3OSIpOyAqLwoJCQkJCgkJCQkKCQkJCSAKCQkJCSAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIG1XaSAKCQkJCUVSaFEgYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgbTAgS0QgbVdpLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKCgkJCQlBRFogbVdpLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKIEFEWiBtV2kuT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiAKCQkJCU56Uk1SIG1XaS5WZVd5SjcwX1dKID0gJyRWV0onIEFEWiBtMC5lVTcwX1dKIFd0KCRlVTcwX1dKKSAgQURaIG1XaS5PX1VTT1NlVSB1RChqLHgsMiwxLDhqLDhILDgxLEJqKSAKCQkJCU90SgogICAgICAgICAgICAgICAgOUF3UShtMC5uMDdPUzdKX09TIE9VIEpPUzcpIFY3U203N3QgOUF3USgnJFQwa2lfSk9TNycgT1UgSk9TNykgT3RKIDlBd1EoJyRTa19KT1M3JyBPVSBKT1M3KSBLTVpSTSBmYSBtMC5XSiBBdzkiCgkJCQkpOyAKCQkJCQoJCQkJCgkJCQkvKiAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIG1XaSAKCQkJCU56Uk1SIG1XaS5WZVd5SjcwX1dKID0gJyRWV0onICAgQURaIG1XaS5PX1VTT1NlVSB1RChqLHgsMiwxLDhqLDhILDgxLEJqKSAKCQkJCU90SiBtV2kuT19lVTcwX1kwa2V2ID0gJF93Und3dUtEW3dSd3d1S0RfcEFNX0RBbFJdWycwa3k3J10gQURaIAogICAgICAgICAgICAgICAgOUF3UShtV2kubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgS01aUk0gZmEgbVdpLldKIEF3OSIKCQkJCSk7ICovCgogCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoJIAkvLyB2MFd0U18wKCRTM1dVLT5VUzMpOwogICAgICAgIC8vdjBXdFNfMCgkUzNXVS0+VVMzLT43MDBrMHV0VGsoKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgkKCVRldG5TV2t0IFk3U05rMDVoeWttX0ZVNzBfd1NPU2VVTTd2azBTcTd0Sld0WV90N21fbVdpX1dKKCR2V0osICRWV0osICRlVTcwX1dKLCAkVTd5X21UX1VTT1NlVSwgJFQwa2lfSk9TNywgJFNrX0pPUzcpIHsKCiAgICAgICAgLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIG1VLldKLCBtVS4wN25rMEpfVTdTX1dKLCBtVS5WZVd5SjcwX1dKLCBtVS5WZVd5SjcwX2RPeWU3X1dKLCAnJyBBdyAnOWtpaTd0UycgLCBtVS5VU09TZVUsICBtVS5lVTcwX1dKLCBtVS5uMDdPUzdKX09TIGhNS2wgbWswNVR5a21fV2lfTzBreTdVIEF3IG1VCiAgICAgICAgICAgICAgICBOelJNUiBtVS52MGtzN25TX1dKID0gJyR2V0onIEFEWiBtVS5WZVd5SjcwX1dKID0gJyRWV0onIEFEWiAgIG1VLmVVNzBfV0ogV3QoJGVVNzBfV0opIEFEWiAod1FBUUZ3ID0gOClPdEoKICAgICAgICAgICAgICAgIDlBd1EobVUubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgS01aUk0gZmEgbVUuV0ogQXc5Iik7ICovCgkJCQkKCQkJCSAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1dpIG1XaSAKCQkJCUVSaFEgYkt1RCBtazA1VHlrbV9XaV9PMGt5N1UgbTAgS0QgbVdpLjA3bmswSl9VN1NfV0ogPSBtMC4wN25rMEpfVTdTX1dKCgkJCQlBRFogbVdpLlZlV3lKNzBfV0ogPSBtMC5WZVd5SjcwX1dKIEFEWiBtV2kuT19WZVd5SjcwX2RPeWU3X1dKID0gbTAuVmVXeUo3MF9kT3llN19XSiAKCQkJCU56Uk1SIG1XaS5WZVd5SjcwX1dKID0gJyRWV0onICAgIEFEWiBtV2kuT19VU09TZVUgdUQoaix4LDIsMSw4aiw4SCw4MSxCaikgCgkJCQlPdEoKICAgICAgICAgICAgICAgIDlBd1EobTAubjA3T1M3Sl9PUyBPVSBKT1M3KSBWN1NtNzd0IDlBd1EoJyRUMGtpX0pPUzcnIE9VIEpPUzcpIE90SiA5QXdRKCckU2tfSk9TNycgT1UgSk9TNykgS01aUk0gZmEgbTAuV0ogQXc5IgoJCQkJKTsgCgkJCQkKCQkJCQoJCQkJLyogJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBtV2kgCgkJCQlOelJNUiBtV2kuVmVXeUo3MF9XSiA9ICckVldKJyAgIEFEWiBtV2kuT19VU09TZVUgdUQoaix4LDIsMSw4aiw4SCw4MSxCaikgCgkJCQlPdEogbVdpLk9fZVU3MF9ZMGtldiA9ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddIEFEWiAKICAgICAgICAgICAgICAgIDlBd1EobVdpLm4wN09TN0pfT1MgT1UgSk9TNykgVjdTbTc3dCA5QXdRKCckVDBraV9KT1M3JyBPVSBKT1M3KSBPdEogOUF3USgnJFNrX0pPUzcnIE9VIEpPUzcpIEtNWlJNIGZhIG1XaS5XSiBBdzkiCgkJCQkpOyAqLwoKIAogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKCSAJLy8gdjBXdFNfMCgkUzNXVS0+VVMzKTsKICAgICAgICAvL3YwV3RTXzAoJFMzV1UtPlVTMy0+NzAwazB1dFRrKCkpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoJCglUZXRuU1drdCBZN1NOV2laT1NPZlBfZVU3MFkwa2V2X1ZXSiggJFZXSiwgJGVVNzBfV0osICQwa3k3LCRUMGtpX0pPUzcsJFNrX0pPUzcpIHsKCQkJJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBtV2kgCgkJCU56Uk1SIG1XaS5WZVd5SjcwX1dKID0gJyRWV0onICAgQURaIG1XaS5PX1VTT1NlVSB1RChqLHgsMiwxLDhqLDhILDgxLEJqKSAKCQkJT3RKIG1XaS5PX2VVNzBfWTBrZXYgPSAkMGt5NyBBRFogCgkJCTlBd1EobVdpLm4wN09TN0pfT1MgT1UgSk9TNykgVjdTbTc3dCA5QXdRKCckVDBraV9KT1M3JyBPVSBKT1M3KSBPdEogOUF3USgnJFNrX0pPUzcnIE9VIEpPUzcpIEtNWlJNIGZhIG1XaS5XSiBBdzkiCgkJCSk7ICAKCQkJJFMzV1UtPlVTMy0+N2M3bmVTNygpOwoJCQkvLyAgdjBXdFNfMCgkUzNXVS0+VVMzKTsKCQkJLy92MFd0U18wKCRTM1dVLT5VUzMtPjcwMGswdXRUaygpKTsKCQkJJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CgkJCTA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKCiAgICBUZXRuU1drdCBZN1NfTnVsX2ZQZnB1WigkdldKLCAkVldKLCAkMFdKLCAkVmRXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fV2kgTnpSTVIgdjBrczduU19XSiA9IDpxTUtiUjlRdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk11WiBBRFogT19WZVd5SjcwX2RPeWU3X1dKID06ZnB1WiIpOwogICAgICAgIC8vN24zayAid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBOelJNUiB2MGtzN25TX1dKID0gJyR2V0onIEFEWiBWZVd5SjcwX1dKID0gJyRWV0onIEFEWiAwN25rMEpfVTdTX1dKID0gJyQwV0onIEFEWiBPX1ZlV3lKNzBfZE95ZTdfV0ogPSckVmRXSiciOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpxTUtiUjlRdVoiLCAkdldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6ZnVaIiwgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOk11WiIsICQwV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpmcHVaIiwgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgWTdTX05rMDVUeWttX0VPUzdVU19BVFM3MF9xN3RKV3RZX011WigkVldKLCAkVmRXSiwgJFdpXzBXSiwgJFdKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgV0ogPiA6dVogQURaIChVU09TZVUgPD4gJycgQURaIFVTT1NlVSA8PiAnaicgQURaIFVTT1NlVSA8PiAnODYnIEFEWiBVU09TZVUgPD4gJzInIEFEWiBVU09TZVUgPD4gJzhIJykgQURaIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogS01aUk0gZmEgV0ogWlJ3OSBFdWx1USA4Iik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBXSiA+ICckV0onIEFEWiAoVVNPU2VVIDw+ICcnIEFEWiBVU09TZVUgPD4gJ2onKSBBRFogVmVXeUo3MF9kT3llN19XSiA9ICckVmRXSicgQURaIFZlV3lKNzBfV0ogPSAnJFZXSicgQURaIDA3bmswSl9VN1NfV0ogPSAnJFdpXzBXSicgS01aUk0gZmEgV0ogQXc5IEV1bHVRIDgiOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmcHVaJywgJFZkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TVI5S01ad1JRdVonLCAkV2lfMFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6dVonLCAkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OazA1VHlrbV93Uzd2X0VPUzdVU19xN3RKV3RZX011WigkVldKLCAkVmRXSiwgJFdpXzBXSikgewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIChVU09TZVUgPSAnJyBLTSBVU09TZVUgPSAnaicpIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIFdKIFpSdzkgRXVsdVEgOCIpOwoKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIC8vICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVaJywgJFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NOazA1aHlrbV9XaV9UV3lKVV9Pbm43VVUoJHZXSiwgJFdpX1dKLCAkVldKLCAkVmRXSikgewoKICAgICAgICAvLzduM2sgIndSRVI5USBXaV9UVzd5Sl90T2k3IGhNS2wgbWswNVR5a21fV2lfVFc3eUpVX09ubjdVVSAgTnpSTVIgdldKID0gJyR2V0onIEFEWiBXaV9XSiA9ICckV2lfV0onIEFEWiBWV0ogPSckVldKJyBBRFogIFZkV0ogPSckVmRXSiciOwoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgV2lfVFc3eUpfdE9pNyBoTUtsIG1rMDVUeWttX1dpX1RXN3lKVV9Pbm43VVUgIAogICAgICAgICAgICAgICAgTnpSTVIgdldKID0gJyR2V0onIEFEWiBXaV9XSiA9ICckV2lfV0onIEFEWiBWV0ogPSckVldKJyBBRFogIFZkV0ogPSckVmRXSiciKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgIC8vIHYwV3RTXzAoJFMzV1UtPlVTMy0+NzAwazB1dFRrKCkpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIAogICAgVGV0blNXa3QgWTdTX051bGhXMFVTd1NPU2VVX2Z1Sl9NdVooJFZXSiwgJFdpXzBXSiwgJFZkV0opIHsKICAgICAgICAvLzduM2sgIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfV0ogPSAnJFZXSicgT3RKIFZlV3lKNzBfZE95ZTdfV0ogPSAkVmRXSiBBRFogMDduazBKX1U3U19XSiA9ICckV2lfMFdKJyBLTVpSTSBmYSBXSiBBdzkgeVdpV1MgOCI7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVVNPU2VVIHRrUyBXdChqLDhnLDhHKSBPdEogVmVXeUo3MF9XSiA9IDpmdVogQURaIFZlV3lKNzBfZE95ZTdfV0ogPSA6VmRXSiAgT3RKIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogQURaIDlLbGxSRFEgREtRIEV1NFIgJyhNN3M3blM3SiBtV1MzIFZPbjVtTzBKKSUnIEtNWlJNIGZhIFdKIEo3VW4geVdpV1MgOCIsIE8wME9QKHFaSzo6QVFRTV85Rk13S00gPT4gcVpLOjo5Rk13S01faE5aS0RFYSkpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoTzAwT1AoJzpmdVonID0+ICRWV0osICc6VmRXSicgPT4gJFZkV0osICc6TVI5S01ad1JRdVonID0+ICRXaV8wV0opKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX0F5eV9GVTcwX0FuU1dkNygkVl9XSiwgJFdpXzBXSiwgJFZkV0opIHsKCiAgICAgICAgLy83bjNrICJ3UkVSOVEgWnV3UXVEOVEgbjA3T1M3Sl9WUCBBdyBlVTcwX1dKIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIFZlV3lKNzBfV0ogPSAkVl9XSiBBRFogMDduazBKX1U3U19XSiA9ICRXaV8wV0ogQURaIFZlV3lKNzBfZE95ZTdfV0ogPSAkVmRXSiBBRFogd1FBUUZ3IHRrUyBXdChqLDhqLDEsQjgsQkIsOEcsODEsJy04Jyw4ZyxCeCkgS01aUk0gZmEgV0ogWlJ3OSI7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USBadXdRdUQ5USBuMDdPUzdKX1ZQIEF3IGVVNzBfV0ogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgTnpSTVIgVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSA6TVI5S01ad1JRdVogQURaIFZlV3lKNzBfZE95ZTdfV0ogPSA6ZnB1WiBBRFogd1FBUUZ3IHRrUyBXdChqLDhqLDEsQjgsQkIsQngsOEcsODEsJy04Jyw4ZykgQURaIDlLbGxSRFEgREtRIEV1NFIgJyhNN3M3blM3SiBtV1MzIFZPbjVtTzBKKSUnIEtNWlJNIGZhIFdKIFpSdzkiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6ZnVaJyA9PiAkVl9XSiwgJzpNUjlLTVp3UlF1WicgPT4gJFdpXzBXSiwgJzpmcHVaJyA9PiAkVmRXSikpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfRU9TN1VTRXV0djBrbjdVVUZVNzBmT1U3KCRtV2lfV0osICQwN25rMEpfVTdTX1dKLCAkVldKLCAkVmRXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBVU09TZVUgPSBCaiBBRFogbVdpX1dKID0gOk51bHVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk13UlF1WiAgQURaIFZlV3lKNzBfV0ogPSA6ZnVaCiAgICAgICAgIEFEWiBWZVd5SjcwX2RPeWU3X1dKID0gOmZwdVogS01aUk0gZmEgV0ogQXc5IEV1bHVRIDgiKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TXdSUXVaJywgJDA3bmswSl9VN1NfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCgogICAgVGV0blNXa3QgSjd5N1M3X21rMDVUeWttX0w3MGt1SigpIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJKN3k3UzcgVDBraSBtazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUgTnpSTVIgT19lVTcwX1kwa2V2ID0gaiBBRFogT19lVTcwX1dKID0gaiIpOwogICAgICAgIC8vJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCI6dVoiLCAkV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgfQoKICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgIFRldG5TV2t0IFk3U19OaF9xMGtuN1VVN0pfRnVaKCRlV0osICR2V0opIHsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgbUouV0ogT1UgbVdpX1dKLCBWLldKLCBWLm1rMDVUeWttX1NXU3k3IGhNS2wgbWswNVR5a21fVmVXeUo3MCBBdyBWIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV9XaSBBdyBtSiBLRCBtSi5WZVd5SjcwX1dKID0gVi5XSiIKICAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1VTT1NlVV9XaSBBdyBtVSBLRCBtSi5WZVd5SjcwX1dKID0gbVUuVmVXeUo3MF9XSiIKICAgICAgICAgICAgICAgIC4gIiAgTnpSTVIgbVUubjA3T1M3Sl9WUCA9IDpGdVogQURaIG1VLnYwa3M3blNfV0ogPSA6cXVaIEFEWiBtVS5VU09TZVUgPD4gaiBvTUtGcSBmYSBWLldKIik7CiAgICAgICAgCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6RnVaJywgJGVXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnF1WicsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfWmtuZVVXWXQoJG1XaV9XSiwgJDA3bmswSl9VN1NfV0osICRWV0osICRWZFdKLCRlVTcwX1dKKSB7CgogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIE56Uk1SIG1XaV9XSiA9IDpOdWx1WiBBRFogMDduazBKX1U3U19XSiA9IDpNd1JRdVogIEFEWiBWZVd5SjcwX1dKID0gOmZ1WgogICAgICAgICBBRFogVmVXeUo3MF9kT3llN19XSiA9IDpmcHVaIE90SiBuMDdPUzdKX1ZQID0gOjlNUkFRUlpmYSAgS01aUk0gZmEgV0ogQXc5IEV1bHVRIDgiKTsKCiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TnVsdVonLCAkbVdpX1dKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6TXdSUXVaJywgJDA3bmswSl9VN1NfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnB1WicsICRWZFdKLCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6OU1SQVFSWmZhJywgJGVVNzBfV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KHFaSzo6aFJROXpfQXd3SzkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfZnVKX011Wl9VV1l0a1RUX0VrWVVfWldVT1Z5NyAoJFZlV3lKNzBfV0osJHRrU19PdnZ5V25PVnk3X1VXWXRfa1RUKXsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgV0osVVM3dl90T2k3IGhNS2wgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgTnpSTVIgVmVXeUo3MF9XSiA9ICRWZVd5SjcwX1dKIEFEWiBXSiBES1EgdUQoICR0a1NfT3Z2eVduT1Z5N19VV1l0X2tUVCApIik7CiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+MDdTZTB0OwogICAgfQoKICAgIFRldG5TV2t0IFk3U19OdWx3U09TZVVfZnVKX011Wl9VV1l0a1RUX0VrWVUoJFZXSiwgJFdpXzBXSikgewoKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBOelJNUiBVU09TZVUgV3QgKDgsQkIsOGcpIEFEWiBWZVd5SjcwX1dKID0gOmZ1WiBBRFogMDduazBKX1U3U19XSiA9IDpNUjlLTVp3UlF1WiBBRFogIFdKIHVEKHdSRVI5USBsQUMoV0opIGhNS2wgbWswNVR5a21fVVNPU2VVX1dpIG0zNzA3ICBVU09TZVUgV3QoOCxCQiw4ZykgQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaICBvTUtGcSBmYSBWZVd5SjcwX2RPeWU3X1dKICxuMDdPUzdKX1ZQIEtNWlJNIGZhIFdKIFpSdzkpIEtNWlJNIGZhIFdKIFpSdzkiLCBPMDBPUChxWks6OkFRUU1fOUZNd0tNID0+IHFaSzo6OUZNd0tNX2hOWktERWEpKTsKICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KE8wME9QKCc6ZnVaJyA9PiAkVldKLCAnOk1SOUtNWndSUXVaJyA9PiAkV2lfMFdKKSk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgCiAgICAvLyBUZXRuU1drdCBZN1NtazA1VHlrbURrU3FPMFNrVE5oKCRWV0opewogICAgICAgIC8vICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgT1VVV1l0X21UX3RrU192TzBTa1RfbVQgTnpSTVIgVldKID0gOmZ1WiBBRFogV1VfT1VVV1l0ID0gaiAiKTsKICAgICAgICAvLyAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpmdVonLCAkVldKLCBxWks6OnFBTUFsX3dRTSk7CiAgICBUZXRuU1drdCBZN1NtazA1VHlrbURrU3FPMFNrVE5oKCl7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBPVVVXWXRfbVRfdGtTX3ZPMFNrVF9tVCBOelJNUiBXVV9PVVVXWXQgPSA4ICIpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CgogICAgVGV0blNXa3QgRnZKT1M3bWswNVR5a21Ea1NxTzBTa1ROaCgkZE95ZTcpewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoImV2Sk9TNyBPVVVXWXRfbVRfdGtTX3ZPMFNrVF9tVCBVN1MgV1VfT1VVV1l0ID0gaiBtMzcwNyBXSiA9IDp1WiIpOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOnVaJywgJGRPeWU3LCBxWks6OnFBTUFsX3dRTSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgIH0KICAgIAogICAgVGV0blNXa3QgWjd5N1M3X21rMDVUeWttRGtTcU8wU2tUTmhfZnVKKCRWV0opewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIlpSRVJRUiBoTUtsIE9VVVdZdF9tVF90a1Nfdk8wU2tUX21UIE56Uk1SIFZlV3lKNzBfV0ogPSA6ZnVaIik7CiAgICAgICAgJFMzV1UtPlVTMy0+Vld0SnBPeWU3KCc6ZnVaJywgJFZXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgogICAgLy8gVVNPMFMgRlU3MCBWT1U3IG1rMDVUeWttIHJlNzBQIGtUIAoKICAgIFRldG5TV2t0IFk3U19OZmVXeUo3MF9mUE1reTdfRlU3MHVKKCQ3aXZfMGt5NywgJDBreTcsICRlV0osICR2V0osICRKN3ZTX1dKKSB7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRIG1KLldKIE9VIG1XaV9XSiwgbTAuV0ogT1UgMGt5N19XSiwgVi5XSiwgVi5tazA1VHlrbV9TV1N5NyBoTUtsIG1rMDVUeWttX1ZlV3lKNzAgQXcgViIKICAgICAgICAgICAgICAgIC4gIiBFUmhRIEtGUVJNIGJLdUQgbWswNVR5a21fVmVXeUo3MF9kT3llN1UgQXcgVmQgS0QgVmQuVmVXeUo3MF9XSiA9IFYuV0oiCiAgICAgICAgICAgICAgICAuICIgRVJoUSBLRlFSTSBiS3VEIG1rMDVUeWttX1dpIEF3IG1KIEtEIG1KLlZlV3lKNzBfV0ogPSBWLldKIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV8wa3k3VSBBdyBtMCBLRCBtMC5XSiA9IFZkLjBreTdfaU9VUzcwX1dKIgogICAgICAgICAgICAgICAgLiAiIEVSaFEgS0ZRUk0gYkt1RCBtazA1VHlrbV8wa3k3X2VVNzBVIEF3IG0wZSBLRCBtMGUubV8wa3k3X1dKID0gVmQuMGt5N19pT1VTNzBfV0oiCiAgICAgICAgICAgICAgICAuICIgTnpSTVIgVi5VU09TZVUgPSAnOCcgQURaIFYudjBrczduU19XSiA9ICckdldKJyBPdEogKG0wZS5lVTcwX1dKID0gJyRlV0onIEtNIG1KLko3dk8wU2k3dFNfV0ogPSAkSjd2U19XSikgb01LRnEgZmEgVi5XSiIpOwoKCgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygiOnFNS2JSOVF1WiIsICR2V0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpaUnFRdVoiLCAkSjd2U19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KCiAgICBUZXRuU1drdCBZN1NfTnVsd1NPU2VVX0VPUzdVU0ZmT1U3RlU3ME11WigkVldKLCAkV2lfMFdKLCAkZV9ZMGtldiwgJDBreTdfV0opIHsKCiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBtVWkgV3R0NzAgc2tXdCBtazA1VHlrbV8wa3k3X2VVNzBVIG0wZSBrdCBtVWkubjA3T1M3Sl9WUCA9IG0wZS5lVTcwX1dKIE56Uk1SIG1fMGt5N19XSiA9ICQwa3k3X1dKIE90SiBVU09TZVUgPD4gaiBBRFogZVU3MF9ZMGtldl9XSiA9IGogQURaIFZlV3lKNzBfV0ogPSAkVldKIEFEWiAwN25rMEpfVTdTX1dKID0gJFdpXzBXSiAiOwoKCiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VU09TZVVfV2kgbVVpIFd0dDcwIHNrV3QgbWswNVR5a21fMGt5N19lVTcwVSBtMGUga3QgbVVpLm4wN09TN0pfVlAgPSBtMGUuZVU3MF9XSiBOelJNUiBtXzBreTdfV0ogPSA6Tk1LRVJ1WiBPdEogVVNPU2VVIDw+IGogQURaIFZlV3lKNzBfV0ogPSA6ZnVaIEFEWiAwN25rMEpfVTdTX1dKID0gOk1SOUtNWndSUXVaIEtNWlJNIGZhIG1VaS5XSiBPVW4gRXVsdVEgODsgIik7CiAgICAgICAgLy83bjNrICJ3UkVSOVEgKiBoTUtsIG1rMDVUeWttX1VTT1NlVV9XaSBtVWkgV3R0NzAgc2tXdCBtazA1VHlrbV8wa3k3X2VVNzBVIG0wZSBrdCBtVWkubjA3T1M3Sl9WUCA9IG0wZS5lVTcwX1dKIE56Uk1SIG1fMGt5N19XSiA9ICQwa3k3X1dKIE90SiBVU09TZVUgPD4gaiBBRFogVmVXeUo3MF9XSiA9IDpmdVogQURaIDA3bmswSl9VN1NfV0ogPSAkV2lfMFdKIEtNWlJNIGZhIG1VaS5XSiBPVW4gRXVsdVEgOCI7CgogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOmZ1WicsICRWV0osIHFaSzo6cUFNQWxfd1FNKTsKICAgICAgICAvLyAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoJzpGb01LRnEnLCAkZV9ZMGtldiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk1SOUtNWndSUXVaJywgJFdpXzBXSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPlZXdEpwT3llNygnOk5NS0VSdVonLCAkMGt5N19XSiwgcVpLOjpxQU1BbF93UU0pOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkocVpLOjpoUlE5el9Bd3dLOSk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CiAgICAKICAgIAogICAgVGV0blNXa3QgbjM3bjVfbWswNVR5a21fVW4zN0pleTdKX2lPV3lVKCl7CiAgICAgICAgJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9VbjM3SmV5N0pfaU9XeVUgbTM3MDcgMDduazBKX1U3U19XSiA9ICRTM1dVLT4wN25rMEpfVTdTX1dKIEFEWiBWZVd5SjcwX1dKID0gJFMzV1UtPlZlV3lKNzBfV0ogQURaIE9fVmVXeUo3MF9kT3llN19XSiA9ICRTM1dVLT5PX1ZlV3lKNzBfZE95ZTdfV0ogQURaIE9fZVU3MF9XSiA9ICRTM1dVLT5PX2VVNzBfV0oiKTsKICAgICAgICAKCiAgICAgICAgCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eShxWks6OmhSUTl6X0F3d0s5KTsKICAgICAgICAkbnRTID0gbmtldFMoJFMzV1UtPjA3U2UwdCk7CiAgICAgICAgV1QoJG50UyA+IGopewogICAgICAgICAgICAwN1NlMHQgODsKICAgICAgICB9N3lVN3sKICAgICAgICAgICAgMDdTZTB0IGo7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFJ0SiBGVTcwIFZPVTcgbWswNVR5a20gcmU3MFAga1QgCiAgICAKICAgIFRldG5TV2t0IFk3U19ua3RVa3lXSk9TN19NN3ZrMFNfZlB3U09TZVUoKXsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG4wa3Rfbmt0VWt5V0pPUzcgTnpSTVIgV1VfbjBrdF8wZXQgPSBqIEFEWiBKa210eWtPSl9VU09TZVUgPSBqIik7CiAgICAgICAgCgogICAgICAgICAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICAgICAgJFMzV1UtPjA3U2UwdCA9ICRTM1dVLT5VUzMtPlQ3U24zQXl5KCk7CiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CiAgICAKICAgIFRldG5TV2t0IEZ2Sk9TN19ua3RVa3lXSk9TN19NN3ZrMFNfOTBrdF93U09TZVUoJGRPeWU3KXsKICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJGcVpBUVIgbjBrdF9ua3RVa3lXSk9TNyB3UlEgV1VfbjBrdF8wZXQ9OjlNS0Rfd1FBUUZ3LCBldkpPUzdfT1M9OkZxWkFRUlpBUSwgSmttdHlrT0pfVVNPU2VVID0gOCBOelJNUiBXSj06dVoiKTsKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjp1WiIsICRkT3llNywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjo5TUtEX3dRQVFGdyIsICRTM1dVLT5uMGt0X1VTT1NlVSwgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAkUzNXVS0+VVMzLT5WV3RKcE95ZTcoIjpGcVpBUVJaQVEiLCAkUzNXVS0+ZXZKT1M3Sl9PUywgcVpLOjpxQU1BbF93UU0pOwoKICAgICAgICAvLyRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAvL3YwV3RTXzAoJFMzV1UtPlVTMy0+NzAwazB1dFRrKCkpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CiAgICAKICAgICBUZXRuU1drdCBZN1NBeXlfbmt0VWt5V0pPUzdfTTd2azBTXzkwa3QoJDBreTcsICRuMDdPUzdKX1ZQLCAkVUVXaVdTLCAkVU4zNzA3KSB7CiAgICAgICAgJFVFV2lXUyA9IFVTMF8wN3Z5T243KE8wME9QKCJ5V2lXUyIsICJFdWx1USIsICJFV2lXUyIpLCAiIiwgJFVFV2lXUyk7CiAgICAgICAgJHlXaVdTZjdTbTc3dCA9IDdjdnlrSjcoIiwiLCBTMFdpKFVTMF8wN3Z5T243KCJ5V2lXUyIsICIiLCAkVUVXaVdTKSkpOwogICAgICAgICR0N21FV2lXUyA9ICR5V2lXU2Y3U203N3Q7CgkJJGVVNzBfV0ogPSAkX3dSd3d1S0Rbd1J3d3VLRF9wQU1fREFsUl1bJ2VVNzBfV0onXTsKCQkkMGt5NyA9ICRfd1J3d3VLRFt3Und3dUtEX3BBTV9EQWxSXVsnMGt5NyddOwoJCVdUKCQwa3k3ID09IDggfHwgJDBreTcgPT0gQil7CgkJCSRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbjBrdF9ua3RVa3lXSk9TNyBLTVpSTSBmYSBXSiBaUnc5ICIpOwoJCX03eVU3ewogICAgICAgICAgICAkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgKiBoTUtsIG4wa3Rfbmt0VWt5V0pPUzcgbTM3MDcgT0pKN0pfVlAgPSAkZVU3MF9XSiBLTVpSTSBmYSBXSiBaUnc5ICIpOwoJCX0KICAgICAgICAgICAgCgogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKCQkgCiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7CiAgICB9CiAgICAKICAgIFRldG5TV2t0IFk3U25rdFVreVdKT1M3X003dmswU19mUHVKKCRXSil7CiAgICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIndSRVI5USAqIGhNS2wgbjBrdF9ua3RVa3lXSk9TNyBtMzcwNyBXSiA9ICRXSiBLTVpSTSBmYSBXSiBaUnc5ICIpOwogICAgICAgICAgICAKCiAgICAgICAgJFMzV1UtPlVTMy0+N2M3bmVTNygpOwogICAgICAgICRTM1dVLT4wN1NlMHQgPSAkUzNXVS0+VVMzLT5UN1NuM0F5eSgpOwogICAgICAgICAKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKICAgIH0KICAgIAogICAgVGV0blNXa3QgSjd5N1M3X25rdFVreVdKT1M3X003dmswUygpewogICAgICAgICRTa0pPUCA9IEpPUzcoImEtaS1KIHo6VzpVIik7CiAgICAgICAgJEpPUFVfT1lrID0gSk9TNygnYS1pLUogejpXOlUnLCBVUzBTa1NXaTcoJy04IEpPUFUnLCBVUzBTa1NXaTcoJFNrSk9QKSkpOwogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyAgVDBraSBuMGt0X25rdFVreVdKT1M3IG0zNzA3ICBldkpPUzdfT1MgPCAnJEpPUFVfT1lrJyIpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CiAgICAKICAgIFRldG5TV2t0IEo3eTdTN19ua3RVa3lXSk9TN19NN3ZrMFNfZlB1WigkZE95ZTcpewogICAgICAgICRTM1dVLT5VUzMgPSAkUzNXVS0+SlYtPnYwN3ZPMDcoIko3eTdTNyBUMGtpIG4wa3Rfbmt0VWt5V0pPUzcgbTM3MDcgIFdKPSRkT3llNyIpOwogICAgICAgIDA3U2UwdCAkUzNXVS0+VVMzLT43YzduZVM3KCk7CiAgICB9CgkKCVRldG5TV2t0IFk3U05rMDVUeWttX3VsX2ZhTnVsdVooJG1XaV9XSil7CgkJJFMzV1UtPlVTMyA9ICRTM1dVLT5KVi0+djA3dk8wNygid1JFUjlRICogaE1LbCBtazA1VHlrbV9XaSBtMzcwNyBXSiBXdCgkbVdpX1dKKSIpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAgCiAgICAgICAgMDdTZTB0ICRTM1dVLT4wN1NlMHQ7Cgl9CgkKCVRldG5TV2t0IFk3U2VVNzBNa3k3dUpmUF9KN3ZTX1dKKCRKN3ZTX1dKKXsKCQkkUzNXVS0+VVMzID0gJFMzV1UtPkpWLT52MDd2TzA3KCJ3UkVSOVEgbTBlLldKLG0wZS5tXzBreTdfV0osbTBlLnYwa3M3blNfV0osbTBlLmVVNzBfV0osZS4wa3k3LG0wZS5KN3ZPMFNpN3RTX1dKLG0wZS5XVV9PVVVXWXQ3X1ZQIGhNS2wgbWswNVR5a21fMGt5N19lVTcwVSBtMGUgLHlrWVd0X2lPVVMgZSBOelJNUiBtMGUuSjd2TzBTaTd0U19XSiA9ICRKN3ZTX1dKIEFEWiBlLmVVNzBfV0ogPSBtMGUuZVU3MF9XSiIpOwogICAgICAgICRTM1dVLT5VUzMtPjdjN25lUzcoKTsKICAgICAgICAkUzNXVS0+MDdTZTB0ID0gJFMzV1UtPlVTMy0+VDdTbjNBeXkoKTsKICAgICAgICAwN1NlMHQgJFMzV1UtPjA3U2UwdDsKCX0KCiAgICAKCn0KCj8+';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnYkE4Y085ZGlLcHRtMUpFU3dJMlpMR2psc2FNeTNuQlg2VVlXbzdRZmhQZ0ZUazVyenhDdXFEZVJOdjRWSDAnLCdKQTF4YUN2bU9Wbnc4ZEx0U1E3RFo1ME1qWVJsaGMyejlzZ2lHZVRCRnk0VWZva3FIM1hJUE51RVdwS2I2cicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>
Function Calls
strtr | 1 |
strrev | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | 19fb2d345443ff30cf7a0dbc0aa1aeef |
Eval Count | 2 |
Decode Time | 1131 ms |