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='Pz48P0x3TApiRF9pak5KaigpOwp3OU4xOUooJ0YtWEpOUjktbExqY2Jz..

Decoded Output download

?><?php
ob_start();
header('X-Frame-Options: DENY');
if (!function_exists("__autoload")) {
    include("lib/app_top.php");
}
if (isset($_SESSION[SESSION_VAR_NAME]['user_id'])) {
    header("location: index.php");
    exit();
} else {
    $timestamp = time();
    $recreatedNonce1 = encrypt_url(rand() . $timestamp . session_id(), APP_ENCRYPTION_SALT);
    setcookie("REQUEST_ID", $recreatedNonce1, 0);
    $_SESSION[SESSION_VAR_NAME]['REQUEST_ID'] = $recreatedNonce1;
    if ($_SERVER["REMOTE_USER"] == "Administrator" || $_SERVER["REMOTE_USER"] == "administrator") {
        if (empty($app_db)) {

            header("location:dbselect.php");
            exit();
        }
    } else {
        if (empty($app_db)) {
            header("location:messagelogin.php");
            exit();
        }
    }
    $User = new user($db);
    $Global_Settings = new global_settings($db);
    $elogin = $Global_Settings->get_module_info_byId(19);
    $password_policy_details = $User->get_password_policy_details();
    $no_of_passwords = $password_policy_details[0]['no_of_passwords'];
    $number = $password_policy_details[0]['number'];
    $special_char = $password_policy_details[0]['special_char'];
    $small_char = $password_policy_details[0]['small_char'];
    $capital_char = $password_policy_details[0]['capital_char'];
    $max_length = $password_policy_details[0]['max_length'];
    $min_length = $password_policy_details[0]['min_length'];
    $no_of_days = $password_policy_details[0]['no_of_days'];

    $password_policy_constraints = get_password_policy_constraints($db);
    $password_regex = $password_policy_constraints['password_regex'];
    $password_error_msg = $password_policy_constraints['password_error_msg'];
    $app_db = $_SESSION['appdb'];
    ?>
    <!DOCTYPE HTML>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>dMACQ - DMS</title>
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta name="description" content="dMACQ">
            <meta name="author" content="Sri Krishnan">
            <!-- styles -->
            <link href="resources/css/bootstrap.css" rel="stylesheet">
            <link href="resources/css/jquery.gritter.css" rel="stylesheet">
            <link href="resources/css/bootstrap-responsive.css" rel="stylesheet">   
            <link rel="stylesheet" href="resources/css/font-awesome.css">
            <!--[if IE 7]>
            <link rel="stylesheet" href="resources/css/font-awesome-ie7.min.css">
            <![endif]-->
            <link href="resources/css/tablecloth.css" rel="stylesheet">
            <link href="resources/css/styles.css" rel="stylesheet">
            <!--[if IE 7]>
            <link rel="stylesheet" type="text/css" href="resources/css/ie/ie7.css" /
            <![endif]-->
            <!--[if IE 8]>
            <link rel="stylesheet" type="text/css" href="resources/css/ie/ie8.css" />
            <![endif]-->
            <!--[if IE 9]>
            <link rel="stylesheet" type="text/css" href="resources/css/ie/ie9.css" />
            <![endif]-->

            <!--fav and touch icons -->
            <link rel="shortcut icon" href="resources/ico/favicon.ico">
            <link rel="apple-touch-icon-precomposed" sizes="144x144" href="resources/ico/apple-touch-icon-144-precomposed.png">
            <link rel="apple-touch-icon-precomposed" sizes="114x114" href="resources/ico/apple-touch-icon-114-precomposed.png">
            <link rel="apple-touch-icon-precomposed" sizes="72x72" href="resources/ico/apple-touch-icon-72-precomposed.png">
            <link rel="apple-touch-icon-precomposed" href="resources/ico/apple-touch-icon-57-precomposed.png">
            <!--============ javascript ===========-->
            <script src="resources/js/jquery.js"></script>
            <script src="resources/js/jquery-ui-1.10.1.custom.min.js"></script>
            <script src="resources/js/bootstrap.js"></script>
            <script src="resources/js/jquery.sparkline.js"></script>
            <script src="resources/js/bootstrap-fileupload.js"></script>
            <script src="resources/js/jquery.metadata.js"></script>
            <script src="resources/js/jquery.tablesorter.min.js"></script>
            <script src="resources/js/jquery.tablecloth.js"></script>
            <script src="resources/js/jquery.flot.js"></script>
            <script src="resources/js/jquery.flot.selection.js"></script>
            <script src="resources/js/excanvas.js"></script>
            <script src="resources/js/jquery.flot.pie.js"></script>
            <script src="resources/js/jquery.flot.stack.js"></script>
            <script src="resources/js/jquery.flot.time.js"></script>
            <script src="resources/js/jquery.flot.tooltip.js"></script>
            <script src="resources/js/jquery.flot.resize.js"></script>
            <script src="resources/js/jquery.collapsible.js"></script>
            <script src="resources/js/accordion.nav.js"></script>
            <script src="resources/js/jquery.gritter.js"></script>
            <script src="resources/js/tiny_mce/jquery.tinymce.js"></script>
            <script src="resources/js/custom.js"></script>
            <script src="resources/js/respond.min.js"></script>
            <script src="resources/js/ios-orientationchange-fix.js"></script>

            <script src="resources/js/ajax_common_request.js"></script>
            <script type="text/javascript" src="resources/js/jquery.login.js"></script>
            <script src="resources/js/jquery.validate.js"></script>
            <script src="resources/js/bootbox.js"></script>

        </head>       
        <script nonce=<?php echo $_SESSION[SESSION_VAR_NAME]['usernonce']; ?>>
            $(document).ready(function () {
                $('#new_password').keypress(function (event) {
                    if (event.keyCode === 32) {
                        event.preventDefault();
                        alert("Spaces are not allowed.");
                    }
                });

                jQuery.validator.addMethod("password_for", function (value, element) {
                    return this.optional(element) || /(<?php echo $password_regex; ?>)/.test(value);// && /[\S]/g.test(value));
                }, "Password must contain at least " + "<?php echo $min_length ?>" + " characters and not more than " + "<?php echo $max_length ?>" + " characters." + "<?php echo $password_error_msg; ?>");
                $("#renew_form").validate({
                    ignore: ":hidden:not(select)",
                    rules: {
                        new_password: {
                            required: true,
                            password_for: true
                        },
                        confirm_password: {
                            required: true,
                            equalTo: "#new_password"
                        }
                    },
                    messages: {
                        new_password: {
                            required: "Please provide a password",
                        },
                        confirm_password: {
                            required: "Please provide a password",
                            equalTo: "Please enter the same password as above"
                        }
                    },
                    submitHandler: function (form) {
                        basic_form_submit_msg('login.php?renewed_id=' + $("#renewed_id").val(), '', 'renew_form');
                    }
                });

            });

        </script>
        <script>
            $(document).ready(function () {
                $("input").keyup(function () {
                    RemoveTheHTMLFromTextBox($(this));
                });
                $("input").blur(function () {
                    RemoveTheHTMLFromTextBox($(this));
                });
                function RemoveTheHTMLFromTextBox(obj) {

                    var inputValue = $(obj).val();
                    if ((inputValue.indexOf('<') > -1 || inputValue.indexOf(">") > -1)) {
                        $(obj).val($(obj).val().replace(/</g, "").replace(/>/g, ""));
                    }
                }
            }
            );
        </script>
    <!--        <script nonce=<?php echo $_SESSION[SESSION_VAR_NAME]['usernonce']; ?>>
                    /* NEW CODE BEGINS */

                    $(document).ready(function () {
                $(".btn-renew").click(function () {
                    if ($("#new-password").val() == "") {
                        alert("Password cannot be blank!");
                    } else if ($("#new-password").val() !== $("#confirm-password").val()) {
                        alert("Passwords do not match");
                    } else {
                        $("#renew_form").prop('action', 'login.php?renewed_id=' + $("#renewed_id").val());
                        $("#renew_form").submit();
                    }
                    //alert('sdfg');					
                    //$("#signin").submit();
                });
                //basic_form_submit(url, open_with, form_id)
            });
            /*NEW CODE ENDS */
        </script>-->
        <body>

            <div class="layout">
                <!-- Navbar================================================== -->
                <div class="navbar navbar-inverse top-nav">
                    <div class="navbar-inner">
                        <div class="container">
                            <a class="brand" href="index.php"><img src="resources/images/dmacq_logo_s.png" height="50" alt="dMACQ"></a>

                        </div>
                    </div>
                </div>
                <?php
                if (!empty($_POST)) {

                    $Login = new login($db);

                    $Login->setUsername($_POST['username']);
                    $usrnm = $_POST['username'];
                    //$Login->setPassword(md5($_POST['password']));
                    //$Login->setPassword(encrypt_pass($_POST['password'], APP_ENCRYPTION_SALT));
                    $login_details = $Login->validateLoginAttemptByUserName();

                    if ($login_details[0]['master_id'] != 0 || $login_details[0]['master_value_id'] != 0) {
                        $dash = true;
                    } else {
                        $dash = false;
                    }

                    $_SESSION[SESSION_VAR_NAME]['empdash'] = array('dash_flag' => $dash,
                        'role' => $login_details[0]['role'],
                        'emp_role' => $login_details[0]['emp_role'],
                        'master_id' => $login_details[0]['master_id'],
                        'master_value_id' => $login_details[0]['master_value_id']);

                    //$login_details = $Login->validateUser();IMP STATEMENT

                    /* NEW CODE BEGINS */
                    $todays_date = date("Y-m-d");
                    $today = date_create($todays_date);
                    $date1 = date_create($login_details[0]['renewed_at']);
                    $diff = date_diff($today, $date1, true);
                    $days_passed = $diff->format("%a");
                    $User = new user($db);
                    $password_policy_details = $User->get_password_policy_details();
                    $no_of_days = $password_policy_details[0]['no_of_days'];

//                    if ($days_passed >= $no_of_days) {
//                        header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
//                        die;
//                    }

                    /* NEW CODE ENDS */
                    $logattempt = 1;
                    $logattempt1 = 1;
                    $validateFlag = false;
                    if (count($login_details) > 0) {
                        $pwdStatus = 1;
                        if (password_verify($_POST['password'], $login_details[0]["password"])) {
                            $Login->setPassword($login_details[0]["password"]);
                            $validateFlag = true;
                            $loginInfo = $login_details;
                        }
                    }

                    $show_captcha = 0;
                    if ($loginInfo[0]['current_session_id'] == '') {
                        if ($_COOKIE["UNEC"] != 403) {
                            if ($login_details[0]['acct_locked_status'] != 1) {
                                if (count($login_details) <= 0 || count($loginInfo) <= 0) {
                                    if ($_COOKIE["CGALF"] != 1) {
                                        if ($login_details[0]['captcha_generate_after_loginFailed'] != 1) {
                                            if ($pwdStatus != 1) {
                                                // $logattempt = $logattempt + $loginInfo[0]['failed_login_count'];
                                                //$captcha_generate_after_loginFailed = $loginInfo[0]['captcha_generate_after_loginFailed'];
                                                $logattempt = $logattempt + $_COOKIE["VUN"];
                                                setcookie("VUN", $logattempt, 0, "/", "", false, TRUE);
                                                if ($logattempt > 3) {
                                                    $show_captcha = 1;
                                                    setcookie("VUN", 0, 0, "/", "", false, TRUE);
                                                    setcookie("CGALF", 1, 0, "/", "", false, TRUE);
                                                }
                                            } else {
                                                $logattempt = $logattempt + $login_details[0]['failed_login_count'];
                                                $captcha_generate_after_loginFailed = $login_details[0]['captcha_generate_after_loginFailed'];
                                                if ($logattempt > 3) {
                                                    $show_captcha = 1;
                                                    $Login->setCaptchaGenStatus();
                                                    $Login->setUserId($login_details[0]['id']);
                                                    $Login->resetFailedLogAttempt();
                                                }
                                            }
                                        }
                                    }

                                    if ($login_details[0]['captcha_generate_after_loginFailed'] == 1 || $_COOKIE["CGALF"] == 1) {
                                        $show_captcha = 1;
                                        if ($pwdStatus != 1) {
                                            $logattempt1 = $logattempt1 + $_COOKIE["VUN"];

                                            if ($logattempt1 > 9) {
                                                //Here UNEC stands for username expiry cookie used to block login for a few minutes.    
                                                setcookie("UNEC", 403, time() + 120, "/", "", false, TRUE);
                                            } else {

                                                setcookie("VUN", $logattempt1, 0, "/", "", false, TRUE);
                                            }
                                        } else {
                                            $logattempt1 = $logattempt1 + $login_details[0]['failed_login_count'];
                                            if ($logattempt1 > 9) {
                                                $Login->setUsrAcctLockedByUserName();
                                            } else {

                                                $Login->updateFailedLogAttempt($logattempt1);
                                            }
                                        }
                                    } else {

                                        $Login->updateFailedLogAttempt($logattempt);
                                    }
                                    if ($login_details[0]['user_status'] == 1) {
                                        ?>
                                        <div class="row-fluid">
                                            <div class="span12">
                                                <div class="alert alert-error">
                                                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                                                    <i class="icon-minus-sign"></i><strong>Error!</strong> Invalid username or password.
                                                </div>                          
                                            </div>
                                        </div>
                                        <?php
                                    } else {
                                        ?>
                                        <div class="row-fluid">
                                            <div class="span12">
                                                <div class="alert alert-error">
                                                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                                                    <i class="icon-minus-sign"></i><strong>Error!</strong> Inactive User.
                                                </div>                          
                                            </div>
                                        </div>
                                        <?php
                                    }
                                } elseif ((!$_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag'] && ($login_details[0]['named_flag'] == 1 || $login_details[0]['named_flag'] == 3)) || (!$_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag'] && ($login_details[0]['emp_named_flag'] == 1 || $login_details[0]['emp_named_flag'] == 3))) { //For Named user
                                    if (!empty($_REQUEST['captcha'])) {
                                        if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha']) {
                                            //$loginInfo = $Login->validateLoginAttempt();
                                            $logattempt = 1;
                                            $show_captcha = 1;

                                            // $login_details = $Login->validateUser();
                                            if (count($login_details) > 0 && $validateFlag) {
                                                $logattempt = $logattempt + $login_details[0]['failed_login_count'];
                                                if ($logattempt > 10) {
                                                    $Login->setUsrAcctLocked();
                                                } else {
                                                    $Login->updateFailedLogAttempt($logattempt);
                                                }
                                            }
                                        } else {
                                            session_regenerate_id(true);
                                            $current_session_id = session_id();
                                            $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];


                                            $organisation = new organization($db);
                                            $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);


                                            $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                            $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                            $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                            $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                            $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                            $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                            $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                            $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                            $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                            if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                                $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                            }
                                            $page_ctl = new page_access_ctl($db);
                                            $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                            $page_ctl->createPersistentObj();
                                            $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';

                                            $Login->setConCurr_LoginStatus();
                                            $Login->updateUserSessionId($current_session_id);

                                            $Login->setUserId($login_details[0]['id']);
                                            $Login->resetFailedLogAttempt();
                                            $Login->setLoginDatetime(DATE_TIME);
                                            $Login->setLogoutDatetime('');
                                            $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                            $Login->setRemarks('');
                                            $insert_login_log = $Login->insert_login_log();
                                            $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                            $Log = new log($db);
                                            $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                            $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                            $Log->setUserOrg($org_name[0]['org_name']);
                                            $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                            $Log->setMainModule("LogIn");
                                            $Log->setSubModule('--NONE--');
                                            $Log->setTrigger("Login");
                                            $Log->setTriggerProcess($log_msg);
                                            $Log->setLogDatetime(DATE_TIME);
                                            $addLog = $Log->addLogDetail();
                                            $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                            $dir = rand(11111, 9999999999);
                                            $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';


                                            $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                            ////Code ended
                                            $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                            ////Code ended
                                            $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                            $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                            $scan_dir = scandir($temp_dir);
                                            for ($j = 0; $j < count($scan_dir); $j++) {
                                                $exp_path = @explode("_", $scan_dir[$j]);

                                                if ($exp_path[0] == $current_user_id) {
                                                    $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                    chmod_r($temp_path, 0777, 0777);
                                                    if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                        exec("rd /s /q " . " " . $temp_path);
                                                    } else {
                                                        exec("sudo rm -rf " . " " . $temp_path . ' 2>error.txt');
                                                    }
                                                    rmdir($temp_path);
                                                }
                                            }
                                            if ($days_passed >= $no_of_days) {
                                                $Login->clearUserSession($login_details[0]['id']);
                                                session_id($current_session_id);
                                                session_start();
                                                session_destroy();
                                                session_commit();
                                                header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                                die;
                                            } else {
                                                header("Location: index.php");
                                            }
                                            echo "<script type=text/javascript src=\"resources/js/login_1.js\"></script>";
                                            exit;
                                        }
                                    } else {
                                        session_regenerate_id(true);
                                        $current_session_id = session_id();
                                        $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];

                                        setcookie("VUN", 0, 0, "/", "", false, TRUE);
                                        setcookie("CGALF", 0, 0, "/", "", false, TRUE);
                                        $organisation = new organization($db);


                                        $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);
                                        $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                        $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                        $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                        $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                        $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                        $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                        $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                        $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                        $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                        if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                            $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                        }
                                        $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';
                                        $page_ctl = new page_access_ctl($db);
                                        $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                        $page_ctl->createPersistentObj();
                                        ///Code to create user specific folder inside temp folder to facilitate user specific file uploading and management
                                        $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                        $dir = rand(11111, 9999999999);
                                        $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';

                                        $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                        ////Code ended
                                        $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                        ////Code ended
                                        $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                        $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                        $scan_dir = scandir($temp_dir);
                                        for ($j = 0; $j < count($scan_dir); $j++) {
                                            $exp_path = @explode("_", $scan_dir[$j]);

                                            if ($exp_path[0] == $current_user_id) {
                                                $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                chmod_r($temp_path, 0777, 0777);
                                                if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                    exec("rd /s /q " . " " . $temp_path);
                                                } else {
                                                    exec("sudo rm -rf " . " " . $temp_path . ' 2>error.txt');
                                                }
                                                rmdir($temp_path);
                                            }
                                        }

                                        $Login->setConCurr_LoginStatus();
                                        $Login->updateUserSessionId($current_session_id);

                                        $Login->setUserId($login_details[0]['id']);
                                        $Login->resetFailedLogAttempt();
                                        $Login->resetCaptchaGenStatus();
                                        $Login->setLoginDatetime(DATE_TIME);
                                        $Login->setLogoutDatetime('');
                                        $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                        $Login->setRemarks('');
                                        $insert_login_log = $Login->insert_login_log();
                                        $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                        $Log = new log($db);
                                        $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                        $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                        $Log->setUserOrg($org_name[0]['org_name']);
                                        $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                        $Log->setMainModule("LogIn");
                                        $Log->setSubModule('--NONE--');
                                        $Log->setTrigger("Login");
                                        $Log->setTriggerProcess($log_msg);
                                        $Log->setLogDatetime(DATE_TIME);
                                        $addLog = $Log->addLogDetail();
                                        if ($days_passed >= $no_of_days) {
                                            $Login->clearUserSession($login_details[0]['id']);
                                            session_id($current_session_id);
                                            session_start();
                                            session_destroy();
                                            session_commit();
                                            header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                            die;
                                        } else {
                                            header("Location: index.php");
                                        }

                                        echo "<script type=\"text/javascript\" src=\"resources/js/login_1.js\"></script>";
                                        exit;
                                    }
                                } else {

                                    if ($login_details[0]['id'] != 1) {


                                        $no_concurrent_user = 0;
                                        if ($login_details[0]['named_flag'] == 2) {//Concurrent Restricted
                                            $logged_count = $Login->currently_logged_in_count_byType_Not1SA(2);
                                            $no_concurrent_user = APP_NOOF_RES_USER;
                                        } else {//Concurrent Full
                                            $logged_count = $Login->currently_logged_in_count_byType_Not1SA(0);
                                            $no_concurrent_user = (APP_NOOF_USER);
                                        }
                                        if ($logged_count[0]['total'] >= $no_concurrent_user) {
                                            ?>
                                            <div class="row-fluid">
                                                <div class="span12">
                                                    <div class="alert alert-error">
                                                        <button type="button" class="close" data-dismiss="alert">&times;</button>
                                                        <i class="icon-minus-sign"></i><strong>Sorry!!</strong> Concurrent user limit exceeded
                                                    </div>                          
                                                </div>
                                            </div>
                                            <?php
                                        } else {

                                            if (!empty($_REQUEST['captcha'])) {
                                                if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha']) {
                                                    //$loginInfo = $Login->validateLoginAttempt();
                                                    $logattempt = 1;
                                                    $show_captcha = 1;

                                                    $Login->setPassword($login_details[0]["password"]);
                                                    // $login_details = $Login->validateUser();
                                                    if (count($login_details) > 0 && $validateFlag) {
                                                        $logattempt = $logattempt + $login_details[0]['failed_login_count'];
                                                        if ($logattempt > 10) {
                                                            $Login->setUsrAcctLocked();
                                                        } else {
                                                            $Login->updateFailedLogAttempt($logattempt);
                                                        }
                                                    }
                                                } else {
                                                    session_regenerate_id(true);
                                                    $current_session_id = session_id();
                                                    $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];

                                                    $organisation = new organization($db);
                                                    $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);
                                                    $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                                    $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                                    $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                                    $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                                    $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                                    $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                                    $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                                    $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                                    $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                                    if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                                        $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                                    }
                                                    $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';
                                                    $page_ctl = new page_access_ctl($db);
                                                    $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                                    $page_ctl->createPersistentObj();
                                                    $Login->setConCurr_LoginStatus();
                                                    $Login->updateUserSessionId($current_session_id);

                                                    $Login->setUserId($login_details[0]['id']);
                                                    $Login->resetFailedLogAttempt();
                                                    $Login->setLoginDatetime(DATE_TIME);
                                                    $Login->setLogoutDatetime('');
                                                    $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                                    $Login->setRemarks('');
                                                    $insert_login_log = $Login->insert_login_log();
                                                    $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                                    $Log = new log($db);
                                                    $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                                    $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                                    $Log->setUserOrg($org_name[0]['org_name']);
                                                    $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                                    $Log->setMainModule("LogIn");
                                                    $Log->setSubModule('--NONE--');
                                                    $Log->setTrigger("Login");
                                                    $Log->setTriggerProcess($log_msg);
                                                    $Log->setLogDatetime(DATE_TIME);
                                                    $addLog = $Log->addLogDetail();
                                                    $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                                    $dir = rand(11111, 9999999999);
                                                    $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';


                                                    $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                                    ////Code ended
                                                    $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                                    ////Code ended
                                                    $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                                    $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                                    $scan_dir = scandir($temp_dir);
                                                    for ($j = 0; $j < count($scan_dir); $j++) {
                                                        $exp_path = @explode("_", $scan_dir[$j]);

                                                        if ($exp_path[0] == $current_user_id) {
                                                            $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                            chmod_r($temp_path, 0777, 0777);
                                                            if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                                exec("rd /s /q " . " " . $temp_path);
                                                            } else {
                                                                exec("sudo rm -rf " . " " . $temp_path . ' 2>error.txt');
                                                            }
                                                            rmdir($temp_path);
                                                        }
                                                    }

                                                    if ($days_passed >= $no_of_days) {
                                                        $Login->clearUserSession($login_details[0]['id']);
                                                        session_id($current_session_id);
                                                        session_start();
                                                        session_destroy();
                                                        session_commit();
                                                        header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                                        die;
                                                    } else {
                                                        header("Location: index.php");
                                                    }
                                                    echo "<script type=text/javascript src=\"resources/js/login_1.js\"></script>";
                                                    exit;
                                                }
                                            } else {
//                                                echo 1;
                                                session_regenerate_id(true);
                                                $current_session_id = session_id();
                                                $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];

                                                setcookie("VUN", 0, 0, "/", "", false, TRUE);
                                                setcookie("CGALF", 0, 0, "/", "", false, TRUE);
                                                $organisation = new organization($db);
                                                $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);
                                                $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                                $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                                $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                                $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                                $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                                $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                                $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                                $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                                $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                                if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                                    $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                                }
                                                $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';
                                                $page_ctl = new page_access_ctl($db);
                                                $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                                $page_ctl->createPersistentObj();
                                                ///Code to create user specific folder inside temp folder to facilitate user specific file uploading and management
                                                $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                                $dir = rand(11111, 9999999999);
                                                $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';

                                                $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                                ////Code ended
                                                $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                                ////Code ended
                                                $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                                $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                                $scan_dir = scandir($temp_dir);
                                                for ($j = 0; $j < count($scan_dir); $j++) {
                                                    $exp_path = @explode("_", $scan_dir[$j]);

                                                    if ($exp_path[0] == $current_user_id) {
                                                        $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                        chmod_r($temp_path, 0777, 0777);
                                                        if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                            exec("rd /s /q " . " " . $temp_path);
                                                        } else {
                                                            exec("sudo rm -rf " . " " . $temp_path . ' 2>error.txt');
                                                        }
                                                        rmdir($temp_path);
                                                    }
                                                }

                                                $Login->setConCurr_LoginStatus();
                                                $Login->updateUserSessionId($current_session_id);

                                                $Login->setUserId($login_details[0]['id']);
                                                $Login->resetFailedLogAttempt();
                                                $Login->resetCaptchaGenStatus();
                                                $Login->setLoginDatetime(DATE_TIME);
                                                $Login->setLogoutDatetime('');
                                                $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                                $Login->setRemarks('');
                                                $insert_login_log = $Login->insert_login_log();
                                                $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                                $Log = new log($db);
                                                $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                                $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                                $Log->setUserOrg($org_name[0]['org_name']);
                                                $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                                $Log->setMainModule("LogIn");
                                                $Log->setSubModule('--NONE--');
                                                $Log->setTrigger("Login");
                                                $Log->setTriggerProcess($log_msg);
                                                $Log->setLogDatetime(DATE_TIME);
                                                $addLog = $Log->addLogDetail();

                                                if ($days_passed >= $no_of_days) {
                                                    $Login->clearUserSession($login_details[0]['id']);
                                                    session_id($current_session_id);
                                                    session_start();
                                                    session_destroy();
                                                    session_commit();
                                                    header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                                    die;
                                                } else {
                                                    header("Location: index.php");
                                                }

                                                echo "<script type=\"text/javascript\" src=\"resources/js/login_1.js\"></script>";
                                                exit;
                                            }
                                        }
                                    } else {


                                        if (!empty($_REQUEST['captcha'])) {
                                            if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha']) {
                                                //$loginInfo = $Login->validateLoginAttempt();
                                                $logattempt = 1;
                                                $show_captcha = 1;



                                                //$login_details = $Login->validateUser();
                                                if (count($login_details) > 0 && $validateFlag) {
                                                    $logattempt = $logattempt + $login_details[0]['failed_login_count'];
                                                    if ($logattempt > 10) {
                                                        $Login->setUsrAcctLocked();
                                                    } else {
                                                        $Login->updateFailedLogAttempt($logattempt);
                                                    }
                                                }
                                            } else {
                                                session_regenerate_id(true);
                                                $current_session_id = session_id();
                                                $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];

                                                $organisation = new organization($db);
                                                $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);
                                                $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                                $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                                $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                                $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                                $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                                $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                                $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                                $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                                $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                                if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                                    $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                                }
                                                $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';
                                                $page_ctl = new page_access_ctl($db);
                                                $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                                $page_ctl->createPersistentObj();
                                                $Login->setConCurr_LoginStatus();
                                                $Login->updateUserSessionId($current_session_id);

                                                $Login->setUserId($login_details[0]['id']);
                                                $Login->resetFailedLogAttempt();
                                                $Login->setLoginDatetime(DATE_TIME);
                                                $Login->setLogoutDatetime('');
                                                $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                                $Login->setRemarks('');
                                                $insert_login_log = $Login->insert_login_log();
                                                $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                                $Log = new log($db);
                                                $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                                $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                                $Log->setUserOrg($org_name[0]['org_name']);
                                                $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                                $Log->setMainModule("LogIn");
                                                $Log->setSubModule('--NONE--');
                                                $Log->setTrigger("Login");
                                                $Log->setTriggerProcess($log_msg);
                                                $Log->setLogDatetime(DATE_TIME);
                                                $addLog = $Log->addLogDetail();
                                                $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                                $dir = rand(11111, 9999999999);
                                                $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';

                                                $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                                ////Code ended
                                                $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                                ////Code ended
                                                $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                                $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                                $scan_dir = scandir($temp_dir);
                                                for ($j = 0; $j < count($scan_dir); $j++) {
                                                    $exp_path = @explode("_", $scan_dir[$j]);

                                                    if ($exp_path[0] == $current_user_id) {
                                                        $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                        chmod_r($temp_path, 0777, 0777);
                                                        if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                            exec("rd /s /q " . " " . $temp_path . ' 2>error.txt');
                                                        } else {
                                                            exec("sudo rm -rf " . " " . $temp_path);
                                                        }
                                                        rmdir($temp_path);
                                                    }
                                                }
                                                if ($days_passed >= $no_of_days) {
                                                    $Login->clearUserSession($login_details[0]['id']);
                                                    session_id($current_session_id);
                                                    session_start();
                                                    session_destroy();
                                                    session_commit();
                                                    header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                                    die;
                                                } else {
                                                    header("Location: index.php");
                                                }
                                                echo "<script type=text/javascript src=\"resources/js/login_1.js\"></script>";
                                                exit;
                                            }
                                        } else {

                                            session_regenerate_id(true);
                                            $current_session_id = session_id();
                                            $_SESSION['SESSION_VAR_NAME']['user_ip'] = $_SERVER['REMOTE_ADDR'];

                                            setcookie("VUN", 0, 0, "/", "", false, TRUE);
                                            setcookie("CGALF", 0, 0, "/", "", false, TRUE);
                                            $organisation = new organization($db);
                                            $org_name = $organisation->getOrganization_byId($login_details[0]['org_id']);
                                            $_SESSION[SESSION_VAR_NAME]['user_id'] = $login_details[0]['id'];
                                            $_SESSION[SESSION_VAR_NAME]['fname'] = $login_details[0]['fname'];
                                            $_SESSION[SESSION_VAR_NAME]['mname'] = $login_details[0]['mname'];
                                            $_SESSION[SESSION_VAR_NAME]['lname'] = $login_details[0]['lname'];
                                            $_SESSION[SESSION_VAR_NAME]['role'] = $login_details[0]['role'];
                                            $_SESSION[SESSION_VAR_NAME]['email'] = $login_details[0]['email'];
                                            $_SESSION[SESSION_VAR_NAME]['phone'] = $login_details[0]['phone'];
                                            $_SESSION[SESSION_VAR_NAME]['org_id'] = $login_details[0]['org_id'];
                                            $_SESSION[SESSION_VAR_NAME]['org'] = $org_name[0]['org_name'];
                                            if ($_SESSION[SESSION_VAR_NAME]['empdash']['dash_flag']) {
                                                $_SESSION[SESSION_VAR_NAME]['role'] = $_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'];
                                            }
                                            $page_ctl = new page_access_ctl($db);
                                            $page_ctl->setRoleId($_SESSION[SESSION_VAR_NAME]['role']);
                                            $page_ctl->createPersistentObj();
                                            $log_msg = $login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname'] . ':Logged In';

                                            ///Code to create user specific folder inside temp folder to facilitate user specific file uploading and management
                                            $current_user_id = $_SESSION[SESSION_VAR_NAME]['user_id'];
                                            $dir = rand(11111, 9999999999);
                                            $current_user_path = 'documents/tmp/' . $current_user_id . '_' . $dir . '/';


                                            $_SESSION[SESSION_VAR_NAME]['user_folder_path'] = $current_user_id . '_' . $dir . '/';

                                            ////Code ended
                                            $_SESSION[SESSION_VAR_NAME]['user_temp_number'] = $current_user_id . '_' . $dir;
                                            $_SESSION[SESSION_VAR_NAME]['ip_add'] = getenv("REMOTE_ADDR");
                                            $temp_dir = APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . "tmp";
                                            $scan_dir = scandir($temp_dir);
                                            for ($j = 0; $j < count($scan_dir); $j++) {
                                                $exp_path = @explode("_", $scan_dir[$j]);

                                                if ($exp_path[0] == $current_user_id) {
                                                    $temp_path = $temp_dir . DIRECTORY_SEPARATOR . $scan_dir[$j];
                                                    chmod_r($temp_path, 0777, 0777);
                                                    if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                                                        exec("rd /s /q " . " " . $temp_path);
                                                    } else {
                                                        exec("sudo rm -rf " . " " . $temp_path . ' 2>error.txt');
                                                    }
                                                    rmdir($temp_path);
                                                }
                                            }


                                            $Login->setConCurr_LoginStatus();
                                            $Login->updateUserSessionId($current_session_id);

                                            $Login->setUserId($login_details[0]['id']);
                                            $Login->resetFailedLogAttempt();
                                            $Login->resetCaptchaGenStatus();
                                            $Login->setLoginDatetime(DATE_TIME);
                                            $Login->setLogoutDatetime('');
                                            $Login->setLoginIp($_SERVER["REMOTE_ADDR"]);
                                            $Login->setRemarks('');
                                            $insert_login_log = $Login->insert_login_log();
                                            $_SESSION[SESSION_VAR_NAME]['login_log_id'] = $insert_login_log;

                                            $Log = new log($db);
                                            $Log->setUserName($login_details[0]['fname'] . " " . $login_details[0]['mname'] . " " . $login_details[0]['lname']);
                                            $Log->setUserEmail($_SESSION[SESSION_VAR_NAME]['email']);
                                            $Log->setUserOrg($org_name[0]['org_name']);
                                            $Log->setIpAddress($_SERVER["REMOTE_ADDR"]);
                                            $Log->setMainModule("LogIn");
                                            $Log->setSubModule('--NONE--');
                                            $Log->setTrigger("Login");
                                            $Log->setTriggerProcess($log_msg);
                                            $Log->setLogDatetime(DATE_TIME);
                                            $addLog = $Log->addLogDetail();
                                            if ($_REQUEST['emp_login'] == 1) {
                                                $_SESSION[SESSION_VAR_NAME]['elogin'] = $_REQUEST['emp_login'];
                                            }
                                            if ($days_passed >= $no_of_days) {
                                                $Login->clearUserSession($login_details[0]['id']);
                                                session_id($current_session_id);
                                                session_start();
                                                session_destroy();
                                                session_commit();
                                                header("Location:renew_password_form.php?un=" . encrypt_url($usrnm, APP_ENCRYPTION_SALT));
                                                die;
                                            } else {
                                                header("Location: index.php");
                                            }
                                            echo "<script type=\"text/javascript\" src=\"resources/js/login_1.js\"></script>";
                                            exit;
                                        }
                                    }
                                }
                            } else {
                                ?>
                                <div class="row-fluid">
                                    <div class="span12">
                                        <div class="alert alert-error">
                                            <button type="button" class="close" data-dismiss="alert">&times;</button>
                                            <i class="icon-minus-sign"></i><strong>Error!</strong>Your account has been locked.
                                        </div>                          
                                    </div>
                                </div>
                                <?php
                            }
                        } else {
                            ?>
                            <div class="row-fluid">
                                <div class="span12">
                                    <div class="alert alert-error">
                                        <button type="button" class="close" data-dismiss="alert">&times;</button>
                                        <i class="icon-minus-sign"></i><strong>Error!</strong> You tried too many times. Please try after some time.
                                    </div>                          
                                </div>
                            </div>
                            <?php
                        }
                    } else {
                        ?>
                        <div class="row-fluid">
                            <div class="span12">
                                <div class="alert alert-error">
                                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                                    <i class="icon-minus-sign"></i><strong>Sorry! - </strong>This account is already logged-in with another active session. 
                                    <a href="logout_alreadyLoggedUser.php">Click Here</a> to force log-out from all active session.
                                    <?php
                                    setcookie("uname", $loginInfo[0]['username'], 0);
                                    setcookie("key", $loginInfo[0]['password'], 0, '', '', false, true);
                                    setcookie("previd", $loginInfo[0]['current_session_id'], 0, '', '', false, true);
                                    ?>
                                </div>                          
                            </div>
                        </div>
                        <?php
                    }
                }
                ?>
                <div class="container">
                    <form class="form-signin-ribbon" id="signin" name="signin" method="POST" action="login.php">
                        <div class="content-widgets gray">
                            <div class=" login-head orange">

                                <?php
                                //echo '111'. decrypt_pass("$2y$10$BhTDxi0r45QtN0NbicwHCudebq6M/ZeUY5uQGFK58fZ7.iUg4xXoK", APP_ENCRYPTION_SALT);
                                ?>
                                <h3 class="form-signin-heading">Please sign in</h3>
                            </div>
                            <div class="long-ribbon">
                                <div class="ribbon-content">
                                    <div class="controls input-icon">
                                        <i class=" icon-user-md"></i>
                                        <input type="text" class="input-block-level" placeholder="Username" name="username" id="username" value="<?php
                                        if (!empty($_POST['username'])) {
                                            echo $_POST['username'];
                                        }
                                        ?>" autocomplete="off">
                                    </div>
                                    <div class="controls input-icon">
                                        <i class=" icon-key"></i><input type="password" class="input-block-level" placeholder="Password" name="password" id="password" autocomplete="off">
                                    </div>
                                    <?php
                                    if ($show_captcha == 1) {
                                        ?>
                                        <img src="captcha.php" id="captcha" /><br/>

                                        <!-- CHANGE TEXT LINK -->
                                        <a href="#" onclick="
                                                        document.getElementById('captcha').src = 'captcha.php?' + Math.random();
                                                        document.getElementById('captcha-form').focus();"
                                           id="change-image">Not readable? Change text.</a><br/>
                                        <input type="text" name="captcha" id="captcha-form" autocomplete="off"/><br/>
                                        <?php
                                    }
                                    ?>
                                    <!--                                    <label class="checkbox">
                                    
                                                                            <input type="checkbox" value="remember-me"> Remember me  </label>-->
                                    <button class="btn btn-inverse btn-block" type="submit">Sign in</button>
                                </div>
                            </div>
                            <div class="forgot-block">
                                <h4>Forgot your password ?</h4>
                                <p>
                                    <a href="forgot_password.php">Click here</a> to reset your password.
                                </p>
                                By signing in I agree to the <a href="license.php">license terms</a><br>

                            </div>
                        </div>
                    </form>
                </div>
            </div>

        </body>
    </html>
    <?php
}
?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1353562110='Pz48P0x3TApiRF9pak5KaigpOwp3OU4xOUooJ0YtWEpOUjktbExqY2JzaTogbnRZQycpOwpjZiAoIWZrc1BqY2JzXzlHY2lqaSgiX19Oa2piZ2JOMSIpKSB7CiAgICBjc1BnazE5KCJnY0QvTkxMX2piTC5Md0wiKTsKfQpjZiAoY2lpOWooJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2MxJ10pKSB7CiAgICB3OU4xOUooImdiUE5qY2JzOiBjczE5Ry5Md0wiKTsKICAgIDlHY2ooKTsKfSA5Z2k5IHsKICAgICRqY1I5aWpOUkwgPSBqY1I5KCk7CiAgICAkSjlQSjlOajkxWWJzUDlxID0gOXNQSmhMal9rSmcoSk5zMSgpIC4gJGpjUjlpak5STCAuIGk5aWljYnNfYzEoKSwgQWRkX3RZZW9DZEVTbFlfTUF5RSk7CiAgICBpOWpQYmJCYzkoIm90MDR0TUVfU24iLCAkSjlQSjlOajkxWWJzUDlxLCB1KTsKICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnb3QwNHRNRV9TbiddID0gJEo5UEo5Tmo5MVlic1A5cTsKICAgIGNmICgkX010b1Z0b1sib3Q1bEV0XzRNdG8iXSA9PSAiQTFSY3NjaWpKTmpiSiIgfHwgJF9NdG9WdG9bIm90NWxFdF80TXRvIl0gPT0gIk4xUmNzY2lqSk5qYkoiKSB7CiAgICAgICAgY2YgKDlSTGpoKCROTExfMUQpKSB7CgogICAgICAgICAgICB3OU4xOUooImdiUE5qY2JzOjFEaTlnOVBqLkx3TCIpOwogICAgICAgICAgICA5R2NqKCk7CiAgICAgICAgfQogICAgfSA5Z2k5IHsKICAgICAgICBjZiAoOVJMamgoJE5MTF8xRCkpIHsKICAgICAgICAgICAgdzlOMTlKKCJnYlBOamNiczpSOWlpTk85Z2JPY3MuTHdMIik7CiAgICAgICAgICAgIDlHY2ooKTsKICAgICAgICB9CiAgICB9CiAgICAkNGk5SiA9IHM5OCBraTlKKCQxRCk7CiAgICAkS2diRE5nX005ampjc09pID0gczk4IE9nYkROZ19pOWpqY3NPaSgkMUQpOwogICAgJDlnYk9jcyA9ICRLZ2JETmdfTTlqamNzT2ktPk85al9SYjFrZzlfY3NmYl9EaFMxKHFtKTsKICAgICRMTmlpOGJKMV9MYmdjUGhfMTlqTmNnaSA9ICQ0aTlKLT5POWpfTE5paThiSjFfTGJnY1BoXzE5ak5jZ2koKTsKICAgICRzYl9iZl9MTmlpOGJKMWkgPSAkTE5paThiSjFfTGJnY1BoXzE5ak5jZ2lbdV1bJ3NiX2JmX0xOaWk4YkoxaSddOwogICAgJHNrUkQ5SiA9ICRMTmlpOGJKMV9MYmdjUGhfMTlqTmNnaVt1XVsnc2tSRDlKJ107CiAgICAkaUw5UGNOZ19Qd05KID0gJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpW3VdWydpTDlQY05nX1B3TkonXTsKICAgICRpUk5nZ19Qd05KID0gJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpW3VdWydpUk5nZ19Qd05KJ107CiAgICAkUE5MY2pOZ19Qd05KID0gJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpW3VdWydQTkxjak5nX1B3TkonXTsKICAgICRSTkdfZzlzT2p3ID0gJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpW3VdWydSTkdfZzlzT2p3J107CiAgICAkUmNzX2c5c09qdyA9ICRMTmlpOGJKMV9MYmdjUGhfMTlqTmNnaVt1XVsnUmNzX2c5c09qdyddOwogICAgJHNiX2JmXzFOaGkgPSAkTE5paThiSjFfTGJnY1BoXzE5ak5jZ2lbdV1bJ3NiX2JmXzFOaGknXTsKCiAgICAkTE5paThiSjFfTGJnY1BoX1Bic2lqSk5jc2ppID0gTzlqX0xOaWk4YkoxX0xiZ2NQaF9QYnNpakpOY3NqaSgkMUQpOwogICAgJExOaWk4YkoxX0o5TzlHID0gJExOaWk4YkoxX0xiZ2NQaF9QYnNpakpOY3NqaVsnTE5paThiSjFfSjlPOUcnXTsKICAgICRMTmlpOGJKMV85SkpiSl9SaU8gPSAkTE5paThiSjFfTGJnY1BoX1Bic2lqSk5jc2ppWydMTmlpOGJKMV85SkpiSl9SaU8nXTsKICAgICROTExfMUQgPSAkX010TU1TbFlbJ05MTDFEJ107CiAgICA/PgogICAgPCFubGVFQ2R0IHhFNXk+CiAgICA8d2pSZyBnTnNPPSI5cyI+CiAgICAgICAgPHc5TjE+CiAgICAgICAgICAgIDxSOWpOIFB3TkppOWo9ImtqZi1XIj4KICAgICAgICAgICAgPGpjamc5PjE1QWUwIC0gbjVNPC9qY2pnOT4KICAgICAgICAgICAgPFI5ak4gc05SOT0iUWM5OExiSmoiIFBic2o5c2o9IjhjMWp3PTE5UWNQOS04YzFqdywgY3NjamNOZy1pUE5nOT1xLnUiPgogICAgICAgICAgICA8UjlqTiBzTlI5PSIxOWlQSmNMamNicyIgUGJzajlzaj0iMTVBZTAiPgogICAgICAgICAgICA8UjlqTiBzTlI5PSJOa2p3YkoiIFBic2o5c2o9Ik1KYyBVSmNpd3NOcyI+CiAgICAgICAgICAgIDwhLS0gaWpoZzlpIC0tPgogICAgICAgICAgICA8Z2NzQiB3SjlmPSJKOWlia0pQOWkvUGlpL0RiYmppakpOTC5QaWkiIEo5Zz0iaWpoZzlpdzk5aiI+CiAgICAgICAgICAgIDxnY3NCIHdKOWY9Iko5aWJrSlA5aS9QaWkvcDJrOUpoLk9KY2pqOUouUGlpIiBKOWc9ImlqaGc5aXc5OWoiPgogICAgICAgICAgICA8Z2NzQiB3SjlmPSJKOWlia0pQOWkvUGlpL0RiYmppakpOTC1KOWlMYnNpY1E5LlBpaSIgSjlnPSJpamhnOWl3OTlqIj4gICAKICAgICAgICAgICAgPGdjc0IgSjlnPSJpamhnOWl3OTlqIiB3SjlmPSJKOWlia0pQOWkvUGlpL2Zic2otTjg5aWJSOS5QaWkiPgogICAgICAgICAgICA8IS0tW2NmIFN0IHpdPgogICAgICAgICAgICA8Z2NzQiBKOWc9ImlqaGc5aXc5OWoiIHdKOWY9Iko5aWJrSlA5aS9QaWkvZmJzai1OODlpYlI5LWM5ei5SY3MuUGlpIj4KICAgICAgICAgICAgPCFbOXMxY2ZdLS0+CiAgICAgICAgICAgIDxnY3NCIHdKOWY9Iko5aWJrSlA5aS9QaWkvak5EZzlQZ2Jqdy5QaWkiIEo5Zz0iaWpoZzlpdzk5aiI+CiAgICAgICAgICAgIDxnY3NCIHdKOWY9Iko5aWJrSlA5aS9QaWkvaWpoZzlpLlBpaSIgSjlnPSJpamhnOWl3OTlqIj4KICAgICAgICAgICAgPCEtLVtjZiBTdCB6XT4KICAgICAgICAgICAgPGdjc0IgSjlnPSJpamhnOWl3OTlqIiBqaEw5PSJqOUdqL1BpaSIgd0o5Zj0iSjlpYmtKUDlpL1BpaS9jOS9jOXouUGlpIiAvCiAgICAgICAgICAgIDwhWzlzMWNmXS0tPgogICAgICAgICAgICA8IS0tW2NmIFN0IFddPgogICAgICAgICAgICA8Z2NzQiBKOWc9ImlqaGc5aXc5OWoiIGpoTDk9Imo5R2ovUGlpIiB3SjlmPSJKOWlia0pQOWkvUGlpL2M5L2M5Vy5QaWkiIC8+CiAgICAgICAgICAgIDwhWzlzMWNmXS0tPgogICAgICAgICAgICA8IS0tW2NmIFN0IG1dPgogICAgICAgICAgICA8Z2NzQiBKOWc9ImlqaGc5aXc5OWoiIGpoTDk9Imo5R2ovUGlpIiB3SjlmPSJKOWlia0pQOWkvUGlpL2M5L2M5bS5QaWkiIC8+CiAgICAgICAgICAgIDwhWzlzMWNmXS0tPgoKICAgICAgICAgICAgPCEtLWZOUSBOczEgamJrUHcgY1Bic2kgLS0+CiAgICAgICAgICAgIDxnY3NCIEo5Zz0iaXdiSmpQa2ogY1BicyIgd0o5Zj0iSjlpYmtKUDlpL2NQYi9mTlFjUGJzLmNQYiI+CiAgICAgICAgICAgIDxnY3NCIEo5Zz0iTkxMZzktamJrUHctY1Bicy1MSjlQYlJMYmk5MSIgaWNhOWk9InFISEdxSEgiIHdKOWY9Iko5aWJrSlA5aS9jUGIvTkxMZzktamJrUHctY1Bicy1xSEgtTEo5UGJSTGJpOTEuTHNPIj4KICAgICAgICAgICAgPGdjc0IgSjlnPSJOTExnOS1qYmtQdy1jUGJzLUxKOVBiUkxiaTkxIiBpY2E5aT0icXFIR3FxSCIgd0o5Zj0iSjlpYmtKUDlpL2NQYi9OTExnOS1qYmtQdy1jUGJzLXFxSC1MSjlQYlJMYmk5MS5Mc08iPgogICAgICAgICAgICA8Z2NzQiBKOWc9Ik5MTGc5LWpia1B3LWNQYnMtTEo5UGJSTGJpOTEiIGljYTlpPSJ6ckd6ciIgd0o5Zj0iSjlpYmtKUDlpL2NQYi9OTExnOS1qYmtQdy1jUGJzLXpyLUxKOVBiUkxiaTkxLkxzTyI+CiAgICAgICAgICAgIDxnY3NCIEo5Zz0iTkxMZzktamJrUHctY1Bicy1MSjlQYlJMYmk5MSIgd0o5Zj0iSjlpYmtKUDlpL2NQYi9OTExnOS1qYmtQdy1jUGJzLXZ6LUxKOVBiUkxiaTkxLkxzTyI+CiAgICAgICAgICAgIDwhLS09PT09PT09PT09PT0gcE5RTmlQSmNMaiA9PT09PT09PT09PS0tPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL3AyazlKaC5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLWtjLXEucXUucS5Qa2lqYlIuUmNzLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9EYmJqaWpKTkwucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL3AyazlKaC5pTE5KQmdjczkucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL0RiYmppakpOTC1mY2c5a0xnYk4xLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9wMms5SmguUjlqTjFOak4ucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL3AyazlKaC5qTkRnOWliSmo5Si5SY3MucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL3AyazlKaC5qTkRnOVBnYmp3LnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9wMms5SmguZmdiai5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmZnYmouaTlnOVBqY2JzLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS85R1BOc1FOaS5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmZnYmouTGM5LnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9wMms5SmguZmdiai5pak5QQi5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmZnYmouamNSOS5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmZnYmouamJiZ2pjTC5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmZnYmouSjlpY2E5LnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9wMms5SmguUGJnZ05MaWNEZzkucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL05QUGJKMWNicy5zTlEucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL3AyazlKaC5PSmNqajlKLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9qY3NoX1JQOS9wMms5SmguamNzaFJQOS5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvUGtpamJSLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9KOWlMYnMxLlJjcy5waSI+PC9pUEpjTGo+CiAgICAgICAgICAgIDxpUEpjTGogaUpQPSJKOWlia0pQOWkvcGkvY2JpLWJKYzlzak5qY2JzUHdOc085LWZjRy5waSI+PC9pUEpjTGo+CgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL05wTkdfUGJSUmJzX0o5Mms5aWoucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGpoTDk9Imo5R2ovcE5RTmlQSmNMaiIgaUpQPSJKOWlia0pQOWkvcGkvcDJrOUpoLmdiT2NzLnBpIj48L2lQSmNMaj4KICAgICAgICAgICAgPGlQSmNMaiBpSlA9Iko5aWJrSlA5aS9waS9wMms5SmguUU5nYzFOajkucGkiPjwvaVBKY0xqPgogICAgICAgICAgICA8aVBKY0xqIGlKUD0iSjlpYmtKUDlpL3BpL0RiYmpEYkcucGkiPjwvaVBKY0xqPgoKICAgICAgICA8L3c5TjE+ICAgICAgIAogICAgICAgIDxpUEpjTGogc2JzUDk9PD9Md0wgOVB3YiAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpzYnNQOSddOyA/Pj4KICAgICAgICAgICAgJCgxYlBrUjlzaikuSjlOMWgoZmtzUGpjYnMgKCkgewogICAgICAgICAgICAgICAgJCgnI3M5OF9MTmlpOGJKMScpLkI5aExKOWlpKGZrc1BqY2JzICg5UTlzaikgewogICAgICAgICAgICAgICAgICAgIGNmICg5UTlzai5COWhlYjE5ID09PSA3cikgewogICAgICAgICAgICAgICAgICAgICAgICA5UTlzai5MSjlROXNqbjlmTmtnaigpOwogICAgICAgICAgICAgICAgICAgICAgICBOZzlKaigiTUxOUDlpIE5KOSBzYmogTmdnYjg5MS4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBwMGs5SmguUU5nYzFOamJKLk4xMTU5andiMSgiTE5paThiSjFfZmJKIiwgZmtzUGpjYnMgKFFOZ2s5LCA5ZzlSOXNqKSB7CiAgICAgICAgICAgICAgICAgICAgSjlqa0pzIGp3Y2kuYkxqY2JzTmcoOWc5UjlzaikgfHwgLyg8P0x3TCA5UHdiICRMTmlpOGJKMV9KOU85RzsgPz4pLy5qOWlqKFFOZ2s5KTsvLyAmJiAvW1xNXS9PLmo5aWooUU5nazkpKTsKICAgICAgICAgICAgICAgIH0sICJkTmlpOGJKMSBSa2lqIFBic2pOY3MgTmogZzlOaWogIiArICI8P0x3TCA5UHdiICRSY3NfZzlzT2p3ID8+IiArICIgUHdOSk5QajlKaSBOczEgc2JqIFJiSjkgandOcyAiICsgIjw/THdMIDlQd2IgJFJOR19nOXNPancgPz4iICsgIiBQd05KTlBqOUppLiIgKyAiPD9Md0wgOVB3YiAkTE5paThiSjFfOUpKYkpfUmlPOyA/PiIpOwogICAgICAgICAgICAgICAgJCgiI0o5czk4X2ZiSlIiKS5RTmdjMU5qOSh7CiAgICAgICAgICAgICAgICAgICAgY09zYko5OiAiOndjMTE5czpzYmooaTlnOVBqKSIsCiAgICAgICAgICAgICAgICAgICAgSmtnOWk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgczk4X0xOaWk4YkoxOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKOTJrY0o5MTogakprOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOaWk4YkoxX2ZiSjogakprOQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBQYnNmY0pSX0xOaWk4YkoxOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKOTJrY0o5MTogakprOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkya05nRWI6ICIjczk4X0xOaWk4YkoxIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBSOWlpTk85aTogewogICAgICAgICAgICAgICAgICAgICAgICBzOThfTE5paThiSjE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEo5MmtjSjkxOiAiZGc5Tmk5IExKYlFjMTkgTiBMTmlpOGJKMSIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBic2ZjSlJfTE5paThiSjE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEo5MmtjSjkxOiAiZGc5Tmk5IExKYlFjMTkgTiBMTmlpOGJKMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MmtOZ0ViOiAiZGc5Tmk5IDlzajlKIGp3OSBpTlI5IExOaWk4YkoxIE5pIE5EYlE5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpa0RSY2p4TnMxZzlKOiBma3NQamNicyAoZmJKUikgewogICAgICAgICAgICAgICAgICAgICAgICBETmljUF9mYkpSX2lrRFJjal9SaU8oJ2diT2NzLkx3TD9KOXM5ODkxX2MxPScgKyAkKCIjSjlzOTg5MV9jMSIpLlFOZygpLCAnJywgJ0o5czk4X2ZiSlInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICA8L2lQSmNMaj4KICAgICAgICA8aVBKY0xqPgogICAgICAgICAgICAkKDFiUGtSOXNqKS5KOU4xaChma3NQamNicyAoKSB7CiAgICAgICAgICAgICAgICAkKCJjc0xraiIpLkI5aGtMKGZrc1BqY2JzICgpIHsKICAgICAgICAgICAgICAgICAgICBvOVJiUTlFdzl4RTV5WEpiUkU5R2pJYkcoJChqd2NpKSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICQoImNzTGtqIikuRGdrSihma3NQamNicyAoKSB7CiAgICAgICAgICAgICAgICAgICAgbzlSYlE5RXc5eEU1eVhKYlJFOUdqSWJHKCQoandjaSkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBma3NQamNicyBvOVJiUTlFdzl4RTV5WEpiUkU5R2pJYkcoYkRwKSB7CgogICAgICAgICAgICAgICAgICAgIFFOSiBjc0xralZOZ2s5ID0gJChiRHApLlFOZygpOwogICAgICAgICAgICAgICAgICAgIGNmICgoY3NMa2pWTmdrOS5jczE5R2xmKCc8JykgPiAtcSB8fCBjc0xralZOZ2s5LmNzMTlHbGYoIj4iKSA+IC1xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkKGJEcCkuUU5nKCQoYkRwKS5RTmcoKS5KOUxnTlA5KC88L08sICIiKS5KOUxnTlA5KC8+L08sICIiKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgPC9pUEpjTGo+CiAgICA8IS0tICAgICAgICA8aVBKY0xqIHNic1A5PTw/THdMIDlQd2IgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKc2JzUDknXTsgPz4+CiAgICAgICAgICAgICAgICAgICAgLyogWXRaIGVsbnQgSXRLU1lNICovCgogICAgICAgICAgICAgICAgICAgICQoMWJQa1I5c2opLko5TjFoKGZrc1BqY2JzICgpIHsKICAgICAgICAgICAgICAgICQoIi5EanMtSjlzOTgiKS5QZ2NQQihma3NQamNicyAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2YgKCQoIiNzOTgtTE5paThiSjEiKS5RTmcoKSA9PSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICBOZzlKaigiZE5paThiSjEgUE5zc2JqIEQ5IERnTnNCISIpOwogICAgICAgICAgICAgICAgICAgIH0gOWdpOSBjZiAoJCgiI3M5OC1MTmlpOGJKMSIpLlFOZygpICE9PSAkKCIjUGJzZmNKUi1MTmlpOGJKMSIpLlFOZygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5nOUpqKCJkTmlpOGJKMWkgMWIgc2JqIFJOalB3Iik7CiAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiI0o5czk4X2ZiSlIiKS5MSmJMKCdOUGpjYnMnLCAnZ2JPY3MuTHdMP0o5czk4OTFfYzE9JyArICQoIiNKOXM5ODkxX2MxIikuUU5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCIjSjlzOThfZmJKUiIpLmlrRFJjaigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL05nOUpqKCdpMWZPJyk7CQkJCQkKICAgICAgICAgICAgICAgICAgICAvLyQoIiNpY09zY3MiKS5pa0RSY2ooKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy9ETmljUF9mYkpSX2lrRFJjaihrSmcsIGJMOXNfOGNqdywgZmJKUl9jMSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qWXRaIGVsbnQgdFluTSAqLwogICAgICAgIDwvaVBKY0xqPi0tPgogICAgICAgIDxEYjFoPgoKICAgICAgICAgICAgPDFjUSBQZ05paT0iZ05oYmtqIj4KICAgICAgICAgICAgICAgIDwhLS0gWU5RRE5KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJzTlFETkogc05RRE5KLWNzUTlKaTkgamJMLXNOUSI+CiAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0ic05RRE5KLWNzczlKIj4KICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iUGJzak5jczlKIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxOIFBnTmlpPSJESk5zMSIgd0o5Zj0iY3MxOUcuTHdMIj48Y1JPIGlKUD0iSjlpYmtKUDlpL2NSTk85aS8xUk5QMl9nYk9iX2kuTHNPIiB3OWNPd2o9InZ1IiBOZ2o9IjE1QWUwIj48L04+CgogICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgPD9Md0wKICAgICAgICAgICAgICAgIGNmICghOVJMamgoJF9kbE1FKSkgewoKICAgICAgICAgICAgICAgICAgICAkeWJPY3MgPSBzOTggZ2JPY3MoJDFEKTsKCiAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWo0aTlKc05SOSgkX2RsTUVbJ2tpOUpzTlI5J10pOwogICAgICAgICAgICAgICAgICAgICRraUpzUiA9ICRfZGxNRVsna2k5SnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAvLyR5Yk9jcy0+aTlqZE5paThiSjEoUjF2KCRfZGxNRVsnTE5paThiSjEnXSkpOwogICAgICAgICAgICAgICAgICAgIC8vJHliT2NzLT5pOWpkTmlpOGJKMSg5c1BKaExqX0xOaWkoJF9kbE1FWydMTmlpOGJKMSddLCBBZGRfdFllb0NkRVNsWV9NQXlFKSk7CiAgICAgICAgICAgICAgICAgICAgJGdiT2NzXzE5ak5jZ2kgPSAkeWJPY3MtPlFOZ2MxTmo5eWJPY3NBamo5UkxqSWg0aTlKWU5SOSgpOwoKICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT2NzXzE5ak5jZ2lbdV1bJ1JOaWo5Sl9jMSddICE9IHUgfHwgJGdiT2NzXzE5ak5jZ2lbdV1bJ1JOaWo5Sl9RTmdrOV9jMSddICE9IHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJDFOaXcgPSBqSms5OwogICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQxTml3ID0gZk5naTk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXSA9IE5KSk5oKCcxTml3X2ZnTk8nID0+ICQxTml3LAogICAgICAgICAgICAgICAgICAgICAgICAnSmJnOScgPT4gJGdiT2NzXzE5ak5jZ2lbdV1bJ0piZzknXSwKICAgICAgICAgICAgICAgICAgICAgICAgJzlSTF9KYmc5JyA9PiAkZ2JPY3NfMTlqTmNnaVt1XVsnOVJMX0piZzknXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ1JOaWo5Sl9jMScgPT4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JOaWo5Sl9jMSddLAogICAgICAgICAgICAgICAgICAgICAgICAnUk5pajlKX1FOZ2s5X2MxJyA9PiAkZ2JPY3NfMTlqTmNnaVt1XVsnUk5pajlKX1FOZ2s5X2MxJ10pOwoKICAgICAgICAgICAgICAgICAgICAvLyRnYk9jc18xOWpOY2dpID0gJHliT2NzLT5RTmdjMU5qOTRpOUooKTtTNWQgTUVBRXQ1dFlFCgogICAgICAgICAgICAgICAgICAgIC8qIFl0WiBlbG50IEl0S1NZTSAqLwogICAgICAgICAgICAgICAgICAgICRqYjFOaGlfMU5qOSA9IDFOajkoIkMtUi0xIik7CiAgICAgICAgICAgICAgICAgICAgJGpiMU5oID0gMU5qOV9QSjlOajkoJGpiMU5oaV8xTmo5KTsKICAgICAgICAgICAgICAgICAgICAkMU5qOXEgPSAxTmo5X1BKOU5qOSgkZ2JPY3NfMTlqTmNnaVt1XVsnSjlzOTg5MV9OaiddKTsKICAgICAgICAgICAgICAgICAgICAkMWNmZiA9IDFOajlfMWNmZigkamIxTmgsICQxTmo5cSwgakprOSk7CiAgICAgICAgICAgICAgICAgICAgJDFOaGlfTE5paTkxID0gJDFjZmYtPmZiSlJOaigiJU4iKTsKICAgICAgICAgICAgICAgICAgICAkNGk5SiA9IHM5OCBraTlKKCQxRCk7CiAgICAgICAgICAgICAgICAgICAgJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpID0gJDRpOUotPk85al9MTmlpOGJKMV9MYmdjUGhfMTlqTmNnaSgpOwogICAgICAgICAgICAgICAgICAgICRzYl9iZl8xTmhpID0gJExOaWk4YkoxX0xiZ2NQaF8xOWpOY2dpW3VdWydzYl9iZl8xTmhpJ107CgovLyAgICAgICAgICAgICAgICAgICAgY2YgKCQxTmhpX0xOaWk5MSA+PSAkc2JfYmZfMU5oaSkgewovLyAgICAgICAgICAgICAgICAgICAgICAgIHc5TjE5SigieWJQTmpjYnM6SjlzOThfTE5paThiSjFfZmJKUi5Md0w/a3M9IiAuIDlzUEpoTGpfa0pnKCRraUpzUiwgQWRkX3RZZW9DZEVTbFlfTUF5RSkpOwovLyAgICAgICAgICAgICAgICAgICAgICAgIDFjOTsKLy8gICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyogWXRaIGVsbnQgdFluTSAqLwogICAgICAgICAgICAgICAgICAgICRnYk9Oamo5UkxqID0gcTsKICAgICAgICAgICAgICAgICAgICAkZ2JPTmpqOVJManEgPSBxOwogICAgICAgICAgICAgICAgICAgICRRTmdjMU5qOVhnTk8gPSBmTmdpOTsKICAgICAgICAgICAgICAgICAgICBjZiAoUGJrc2ooJGdiT2NzXzE5ak5jZ2kpID4gdSkgewogICAgICAgICAgICAgICAgICAgICAgICAkTDgxTWpOamtpID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgY2YgKExOaWk4YkoxX1E5SmNmaCgkX2RsTUVbJ0xOaWk4YkoxJ10sICRnYk9jc18xOWpOY2dpW3VdWyJMTmlpOGJKMSJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWpkTmlpOGJKMSgkZ2JPY3NfMTlqTmNnaVt1XVsiTE5paThiSjEiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUU5nYzFOajlYZ05PID0gakprOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9jc1NzZmIgPSAkZ2JPY3NfMTlqTmNnaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGl3YjhfUE5MalB3TiA9IHU7CiAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9jc1NzZmJbdV1bJ1BrSko5c2pfaTlpaWNic19jMSddID09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkX2VsbFVTdFsiNFl0ZSJdICE9IEh1NykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9jc18xOWpOY2dpW3VdWydOUFBqX2diUEI5MV9pak5qa2knXSAhPSBxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKFBia3NqKCRnYk9jc18xOWpOY2dpKSA8PSB1IHx8IFBia3NqKCRnYk9jc1NzZmIpIDw9IHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRfZWxsVVN0WyJlS0F5WCJdICE9IHEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkZ2JPY3NfMTlqTmNnaVt1XVsnUE5MalB3Tl9POXM5Sk5qOV9OZmo5Sl9nYk9jc1hOY2c5MSddICE9IHEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJEw4MU1qTmpraSAhPSBxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICRnYk9Oamo5UkxqID0gJGdiT05qajlSTGogKyAkZ2JPY3NTc2ZiW3VdWydmTmNnOTFfZ2JPY3NfUGJrc2onXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kUE5MalB3Tl9POXM5Sk5qOV9OZmo5Sl9nYk9jc1hOY2c5MSA9ICRnYk9jc1NzZmJbdV1bJ1BOTGpQd05fTzlzOUpOajlfTmZqOUpfZ2JPY3NYTmNnOTEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdiT05qajlSTGogPSAkZ2JPTmpqOVJMaiArICRfZWxsVVN0WyJWNFkiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlqUGJiQmM5KCJWNFkiLCAkZ2JPTmpqOVJMaiwgdSwgIi8iLCAiIiwgZk5naTksIEVvNHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT05qajlSTGogPiA3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXdiOF9QTkxqUHdOID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiVjRZIiwgdSwgdSwgIi8iLCAiIiwgZk5naTksIEVvNHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlqUGJiQmM5KCJlS0F5WCIsIHEsIHUsICIvIiwgIiIsIGZOZ2k5LCBFbzR0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9Oamo5UkxqID0gJGdiT05qajlSTGogKyAkZ2JPY3NfMTlqTmNnaVt1XVsnZk5jZzkxX2diT2NzX1Bia3NqJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQTkxqUHdOX085czlKTmo5X05majlKX2diT2NzWE5jZzkxID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ1BOTGpQd05fTzlzOUpOajlfTmZqOUpfZ2JPY3NYTmNnOTEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9Oamo5UkxqID4gNykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl3YjhfUE5MalB3TiA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5amVOTGpQd05LOXNNak5qa2koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqNGk5SlMxKCRnYk9jc18xOWpOY2dpW3VdWydjMSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+SjlpOWpYTmNnOTF5Yk9Bamo5UkxqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkZ2JPY3NfMTlqTmNnaVt1XVsnUE5MalB3Tl9POXM5Sk5qOV9OZmo5Sl9nYk9jc1hOY2c5MSddID09IHEgfHwgJF9lbGxVU3RbImVLQXlYIl0gPT0gcSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl3YjhfUE5MalB3TiA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJEw4MU1qTmpraSAhPSBxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdiT05qajlSTGpxID0gJGdiT05qajlSTGpxICsgJF9lbGxVU3RbIlY0WSJdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT05qajlSTGpxID4gbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3g5SjkgNFl0ZSBpak5zMWkgZmJKIGtpOUpzTlI5IDlHTGNKaCBQYmJCYzkga2k5MSBqYiBEZ2JQQiBnYk9jcyBmYkogTiBmOTggUmNza2o5aS4gICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiNFl0ZSIsIEh1NywgamNSOSgpICsgcXJ1LCAiLyIsICIiLCBmTmdpOSwgRW80dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiVjRZIiwgJGdiT05qajlSTGpxLCB1LCAiLyIsICIiLCBmTmdpOSwgRW80dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPTmpqOVJManEgPSAkZ2JPTmpqOVJManEgKyAkZ2JPY3NfMTlqTmNnaVt1XVsnZk5jZzkxX2diT2NzX1Bia3NqJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9Oamo5UkxqcSA+IG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWo0aUpBUFBqeWJQQjkxSWg0aTlKWU5SOSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmtMMU5qOVhOY2c5MXliT0FqajlSTGooJGdiT05qajlSTGpxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5rTDFOajlYTmNnOTF5Yk9Bamo5UkxqKCRnYk9Oamo5UkxqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT2NzXzE5ak5jZ2lbdV1bJ2tpOUpfaWpOamtpJ10gPT0gcSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9IkpiOC1mZ2tjMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iaUxOc3FyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iTmc5SmogTmc5SmotOUpKYkoiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERrampicyBqaEw5PSJEa2pqYnMiIFBnTmlpPSJQZ2JpOSIgMU5qTi0xY2lSY2lpPSJOZzlKaiI+JmpjUjlpOzwvRGtqamJzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGMgUGdOaWk9ImNQYnMtUmNza2ktaWNPcyI+PC9jPjxpakpic08+dEpKYkohPC9pakpic08+IFNzUU5nYzEga2k5SnNOUjkgYkogTE5paThiSjEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/THdMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iSmI4LWZna2MxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJpTE5zcXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJOZzlKaiBOZzlKai05SkpiSiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGtqamJzIGpoTDk9IkRrampicyIgUGdOaWk9IlBnYmk5IiAxTmpOLTFjaVJjaWk9Ik5nOUpqIj4mamNSOWk7PC9Ea2pqYnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YyBQZ05paT0iY1Bicy1SY3NraS1pY09zIj48L2M+PGlqSmJzTz50SkpiSiE8L2lqSmJzTz4gU3NOUGpjUTkgNGk5Si4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9Md0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOWNmICgoISRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJMMU5pdyddWycxTml3X2ZnTk8nXSAmJiAoJGdiT2NzXzE5ak5jZ2lbdV1bJ3NOUjkxX2ZnTk8nXSA9PSBxIHx8ICRnYk9jc18xOWpOY2dpW3VdWydzTlI5MV9mZ05PJ10gPT0gNykpIHx8ICghJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWyc5UkwxTml3J11bJzFOaXdfZmdOTyddICYmICgkZ2JPY3NfMTlqTmNnaVt1XVsnOVJMX3NOUjkxX2ZnTk8nXSA9PSBxIHx8ICRnYk9jc18xOWpOY2dpW3VdWyc5Ukxfc05SOTFfZmdOTyddID09IDcpKSkgeyAvL1hiSiBZTlI5MSBraTlKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICghOVJMamgoJF9vdDA0dE1FWydQTkxqUHdOJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoOVJMamgoJF9NdE1NU2xZWydQTkxqUHdOJ10pIHx8IGpKY1IoaWpKamJnYjg5SigkX290MDR0TUVbJ1BOTGpQd04nXSkpICE9ICRfTXRNTVNsWVsnUE5MalB3TiddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kZ2JPY3NTc2ZiID0gJHliT2NzLT5RTmdjMU5qOXliT2NzQWpqOVJMaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9Oamo5UkxqID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXdiOF9QTkxqUHdOID0gcTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJGdiT2NzXzE5ak5jZ2kgPSAkeWJPY3MtPlFOZ2MxTmo5NGk5SigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChQYmtzaigkZ2JPY3NfMTlqTmNnaSkgPiB1ICYmICRRTmdjMU5qOVhnTk8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdiT05qajlSTGogPSAkZ2JPTmpqOVJMaiArICRnYk9jc18xOWpOY2dpW3VdWydmTmNnOTFfZ2JPY3NfUGJrc2onXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9Oamo5UkxqID4gcXUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqNGlKQVBQanliUEI5MSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5rTDFOajlYTmNnOTF5Yk9Bamo5UkxqKCRnYk9Oamo5UkxqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19KOU85czlKTmo5X2MxKGpKazkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2k5aWljYnNfYzEgPSBpOWlpY2JzX2MxKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZWydNdE1NU2xZX1ZBb19ZQTV0J11bJ2tpOUpfY0wnXSA9ICRfTXRvVnRvWydvdDVsRXRfQW5ubyddOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKT05zY2lOamNicyA9IHM5OCBiSk9Oc2NhTmpjYnMoJDFEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPX3NOUjkgPSAkYkpPTnNjaU5qY2JzLT5POWpsSk9Oc2NhTmpjYnNfRGhTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYkpPX2MxJ10pOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2MxJ10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2ZzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ1JzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2dzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydKYmc5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWyc5Uk5jZyddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJzlSTmNnJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydMd2JzOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ0x3YnM5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk9fYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2JKTyddID0gJGJKT19zTlI5W3VdWydiSk9fc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnMU5pd19mZ05PJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10gPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnOVJMX0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnID0gczk4IExOTzlfTlBQOWlpX1BqZygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMTk85X1BqZy0+aTlqb2JnOVMxKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnSmJnOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPlBKOU5qOWQ5SmljaWo5c2psRHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPX1JpTyA9ICRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSAuICc6eWJPTzkxIFNzJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWplYnNla0pKX3liT2NzTWpOamtpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5rTDFOajk0aTlKTTlpaWNic1MxKCRQa0pKOXNqX2k5aWljYnNfYzEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5ajRpOUpTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5KOWk5alhOY2c5MXliT0FqajlSTGooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Nzbk5qOWpjUjkobkFFdF9FUzV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Jram5OajlqY1I5KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2NzU0woJF9NdG9WdG9bIm90NWxFdF9Bbm5vIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqbzlSTkpCaSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNzaTlKal9nYk9jc19nYk8gPSAkeWJPY3MtPmNzaTlKal9nYk9jc19nYk8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2diT2NzX2diT19jMSddID0gJGNzaTlKal9nYk9jc19nYk87CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8gPSBzOTggZ2JPKCQxRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SllOUjkoJGdiT2NzXzE5ak5jZ2lbdV1bJ2ZzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo0aTlKdFJOY2coJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWyc5Uk5jZyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo0aTlKbEpPKCRiSk9fc05SOVt1XVsnYkpPX3NOUjknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqU0xBMTFKOWlpKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo1TmNzNWIxa2c5KCJ5Yk9TcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ak1rRDViMWtnOSgnLS1ZbFl0LS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKKCJ5Yk9jcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5akVKY09POUpkSmJQOWlpKCRnYk9fUmlPKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWp5Yk9uTmo5amNSOShuQUV0X0VTNXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROMTF5Yk8gPSAkeWJPLT5OMTF5Yk9uOWpOY2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGtKSjlzal9raTlKX2MxID0gJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2MxJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDFjSiA9IEpOczEocXFxcXEsIG1tbW1tbW1tbW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfTE5qdyA9ICcxYlBrUjlzamkvalJMLycgLiAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSiAuICcvJzsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsna2k5Sl9mYmcxOUpfTE5qdyddID0gJFBrSko5c2pfa2k5Sl9jMSAuICdfJyAuICQxY0ogLiAnLyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy9lYjE5IDlzMTkxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2o5Ukxfc2tSRDlKJ10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vZWIxOSA5czE5MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnY0xfTjExJ10gPSBPOWo5c1EoIm90NWxFdF9Bbm5vIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfMWNKID0gQWRkX250WEE0eUVfNGR5bEFuX25TbyAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAialJMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVBOc18xY0ogPSBpUE5zMWNKKCRqOVJMXzFjSik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJKICgkcCA9IHU7ICRwIDwgUGJrc2ooJGlQTnNfMWNKKTsgJHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUdMX0xOancgPSBAOUdMZ2IxOSgiXyIsICRpUE5zXzFjSlskcF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQ5R0xfTE5qd1t1XSA9PSAkUGtKSjlzal9raTlKX2MxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkajlSTF9MTmp3ID0gJGo5UkxfMWNKIC4gblNvdGVFbG9DX010ZEFvQUVsbyAuICRpUE5zXzFjSlskcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQd1JiMV9KKCRqOVJMX0xOancsIHV6enosIHV6enopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKGR4ZF9sTSA9PSAiWmNzMWI4aSIgfHwgZHhkX2xNID09ICJaU1lZRSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5RzlQKCJKMSAvaSAvMiAiIC4gIiAiIC4gJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHOVAoImlrMWIgSlIgLUpmICIgLiAiICIgLiAkajlSTF9MTmp3IC4gJyByPjlKSmJKLmpHaicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlIxY0ooJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQxTmhpX0xOaWk5MSA+PSAkc2JfYmZfMU5oaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPlBnOU5KNGk5Sk05aWljYnMoJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2MxKCRQa0pKOXNqX2k5aWljYnNfYzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2lqTkpqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfMTlpakpiaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX1BiUlJjaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOko5czk4X0xOaWk4YkoxX2ZiSlIuTHdMP2tzPSIgLiA5c1BKaExqX2tKZygka2lKc1IsIEFkZF90WWVvQ2RFU2xZX01BeUUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc5TjE5SigieWJQTmpjYnM6IGNzMTlHLkx3TCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5UHdiICI8aVBKY0xqIGpoTDk9ajlHai9wTlFOaVBKY0xqIGlKUD1cIko5aWJrSlA5aS9waS9nYk9jc19xLnBpXCI+PC9pUEpjTGo+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5R2NqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19KOU85czlKTmo5X2MxKGpKazkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBrSko5c2pfaTlpaWNic19jMSA9IGk5aWljYnNfYzEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVsnTXRNTVNsWV9WQW9fWUE1dCddWydraTlKX2NMJ10gPSAkX010b1Z0b1snb3Q1bEV0X0Fubm8nXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWpQYmJCYzkoIlY0WSIsIHUsIHUsICIvIiwgIiIsIGZOZ2k5LCBFbzR0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiZUtBeVgiLCB1LCB1LCAiLyIsICIiLCBmTmdpOSwgRW80dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPTnNjaU5qY2JzID0gczk4IGJKT05zY2FOamNicygkMUQpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPX3NOUjkgPSAkYkpPTnNjaU5qY2JzLT5POWpsSk9Oc2NhTmpjYnNfRGhTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYkpPX2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2MxJ10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnZnNOUjknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydSc05SOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2dzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnSmJnOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSA9ICRnYk9jc18xOWpOY2dpW3VdWyc5Uk5jZyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydMd2JzOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ0x3YnM5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2JKT19jMSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ2JKT19jMSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk8nXSA9ICRiSk9fc05SOVt1XVsnYkpPX3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnMU5pd19mZ05PJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJMMU5pdyddWyc5UkxfSmJnOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdiT19SaU8gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydSc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ2dzTlI5J10gLiAnOnliT085MSBTcyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamcgPSBzOTggTE5POV9OUFA5aWlfUGpnKCQxRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPmk5am9iZzlTMSgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPlBKOU5qOWQ5SmljaWo5c2psRHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL2ViMTkgamIgUEo5Tmo5IGtpOUogaUw5UGNmY1AgZmJnMTlKIGNzaWMxOSBqOVJMIGZiZzE5SiBqYiBmTlBjZ2NqTmo5IGtpOUogaUw5UGNmY1AgZmNnOSBrTGdiTjFjc08gTnMxIFJOc05POVI5c2oKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfYzEgPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxY0ogPSBKTnMxKHFxcXFxLCBtbW1tbW1tbW1tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfTE5qdyA9ICcxYlBrUjlzamkvalJMLycgLiAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSiAuICcvJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfZmJnMTlKX0xOancnXSA9ICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKIC4gJy8nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy9lYjE5IDlzMTkxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfajlSTF9za1JEOUonXSA9ICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnY0xfTjExJ10gPSBPOWo5c1EoIm90NWxFdF9Bbm5vIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkajlSTF8xY0ogPSBBZGRfbnRYQTR5RV80ZHlsQW5fblNvIC4gblNvdGVFbG9DX010ZEFvQUVsbyAuICJqUkwiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlQTnNfMWNKID0gaVBOczFjSigkajlSTF8xY0opOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJKICgkcCA9IHU7ICRwIDwgUGJrc2ooJGlQTnNfMWNKKTsgJHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5R0xfTE5qdyA9IEA5R0xnYjE5KCJfIiwgJGlQTnNfMWNKWyRwXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkOUdMX0xOandbdV0gPT0gJFBrSko5c2pfa2k5Sl9jMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkajlSTF9MTmp3ID0gJGo5UkxfMWNKIC4gblNvdGVFbG9DX010ZEFvQUVsbyAuICRpUE5zXzFjSlskcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB3UmIxX0ooJGo5UkxfTE5qdywgdXp6eiwgdXp6eik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChkeGRfbE0gPT0gIlpjczFiOGkiIHx8IGR4ZF9sTSA9PSAiWlNZWUUiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5RzlQKCJKMSAvaSAvMiAiIC4gIiAiIC4gJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5RzlQKCJpazFiIEpSIC1KZiAiIC4gIiAiIC4gJGo5UkxfTE5qdyAuICcgcj45SkpiSi5qR2onKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUjFjSigkajlSTF9MTmp3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWplYnNla0pKX3liT2NzTWpOamtpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmtMMU5qOTRpOUpNOWlpY2JzUzEoJFBrSko5c2pfaTlpaWNic19jMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWo0aTlKUzEoJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5KOWk5alhOY2c5MXliT0FqajlSTGooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+SjlpOWplTkxqUHdOSzlzTWpOamtpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Nzbk5qOWpjUjkobkFFdF9FUzV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqeWJPYmtqbk5qOWpjUjkoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9jc1NMKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqbzlSTkpCaSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3NpOUpqX2diT2NzX2diTyA9ICR5Yk9jcy0+Y3NpOUpqX2diT2NzX2diTygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydnYk9jc19nYk9fYzEnXSA9ICRjc2k5SmpfZ2JPY3NfZ2JPOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8gPSBzOTggZ2JPKCQxRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo0aTlKWU5SOSgkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydSc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ2dzTlI5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SnRSTmNnKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo0aTlKbEpPKCRiSk9fc05SOVt1XVsnYkpPX3NOUjknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpTTEExMUo5aWkoJF9NdG9WdG9bIm90NWxFdF9Bbm5vIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNU5jczViMWtnOSgieWJPU3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ak1rRDViMWtnOSgnLS1ZbFl0LS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5akVKY09POUooInliT2NzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKZEpiUDlpaSgkZ2JPX1JpTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWp5Yk9uTmo5amNSOShuQUV0X0VTNXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE4xMXliTyA9ICR5Yk8tPk4xMXliT245ak5jZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQxTmhpX0xOaWk5MSA+PSAkc2JfYmZfMU5oaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+UGc5Tko0aTlKTTlpaWNicygkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19jMSgkUGtKSjlzal9pOWlpY2JzX2MxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2lqTkpqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic18xOWlqSmJoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19QYlJSY2ooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOko5czk4X0xOaWk4YkoxX2ZiSlIuTHdMP2tzPSIgLiA5c1BKaExqX2tKZygka2lKc1IsIEFkZF90WWVvQ2RFU2xZX01BeUUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc5TjE5SigieWJQTmpjYnM6IGNzMTlHLkx3TCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlQd2IgIjxpUEpjTGogamhMOT1cImo5R2ovcE5RTmlQSmNMalwiIGlKUD1cIko5aWJrSlA5aS9waS9nYk9jc19xLnBpXCI+PC9pUEpjTGo+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHY2o7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9jc18xOWpOY2dpW3VdWydjMSddICE9IHEpIHsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNiX1Bic1BrSko5c2pfa2k5SiA9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT2NzXzE5ak5jZ2lbdV1bJ3NOUjkxX2ZnTk8nXSA9PSByKSB7Ly9lYnNQa0pKOXNqIG85aWpKY1BqOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPTzkxX1Bia3NqID0gJHliT2NzLT5Qa0pKOXNqZ2hfZ2JPTzkxX2NzX1Bia3NqX0RoRWhMOV9ZYmpxTUEocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNiX1Bic1BrSko5c2pfa2k5SiA9IEFkZF9ZbGxYX290TV80TXRvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsvL2Vic1BrSko5c2ogWGtnZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9POTFfUGJrc2ogPSAkeWJPY3MtPlBrSko5c2pnaF9nYk9POTFfY3NfUGJrc2pfRGhFaEw5X1lianFNQSh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2JfUGJzUGtKSjlzal9raTlKID0gKEFkZF9ZbGxYXzRNdG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRnYk9POTFfUGJrc2pbdV1bJ2piak5nJ10gPj0gJHNiX1Bic1BrSko5c2pfa2k5SikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iSmI4LWZna2MxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iaUxOc3FyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9Ik5nOUpqIE5nOUpqLTlKSmJKIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGtqamJzIGpoTDk9IkRrampicyIgUGdOaWk9IlBnYmk5IiAxTmpOLTFjaVJjaWk9Ik5nOUpqIj4mamNSOWk7PC9Ea2pqYnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGMgUGdOaWk9ImNQYnMtUmNza2ktaWNPcyI+PC9jPjxpakpic08+TWJKSmghITwvaWpKYnNPPiBlYnNQa0pKOXNqIGtpOUogZ2NSY2ogOUdQOTkxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/THdMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoITlSTGpoKCRfb3QwNHRNRVsnUE5MalB3TiddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoOVJMamgoJF9NdE1NU2xZWydQTkxqUHdOJ10pIHx8IGpKY1IoaWpKamJnYjg5SigkX290MDR0TUVbJ1BOTGpQd04nXSkpICE9ICRfTXRNTVNsWVsnUE5MalB3TiddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRnYk9jc1NzZmIgPSAkeWJPY3MtPlFOZ2MxTmo5eWJPY3NBamo5UkxqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPTmpqOVJMaiA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXdiOF9QTkxqUHdOID0gcTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5amROaWk4YkoxKCRnYk9jc18xOWpOY2dpW3VdWyJMTmlpOGJKMSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICRnYk9jc18xOWpOY2dpID0gJHliT2NzLT5RTmdjMU5qOTRpOUooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChQYmtzaigkZ2JPY3NfMTlqTmNnaSkgPiB1ICYmICRRTmdjMU5qOVhnTk8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPTmpqOVJMaiA9ICRnYk9Oamo5UkxqICsgJGdiT2NzXzE5ak5jZ2lbdV1bJ2ZOY2c5MV9nYk9jc19QYmtzaiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkZ2JPTmpqOVJMaiA+IHF1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqNGlKQVBQanliUEI5MSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+a0wxTmo5WE5jZzkxeWJPQWpqOVJMaigkZ2JPTmpqOVJMaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19KOU85czlKTmo5X2MxKGpKazkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBrSko5c2pfaTlpaWNic19jMSA9IGk5aWljYnNfYzEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVsnTXRNTVNsWV9WQW9fWUE1dCddWydraTlKX2NMJ10gPSAkX010b1Z0b1snb3Q1bEV0X0Fubm8nXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPTnNjaU5qY2JzID0gczk4IGJKT05zY2FOamNicygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKT19zTlI5ID0gJGJKT05zY2lOamNicy0+TzlqbEpPTnNjYU5qY2JzX0RoUzEoJGdiT2NzXzE5ak5jZ2lbdV1bJ2JKT19jMSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsna2k5Sl9jMSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2ZzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnUnNOUjknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydSc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydnc05SOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ2dzTlI5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydKYmc5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTmNnJ10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnOVJOY2cnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnTHdiczknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydMd2JzOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk9fYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnYkpPJ10gPSAkYkpPX3NOUjlbdV1bJ2JKT19zTlI5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWyc5UkwxTml3J11bJzFOaXdfZmdOTyddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10gPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnOVJMX0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9fUmlPID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ2ZzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddIC4gJzp5Yk9POTEgU3MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnID0gczk4IExOTzlfTlBQOWlpX1BqZygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnLT5pOWpvYmc5UzEoJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnLT5QSjlOajlkOUppY2lqOXNqbERwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5amVic2VrSkpfeWJPY3NNak5qa2koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+a0wxTmo5NGk5Sk05aWljYnNTMSgkUGtKSjlzal9pOWlpY2JzX2MxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5ajRpOUpTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPko5aTlqWE5jZzkxeWJPQWpqOVJMaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9jc25OajlqY1I5KG5BRXRfRVM1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Jram5OajlqY1I5KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqeWJPY3NTTCgkX010b1Z0b1sib3Q1bEV0X0Fubm8iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5am85Uk5KQmkoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNzaTlKal9nYk9jc19nYk8gPSAkeWJPY3MtPmNzaTlKal9nYk9jc19nYk8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnZ2JPY3NfZ2JPX2MxJ10gPSAkY3NpOUpqX2diT2NzX2diTzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPID0gczk4IGdiTygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SllOUjkoJGdiT2NzXzE5ak5jZ2lbdV1bJ2ZzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajRpOUp0Uk5jZygkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTmNnJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SmxKTygkYkpPX3NOUjlbdV1bJ2JKT19zTlI5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqU0xBMTFKOWlpKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajVOY3M1YjFrZzkoInliT1NzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpNa0Q1YjFrZzkoJy0tWWxZdC0tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKKCJ5Yk9jcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqRUpjT085SmRKYlA5aWkoJGdiT19SaU8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqeWJPbk5qOWpjUjkobkFFdF9FUzV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROMTF5Yk8gPSAkeWJPLT5OMTF5Yk9uOWpOY2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfYzEgPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxY0ogPSBKTnMxKHFxcXFxLCBtbW1tbW1tbW1tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfTE5qdyA9ICcxYlBrUjlzamkvalJMLycgLiAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSiAuICcvJzsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2ZiZzE5Sl9MTmp3J10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSiAuICcvJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vZWIxOSA5czE5MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2o5Ukxfc2tSRDlKJ10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy9lYjE5IDlzMTkxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2NMX04xMSddID0gTzlqOXNRKCJvdDVsRXRfQW5ubyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfMWNKID0gQWRkX250WEE0eUVfNGR5bEFuX25TbyAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAialJMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpUE5zXzFjSiA9IGlQTnMxY0ooJGo5UkxfMWNKKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiSiAoJHAgPSB1OyAkcCA8IFBia3NqKCRpUE5zXzFjSik7ICRwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUdMX0xOancgPSBAOUdMZ2IxOSgiXyIsICRpUE5zXzFjSlskcF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJDlHTF9MTmp3W3VdID09ICRQa0pKOXNqX2tpOUpfYzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfTE5qdyA9ICRqOVJMXzFjSiAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAkaVBOc18xY0pbJHBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQd1JiMV9KKCRqOVJMX0xOancsIHV6enosIHV6enopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoZHhkX2xNID09ICJaY3MxYjhpIiB8fCBkeGRfbE0gPT0gIlpTWVlFIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOUc5UCgiSjEgL2kgLzIgIiAuICIgIiAuICRqOVJMX0xOancpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOUc5UCgiaWsxYiBKUiAtSmYgIiAuICIgIiAuICRqOVJMX0xOancgLiAnIHI+OUpKYkouakdqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlIxY0ooJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkMU5oaV9MTmlpOTEgPj0gJHNiX2JmXzFOaGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPlBnOU5KNGk5Sk05aWljYnMoJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfYzEoJFBrSko5c2pfaTlpaWNic19jMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19pak5KaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfMTlpakpiaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfUGJSUmNqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzlOMTlKKCJ5YlBOamNiczpKOXM5OF9MTmlpOGJKMV9mYkpSLkx3TD9rcz0iIC4gOXNQSmhMal9rSmcoJGtpSnNSLCBBZGRfdFllb0NkRVNsWV9NQXlFKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOiBjczE5Ry5Md0wiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlQd2IgIjxpUEpjTGogamhMOT1qOUdqL3BOUU5pUEpjTGogaUpQPVwiSjlpYmtKUDlpL3BpL2diT2NzX3EucGlcIj48L2lQSmNMaj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOUdjajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOVB3YiBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX0o5TzlzOUpOajlfYzEoakprOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2k5aWljYnNfYzEgPSBpOWlpY2JzX2MxKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVsnTXRNTVNsWV9WQW9fWUE1dCddWydraTlKX2NMJ10gPSAkX010b1Z0b1snb3Q1bEV0X0Fubm8nXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiVjRZIiwgdSwgdSwgIi8iLCAiIiwgZk5naTksIEVvNHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWpQYmJCYzkoImVLQXlYIiwgdSwgdSwgIi8iLCAiIiwgZk5naTksIEVvNHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPTnNjaU5qY2JzID0gczk4IGJKT05zY2FOamNicygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPX3NOUjkgPSAkYkpPTnNjaU5qY2JzLT5POWpsSk9Oc2NhTmpjYnNfRGhTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYkpPX2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydjMSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2ZzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydSc05SOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnZ3NOUjknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydKYmc5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSA9ICRnYk9jc18xOWpOY2dpW3VdWyc5Uk5jZyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0x3YnM5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnTHdiczknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk9fYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk8nXSA9ICRiSk9fc05SOVt1XVsnYkpPX3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJMMU5pdyddWycxTml3X2ZnTk8nXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10gPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnOVJMX0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPX1JpTyA9ICRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSAuICc6eWJPTzkxIFNzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnID0gczk4IExOTzlfTlBQOWlpX1BqZygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPmk5am9iZzlTMSgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMTk85X1BqZy0+UEo5Tmo5ZDlKaWNpajlzamxEcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9lYjE5IGpiIFBKOU5qOSBraTlKIGlMOVBjZmNQIGZiZzE5SiBjc2ljMTkgajlSTCBmYmcxOUogamIgZk5QY2djak5qOSBraTlKIGlMOVBjZmNQIGZjZzkga0xnYk4xY3NPIE5zMSBSTnNOTzlSOXNqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfYzEgPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDFjSiA9IEpOczEocXFxcXEsIG1tbW1tbW1tbW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGtKSjlzal9raTlKX0xOancgPSAnMWJQa1I5c2ppL2pSTC8nIC4gJFBrSko5c2pfa2k5Sl9jMSAuICdfJyAuICQxY0ogLiAnLyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfZmJnMTlKX0xOancnXSA9ICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKIC4gJy8nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2o5Ukxfc2tSRDlKJ10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydjTF9OMTEnXSA9IE85ajlzUSgib3Q1bEV0X0Fubm8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfMWNKID0gQWRkX250WEE0eUVfNGR5bEFuX25TbyAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAialJMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlQTnNfMWNKID0gaVBOczFjSigkajlSTF8xY0opOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYkogKCRwID0gdTsgJHAgPCBQYmtzaigkaVBOc18xY0opOyAkcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUdMX0xOancgPSBAOUdMZ2IxOSgiXyIsICRpUE5zXzFjSlskcF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkOUdMX0xOandbdV0gPT0gJFBrSko5c2pfa2k5Sl9jMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqOVJMX0xOancgPSAkajlSTF8xY0ogLiBuU290ZUVsb0NfTXRkQW9BRWxvIC4gJGlQTnNfMWNKWyRwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQd1JiMV9KKCRqOVJMX0xOancsIHV6enosIHV6enopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChkeGRfbE0gPT0gIlpjczFiOGkiIHx8IGR4ZF9sTSA9PSAiWlNZWUUiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHOVAoIkoxIC9pIC8yICIgLiAiICIgLiAkajlSTF9MTmp3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5RzlQKCJpazFiIEpSIC1KZiAiIC4gIiAiIC4gJGo5UkxfTE5qdyAuICcgcj45SkpiSi5qR2onKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlIxY0ooJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqZWJzZWtKSl95Yk9jc01qTmpraSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmtMMU5qOTRpOUpNOWlpY2JzUzEoJFBrSko5c2pfaTlpaWNic19jMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5ajRpOUpTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+SjlpOWpYTmNnOTF5Yk9Bamo5UkxqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+SjlpOWplTkxqUHdOSzlzTWpOamtpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqeWJPY3NuTmo5amNSOShuQUV0X0VTNXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Jram5OajlqY1I5KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9jc1NMKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWpvOVJOSkJpKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNzaTlKal9nYk9jc19nYk8gPSAkeWJPY3MtPmNzaTlKal9nYk9jc19nYk8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydnYk9jc19nYk9fYzEnXSA9ICRjc2k5SmpfZ2JPY3NfZ2JPOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTyA9IHM5OCBnYk8oJDFEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SllOUjkoJGdiT2NzXzE5ak5jZ2lbdV1bJ2ZzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXSAuICIgIiAuICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SnRSTmNnKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajRpOUpsSk8oJGJKT19zTlI5W3VdWydiSk9fc05SOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqU0xBMTFKOWlpKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNU5jczViMWtnOSgieWJPU3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqTWtENWIxa2c5KCctLVlsWXQtLScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKKCJ5Yk9jcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKZEpiUDlpaSgkZ2JPX1JpTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5anliT25OajlqY1I5KG5BRXRfRVM1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROMTF5Yk8gPSAkeWJPLT5OMTF5Yk9uOWpOY2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkMU5oaV9MTmlpOTEgPj0gJHNiX2JmXzFOaGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+UGc5Tko0aTlKTTlpaWNicygkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2MxKCRQa0pKOXNqX2k5aWljYnNfYzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19pak5KaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic18xOWlqSmJoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX1BiUlJjaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzlOMTlKKCJ5YlBOamNiczpKOXM5OF9MTmlpOGJKMV9mYkpSLkx3TD9rcz0iIC4gOXNQSmhMal9rSmcoJGtpSnNSLCBBZGRfdFllb0NkRVNsWV9NQXlFKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOiBjczE5Ry5Md0wiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOVB3YiAiPGlQSmNMaiBqaEw5PVwiajlHai9wTlFOaVBKY0xqXCIgaUpQPVwiSjlpYmtKUDlpL3BpL2diT2NzX3EucGlcIj48L2lQSmNMaj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5R2NqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCE5UkxqaCgkX290MDR0TUVbJ1BOTGpQd04nXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoOVJMamgoJF9NdE1NU2xZWydQTkxqUHdOJ10pIHx8IGpKY1IoaWpKamJnYjg5SigkX290MDR0TUVbJ1BOTGpQd04nXSkpICE9ICRfTXRNTVNsWVsnUE5MalB3TiddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJGdiT2NzU3NmYiA9ICR5Yk9jcy0+UU5nYzFOajl5Yk9jc0FqajlSTGooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdiT05qajlSTGogPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXdiOF9QTkxqUHdOID0gcTsKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kZ2JPY3NfMTlqTmNnaSA9ICR5Yk9jcy0+UU5nYzFOajk0aTlKKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChQYmtzaigkZ2JPY3NfMTlqTmNnaSkgPiB1ICYmICRRTmdjMU5qOVhnTk8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnYk9Oamo5UkxqID0gJGdiT05qajlSTGogKyAkZ2JPY3NfMTlqTmNnaVt1XVsnZk5jZzkxX2diT2NzX1Bia3NqJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiAoJGdiT05qajlSTGogPiBxdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqNGlKQVBQanliUEI5MSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmtMMU5qOVhOY2c5MXliT0FqajlSTGooJGdiT05qajlSTGopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlpaWNic19KOU85czlKTmo5X2MxKGpKazkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGtKSjlzal9pOWlpY2JzX2MxID0gaTlpaWNic19jMSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbJ010TU1TbFlfVkFvX1lBNXQnXVsna2k5Sl9jTCddID0gJF9NdG9WdG9bJ290NWxFdF9Bbm5vJ107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPTnNjaU5qY2JzID0gczk4IGJKT05zY2FOamNicygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPX3NOUjkgPSAkYkpPTnNjaU5qY2JzLT5POWpsSk9Oc2NhTmpjYnNfRGhTMSgkZ2JPY3NfMTlqTmNnaVt1XVsnYkpPX2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydjMSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2ZzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydSc05SOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnZ3NOUjknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydnc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydKYmc5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSA9ICRnYk9jc18xOWpOY2dpW3VdWyc5Uk5jZyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0x3YnM5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnTHdiczknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk9fYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk8nXSA9ICRiSk9fc05SOVt1XVsnYkpPX3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJMMU5pdyddWycxTml3X2ZnTk8nXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10gPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnOVJMX0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPX1JpTyA9ICRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSAuICc6eWJPTzkxIFNzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnID0gczk4IExOTzlfTlBQOWlpX1BqZygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPmk5am9iZzlTMSgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMTk85X1BqZy0+UEo5Tmo5ZDlKaWNpajlzamxEcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5amVic2VrSkpfeWJPY3NNak5qa2koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5rTDFOajk0aTlKTTlpaWNic1MxKCRQa0pKOXNqX2k5aWljYnNfYzEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWo0aTlKUzEoJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPko5aTlqWE5jZzkxeWJPQWpqOVJMaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5anliT2Nzbk5qOWpjUjkobkFFdF9FUzV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9ia2puTmo5amNSOSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqeWJPY3NTTCgkX010b1Z0b1sib3Q1bEV0X0Fubm8iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqbzlSTkpCaSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjc2k5SmpfZ2JPY3NfZ2JPID0gJHliT2NzLT5jc2k5SmpfZ2JPY3NfZ2JPKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnZ2JPY3NfZ2JPX2MxJ10gPSAkY3NpOUpqX2diT2NzX2diTzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8gPSBzOTggZ2JPKCQxRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajRpOUpZTlI5KCRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajRpOUp0Uk5jZygkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTmNnJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWo0aTlKbEpPKCRiSk9fc05SOVt1XVsnYkpPX3NOUjknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5alNMQTExSjlpaSgkX010b1Z0b1sib3Q1bEV0X0Fubm8iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajVOY3M1YjFrZzkoInliT1NzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ak1rRDViMWtnOSgnLS1ZbFl0LS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqRUpjT085SigieWJPY3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqRUpjT085SmRKYlA5aWkoJGdiT19SaU8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWp5Yk9uTmo5amNSOShuQUV0X0VTNXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTjExeWJPID0gJHliTy0+TjExeWJPbjlqTmNnKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfYzEgPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDFjSiA9IEpOczEocXFxcXEsIG1tbW1tbW1tbW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGtKSjlzal9raTlKX0xOancgPSAnMWJQa1I5c2ppL2pSTC8nIC4gJFBrSko5c2pfa2k5Sl9jMSAuICdfJyAuICQxY0ogLiAnLyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfZmJnMTlKX0xOancnXSA9ICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKIC4gJy8nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2o5Ukxfc2tSRDlKJ10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydjTF9OMTEnXSA9IE85ajlzUSgib3Q1bEV0X0Fubm8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfMWNKID0gQWRkX250WEE0eUVfNGR5bEFuX25TbyAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAialJMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlQTnNfMWNKID0gaVBOczFjSigkajlSTF8xY0opOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYkogKCRwID0gdTsgJHAgPCBQYmtzaigkaVBOc18xY0opOyAkcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUdMX0xOancgPSBAOUdMZ2IxOSgiXyIsICRpUE5zXzFjSlskcF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkOUdMX0xOandbdV0gPT0gJFBrSko5c2pfa2k5Sl9jMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqOVJMX0xOancgPSAkajlSTF8xY0ogLiBuU290ZUVsb0NfTXRkQW9BRWxvIC4gJGlQTnNfMWNKWyRwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQd1JiMV9KKCRqOVJMX0xOancsIHV6enosIHV6enopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmIChkeGRfbE0gPT0gIlpjczFiOGkiIHx8IGR4ZF9sTSA9PSAiWlNZWUUiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHOVAoIkoxIC9pIC8yICIgLiAiICIgLiAkajlSTF9MTmp3IC4gJyByPjlKSmJKLmpHaicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHOVAoImlrMWIgSlIgLUpmICIgLiAiICIgLiAkajlSTF9MTmp3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlIxY0ooJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQxTmhpX0xOaWk5MSA+PSAkc2JfYmZfMU5oaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5QZzlOSjRpOUpNOWlpY2JzKCRnYk9jc18xOWpOY2dpW3VdWydjMSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfYzEoJFBrSko5c2pfaTlpaWNic19jMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2lqTkpqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzXzE5aWpKYmgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfUGJSUmNqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOko5czk4X0xOaWk4YkoxX2ZiSlIuTHdMP2tzPSIgLiA5c1BKaExqX2tKZygka2lKc1IsIEFkZF90WWVvQ2RFU2xZX01BeUUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFjOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc5TjE5SigieWJQTmpjYnM6IGNzMTlHLkx3TCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlQd2IgIjxpUEpjTGogamhMOT1qOUdqL3BOUU5pUEpjTGogaUpQPVwiSjlpYmtKUDlpL3BpL2diT2NzX3EucGlcIj48L2lQSmNMaj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5R2NqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfSjlPOXM5Sk5qOV9jMShqSms5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGtKSjlzal9pOWlpY2JzX2MxID0gaTlpaWNic19jMSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVsnTXRNTVNsWV9WQW9fWUE1dCddWydraTlKX2NMJ10gPSAkX010b1Z0b1snb3Q1bEV0X0Fubm8nXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlqUGJiQmM5KCJWNFkiLCB1LCB1LCAiLyIsICIiLCBmTmdpOSwgRW80dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTlqUGJiQmM5KCJlS0F5WCIsIHUsIHUsICIvIiwgIiIsIGZOZ2k5LCBFbzR0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkpPTnNjaU5qY2JzID0gczk4IGJKT05zY2FOamNicygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSk9fc05SOSA9ICRiSk9Oc2NpTmpjYnMtPk85amxKT05zY2FOamNic19EaFMxKCRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2MxJ10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2ZzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ1JzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnUnNOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2dzTlI5J10gPSAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ0piZzknXSA9ICRnYk9jc18xOWpOY2dpW3VdWydKYmc5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWyc5Uk5jZyddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJzlSTmNnJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydMd2JzOSddID0gJGdiT2NzXzE5ak5jZ2lbdV1bJ0x3YnM5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydiSk9fYzEnXSA9ICRnYk9jc18xOWpOY2dpW3VdWydiSk9fYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2JKTyddID0gJGJKT19zTlI5W3VdWydiSk9fc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnMU5pd19mZ05PJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydKYmc5J10gPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlSTDFOaXcnXVsnOVJMX0piZzknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExOTzlfUGpnID0gczk4IExOTzlfTlBQOWlpX1BqZygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMTk85X1BqZy0+aTlqb2JnOVMxKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnSmJnOSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTE5POV9QamctPlBKOU5qOWQ5SmljaWo5c2psRHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2JPX1JpTyA9ICRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSAuICc6eWJPTzkxIFNzJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vZWIxOSBqYiBQSjlOajkga2k5SiBpTDlQY2ZjUCBmYmcxOUogY3NpYzE5IGo5UkwgZmJnMTlKIGpiIGZOUGNnY2pOajkga2k5SiBpTDlQY2ZjUCBmY2c5IGtMZ2JOMWNzTyBOczEgUk5zTk85UjlzagogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQa0pKOXNqX2tpOUpfYzEgPSAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfYzEnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMWNKID0gSk5zMShxcXFxcSwgbW1tbW1tbW1tbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBrSko5c2pfa2k5Sl9MTmp3ID0gJzFiUGtSOXNqaS9qUkwvJyAuICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKIC4gJy8nOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydraTlKX2ZiZzE5Sl9MTmp3J10gPSAkUGtKSjlzal9raTlKX2MxIC4gJ18nIC4gJDFjSiAuICcvJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vL2ViMTkgOXMxOTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJ2tpOUpfajlSTF9za1JEOUonXSA9ICRQa0pKOXNqX2tpOUpfYzEgLiAnXycgLiAkMWNKOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnY0xfTjExJ10gPSBPOWo5c1EoIm90NWxFdF9Bbm5vIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGo5UkxfMWNKID0gQWRkX250WEE0eUVfNGR5bEFuX25TbyAuIG5Tb3RlRWxvQ19NdGRBb0FFbG8gLiAialJMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVBOc18xY0ogPSBpUE5zMWNKKCRqOVJMXzFjSik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJKICgkcCA9IHU7ICRwIDwgUGJrc2ooJGlQTnNfMWNKKTsgJHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUdMX0xOancgPSBAOUdMZ2IxOSgiXyIsICRpUE5zXzFjSlskcF0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQ5R0xfTE5qd1t1XSA9PSAkUGtKSjlzal9raTlKX2MxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkajlSTF9MTmp3ID0gJGo5UkxfMWNKIC4gblNvdGVFbG9DX010ZEFvQUVsbyAuICRpUE5zXzFjSlskcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQd1JiMV9KKCRqOVJMX0xOancsIHV6enosIHV6enopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKGR4ZF9sTSA9PSAiWmNzMWI4aSIgfHwgZHhkX2xNID09ICJaU1lZRSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5RzlQKCJKMSAvaSAvMiAiIC4gIiAiIC4gJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDlnaTkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlHOVAoImlrMWIgSlIgLUpmICIgLiAiICIgLiAkajlSTF9MTmp3IC4gJyByPjlKSmJKLmpHaicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlIxY0ooJGo5UkxfTE5qdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5amVic2VrSkpfeWJPY3NNak5qa2koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmtMMU5qOTRpOUpNOWlpY2JzUzEoJFBrSko5c2pfaTlpaWNic19jMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+aTlqNGk5SlMxKCRnYk9jc18xOWpOY2dpW3VdWydjMSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPko5aTlqWE5jZzkxeWJPQWpqOVJMaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk9jcy0+SjlpOWplTkxqUHdOSzlzTWpOamtpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9jc25OajlqY1I5KG5BRXRfRVM1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9ia2puTmo5amNSOSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliT2NzLT5pOWp5Yk9jc1NMKCRfTXRvVnRvWyJvdDVsRXRfQW5ubyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPmk5am85Uk5KQmkoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjc2k5SmpfZ2JPY3NfZ2JPID0gJHliT2NzLT5jc2k5SmpfZ2JPY3NfZ2JPKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9NdE1NU2xZW010TU1TbFlfVkFvX1lBNXRdWydnYk9jc19nYk9fYzEnXSA9ICRjc2k5SmpfZ2JPY3NfZ2JPOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPID0gczk4IGdiTygkMUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5ajRpOUpZTlI5KCRnYk9jc18xOWpOY2dpW3VdWydmc05SOSddIC4gIiAiIC4gJGdiT2NzXzE5ak5jZ2lbdV1bJ1JzTlI5J10gLiAiICIgLiAkZ2JPY3NfMTlqTmNnaVt1XVsnZ3NOUjknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SnRSTmNnKCRfTXRNTVNsWVtNdE1NU2xZX1ZBb19ZQTV0XVsnOVJOY2cnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNGk5SmxKTygkYkpPX3NOUjlbdV1bJ2JKT19zTlI5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5Yk8tPmk5alNMQTExSjlpaSgkX010b1Z0b1sib3Q1bEV0X0Fubm8iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqNU5jczViMWtnOSgieWJPU3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpNa0Q1YjFrZzkoJy0tWWxZdC0tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqRUpjT085SigieWJPY3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPLT5pOWpFSmNPTzlKZEpiUDlpaSgkZ2JPX1JpTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHliTy0+aTlqeWJPbk5qOWpjUjkobkFFdF9FUzV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTjExeWJPID0gJHliTy0+TjExeWJPbjlqTmNnKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCRfb3QwNHRNRVsnOVJMX2diT2NzJ10gPT0gcSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX010TU1TbFlbTXRNTVNsWV9WQW9fWUE1dF1bJzlnYk9jcyddID0gJF9vdDA0dE1FWyc5UkxfZ2JPY3MnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgKCQxTmhpX0xOaWk5MSA+PSAkc2JfYmZfMU5oaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWJPY3MtPlBnOU5KNGk5Sk05aWljYnMoJGdiT2NzXzE5ak5jZ2lbdV1bJ2MxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2MxKCRQa0pKOXNqX2k5aWljYnNfYzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX2lqTkpqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5aWljYnNfMTlpakpiaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWlpY2JzX1BiUlJjaigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OU4xOUooInliUE5qY2JzOko5czk4X0xOaWk4YkoxX2ZiSlIuTHdMP2tzPSIgLiA5c1BKaExqX2tKZygka2lKc1IsIEFkZF90WWVvQ2RFU2xZX01BeUUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc5TjE5SigieWJQTmpjYnM6IGNzMTlHLkx3TCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5UHdiICI8aVBKY0xqIGpoTDk9XCJqOUdqL3BOUU5pUEpjTGpcIiBpSlA9XCJKOWlia0pQOWkvcGkvZ2JPY3NfcS5waVwiPjwvaVBKY0xqPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOUdjajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOWdpOSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJKYjgtZmdrYzEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJpTE5zcXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iTmc5SmogTmc5SmotOUpKYkoiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEa2pqYnMgamhMOT0iRGtqamJzIiBQZ05paT0iUGdiaTkiIDFOak4tMWNpUmNpaT0iTmc5SmoiPiZqY1I5aTs8L0Rrampicz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YyBQZ05paT0iY1Bicy1SY3NraS1pY09zIj48L2M+PGlqSmJzTz50SkpiSiE8L2lqSmJzTz5DYmtKIE5QUGJrc2ogd05pIEQ5OXMgZ2JQQjkxLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9Md0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MWNRIFBnTmlpPSJKYjgtZmdrYzEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9ImlMTnNxciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9Ik5nOUpqIE5nOUpqLTlKSmJKIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEa2pqYnMgamhMOT0iRGtqamJzIiBQZ05paT0iUGdiaTkiIDFOak4tMWNpUmNpaT0iTmc5SmoiPiZqY1I5aTs8L0Rrampicz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjIFBnTmlpPSJjUGJzLVJjc2tpLWljT3MiPjwvYz48aWpKYnNPPnRKSmJKITwvaWpKYnNPPiBDYmsgakpjOTEgamJiIFJOc2ggamNSOWkuIGRnOU5pOSBqSmggTmZqOUogaWJSOSBqY1I5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4gICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P0x3TAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSA5Z2k5IHsKICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iSmI4LWZna2MxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9ImlMTnNxciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iTmc5SmogTmc5SmotOUpKYkoiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGtqamJzIGpoTDk9IkRrampicyIgUGdOaWk9IlBnYmk5IiAxTmpOLTFjaVJjaWk9Ik5nOUpqIj4mamNSOWk7PC9Ea2pqYnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjIFBnTmlpPSJjUGJzLVJjc2tpLWljT3MiPjwvYz48aWpKYnNPPk1iSkpoISAtIDwvaWpKYnNPPkV3Y2kgTlBQYmtzaiBjaSBOZ0o5TjFoIGdiT085MS1jcyA4Y2p3IE5zYmp3OUogTlBqY1E5IGk5aWljYnMuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TiB3SjlmPSJnYk9ia2pfTmdKOU4xaHliT085MTRpOUouTHdMIj5lZ2NQQiB4OUo5PC9OPiBqYiBmYkpQOSBnYk8tYmtqIGZKYlIgTmdnIE5QamNROSBpOWlpY2JzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P0x3TAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOWpQYmJCYzkoImtzTlI5IiwgJGdiT2NzU3NmYlt1XVsna2k5SnNOUjknXSwgdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiQjloIiwgJGdiT2NzU3NmYlt1XVsnTE5paThiSjEnXSwgdSwgJycsICcnLCBmTmdpOSwgakprOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk5alBiYkJjOSgiTEo5UWMxIiwgJGdiT2NzU3NmYlt1XVsnUGtKSjlzal9pOWlpY2JzX2MxJ10sIHUsICcnLCAnJywgZk5naTksIGpKazkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/THdMCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9IlBic2pOY3M5SiI+CiAgICAgICAgICAgICAgICAgICAgPGZiSlIgUGdOaWk9ImZiSlItaWNPc2NzLUpjRERicyIgYzE9ImljT3NjcyIgc05SOT0iaWNPc2NzIiBSOWp3YjE9ImRsTUUiIE5QamNicz0iZ2JPY3MuTHdMIj4KICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iUGJzajlzai04YzFPOWppIE9KTmgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iIGdiT2NzLXc5TjEgYkpOc085Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9Md0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzlQd2IgJ3FxcScuIDE5UEpoTGpfTE5paSgiJHJoJHF1JEl3RW5HY3VKSHYwall1WURjUDh4ZWsxOUQyMzUvNjk0Q3ZrMEtYVXZXZjZ6LmM0T0hHRmJVIiwgQWRkX3RZZW9DZEVTbFlfTUF5RSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dzcgUGdOaWk9ImZiSlItaWNPc2NzLXc5TjFjc08iPmRnOU5pOSBpY09zIGNzPC93Nz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iZ2JzTy1KY0REYnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9IkpjRERicy1QYnNqOXNqIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iUGJzakpiZ2kgY3NMa2otY1BicyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YyBQZ05paT0iIGNQYnMta2k5Si1SMSI+PC9jPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNzTGtqIGpoTDk9Imo5R2oiIFBnTmlpPSJjc0xrai1EZ2JQQi1nOVE5ZyIgTGdOUDl3YmcxOUo9IjRpOUpzTlI5IiBzTlI5PSJraTlKc05SOSIgYzE9ImtpOUpzTlI5IiBRTmdrOT0iPD9Md0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICghOVJMamgoJF9kbE1FWydraTlKc05SOSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlQd2IgJF9kbE1FWydraTlKc05SOSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4iIE5ramJQYlJMZzlqOT0iYmZmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxY1EgUGdOaWk9IlBic2pKYmdpIGNzTGtqLWNQYnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGMgUGdOaWk9IiBjUGJzLUI5aCI+PC9jPjxjc0xraiBqaEw5PSJMTmlpOGJKMSIgUGdOaWk9ImNzTGtqLURnYlBCLWc5UTlnIiBMZ05QOXdiZzE5Sj0iZE5paThiSjEiIHNOUjk9IkxOaWk4YkoxIiBjMT0iTE5paThiSjEiIE5ramJQYlJMZzlqOT0iYmZmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8xY1E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/THdMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmICgkaXdiOF9QTkxqUHdOID09IHEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y1JPIGlKUD0iUE5MalB3Ti5Md0wiIGMxPSJQTkxqUHdOIiAvPjxESi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBleEFZS3QgRXRGRSB5U1lVIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE4gd0o5Zj0iIyIgYnNQZ2NQQj0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWJQa1I5c2ouTzlqdGc5UjlzakloUzEoJ1BOTGpQd04nKS5pSlAgPSAnUE5MalB3Ti5Md0w/JyArIDVOancuSk5zMWJSKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWJQa1I5c2ouTzlqdGc5UjlzakloUzEoJ1BOTGpQd04tZmJKUicpLmZiUGtpKCk7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzE9IlB3TnNPOS1jUk5POSI+WWJqIEo5TjFORGc5PyBld05zTzkgajlHai48L04+PERKLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjc0xraiBqaEw5PSJqOUdqIiBzTlI5PSJQTkxqUHdOIiBjMT0iUE5MalB3Ti1mYkpSIiBOa2piUGJSTGc5ajk9ImJmZiIvPjxESi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P0x3TAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z05EOWcgUGdOaWk9IlB3OVBCRGJHIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y3NMa2ogamhMOT0iUHc5UEJEYkciIFFOZ2s5PSJKOVI5UkQ5Si1SOSI+IG85UjlSRDlKIFI5ICA8L2dORDlnPi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGtqamJzIFBnTmlpPSJEanMgRGpzLWNzUTlKaTkgRGpzLURnYlBCIiBqaEw5PSJpa0RSY2oiPk1jT3MgY3M8L0Rrampicz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPDFjUSBQZ05paT0iZmJKT2JqLURnYlBCIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d0g+WGJKT2JqIGhia0ogTE5paThiSjEgPzwvd0g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxOIHdKOWY9ImZiSk9ial9MTmlpOGJKMS5Md0wiPmVnY1BCIHc5Sjk8L04+IGpiIEo5aTlqIGhia0ogTE5paThiSjEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEloIGljT3Njc08gY3MgUyBOT0o5OSBqYiBqdzkgPE4gd0o5Zj0iZ2NQOXNpOS5Md0wiPmdjUDlzaTkgajlKUmk8L04+PERKPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvMWNRPgogICAgICAgICAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgICAgICAgICA8L2ZiSlI+CiAgICAgICAgICAgICAgICA8LzFjUT4KICAgICAgICAgICAgPC8xY1E+CgogICAgICAgIDwvRGIxaD4KICAgIDwvd2pSZz4KICAgIDw/THdMCn0KPz4K';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnVEFSZTVLemdpQnJwdHE5MVdMdmxmOGF1bmM0eFlRWk9JeVYzN293akMwUGtORkhoNmRNR0RiRTJVWFNKbXMnLCdKQW1DTUc3bHNrMmpFMWVkOHA1T2Z3ejBEaVVITnZXZ0JMVjYzUmh0WVFjdWFYNHlaUFN4Ym9UcUtGSXI5bicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R 0
$_C1353562110 0

Stats

MD5 9060fe83791b43e31babb7c71e9262fc
Eval Count 2
Decode Time 237 ms